USART kesmesi sorunu ?

Başlatan gtekdemir, 29 Eylül 2009, 03:49:35

gtekdemir

Merhaba , iki tane 16F877 yi  USART kullanarak haberleştirmek istiyorum. Vericiden(portc.6) 0 ile 12 arasındaki sayıları birer arttırarak HSEROUT komutu ile gönderiyorum, fakat alıcıda(portc.7) yalnızca bir defa kesme oluşuyor bu seferde timeout oluyor. Sonrasında ise hiç kesme oluşmuyor. Alıcı ve verici kodlarım aşağıda incelerseniz sevinirim saygılar...

Verici:
Device 16F877A
XTAL = 4

Declare HSERIAL_BAUD=2400
Declare HSERIAL_RCSTA=%10010000
Declare HSERIAL_TXSTA=%00100000
Declare HSERIAL_CLEAR=On
SPBRG=25

Dim ver As Byte
Dim temp As Word

ALL_DIGITAL = TRUE

TRISA=0
TRISB=0
TRISC=%11000000 'RX ve TX pinleri giriş
TRISD=0
PORTA=0
PORTC=0
PORTB=0
PORTD=0
ver=0

basla:

For ver=0 To 12
HSerOut [Rep $55\5 , Rep $00\5 , Rep $1F\5] '10101 00000 11111 bilgisi 
HSerOut ["a","b","c",ver] 
temp=TXREG
DelayMS 100
Next
ver=0

GoTo basla
End


Alıcı:
Device 16F877A
XTAL = 4

Declare HSERIAL_BAUD=2400
Declare HSERIAL_RCSTA=%10010000
Declare HSERIAL_TXSTA=%00100000
Declare HSERIAL_CLEAR=On
SPBRG=25

Declare LCD_DTPIN PORTB.4	'DATA girişi PORTB'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTB.3	'LCD'nin Enable ucu
Declare LCD_RSPIN PORTB.2	'LCD'nin Register Select ucu
Declare LCD_INTERFACE 4	    'LCD veri yolu 4 bit olacak
Declare LCD_LINES 2		    'LCD 2 satırdan oluşuyor
Cls					        'Ekranı temizler ve 30 ms gecikme sağlar

Dim veri As Word
Dim temp As Word
Dim i As Byte

INTCON.7=1
INTCON.6=1
PIE1.5 = 1

ALL_DIGITAL = TRUE

TRISA=0
TRISB=0
TRISC=%11000000
TRISD=0
PORTA=0
PORTB=0
PORTC=0
PORTD=0

On_Interrupt GoTo intr

basla:
Print At 1,1,"kesme bekleniyor"
Toggle PORTC.0
DelayMS 100
GoTo basla

Disable
intr: 
HSerIn 1000,Timeout,[Wait("abc"),veri]
Print At 2,1,"gelen veri=",DEC5 veri
temp=RCREG
Resume
Enable

Timeout:
Print $fe,1
For i=0 To 10
Print At 2,1,"time out"
DelayMS 100
Next
Print $fe,1
GoTo basla

End

My75

Merhaba,

basla:
Print At 1,1,"kesme bekleniyor"
Toggle PORTC.0
DelayMS 100
GoTo basla

Kesme beklenirken zaman döngüsünü kısa aralıklarla tutarsan sanırım sorunun çözülür.Delayms 100 yerine

basla:
Print At 1,1,"kesme bekleniyor"
Toggle PORTC.0
for x=1 to 100         '100ms icin 100 defa kesme kontrolu
delayms 1
next
GoTo basla

gibi,yada

basla:
Print At 1,1,"kesme bekleniyor"
Toggle PORTC.0
for x=1 to 1000    '100ms icin 1000 defa kesme kontrolu
delayus 100
next
GoTo basla

basla:
Print At 1,1,"kesme bekleniyor"
Toggle PORTC.0
for x=1 to 10000    '100ms icin 10000 defa kesme kontrolu
delayus 10
next
GoTo basla



gibi..100ms kesme kontrolu için çok uzun bir süre,data alımını etkiler..Zaten gelen veri 100ms aralıklarla geliyor,kesme kontrolu 100ms aralıklarla olursa sapıtır.Tavsiyem sonuncu örnektir..Kolay gelsin.
Tomurcuk için çaba göstermeyen dal,odun kalmaya mahkumdur...

Maxim

alıcıda interrupta gerek yok sanki ,
üstelik hız 2400 baudrate ,

hardware interrupt o şekilde olmaması lazım ,
o yüzden saçmalıyordur ,

alıcı kodunu şu şekilde denermisiniz ?;

Device 16F877A 
XTAL = 4 

Declare HSERIAL_BAUD=2400 
Declare HSERIAL_RCSTA=%10010000 
Declare HSERIAL_TXSTA=%00100000 
Declare HSERIAL_CLEAR=On 
SPBRG=25 

Declare LCD_DTPIN PORTB.4   'DATA girişi PORTB'nin 4. ucundan başlayacak 
Declare LCD_ENPIN PORTB.3   'LCD'nin Enable ucu 
Declare LCD_RSPIN PORTB.2   'LCD'nin Register Select ucu 
Declare LCD_INTERFACE 4       'LCD veri yolu 4 bit olacak 
Declare LCD_LINES 2          'LCD 2 satırdan oluşuyor 
Cls                       'Ekranı temizler ve 30 ms gecikme sağlar 

Dim veri As Word 
Dim temp As Word 
Dim i As Byte 

ALL_DIGITAL = TRUE 

TRISA=0 
TRISB=0 
TRISC=%11000000 
TRISD=0 
PORTA=0 
PORTB=0 
PORTC=0 
PORTD=0 

basla: 
Print At 1,1,"kesme bekleniyor" 
Toggle PORTC.0 
HSerIn 1000,Timeout,[Wait("abc"),veri] 
Print At 2,1,"gelen veri=",DEC5 veri 
GoTo basla

Timeout: 
Print $fe,1 
For i=0 To 10 
Print At 2,1,"time out" 
DelayMS 100 
Next 
Print $fe,1 
GoTo basla 

End

gtekdemir

İlginiz için teşekkürler

@maxiboost; Kesme kullanmadan denediğimde zaten problem yok oldukça güzel çalışıyor amacım kesme kullanmayı öğrenmek, belki bu projede değil ama zamanın önemli olduğu farklı çalışmalarımda kesme kullanmak zorunda kalabilirim. O kadar uğraşmama rağmen nedense kesme ile sağlıklı bir çalışma gözleyemedim.

@My75; tavsiyelerinizi denedim fakat sonuç aynı

Acaba;
Declare HSERIAL_BAUD=2400
Declare HSERIAL_RCSTA=%10010000
Declare HSERIAL_TXSTA=%00100000
Declare HSERIAL_CLEAR=On
SPBRG=25
INTCON.7=1
INTCON.6=1
PIE1.5 = 1
tanımlamalarında mı bi yanlışlık yada eksiklik ? RCREG ve TXREG register' larınıda temizliyorum. Aklıma başka bişeyde gelmiyor delirmek üzereyim.

gtekdemir

Arkadaşlar yokmu bu derde bir deva, acil yardımlarınızı bekliyorum.

muser53

derdinin devası seri iletişim senin keyfini beklemez. 100 msn kaldır. düzelir.

gtekdemir

100ms kaldırdım ama düzelmedi ne yazıkki