eusart kesme

Başlatan burakozdmr, 30 Eylül 2015, 16:27:08

burakozdmr

Merhaba arkadaşlar. Aşağıdaki kodlarla seri porttan veri geldiğinde kesme oluşması için bir program yazmaya çalışıyorum. Fakat program kesmeye girmiyor.  Fikri olan varsa yardımcı olabilir mi? Birde 4mhz kristal kullanıyorum. Tam olarak configürasyonu nasıl yapmam gerekiyor. Programda portb.1 e bağlı butona basınca seri portdan veri gönderiyor. Karşıdaki cihaz buna cevap verdiğinde kesmeye girip veriyi almasını istiyorum.Kesmeye girdiğinide portb.0 a bağlı ledin durumunu gözlemleyerek kesmede olup olmadığını anlamaya çalışıyorum. Fakat 2. sefere butona bastığımda program hiç tepki vermiyor. microcodestudio 4 kullanıyorum ve pic kit 2 ile programı yüklüyorum. Yardımlarınız için şimdiden teşekkürler

DEFINE OSC 4                
  DEFINE        HSER_CLROERR 1
  DEFINE        HSER_RCSTA  90h
  DEFINE        HSER_TXSTA  24h
  DEFINE        HSER_SPBRG  25
  DEFINE        HSER_SPBRGH 0
  l             var byte
  k             var byte
  j             var byte
  i             var byte
  tgl           var byte
  rxtemp        var byte[20]
  rxreel        var byte[20]
  temp          var byte
  colon         var byte 
  colon         = $3a
  hmi           VAR byte 
  hmi           = 1
  LRC           var byte
  funcbyteyaz   var byte
  funcbyteyaz   = 6
  funcbyteoku   var byte
  funcbyteoku   = 3
  
  adress        var word
  adressl       var adress.lowbyte
  adressh       var adress.highbyte
  adress        = 125
  send_d        var word
  send_dl       var send_d.lowbyte
  send_dh       var send_d.highbyte
  send_d        = 1
  'cr           var byte 
  'cr           = 13
  lf            var byte
  lf            =  10
  A             var BYTE[20]
  INTCON        =%11000000 
  OSCCON        =%01100000                 
  PIE1          =%00100000
  IPR1          =%00100000
  TRISC         =%11111111
  TRISB         =%00000110
  PORTC         =0
  PORTB         =0
  include "modedefs.bas"
  ON INTERRUPT GOTO serikesme
  Enable     interrupt
start:
            HIGH        PORTB.0
            PAUSE 1500
            LOW         PORTB.0
            PAUSE 500
mainloop:
            while portb.1= 0
            pause 250
'OUT:
 '           IF PIR1.4=0 THEN OUT
            gosub txlrccalc
            hserout [colon, HEX2 hmi,hex2 funcbyteyaz,hex2 adressh,hex2 adressl,hex2 send_dh,hex2 send_dl,hex2 lrc,cr,lf]
            'hserout [colon, HEX2 hmi,hex2 funcbyteoku,hex2 adressh,hex2 adressl,hex2 send_dh,hex2 send_dl,hex2 lrc,cr,lf]
            wend
            while portb.2=0  
            pause 500
              gosub unpack
              gosub unpacksend
            wend
            GOTO mainloop
txlrccalc:
            LRC=hmi+funcbyteyaz+adress+send_d
            lrc =~LRC + 1 
            return 
            
unpack:
            for i = 0 to 4
                if rxtemp[i] == colon Then  i=k :gosub copy     
            next   i
            RETURN
copy:
            j=0
            for i=k to 20
                rxreel[j]=rxtemp[i]
                j=j+1
            next i
            return
unpacksend
            serout2  PORTD.1, 84,[str rxreel\10]
            pauseus 50
            return

            DISABLE  interrupt
serikesme:
            INTCON.7    =0
            hserin  [ STR rxtemp\20]
            for l=0 to 10
            TEMP=0
            next l
            TOGGLE PORTB.0
            serout2  PORTD.1, 84,[str rxtemp]         
            for l=0 to 10
            TEMP=0
            next l
            INTCON.7=1
            RESUME
            enable  interrupt
            
            
            END
           

sezgiin

merhaba öncelikle devrenin şemasını da eklemenizi isteriz. Yazılımda ise iki sebepten dolayı sorun olabilir;birincisi  hserin  [ STR rxtemp\20] demişsin eğer burada toplamda 20 beyte veri gelmezse  program bekleme konumunda kalır. Ama 20 byte alıyorsan sorun olmayacaktır. ikincisi ise Kesmeden çıkmadan önce PIR1.5 (RC1IF  Receive interrupt flag bit) i sıfırlamanız gerekir aksi halde sürekli kesme işlemini icra eder.

ete

Kesme bayrağı RCREG sürekli set edilmiş kalıyor ve programda kesmeden çıkarçıkmaz yeniden kesmeye giriyordur.
Rcreg direk ulaşılan bir register değildir. Bu nedenle Rcreg=0 diyerek sıfırlayamazsınız. Ancak ve ancak Rcreg içi boşaltılınca kendiliğinden sıfırlanır. Yani Temp=Rcreg şeklinde bir başka değişkene eşitlenmelidir. Kesmeden çıkmadan önce bu işlemi yapın.
Program hangi işlemci için yazılmış belli değil !!!

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

burakozdmr

Merhaba, Programı 18f4550 için yazdım.

RCIF bitinin datasheet de yanlızca okunabilir bir bit olduğu ve RCREG boşaldığında kendiliğinden sıfırlanacağını söylüyor. O zaman RCIF bitine doğrudan bir şey yazamam. (ETE bunu demek istemişti sanırım.)
Ama şu 20 karakter olayını bilmiyordum. Değiştirip deneyeceğim. Teşekkür ederim.