alicida birden fazla veri okunmasi

Başlatan selvi, 04 Mart 2009, 09:37:30

selvi

vericiden ornegin;veri =10 ve veri =20 degerlerini gonderdikten sonra alicida, usart kesmesini kullanarak nasil  bir programla bu verileri okumaliyim.
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]'uyandirma sinyali preambl
HSEROUT ["A","R","A",DEC VERI ,123]
seklinde vericide 2 adet (ver=10 ve ver=20) veriyi bir butona basarak 2 veriyi aliciya seri gonderip alicida bu verileri usart kesmesi ile okumam gerekiyor.usart kesme kismini nasil duzenlemem gerekiyor.
ornegin;alici=rcreg seklinde veri okunuyor.ama (ARA) kismini   nasil degerlendirecem.
Yaşam anlamlandırıldıkça kutsaldır....

ete

Usart kesmesine bir örnek aşağıda veriyorum. Örnek RF ile yollanan sıcaklık bilgisinin USART kesmesi yolu ile alınmasına örnektir.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [E.T.E]                                           *
'*  Notice  : Copyright (c) 2007 Ete]                           *
'*          : All Rights Reserved                               *
'*  Date    : 28.11.2007                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
PORTA=0:TRISA=0
PORTB=0:TRISB=%00000010
CMCON=7  
INTCON=%11000000
DEFINE OSC 4

DEFINE LCD_DREG PORTA    'LCD data bacaklari hangi porta bagli ? 
DEFINE LCD_DBIT 4      'LCD data bacaklari hangi bitten basliyor ?

DEFINE LCD_DREG PORTb    'LCD data bacaklari hangi porta bagli ? 
DEFINE LCD_DBIT 4       'LCD data bacaklari hangi bitten basliyor ?
 
DEFINE LCD_EREG PORTb    'LCD Enable Bacagi Hangi Porta bagli ?
DEFINE LCD_EBIT 3      'LCD Enable Bacagi Hangi bite bagli ?

DEFINE LCD_RSREG PORTB    'LCD RS Bacagi Hangi Porta bagli ?
DEFINE LCD_RSBIT 0       'LCD RS bacagi Hangi Bite bagli ?

DEFINE LCD_BITS 4       'LCD 4 bit mi yoksa 8 bit olarak ba?ly ?
DEFINE LCD_LINES 2       'LCD Kaç syra yazabiliyor ? 

DEFINE LCD_COMMANDUS 2000 'Command delay time in us 
DEFINE LCD_DATAUS 50 'Data delay time in us   

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

'OPTION_REG.7=1
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_ON
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_OFF
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT

    ISI1    VAR     BYTE       
    ISI2    VAR     BYTE  
    SIGN    VAR     BYTE
    TEMP    var     BYTE
    I       VAR     WORD
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

LCDOUT $FE, $40, $06, $09, $09, $06, $00, $00, $00, $00 ' 
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT
lcdout $FE,1,"LUTFEN  BEKLEYIN"
FOR I=0 TO 10200
 PAUSEUS 5
NEXT

LCDOUT $FE,1
BASLA:

      lcdout $FE,$C0,"SICAKLIK:",SIGN,dec ISI1,",",dec ISI2,0,"C "
      GOTO BASLA
      
DISABLE
INT:
    GIE=0
    hSerIn , [WAIT("ETE"),ISI1,ISI2,SIGN]  
    TEMP=RCREG 
    GIE=1
    Resume
    enable


Burada ;
TEMP=RCREG   komutuna dikkat etmeni özellikle belirtiyorum. Bu komut RCREG buffer'ının boşaltılmasını sağlamaktadır. Koymaz isen buffer boşaltılamadığı için sorunlar yaşarsın. Diğer bir önemli konuda bilgi paketinin baş tarafında bir şaretçi kullanman. Bu örnekte ben "ETE" kullandım. Mümkünse herhangi bir 3 karekterli işaret kullanabilirsin. 3 karekter diyorum çünki yaptığım deneylerde en iyi neticeyi 3 karekterli bir şaretçiden aldım. Sende bu konuda denemeler yapabilirsin.

Diğer yerleri açıklamaya gerek yok sanırım. Örnek her türlü detayı göstermektedir.

İşin bilgi gönderme tarafında ise bence USART kesmesi kullanmaya lüzum yok. Ama USART kullanmaya lüzum var tabiiki. Yollama şeklin ,
      HSEROUT [REP$55\5,REP$00\5,REP$FF\5]
      HSEROUT ["E","T","E",ISI1,ISI2,SIGN]
gibi olabilir.

Kolay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

hocam ben vericiden bir butonla 3 veriyi seri yolluyorum.2. bir butonla tek bir veri  yolladigimda alici kisminda nasil bir degisiklik yapmak gerekiyor.
DISABLE
INT:
   GIE=0
   hSerIn , [WAIT("ETE"),ISI1,ISI2,SIGN]
   TEMP=RCREG
   GIE=1
   Resume
   enable
sizin verdiginiz programda 3 veri kontrol ediliyor.tek bir veri nasil kontrol edilecek.ornegin;isi1=40 verisini yolladigimda alicida if isi1=40 then portb.0=1   seklinde bir kontrol ile olur mu?
   (ETE) isareti de  temp degiskenin icine atiliyor mu?
    birde hserin den sonra virgul kullanilmasa bir sorun yaratir mi?ben simdiye kadar virgul kullanmadim.derlemede bir hata vermiyordu.
