18f25k22 Sorunu

Başlatan Elektronikprojem, 08 Nisan 2018, 22:53:59

Elektronikprojem

Merhaba. Bu işlemci ile ilk kez çalışıyorum. Datasheete tam hakim olamadım. Programımda tmr0, usart, b0 kesmelerini aynı anda kullanmak istiyorum. İlk yazdığım program aşağıdaki idi.

ASM
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H       
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H                                                                                     
;    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
     __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L   
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H 
    __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L
    __CONFIG _CONFIG7H, _EBTRB_ON_7H
endasm
DEFINE OSC 16
ANSELA=0
ANSELB=0
ANSELC=0
INTCON2.7=0
IPR1=%00100000
OSCCON =%01111110 
OSCCON2=%00000000
OSCTUNE=%10000000
CCP1CON=0:CCP2CON=0:CCP3CON=0
;-------------------------------------------------------------------------------
TRISA=0         :PORTA=0
TRISB=%00000111 :PORTB=0
TRISC=%10000000 :PORTC=0             
;-------------------------------------------------------------------------------
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 16MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 25  ' 9600 Baud @ 16MHz, 0,16%
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
temp var BYTe
;-------------------------------------------------------------------------------
INTCON=%10110000
T0CON =%10001101
ON INTERRUPT GOTO INT
TMR0=3036
;-------------------------------------------------------------------------------

SYMBOL M2S =PORTB.1
;-------------------------------------------------------------------------------
RPM VAR WORD
rpm=0

RPMAYAR VAR WORD
READ 0,RPMAYAR.BYTE0
READ 1,RPMAYAR.BYTE1

M2 VAR long
READ 30,M2.BYTE0
READ 40,M2.BYTE1
read 50,m2.byte2
read 60,M2.BYTE3

M2ONDA VAR BYTE
READ 5,M2ONDA

M2AYAR VAR BYTE
READ 6,M2AYAR

M2AYARONDA VAR BYTE
READ 7,M2AYARONDA

GELEN VAR BYTE
GELEN=0
GELEN2 VAR WORD
GELEN2=0
GELEN3 VAR WORD
GELEN3=0
GELEN4 VAR WORD
GELEN4=0
SAYI VAR BYTE
SAYI=0
I VAR BYTE
HESAP VAR BYTE
HESAP=0
SAYAC Var word
SAYAC=0
pause 250
;-------------------------------------------------------------------------------
ACILIS:
IF GELEN=61 THEN
GELEN=0
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
pause 50
HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]
pause 50
HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
pause 50
HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]
pause 2000
goto basla
endIF

goto ACILIS
;-------------------------------------------------------------------------------
BASLA:
IF HESAP=1 THEN
RPM=SAYI*60
HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]
HESAP=0
SAYI=0
ENDIF

IF M2S=0 and RPM>=RPMAYAR THEN
WHILE M2S=0 :WEND
M2=M2+M2AYAR
m2onda=M2ONDA+M2AYARONDA
IF M2>999999 THEN
M2=0
M2ONDA=0
endIF
IF M2ONDA>99 THEN
m2=m2+1
M2ONDA=M2ONDA/100
ENDIF
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
WRITE 30,M2.BYTE0
WRITE 40,M2.BYTE1
WRITE 50,m2.byte2
WRITE 60,M2.BYTE3 :pause 10
WRITE 5,M2ONDA :PAUSE 10
ENDIF

IF GELEN=1 THEN
hserout ["AYARLAR"]
HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
PAUSE 10
HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]
PAUSE 10
GOTO AYARLAR
ENDIF

IF GELEN=2 THEN
M2=0
M2ONDA=0
WRITE 30,M2.BYTE0
WRITE 40,M2.BYTE1
WRITE 50,m2.byte2
WRITE 60,M2.BYTE3 :PAUSE 10
WRITE 5,M2ONDA   :PAUSE 10
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
PAUSE 10
GELEN=0
ENDIF
GOTO BASLA
;-------------------------------------------------------------------------------
AYARLAR:
IF GELEN=3 THEN
GELEN=101
GOTO M2AYARLAR
ENDIF

IF GELEN=4 THEN
GELEN=101
GOTO RPMAYARLAR
ENDIF


IF GELEN=0 THEN
HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
pause 10
HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]
GOTO BASLA
endIF
GOTO AYARLAR
;-------------------------------------------------------------------------------
M2AYARLAR:
IF GELEN<100 AND GELEN2<100 THEN
M2AYAR=GELEN
M2AYARONDA=GELEN2
WRITE 6,M2AYAR :PAUSE 10
WRITE 7,M2AYARONDA :PAUSE 10
GELEN=1
GELEN2=0
HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
GOTO AYARLAR
ENDIF
GOTO M2AYARLAR
;-------------------------------------------------------------------------------
RPMAYARLAR:
IF GELEN=1 THEN
RPMAYAR=GELEN2
WRITE 0,RPMAYAR.BYTE0
WRITE 1,RPMAYAR.BYTE1
PAUSE 10
GELEN2=0
HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]
PAUSE 10
GOTO AYARLAR
ENDIF
GOTO RPMAYARLAR
;-------------------------------------------------------------------------------




