Pic16f877 ile timer0 kesmesi ve serin

Başlatan yasargunaydin, 24 Ocak 2014, 12:41:36

yasargunaydin

Arkadaşlar Merhaba;
Pic16f877 ile timer0 kesmesi yapmaya çalıştım.Serin komutunu koymadığım zaman problem yok ama koyduğum zaman duruyor ve dinlemeye geçiyor.Serinde bunu yaptığını biliyorum ama dinleme yaparken biryandanda başka işlem yaptırmalıyım.Yardımcı olabilirmisiniz.
Kesmeye ve ana proğrama şimdilik rastgele komutlar verdim.


TRISA=%11111111     'portA giriş yapıldı
TRISB=%00000000     'portB giriş yapıldı
TRISC=%10000000
TRISD=%11111111
'-------------------------------------------------------------------------------
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON               
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC




DEFINE OSC 4
ADCON1=7 '7. bit 1 yapıldı 10 bit sonuç almak için.
OPTION_REG.7=0 'pull-up dirençleri aktif
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101   'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0


DEFINE LCD_DREG     PORTB
DEFINE LCD_DBIT     0
DEFINE LCD_EREG     PORTB
DEFINE LCD_EBIT     5
DEFINE LCD_RSREG    PORTB
DEFINE LCD_RSBIT    4
DEFINE LCD_BITS     4
DEFINE LCD_LINES    2




SYMBOL ARTIR=PORTD.0   'ART
SYMBOL NPN=PORTD.1   'NPN
SYMBOL GERI=PORTD.2   'GERİ
B0 VAR WORD
SAYI VAR WORD

SAYI=0
'------------------------------------------------------------------------------
A VAR BYTE
A=0

SO VAR PORTC.6
SI VAR PortC.7

BASLA:

LCDOUT $FE,$84,DEC SAYI,"  ",DEC A
LCDOUT $fe,$C0,"PAN:",DEC B0

IF ARTIR=0  THEN
PAUSE 100
While PORTD.0=0 : Wend
LCDOUT $FE,1
A=A+1
ENDIF

IF A=4 THEN A=0

PAUSE 50

GOTO BASLA

DISABLE
KESME:
SERIN SI,2400,B0
SAYI=SAYI+1
IF NPN=0 THEN PORTC=%00010000
IF NPN=1 THEN PORTC=%00000000
INTCON.1=0        'TMR0 Kesme bayrağı sıfırlanıyor
LCDOUT $FE,$84,DEC SAYI,"  ",DEC A
LCDOUT $fe,$C0,"PAN:",DEC B0
RESUME
ENABLE 
       
END

yldzelektronik

Basic üzerinde işler nasıl yürüyor tam olarak bilmiyorum.Fakat önce dikkatimi çeken noktayı söyleyeyim;

OPTION_REG.7=0


demişsin.Arkasından;

OPTION_REG=%10000101


demişsin.Yani önce 0 yapmış,sonra 1 yapmışsın.

Diğer bir konu,SERIN komutu sanırım bütün işi gücü bırakıp portu dinlemeye geçiyor.HSERIN diye bir komutu basic için hatırlar gibiyim.

C'de olduğu gibi birden fazla kesme alt programı tanımlayabiliyorsan, rcv int için de alt program yaz.Olmuyorsa KESME alt programına girdiğinde hangi kesmenin geldiğine bakarak işlem yap.Ancak rcv int de açman gerekecek.

KESME:
If PIR.7 = 1 Then
'Seri port kesmesi kodların
endif
Else If Intcon.0 = 1 Then
'Timer 0 kesmesi kodların
endif
'Burada Pir ve Intcon registerlerinin hangi bitlerinde olduğunu yanlış yazmış olabilirim.Kodlama da hatalı olabilir.Basic çok hatırlamıyorum.
'O yüzden hatalı kısımlar için üzgünüm.Sen halledersin sanırım.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.