Yaşam anlamlandırıldıkça kutsaldır....

ete

Veri adedi tamamen sana bağlı istersen 1 adet koy istersen 2 adet istersen 3 adet veri değişkeni koyarsın. Ama  kaç veri geliyor ise o kadar değişken koymak en idealidir.

Diyelimki 3 adet veri değiknei yazdın ama 2 veri yolladın. 3. veri değişknei sıfır olarak değer alacaktır.
Diyelimki tersi oldu. 2 veri değişkeni yazdın ama 3 veri yolladın.
3. veri alınmayacaktır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

selvi

hocam bir de soyle bir veri degerlerinme programi var.bu kesme programinda if TEMP="A" then Hserin [DEC AL1] seklinde bir yazilimi derleyici hata olarak kabul ediyor.proton derleyisinde de denedim.hata verdi.bunu sunun icin belirtiyorum.diyelim 2 butonla 2 ayri veri yollayacagim asagidaki ornekte oldugu gibi 2 farkli isaretci(temp=a ve temp=b )veri oncesi yollacagim .bu durumda alici kismi nasil duzenlenecek.
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
Yaşam anlamlandırıldıkça kutsaldır....

ete

#5
Bu tür karşılaştırmalar sorun çıkartabilir.
Bana kalırsa 1. butona basılınca farklı bir işaret (mesela "BTA") ikinci butona basılınca farkli bir işaret (Mesela "BTB") uygulasan daha iyi olur gibime geliyor.
Ayrıca TEMP=RECREG komutu işlenen sonbilgiyi vereceğinmden orada A veya B bilgisini göremeyeceksin muhtemelen.

İki ayrı butona göre bir wait hazırlarsan sorunun hallolur gibi geliyor bana.
HSERIN [wait"BTA",AL1]
HSERIN [wait"BTB",AL2]
programın gereksiz beklememesi için birer timeout zamanı ile etiketi koyarsan sorun çıkmaz sanırım.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

canbulut

Alıntı yapılan: ete - 04 Mart 2009, 17:53:31
Veri adedi tamamen sana bağlı istersen 1 adet koy istersen 2 adet istersen 3 adet veri değişkeni koyarsın. Ama  kaç veri geliyor ise o kadar değişken koymak en idealidir.

Diyelimki 3 adet veri değiknei yazdın ama 2 veri yolladın. 3. veri değişknei sıfır olarak değer alacaktır.
Diyelimki tersi oldu. 2 veri değişkeni yazdın ama 3 veri yolladın.
3. veri alınmayacaktır.

Ete



s.a ete hocam ben bu işlemi şöyle yaptım...mesela 10 adet değişken tanımladım.10 adet veri yollarsam sorun yok ama gel gelelim 5 adet veri yollaYınca seri kesmenin içindeki komutları işletmesi için için 2 kere gönderme yapmam gerekiyor...yardımcı olursanız sevinirim

ete

Bu tamamen senkron olayı ile ilgili. Hiç bir şey vermez isen ancak bu şekilde akıl vererek yardımcı olabilrim.
Preambl denilen ön bilgiyi (rep $AA\5, rep $00\5, rep $FF\5) yollarsanız bu sorun muhtemelen çözülmesi gerekir.
Birde data paketi başına en fazla 3 karekter işaret koyun ("E","T","E") gibi.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

cuneytatay

herkese merhaba,

bu konu ile ilgili benimde bir sorum olacak, bende rf ile ilgili bir alıcı verici yaptım ve çalıştırdım.
Benim sorunum ise
HSERIN [wait"BTA",AL1]
gibi bir komut yazdığımda program sürekli burada kalıyor, "BTA" gelince diğer işlemlere devam ediyor. Ben bu arada başka işlemlerde yaptırmak istiyorum ama olmuyor. Kesme kullanayım dedim bu seferde çok fazla parazit geldiği için saçma işlemler yapıldı.

Örneğin LCD de hem saat tarih hemde ısı göstersin aynı zamanda rf ten gelen bilgiye göre işlem yapsın istiyorum. Bu mümkün müdür.

canbulut

#9
Alıntı yapılan: ete - 13 Mayıs 2011, 08:12:25
Bu tamamen senkron olayı ile ilgili. Hiç bir şey vermez isen ancak bu şekilde akıl vererek yardımcı olabilrim.
Preambl denilen ön bilgiyi (rep $AA\5, rep $00\5, rep $FF\5) yollarsanız bu sorun muhtemelen çözülmesi gerekir.
Birde data paketi başına en fazla 3 karekter işaret koyun ("E","T","E") gibi.

Ete

ete hocam öncelikle ilgilendiğiniz için teşekkr ederim......gelen her karekter bir değişken içine yazılıyor.ben gelen karekterlerin içeriğini 10 tane değişken içine yazdırıyorum..eger 10 karekter gönderiyorsam sorun yok.çok güzel çalışıyor.ama gel gelelim 10 değilde 5 karekter göndereyim dediğimde veri gönderme işlemini ikinci kere gönderme yaptığımda yapıyor...ilk 5liği gönderme işlemi yapmıyor illaki ikinci 5liği istiyor...hserout yapmak için halbuki ben hep ne olursa olsun her bilgi gönderdiğimde hseroutu işletmek istiyorum.ilgilendiğiniz için ne kadar teşekkür etsem azdır.sağolun.önemli bir  bilgi vermem gerekirse gelen bilginin başına bir şey koyma şansım yok.