DISABLE
INT:
IF INTCON.1=1 THEN
SAYI=SAYI+1
INTCON.1=0
GOTO ATLA
ENDIF

IF INTCON.2=1 THEN
HESAP=1
INTCON.2=0 'kesme bayrağı sıfırlandı
TMR0=3036 'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir.
GOTO ATLA
ENDIF

HSERIN ,5,ZIPLA,[WAIT("s"),dec GELEN,dec GELEN2]
ZIPLA:
TEMP=RCREG
RESUME
ENABLE
ATLA:
RESUME
ENABLE



Bu programda timer0 ı 16 bit yapıp her 1 saniyede kesmeye gitmesini istedim ama tmr0 daha kısa sürede kesmeye gidiyor.sonrasında ete hocamla konuştuktan sonra programı aşağıdaki şekilde düzenledim.


ASM
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H       
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H                                                                                     
;    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
     __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L   
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H 
    __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L
    __CONFIG _CONFIG7H, _EBTRB_ON_7H
endasm
DEFINE OSC 16
ANSELA=0
ANSELB=0
ANSELC=0
INTCON2.7=0
IPR1=%00100000
OSCCON  = %01110000; 
OSCCON2=%00000000
OSCTUNE=%00000000
CCP1CON=0:CCP2CON=0:CCP3CON=0
;-------------------------------------------------------------------------------
TRISA=0         :PORTA=0
TRISB=%00000111 :PORTB=0
TRISC=%10000000 :PORTC=0             
;-------------------------------------------------------------------------------
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 16MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 25  ' 9600 Baud @ 16MHz, 0,16%
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
temp var BYTe
;-------------------------------------------------------------------------------
INTCON=%10110000
T0CON=%10000101
ON INTERRUPT GOTO INT
TMR0H=$0B :TMR0L=$DC
;-------------------------------------------------------------------------------
SYMBOL M2S =PORTB.1
;-------------------------------------------------------------------------------
RPM VAR WORD
rpm=0

RPMAYAR VAR WORD
READ 0,RPMAYAR.BYTE0
READ 1,RPMAYAR.BYTE1

M2 VAR long
READ 30,M2.BYTE0
READ 40,M2.BYTE1
read 50,m2.byte2
read 60,M2.BYTE3

M2ONDA VAR BYTE
READ 5,M2ONDA

M2AYAR VAR BYTE
READ 6,M2AYAR

M2AYARONDA VAR BYTE
READ 7,M2AYARONDA

GELEN VAR BYTE
GELEN=0
GELEN2 VAR WORD
GELEN2=0
GELEN3 VAR WORD
GELEN3=0
GELEN4 VAR WORD
GELEN4=0
SAYI VAR BYTE
SAYI=0
I VAR BYTE
HESAP VAR BYTE
HESAP=0
SAYAC Var word
SAYAC=0
pause 250
;-------------------------------------------------------------------------------
ACILIS:
IF GELEN=61 THEN
GELEN=0
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
pause 50
HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]
pause 50
HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
pause 50
HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]
pause 2000
goto basla
endIF

goto ACILIS
;-------------------------------------------------------------------------------
BASLA:
IF HESAP=1 THEN
RPM=SAYI*60
HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]
HESAP=0
SAYI=0
ENDIF

IF M2S=0 and RPM>=RPMAYAR THEN
WHILE M2S=0 :WEND
M2=M2+M2AYAR
m2onda=M2ONDA+M2AYARONDA
IF M2>999999 THEN
M2=0
M2ONDA=0
endIF
IF M2ONDA>99 THEN
m2=m2+1
M2ONDA=M2ONDA/100
ENDIF
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
WRITE 30,M2.BYTE0
WRITE 40,M2.BYTE1
WRITE 50,m2.byte2
WRITE 60,M2.BYTE3 :pause 10
WRITE 5,M2ONDA :PAUSE 10
ENDIF

IF GELEN=1 THEN
hserout ["AYARLAR"]
HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
PAUSE 10
HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]
PAUSE 10
GOTO AYARLAR
ENDIF

IF GELEN=2 THEN
M2=0
M2ONDA=0
WRITE 30,M2.BYTE0
WRITE 40,M2.BYTE1
WRITE 50,m2.byte2
WRITE 60,M2.BYTE3 :PAUSE 10
WRITE 5,M2ONDA   :PAUSE 10
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
PAUSE 10
GELEN=0
ENDIF
GOTO BASLA
;-------------------------------------------------------------------------------
AYARLAR:
IF GELEN=3 THEN
GELEN=101
GOTO M2AYARLAR
ENDIF

