PIC16F628 USART YARDIM.....

Başlatan My75, 11 Şubat 2007, 21:30:39

My75

Arkadaslar usart kesmesini Erdal hocamın kodlarıyla evirdim çevirdim çalıştırdım...Çok basit bir test programı yazdım,porta.0 bağlı bir ledi ana programda 500ms. aralıklarla yakıp söndürüyorum..rx ucuna 6 bitlik herhangi bir sinyal geldiği zaman kesme altprogramına gidiyorum..Burada hserin ile bilgileri okuyup hseroutla gönderiyorum,buraya kadar tamam ama ana programa geri dönüp led devam etmesi gerekirken her data gelişinde kafasına göre yanıp sönüyor...Hserin ve Hserout çalışıyor...

     İşimi kolaylaştırmak için pic geliştirme kartı aldım,verileri docklight ile gönderiyorum ve alıyorum sorun yok...Lütfen bana kısa bir örnek verin her komutun ne işe yaradığını yazınki öğreneyim...Led yanıp sönsün ve data geldiğinde datayı alıp yine göndersin..Teşekkürler
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

mytap

Merhaba bu konu forumda epeyce tartışıldı aşağıdaki bölümden bakabilirsin. Birde kesme kullanarak yapacaksan PROTON'a geçmeni tavsiye ederim. Takıldığın noktaları yine sorabilirsin.

https://www.picproje.org/index.php/topic,13027&highlight=
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

My75

Hepsini inceledim ama şöyle tam tanımlamalarıyla bir örnek yok Mytap arkadasım o yüzden söyle basit bir program istedim..Birde Proton'da komut farklılıkları varmı?? Neden Proton?
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

mytap

Soru sormadan önce yada konulara baktıktan sonra biraz program yazıp denemeler yapıpda tekrar anlamadığınız, takıldığınız yerlerde yardımcı olsak, bu sizin için daha iyi olur sanırım. (Yanlış anlamayın anlamak bakımından). Bu kanıya nerden vardım; Mesajımdan tam 10dk sonra tekrar msj yazmışsınız. Bu kadar kısa bi zamanda okuyup, anlayıp deneme yapmak imkansız bence. Birde Forumda PBP ile Proton arasındaki farklılıklar da bolca mevcut arama fonksiyonundan yararlanın.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

My75

Yanlış anlaşıldıysam özür dilerim ama inanın sabahtan beri ugrasıyorum,önceki konuları mesajlarınızı defalarca inceledim,Ete hocamın örneğini isisde çalıştırdım zaten ordan örnekleyip programı yazdım...Sıkıntım ya programın ortalarından yada sonlardan örnekler verilmiş olması,tam verilenlerde usartta yeni geçmiş biri için ağır geliyor..Kısaca tanım açıklamalarında  "bu böyle oldugu için şu böyle oluyor" diye fazla bir açıklama  yok...Yinede kusura bakma dostum cevabın içinde sağol..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

OG

Alıntı YapBurada hserin ile bilgileri okuyup hseroutla gönderiyorum,buraya kadar tamam ama ana programa geri dönüp led devam etmesi gerekirken her data gelişinde kafasına göre yanıp sönüyor
Dataları değerlendirirken hata yapıyorsundur.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mytap

Kırdıysam özür dilerim. Benimde bi aralar baya kafam ağrımıştı. Programını buraya koy birlikte bir düzene sokalım bakalım nasıl olacak.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

My75

Yok kırılmadım sadece bunalmışım artık, belki cevapların hepside forumda mevcut ama beynim o kadar dolduki belkide boş okuyorum artık anlayamıyorum..O yüzden kısa ve öz bir program istemiştim,aslında programı yazacaktım ama diğer pc'de..Şimdi üşenmeden (laptop oldugu için,usb flash'ımda yok)cd yazıp burdan aktaracağım arkadasım,başınızı ağrıttım kusuruma bakmayın..Bir yere gitmeyin sakın :lol:
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

My75

İşte örneğim,alınan veri herhangi bir veri,aynen aldıgı gibi göndersin diyorum...


@ DEVICE pic16F628                      'işlemci 16F628                                
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak


DEFINE HSER_RCSTA 90h '(alma yazmacının Enable edilmesi)
DEFINE HSER_TXSTA 24h '(gönderme yazmacının Enable edilmesi)
DEFINE HSER_SPBRG 207
DEFINE HSER_BAUD 1200 '(Haberlesme hızının belirlenmesi)
DEFINE HSER_CLROERR 1

INTCON=%11000000
ON  INTERRUPT   GOTO    KESME
SYMBOL  GIE =INTCON.7
SYMBOL  PEIE=INTCON.6
SYMBOL  RCIE=PIE1.5
SYMBOL  RCIF=PIR1.5
RCIE=1    'Ne işe yaradığını bilmiyorum
PEIE=1     'Ne işe yaradığını bilmiyorum
GIE=1      'Ne işe yaradığını bilmiyorum

A   var byte
B   var byte
C   var byte
D   var byte
E   var byte
F   var byte
temp   var byte  'Ne işe yaradığını bilmiyorum
CMCON=7
PORTA=0
TRISA=%00000000

BASLA:
PORTA.0=1 : PAUSE 50 : PORTA.0=0 : PAUSE 50
GOTO BASLA


