usart kesmesi program donuyor

Başlatan zenze, 04 Mart 2013, 20:00:55

zenze

Aşağıdaki program da rx e veri geldiğinde program kilitleniyor.Kesme yede gitmiyor(kesmedeki iş de yapılmıyor) normal gönderme işi de donuyor bakabilirmisiniz?

INCLUDE "modedefs.bas"
DEFINE OSC 4
DEFINE HSER_RCSTA 90H
DEFINE HSER_TXSTA 24H
DEFINE HSER_BAUD  9600
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 '
'KESME AYARLARI**********************
INTCON.7=1 'genel kesmeler açık
INTCON.6=1 'perip kesmeler açık
PIE1.5 =1  'usart kesmesi açık
PIR1.5 = 0 'KESME BAYRAĞI SIFIRANDI
'İN OUT AYARLARI**********************
*
*
*

ON INTERRUPT GOTO KESME




BASLA:
TUS = 18
GOSUB TUS_TARA
GOSUB GONDER

TUS_TARA:
    *
     *
    RETURN

GONDER:
    'HSEROUT ["AA","00","AA","00"]
    HSEROUT ["SIFRE",#TUS]
    GOTO BASLA


DISABLE
KESME:
    HSERIN [WAIT ("SIFRE"),PLCDATA]
    PORTA = PLCDATA
    TEMP = RCREG
    PIR1.5 = 0'KESME BAYRAĞI SIFIRANDI
   
    Resume
    enable
END


rx e gelen de şu    HSEROUT ["SIFRE",#PLCGO]

haydarpasamikro

Kesmenin içinde Hserin kullanmayın. Çünkü bu komut donanımsal olarak bir seri data bekler. Zaten kesme olunca seri data gelmiştir. Kesme bayrağı aktif olmuştur. Kesmenin içinde kullanmayın. Kesmenin içinde seri kesme bayrağı aktif mi bakın. Öyleyse seri geleni okuyun. Bayrağı sıfırlayın. Kesmeden çıkın.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

zenze

kesmenin içinde PIR1.5 = 1 se geleni serin  le aldım
bu seferde kesme alt programı gelen datayı almıyor

zenze

aslında usart kesmesi kullanırken kesme içnde bilginin serinle alındığını da hiç görmedim genelde hserin kullanılıyor , doğrumudur

serhat1990

#4
Merhabalar basic bilmiyorum ama bildiğim şu var. hserin & hserout donanımsal usart komutları . Serin serout yazılımsal usart komutları . Bundan dolayı kesme için donanımsal  usart kullanıldığına göre hserin ile veri alınması gereklidir diye düşünüyorum. Yalnız şöyle birşey var ...

HSERIN [WAIT ("SIFRE"),PLCDATA]


Buradaki komutta bir string ifade bekleniyor gibi . Kesme içinde bir daha veri gelmesini bekler bu komut eğer yanlış anlamadıysam buda programda tıkanmaya yol açar . Kesme gelince 1 veri geldi . Bayrağı sıfırlamadan diğer veriyi alamazsın . Bu mcu'nun tıkanmasına yola açabilir . Kesme içerisinde direk RCREG'den veri alınarak bayrağı temizleyip programa geri dönmek en garanti yol olur .


İyi çalışmalar...

ibrsel

#5
Programında öncelikle şu hatalar var gibi..( Tabii programının tamamını paylaşmadığın için yukarıda eklediğin kodlara göre yorum yapıyorum)

Programında "Gosub GONDER" komutunun hemen altına "Goto BASLA" komutunu ekle..
"GONDER" alt programının sonundaki "Goto BASLA" komutu yerinede "RETURN" komutunu ekle..
(NOT: Gosub GONDER komutu ile dallandığın alt programdan RETURN ile değil GOTO BASLA ile geri dönüş yapmışsın.
Bu yığın belleğin taşmasına be programında hatalı çalışmalara neden olur. Aslında derleme esnasında uyarı şeklinde bu hatanın derleyici tarafından belirtilmesi lazımdı diye hatırlıyorum.)

Ayrıca Basic Donanımsal kesmeyi desteklemiyor..Dolayısı ile kesme programının içerisinde Hserin komutunu kullanmanız hatalı olacaktır..

İyi çalışmalar..

zenze

" Kesmenin içindeyken gelen seri verinin sadece 1 baytını alabilirsiniz " ifadesine katılmamakla beraber

Usart kesmesi içindeki ver serin lemi hserinle mi sağlıklı alınabilir net olarak  söyleyecek bir arkadaş var mıdır?

vatandas30

define osc 4 
INCLUDE "modedefs.bas"
cmcon=7 
porta=0 : portb=0
trisa=%00000000
trisb=%00000010

DEFINE HSER_RCSTA 90h  
DEFINE HSER_TXSTA 20h  
DEFINE HSER_BAUD 2400
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%  
DEFINE HSER_CLROERR 1

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

................
        
INTCON=%11000000               
ON INTERRUPT GOTO kesme
RCIE=1
PAUSE 300

................

DISABLE
kesme:

IF RCIF = 1 THEN 
          RCIE = 0 
          RCIF = 0 
          HSERIN 5, ATLA,[WAIT("TUN"), bilgi]   'HSERİNDEN SONRA GELEN SÜRE GERÇEKTE 10 YAPILACAK            
          RCIE = 1
          RESUME karar
          ENDIF
ATLA:
RCIE = 1 
    Resume   
enable
 


Ben bu şekilde kullanıyorum. kesme oluşursa, 5 sn "TUN" bilgisini bekliyor. gelirse bilgi ye atıyor ve kesmeden çıkıyor. gelmezse kesmeden çıkıyor. şimdiye kadar hiç problem çıkmadı. takılma vs. de olmadı.

mg1980

Hocam,
Bu işin piri etepic.com'da Ete Hocam'dır her halde.Bi zahmet ona sorun.Kolay gelsin.mg1980