A

HC-06 Bluetooth - Pic Haberleşmesi

Başlatan abdull, 25 Mart 2014, 23:48:22

abdull

Selam Arkadaşlar,
HC-06 bluetooth modülü ile pic haberleşmesi üzerine çalışıyordum. Bu forum sitesindeki verileri ve başka yerlere baktıklarımı uyguladım. Fakat hala veriler düzgün okunmuyor. Gönderilen ve alınan veriler yanlış. Bunu da RS232 ile deneyerek test ettim. Veriler düzgün alınıp düzgün gönderiliyor. Pic'in TX ile bluettoh modülünün RX bacağının arasına 2K/3K gerilim bölücü kurdum. Ayrıca bluetooth modülünün RX'i ile pic TX arasında pull-up direnci attım. Fakat veriler yine yanlış geliyor. İki yönlü de veriler hatalı. Sizce sorun nedir arkadaşlar?
Şimdiden ilgilenen arkadaşlara teşekkür ederim.


#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, stop=1)

#use fast_io(a)
#use fast_io(b)


int data;


#use fast_io(a)


void main ()
{
  setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı


   set_tris_a(0x00); 

   output_a(0x00);

   
   while(1)
   {
 
   data=getch();
   
   if(data==0xAA)
   {
   output_high(pin_a0);
   delay_ms(1000);
   }
   
   // printf("Deneme");
 
 
   }
   }



ete

Şemanda hata yok ancak programında bir çok eksik görüyorum.

Gördüğüm kadarı ile sadece A portunu TRISA üzerinden ayarlamışsın.
Asıl ayarlanması gereken C portu ile ilgili bir komut göremedim.
RX pini giriş olmalı diğerleri çıkış olmalıdır.
Programda bir eşleşme durumuda göremedim. Bildiğim kadarı ile Bluetooth modülleri karşılıklı olarak önce eşleştirilmeleri gerekir.
Bunu yapıyormusun?

Ete

abdull

Hocam cevabınız için teşekkür ederim. Fakat şuana kadar C portunu pinlerini giriş-çıkış yapmadan birçok kez RS232 ile kullandım. Bildiğim kadarıyla program kendiliğinden ayarlıyor. Bluetooth modülünü de bilgisayar üzerinden eşliyorum. Eşlendiğini de modül üzerindeki ışığın sabitlenmesi ile anlıyorum. Veriler de geliyor bana fakat veri parçalı olarak geliyor. Bundan dolayı da okuma işlemlerinde de hata yapıyor. Bir de bu kodu RS232 ile bizzat denedim veri okumasında ve gönderilmesinde bir sorun yaşamadım.

detect

hocam merhaba

bende hc-06 modül ile ugraşıyorum picbasic ile kod yazdım serial port termainal üzerinden pcye veri aktarmaya çalışıyorum. Sorunum şu aktardığım veriler hatalı oluyor modülün RX bacağına gerilim bölücü yapsam acaba sorun çözülürmü yoksa modülmü bozuk anlamadım

ete

Anladığım kadarı ile 3,3v ile çalışan modül ile pc arasında bir seviye düzenleyici kullanmamışsın,
Pic ler genelede 5v ile çalıştırılırlar. Pic ile modül arasında da gerilim bölücü kullanman gerekir. Zira 3,3v ile çalışan modüle 5 v luk bir high sinyali gelmesi onu bozar. Genel de low ve hig sinyallerinin birer aralığı vardır. Örneğin pic in low olarak algılayacağı sinyal 0 - 0,8v aralığındadır. High diye algılanacak sinyal ise 2-5 v aralığındadır. Dikkat ederseniz 0,8 v ile 2v arasında float denilen bir bölge vardır ve bu aralıkta işlemci kararsız kalır. Bu nedenle lojik sinyallerin seviyeleri net ve istenen aralıkta olmalıdır.  İşin pc tarafına gelince, pc de high olarak belirlenen sinyal -10v değerindedir. Low olarak algılanacak sinyal ise +10v seviyesindedir. Bu voltajlar laptoplarda 7v lara kadar inebilir. Pic yada modülün high diye yolladığı +1,8v ile 3,3v arasındaki sinyal Pc nin anlayamayacağı seviyededir pc bu konuda -7 ile 10v arasında bir sinyal bekler. Yine pic yada öodulün low diye yolladığı ve teorik olarak 0v (gnd) seviyesindeki sinyal için ise pc tarafı +10v seviyesini bekler. Bu cihazları arada bir seviye düzeltici kullanmadan haberleştirmeye çalışırsanız her iki tarafta bir birini anlamaz. Bu nedenle TTL dedğimiz Pic veya Modül seviyelerini RS232 formatı denilen weviyelere dönüştürecek olan max232 gibi entegreler kullanılır. Bu entegreler içinde voltaj pompaları bulunur ve 5v dan hem -10v hemde +10v voltajları üreterek seviye çevirimi yaparlar.
Bu açıklamalara uygun olarak devreni yeniden düzenlemen grekir.