DISABLE
KESME:
GIE=0                 'Ne işe yaradığını bilmiyorum
Hserin  [A,B,C,D,E,F]
Hserout [A,B,C,D,E,F]
TEMP=RCREG      'Ne işe yaradığını bilmiyorum
GIE=1                 'Ne işe yaradığını bilmiyorum
RESUME
ENABLE
END
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

sitenindelisi

https://www.picproje.org/index.php/topic,13027&highlight=

Sevgili Mytap' ın verdiği linki dikkatli inceler iseniz ve bu esnada birde datasheet olursa yanınızda, en fazla 1 saatinizi alır. Göründüğü gibi zor ve karışık değildir. Microchipin, genel donanımsal işlev prosedürlerine gayet uygun. Bu prosedur genel anlamıyla fazla değişmeden diğer donanımsal özelliklere de uygulanabilir durumda. Mantığı bir sefer kavramanız kafi.

mytap

SYMBOL RCIE = PIE1.5   'PIE1 registerinin 5.biti yani USART alıcı mod aktif edilmesi 
SYMBOL GIE = INTCON.7 ' INTCON registerinin 7.Biti Global (genel) kesmelerin aktif edilmesi
SYMBOL PEIE = INTCON.6 ' INTCON registerinin 6.Biti usart kesmelerini aktif hale getirir


VAR demek  değişken tanımlama anlamına gelir word dword byte bit olarak fakat sonradan gördüm.  Bir ihtimalde orda kullanılan değişkenin ne olduğunu soruyor olabilirsiniz. o halde;
Temp de tanımlanmış 1bytelik değişken gelen verinin alındığı değişkendir.
TEMP=RCREG ; yani gelen veri RCREG içerisinde saklı bunu TEMP in içene atıyoruz. TEMP'e attıktan sonra RCIF (Alıcıya bilgi geldiğinde bu RCIF biti 1 e set edilir yani bayrak kaldırır bilgi geldi diye) bayrağı silinir.

Şimdilik bu kadar yeter birde gönderici pic için komutu görelim.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

My75

Buda tx bölümü,1sn. aralıkla 6 bitlik bir kod gönderiyor...Yani bunları temsili yazdım,asıl programa tam öğrendikten sonra geçeceğim..


@ DEVICE pic16F628 'islemci 16F628
@ DEVICE pic16F628, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_OFF 'MCLR pini kullanılmıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak


DEFINE HSER_RCSTA 90h '(alma yazmacının Enable edilmesi)
DEFINE HSER_TXSTA 24h '(gönderme yazmacının Enable edilmesi)
DEFINE HSER_SPBRG 207  
DEFINE HSER_BAUD 1200 '(Haberlesme hızının belirlenmesi)
DEFINE HSER_CLROERR
A   var byte
B   var byte
C   var byte
D   var byte
E   var byte
F   var byte



BASLA:

Hserout [$01,$FE,$55,$FE,$55,$F2]
PAUSE 1000
GOTO BASLA
END
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

mytap

Burda gönderilen bilginin alıcı tarafta hangi değişkene yerleşeceği gibi faktörlerin sağlıklı çalışması için belirleyici bir etiket kullanmak gerek.

gönderici tarafta şöyle yapıyoruz;

basla:
GONDER1=100
GONDER2=200
Hserout ["A",GONDER1] ; Giden veri A100
Hserout ["B",GONDER2] ; Giden veri B200
'
'
'
Goto basla


Alıcı taraf ;
intcon=11000000
On interrupt Goto Usart_Kesme

basla:
for SAYI = 1 to 100
next SAYI             ; biraz bekletiyoruz
goto basla

disable
Usart_Kesme:
TEMP=RCREG ; gelen veriyi TEMP içine attık RCIF silindi!
if TEMP="A" then Hserin [DEC AL1]
if TEMP="B" then Hserin [DEC AL2]
;bu alanda gerekli kontroller yapılarak hızlı bir şekilde rutinin içinden çıkmak gerek.
'
'
'
CLEAR TEMP
RCIF=0 ; Şüphe olmasın tekrar bayrağı silelim
enable
resume


Umarım mantığı anlamışsındır. Birazda uygulama yaparak pekiştirmen gerek. Diğer yandan önemli bir nokta arkadaşda bahsetmiş, kullanacağın işlemcinin datasheetinin inceleyerek registerler hakkında bigi sahibi olmalısın
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

sitenindelisi



Burada bir yanlış bilgi mevcut.PIEI sadec usart için değildir. Küçük GIE diyebiliriz. Aşağıda bulunan tabloda ki kesmelerin aktif edilebilmesine müsaade eder. Bu kesmelerinde alt yapıları için, lütfen ilfgili MCU ya ait olan datasheeti inceleyin.


mytap

Alıntı Yap
Burada bir yanlış bilgi mevcut.PIEI sadec usart için değildir. Küçük GIE diyebiliriz. Aşağıda bulunan tabloda ki kesmelerin aktif edilebilmesine müsaade eder. Bu kesmelerinde alt yapıları için, lütfen ilfgili MCU ya ait olan datasheeti inceleyin.

Sevgili @sitenindelisi
Burdaki PIEI-- PIE1 dimi? Yoksa benmi yanlış anlıyorum. Yanlış olan bilgi neresi anlayamadım. Arkadaşında şimdi kafası karışmasın :)
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------