PIC16F628 USART YARDIM.....

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

sitenindelisi

Alıntı yapılan: "mytap"
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


Bu kısımın,sadece usart kesmesi ile kullanımı durumunda,  PBP için şu şekilde değiştirilmesini şiddetle tavsiye ederim.

data_al:
if TEMP="A" then Hserin [DEC AL1]
if TEMP="B" then Hserin [DEC AL2]
CLEAR TEMP
RCIF=0 
goto main

disable
Usart_Kesme:
TEMP=RCREG 
goto data_al
enable
resume


Daha da iyisi sadece bit düzeyinde bir işaretçi tanımlayarak ve int rutini içerisinde bunu 1 yaparak kesmeden normal çıkın ve program içerisinde işaretçi 1 olmuşsa data_al rutinine gidin ve datanızı alıp müteakiben işaretçiyi sıfırlayın.

i var bit
.
.
.
goto main
data_al:
if TEMP="A" then Hserin [DEC AL1]
if TEMP="B" then Hserin [DEC AL2]
CLEAR TEMP
RCIF=0 
i=0
main:
if i=1 then data_al
.
.
.
.
goto main

disable
Usart_Kesme:
TEMP=RCREG 
i=1
enable
resume

My75

Mytap anladımda A,B,C,D,E,F değişkenlerini gönderirken alıcı tarafta zaten geleni sırayla A,B,C,D,E,F değişkenine yazıyor..Daha doğrusu ben bir cihazdan aldığım 01 FE 55 FE 55 F2 kodlarını sırayla bu değişkenlere atıyorum,yani okuyacağım kodlarda bir değişiklik yapamıyorum..Mesela ilk bit 01 oldugunda bu cihaz bir işlev yapıyor,bu bit 26 oldugunda başka bir işlev,aynı şekil 2. bitteki FE değişimi ise bu hatta bağlı adres değişimi için...

  Aslında serin komutuyla ben işi coktan hallettim ama sağlıklı çalışmadı,kilitlenip duruyordu enerjiyi kesip verince calısıyor bir süre sonra tekrar kilitleniyordu..Ete hocamda usart donanımını kullan dedi bende kafa patlatıyorum işte...Neyse biraz daha uğrasayım bakalım...
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

My75

Bu arada Mytap ve Sitemin delisi arkadasıma vakit ayırdıkları için teşekkür ederim....


    Gelen veride bir etiket olusturamam,geleni bit olarak karşılaştırma yapmak zorundayım..Yani gelen A herhangi 1 bitlik bir deger olabilir,"A" şeklinde sabit bir değer yapamam,yada hex kodu bu şekilde "$FE" etiketleyebilirmiyim??? Ben su sekil yapıyorum...

if    A=$FE then
gosub  etiket
endif

if    B=$FD then
gosub  etiket
endif
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

sitenindelisi

PIEI ile PIE1 farklı iki kavram.
PIEI ile kast edilen genel anlamda çevresel kesmelere izin veren bit ve INTCON içinde.

PIE1 ise PIEI nın denetiminde ki 2 çevresel kesme registerından ilki.

My75

Sonunda çalıştırdım arkadaşlar o kadar fazla komuta gerek kalmadı..Gelen veriyi sadece değişkene yazdım,değişkeni rcreg 'e eşitledim ve çıkarken rcreg=0 yaptım şimdi saat gibi çalışıyor....Yardımlarınız için cok tesekkür ederim takıldıgım bir nokta olursa ulasırım sizlere... :roll:

gelendata   var   byte
.
.
.
Kesme:
GIE=0
Hserin   [gelendata]
gelendata=RCREG
Hserout [gelendata]
RCREG=0
GIE=1
RESUME
ENABLE
END

Bu kadarcık bir komut ne kadar uğrastırdı beni....
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

sitenindelisi

Hem mantık hatası, hemde programlama hatası var.


Hserin [gelendata]

Bu komut gerekli değil. RCREG içerisidinde bu bilgi alınmış durumda zaten.Birde serin yapmaya gerek yok.
Serout komutunu int rutini dışına taşırsan, yazlım açısından çok daha doğru olur. INT işlem yapmamız için değil, iç ve dış olayları sadece denetlememiz içindir. İşlemleri int dışında yapmalıyız ki gözümüz kulağımız sürekli açık olsun. Bu şuna benzer;
karşıdan karşıya geçerken sağa ve sola bakıyoruz, araba geliyor, bekliyoruz , geçiyor tamam deyip bir daha sağa ve sola bakmadan gözlerimizi kapatıyoruz ve devam ediyoruz geçmeye.
Sence güvenli mi. ;)

My75

Dediğin şekildede oluyor ama ilk bilgiden sonra sıfırlandığı için boş bilgi gönderiyor,neyse iyice mantığıma yatmaya başladı..Hserout komutunu bende aynı şekil düşünüyorum burda sadece test amaçlı...Str dizgisini hatırlayamadım..gelendata var byte [6] yaptım ama gönderirken str yapmam lazım sanırım..Kitaptan buldum ama örnek vermemiş dostum...
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

sitenindelisi

anlamadım. 1 bytetan fazla bilgiyi almak ise sorun, Mytap'ın verdiği linkte bit pointerı byte yaparsan işini fazlası ile görür. Bu değilse sorun, ben anlayamadım.

My75

Sitenin delisi evet dediğin şekilde yaptıgım zaman ilk veriyi gönderiyor sonraki bilgiler FF gidiyor...STR olayını hatırladım...

gelendata   var   byte[6]  ' Datayı 6 bit olara al...
.
.
.
Hserin       [STR gelendata\6]
Hserout     [STR gelendata\6]   '6 bit olarak gönder...

Denedim sorun yok...İlgilendiğin için çok teşekkür ederim,yatma zamanı geldi,asıl programa yarın başlayacağım...İyi geceler dostum..
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...