H

18F4550 İle Bluetooth Modül İletişimi

Başlatan hakki0548, 06 Mart 2013, 11:08:39

hakki0548

Selamlar. HC06 Bluetooth modülüm var. Android programı aracılığıyla modüle bağlanabiliyorum. Android programından bluetooth modüle 8 bitlik sayı gönderiyorum. 18f4550 ile bluetoothdan gelen 8 bitlik sayıyı alıp portb'ye yönlendirmek istiyorum. Telefondaki programı başka telefonla deniyorum. 8 bitlik sayı gitmesi konusunda problem yok. Ama modüle giden sayıyı pic'te okuyamıyorum. Kullandığım kodlar şunlar:

'------------------------------------------------------------------------------------------
DEFINE OSC 48

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 225 ' 2400 Baud @ SPBRGH = 4
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

RCSTA = %10010000       ' Enable serial port and continuous receive
TXSTA = %00100000       ' Enable transmit and asynchronous mode

RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT

TRISB = 0             ' Set RB2 to output
portb = 0
Trisc = %10000000

CMCON=7

'RCSTA = %010000       ' Enable serial port and continuous receive
'TXSTA = 100000       ' Enable transmit and asynchronous mode

char Var byte  ' Storage for serial character
AL var byte

'char = %10100101
 
    basla:
       Goto basla        ' Do it all over again
     
DISABLE
INT:
    GIE=0
                               
       hserin [AL]
       PORTB  = AL

    RCIF=0
    GIE=1
    Resume
    enable
'-----------------------------------------------------------------------------------------

hata nerde bulamadım. yardımlarınızı bekliyorum

ete

Programda sigorta ayarları gözükmüyor. PLL yi açmış olmanız gerekir çünki OSC 48 Mhz olarak belirtilmiş.

Programa bir açılış gecikmeside vermeniz gerekir.
İlk açılışta bütün pic ler programda belirlenen atamaları (Tris ayarlamaları, değişkenlerin belirlenmesi ve ona ait hafıza atamaları vs.) için zaman harcarlar. Bu atamaların gerçekleşmesi için işlemciye en azından bir 300 ms lik açılış gecikmesi vermeniz gerekir.

Diğer bir eksiklik de RCIF yani alma bayrağı direk ulaşılan bir register değildir. Ulaşamayacağını ziçin onu RCIF=0 şeklinde sıfırlayamazsınız. Bakınıuz data sheet bu konuda ne diyor;
"1 = The EUSART receive buffer, RCREG, is full (cleared when RCREG is read)" RCREG registerini okuduğunuz zaman sıfırlanır diyor. O halde RCIF=0 yerine  TEMP=RCREG şeklinde bir komut satırı kullanmanız gerekir.
Tabiiki değişken tanımlama kısmında TEMP VAR BYTE şeklinde değişken tanımlamasıda yapmanız gerekir.

Bu şekilde olursa en azından sistem çalışır hale gelir. Ama mesajda detay yok. En azından şema olmayınca bazı detayları göremiyoruz. Pic bir şekilde bluetooth modüle bağlı olması gerekiyor. Bağlantı da standart seri iletişim bağlantısı kullanılıyor ise 9600 baud ile haberleşmesi gerekir. Yok bluetooth üzerinde ayar yapabilme imkanın var ise 2440 ile de olur ama her iki tarafta bu hızın eşit olması gerekir. Bana kalırsa 48 Mhz çalışma için 2400 baud çok yavaş kalır. Bunu artırabildiğin oranda artırman gerekir. Bir de Bluetooth default haberleşme hızı nedir ona da bir bakmanda yarar var sanırım.

Ete

hakki0548

Modülün datasheetinde baud hızının 9600 olduğunu gördüm. 48 mhz osc için şu ayarları kullandım:

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 225 ' 9600 Baud @ SPBRGH = 4
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator


pause 300
ifadesini ekledim

TEMP=RCREG 
ifadesini ekledim.

Devre bağlantısına gelince bluetooth modülünün TX pini 18f4550'nin PortC.7 (RX) pinine, modülün RX pini 18f4550'nin PortC.6 (TX) pinine bağlı. PortB'de ise 8 adet led bağlı.

Telefondan modüle örnek olarak 255 değerini gönderdiğimde PortB'deki tüm ledlerin yanmasını istiyorum. Bunun için
hserin [AL] 
       PORTB  = AL

kodunu ekledim.

Kodların son durumu şu:
DEFINE OSC 48

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 225 ' 9600 Baud @ SPBRGH = 4
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

RCSTA = %10010000       ' Enable serial port and continuous receive
TXSTA = %00100000       ' Enable transmit and asynchronous mode

RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT

TRISB = 0             
portb = 0
Trisc = %10000000

CMCON=7

AL var byte
TEMP VAR BYTE


pause 300     
 
    basla:

       Goto basla       
     
DISABLE
INT:
    GIE=0
                               
       hserin [AL]
       PORTB  = AL

    TEMP=RCREG
    GIE=1
    Resume
    enable


Henüz bir sonuç alamadım

ete