Ete

detect

ete hocam cevap için teşekkür ederim. bununla ilgili örnek devre varmıdır paylaşabileceğiniz

ete

Bununla derken neyi kast ettin bilmiyorum ama sanırım max232 devresini soruyorun. Max232 entegresinin data sheetinde her şey mevcut.
Ete

detect

evet hocam max 232 ile ilgili ben bir devre yaptım fakat sonuç yine aynı yardımcı olursanız sevinirim

ete

Daha nasıl yardımcı olacağım anlamadım. Her şeyi açıkladım detaylı olarak.
Max232 li devrede yaptım diyorsun. Ya devrenin diğer kısımları çalışmıyorsa ya komut veremiyorsan. bunları aşman gerekiyor.
Programın çalıştığından emin olursan gerisi yukarıda açıkladığım seviye düzeltmesine kalıyor. Genelde Max232 devresinde kondansatörleri ters bağlıyorlar. Onlara dikkat ettinmi?. Tekrar kontrol et bence.

Ete

onurinci

eğer sistem 3 voltluk bir devre ise ,MAX3232 tavsiye ederim yeni nesil 3.3 volt'a uyarlanmış modeli.

detect

hocam yazdığım kodları gönderiyorum yanlışlık devredemi koddamı anlamadım max 232 devremi kontrol ettimherşey normal son çare kodlar kalıyo

TRISA=%00000011
TRISB=0
TRISC=%10001111

@ DEVICE pic16F876A, WDT_ON
@ DEVICE pic16F876A, PWRT_ON
@ DEVICE pic16F876A, PROTECT_OFF
@ DEVICE pic16F876A, HS_OSC

DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
define LCD RWREG        PORTB 
define LCD_RWBIT          2 
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS 4 
DEFINE LCD_LINES 2

DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRG 25
DEFINE HSER_CLROERR 1

DEFINE OSC 20

VERI VAR BYTE

VERI=55
 
lcdout $FE,1
pause 2000

BASLA:

LCDOUT $FE,1,"   DENEME    "
LCDOUT $FE,$C0,"   VERI"
PAUSE 3000


EKRAN:

LCDOUT $FE,1," NORMAL",#VERI
lcdout $FE,$C0," HEDEF",#VERI
PAUSE 100

HSEROUT [VERI]

GOTO EKRAN
     
END
r

ete

Programda yer alan aşağıdaki satırları sil;
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRG 25
DEFINE HSER_CLROERR 1

yerine aşağıdakileri yazıp yeniden derle ve dene bakalım.

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 129 ' 9600 Baud @ 20MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

ete

detect

denedim hocam ama olmadı. advanced serial terminal kullanıyorum, örnek olarak 1 gönderiyorum s harfi geliyor , 55 gönderiyorum R7 geliyor anlamadım gitti. max232 yerine birde 3232 yi deneyecem bakalım

ete

Birde şunu dene,
HSEROUT [VERI] satırını HSEROUT [VERI,13,10]  olarak değiştir.

Sanki baud rate uyuşmazlığı varmış gibi gözüküyor. Her iki tarafta da baud rate değerinin aynı olmasına dikkat et.

Ete

enginkanat

http://etepic.com/index.php/topic,953.15.html
yukarıdaki bağlantıyı takip ederseniz sorunu çözebilirsiniz.
ben en net sonucu 16f628a yı 3,3 voltta çalıştırmakla çözdüm. HC-06 ile 25-30 mt mesafeden sorunsuz bilgi aldım. yukarıda ki bağlantıda ETE hocanın kodları var ve bunları baz aldım.

Powered by EzPortal