IF GELEN=4 THEN
GELEN=101
GOTO RPMAYARLAR
ENDIF


IF GELEN=0 THEN
HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
pause 10
HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]
GOTO BASLA
endIF
GOTO AYARLAR
;-------------------------------------------------------------------------------
M2AYARLAR:
IF GELEN<100 AND GELEN2<100 THEN
M2AYAR=GELEN
M2AYARONDA=GELEN2
WRITE 6,M2AYAR :PAUSE 10
WRITE 7,M2AYARONDA :PAUSE 10
GELEN=1
GELEN2=0
HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
GOTO AYARLAR
ENDIF
GOTO M2AYARLAR
;-------------------------------------------------------------------------------
RPMAYARLAR:
IF GELEN=1 THEN
RPMAYAR=GELEN2
WRITE 0,RPMAYAR.BYTE0
WRITE 1,RPMAYAR.BYTE1
PAUSE 10
GELEN2=0
HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]
PAUSE 10
GOTO AYARLAR
ENDIF
GOTO RPMAYARLAR
;-------------------------------------------------------------------------------




DISABLE
INT:
IF INTCON.1=1 THEN
SAYI=SAYI+1
INTCON.1=0
GOTO ATLA
ENDIF

IF INTCON.2=1 THEN
HESAP=1
INTCON.2=0 'kesme bayrağı sıfırlandı
TMR0H=$0B :TMR0L=$DC  'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir.
GOTO ATLA
ENDIF

HSERIN ,10,ZIPLA,[WAIT("s"),dec GELEN,dec GELEN2]
ZIPLA:
TEMP=RCREG
RESUME
ENABLE
ATLA:
RESUME
ENABLE


Bu kodda da program hiç çalışmıyor. 1 saniyelik kesmeleri oluşturuyor ama İlk açılışta "s61" diye bir bilgi gönderiyorum onu almıyor ki ana döngüye girsin.
Rica etsem sigorta ayarlarına ve register ayarlarına bakabilir misiniz?

Elektronikprojem

Programı anlaşılması için sadeleştirdim. tmr0 ı 500ms de kesme oluşturacak şekilde ayarladım. Şu an seri porttan veri gönderiyorum 10 tane veri göndersem 5 ini kaçırıyor.


ASM
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H       
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H                                                                                     
;    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
     __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L   
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H 
    __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L
    __CONFIG _CONFIG7H, _EBTRB_ON_7H
endasm
DEFINE OSC 16
ANSELA=0
ANSELB=0
ANSELC=0
INTCON2.7=0
IPR1=%00100000
OSCCON =%01111000 
OSCCON2=%00000000
OSCTUNE=%10000000
CCP1CON=0:CCP2CON=0:CCP3CON=0
;-------------------------------------------------------------------------------
TRISA=0         :PORTA=0
TRISB=%00000111 :PORTB=0
TRISC=%10000000 :PORTC=0             
;-------------------------------------------------------------------------------
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 16MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 25  ' 9600 Baud @ 16MHz, 0,16%
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
temp var BYTe
;-------------------------------------------------------------------------------
INTCON=%10110000
T0CON=%10000101
ON INTERRUPT GOTO INT
TMR0H=$85 :TMR0L=$EE
;-------------------------------------------------------------------------------

SYMBOL M2S =PORTB.1
;-------------------------------------------------------------------------------
RPM VAR WORD
rpm=0

RPMAYAR VAR WORD
READ 0,RPMAYAR.BYTE0
READ 1,RPMAYAR.BYTE1

M2 VAR long
READ 30,M2.BYTE0
READ 40,M2.BYTE1
read 50,m2.byte2
read 60,M2.BYTE3

M2ONDA VAR BYTE
READ 5,M2ONDA

M2AYAR VAR BYTE
READ 6,M2AYAR

M2AYARONDA VAR BYTE
READ 7,M2AYARONDA

GELEN VAR BYTE
GELEN=0
GELEN2 VAR WORD
GELEN2=0
GELEN3 VAR WORD
GELEN3=0
GELEN4 VAR WORD
GELEN4=0
SAYI VAR BYTE
SAYI=0
I VAR BYTE
HESAP VAR BYTE
HESAP=0
SAYAC Var word
SAYAC=0
pause 250
;-------------------------------------------------------------------------------
ACILIS:
IF GELEN=61 THEN
HSEROUT ["VERI GELDI"]
GELEN=0
ENDIF
GOTO ACILIS
;-------------------------------------------------------------------------------
DISABLE
INT:
IF INTCON.1=1 THEN
SAYI=SAYI+1
INTCON.1=0
GOTO ATLA
ENDIF