Bu hali ile programda hata yok gözüküyor. Son bir şey sorayım. Bluetooth TTL mi çalışıyor? Çünki Pic TTL çalışır. Yani HIGH seviyesi +5V , GND si ise sıfır volt dur.  Bu değerler PC lerde farklıdır. Mesela PC de (R232 Portunda) HIGH= -10V dur.
LOW ise +10V dur. Bu yüzden Pic ile PC yi haberleştirirken seviye düzeltici olarak MAX232 entegresi kullanılır. Yoksa bir birlerinin dediklerini anlamazlar. Acaba Bluetooth da böyle bir şey varmıdır.
Ayrıca Pic default haberleşme ayarı 9600 Baud , 8 data biti ve 1 stop biti olarak haberleşir. Bunun standart adı 8N1 dir.
Bluetooth'un değerlerini kontrol ediniz. Gerekirse bir lojik analizör ile sinyal seviyelerini ve gelen giden data ların neler olduklarını kontrol ediniz.

Ete

hakki0548

Stop biti kullanmayı bilmiyorum. Yardımcı olur musunuz

ete

Stop bitini sen kullanmayacaksın zaten. O standart bir seçenek. Parity denilen parametre seçenekli dir. Default olanı No parity olup 8N1 deki N harfi no parity anlamına geliyor. Parity ile ilgili diğer seçenekleri aşağıda görebilirsin.

DEFINE HSER2_EVEN 1 'Hser(2) Use only if even parity desired
DEFINE HSER2_ODD 1 'Hser(2) Use only if odd parity desired
DEFINE HSER2_BITS 9 'Hser(2) Use 9th bit for parity

Bluetooth ile karşılaştır bunalrdan birisi ise sende o satırı ilave et programa.
Başkada yapacak bir şey yok gözüküyor.

Ete

hakki0548

DEFINE HSER2_BITS 9 'Hser(2) Use 9th bit for parity

yazınca sorun kalmadı. çok teşekkürler

ete

Hallolduğuna sevindim. Şimdi sende bu projeyi yayınla bakalım. Yada en azından bluetooth modülü konusunda biraz bilgi ver.
Bluetooth haberleşmesi yapacaklara yardımı olacaktır.

Ete

hakki0548

#8
Bitireyim yayınlarım da ben tek ledle denemiştim. şimdi portb'ye 8 led bağladım. fakat çok saçma sonuçlar alıyorum. Telefondan gönderdiğim sonuçlar ve karşılığında yanan ledler şöyle:

1 ->   11101000  (232 ediyor)
2 ->   11101001  (233)
4 ->   11101010  (234)
8 ->   11101100  (236)
16->   11111001  (249)
32->   11111111  (255)
64->   11111001  (249)
128>   10110001  (177)


sayılarda ilk başta bir bağlantı var gibi görünüyor ama sonlarda saçmalıyor. nedir acaba bunun sebebi

ete

Bir anlam vermek zor gerçekten.  Bir uyuşmazlık olduğu kesin gözüküyor. Bluetooth modülün bir data sheet'i varmıdır bakalım.
Ete


ete

Çok zayıf bir data sheet. Seri port ile ilgili bilgi yok denecek kadar az maalesef.
Tek görebildiğim default baud rate 9600. Onun dışında bir bilgi yok.
Alet genelde AT komutları ile çalışacak şekilde düşünüldüğü için o konuya ağırlık verilmiş. Pin34 HIGH da tutulur ise alet AT modunda kalıyor. Bu pinin LOW da tutulması gerekir. Bir diğer konuda TX pininde Pullup olmadlığı belirtilerek dışarıdan bu pine bir pullup direnci bağlanmalı denilmiş. RX pininde dahili pulldown direnci mevcutmuş. Bu durumda MCU TX pininde her hangi bir pullup yada pull down direnci olmaması gerekir.
Gördüklerim bunlar. Bence sistemi 9600 baud olarak ayarlayıp bu anlattıklarıma göre düzenleme yapıp denemek lazım. Çalışmıyor ise firmasındanbilgi almak en doğrusu olacaktır.

Ete

zoptrik

Projeyi merakla bekliyorum. Mükemmel işler çıkar bu projeden.
Androidin programını siz mi yazdınız? Yoksa hazır programlar var mı?
Merakla bekliyorum.
İyi forumlar...
DEHA; İMKANSIZDA MÜMKÜNÜ GÖREBİLMEK DEMEKTİR.GEMİLERİN KARADA DA YÜZEBİLECEĞİNİ SEZMEK, MEHMETLERDEN BIRINI "FATİH" YAPAR...!

hakki0548

Proje henüz bitmedi. Bitiğinde güzel olacağına eminim. ds18b20 kullanarak sıcaklık okuyup bunu telefona aktarmayı ve telefondan devredeki röleleri sürmeyi planlıyorum. Android programına gelince hazır bir bluetooth chat programı bulup düzenlemeler yaparak az önce anlattığım işleri yapacak şekle getirdim

zengar

aha ağzımın suyu aktı ;D sabırsızlıkla bekliyorum!

Powered by EzPortal