IF INTCON.2=1 THEN
HESAP=1
INTCON.2=0 'kesme bayrağı sıfırlandı
TMR0H=$85 :TMR0L=$EE  'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir.
GOTO ATLA
ENDIF

HSERIN,10,ZIPLA,[WAIT("s"),dec GELEN,dec GELEN2]
ZIPLA:
TEMP=RCREG
RESUME
ENABLE
ATLA:
RESUME
ENABLE

ete

Bir işlemci ile çalışırken onun bütün özelliklerine vakıf olmak gerekiyor. Özellikle USART (bu işlemcide EUSART) kesmesi kullanacaksanız nedir ne değildir öğrenmek gerekiyor.
Şimdi öncelikle programın kesme kısmına bakıyorum.
TMR0 kesmesi, INT kesmesi ve USART kesmesi kullnaılmış.
Bunları aktif eden komutlara bakıyorum. Programın başında INTCON=%10110000 komutu verilerek global kesmeler ve INT0 kesmesi ile TMR0 kesmesi açılmış. Peki nerede USART kesmesi aktivasyonu. Ben göremiyorum.
Peki seri port dan veri almasını sağlayacak kesme aktif değil ise nasıl veri alacak. Verikaçırması elbette normal. Hatta hepsini kaçırması normal bence.

Programın başında bazı tanımlamalar mevcut. Bunlar;
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
Gerek tanımlama yapılmış ama bu tanımlama programın geri kalanında hiç kullanılmamış.
Peki bir kesmeyi aktif etmez isem o kesme çalışırmı? çalışmaz elbette. Peki soruyorum bunları düşünmek çok mu zor? Yani insan kendi kendine soramazmı acaba kesmeyi aktif etmez isem o çalışırmı?
Kusura bakmayn bu konu üzerine fazlaca gidiyorum. Çünki bu işlerin mantıksal düşünceye dayandığını anlatmaya çalışıyorum. Ortada bir özellik var. Bu bir anahtara benzer. Mesela bir lambayı yakacaksın. Ortada akü var lamba var ve bir de açma kapatma anahtarı var. Bütün bunları bir devreye yerleştirmiş olmam lambanın yanmasına yeterlimi. Yeterli ancak o anahtarı açmaz isem o lamba yanarmı sonsuza kadar beklesen yanmaz elbette. O halde anahtarı açman gerektiğinide düşüneceksin. Burada da kesmeyi açmayı bileceksin.

Evet demekki asıl hata EUSART kesmesinin aktif edilmemiş olmasıdır. Dİğer bir konuya da değinmek isterim.
Bu işlemcide iki EUSART portu mevcut. Dolayısıyla hangisinin kullanılacağı da çok önem kazanıyor. Hangisi kullanılıyor ise ona ait kesme aktif edilmeli. Bu örnekte EUSART-1 kullanılmış (tanımlamalarda) işlemci pinlerinde TX1 ve RX1 pinlerinin kullnılıyor olmasına dikkat etmek gerekiyor.

Diğer bir konu şu, define ile USART tanımlamaları verilmiş ama ardından ne hikmet ise yeniden
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 25  ' 9600 Baud @ 16MHz, 0,16%
şeklinde satırlar eklenmiş. Bu neden olmuş acaba merak ettim. Define tanımlamaları işi yapmaz ise bunlar yapsın diyemi?. Olamaz elbette. Bilinçsizce yapılan bir hareket maalesef. Bu satırları oradan silmek lazım.
Data sheet'e bakınca bu işlemcide USART değilse EUSART (Extended USART yani gelişmiş USART) portunun olduğunu anlarsınız. O halde Define komutları buna uygun olarak verilmelidir. Doğruları aşağıdaki gibi olmalıdır.

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 160 ' 9600 Baud @ 16MHz, -0,08%
SPBRGH = 1
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator


Şimdi diyesecksiniz ki bütün bunları en başta bir mesaj ile anlatsam ne olurdu. ? Bu kadar beklemeye yada uzatmaya ne gerek vardı? Bence çok gerek vardı. İnsan yapamadığı şey için uğraş vermeli neden olmadığı konusunda kafa yormalıdır. Bu bilgiyi direk versem bu bilgiiler kesinlikle kafada kalmayacak idi. Ama şimdi iyice öğrendiğini düşünüyorum (umarım)

SOnu olarak işe define komutlarını değiştirerek başla. Ardından ESUART kesmesini aktif et. BASLA satırından evvel bu aktivasyonu yap. Ardından bak bakalım ne oluyor.


Ete


Elektronikprojem

Hocam sağolun defalarca inceledim ama aklıma orası hiç gelmedi. Teşekkür ederim.

Powered by EzPortal