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.

Dtmf

#4
pıc18f25k22 pll ıle 64 mhz'de çalıştırmak istiyorum nrf24l01 spı haberlesmede sorun çıkarıyor aşagıdakı kodlarda eksigimi yazarmısınız rica etsem
Device = 18F25K22
Xtal=64
Config_Start 
FOSC=INTIO67,PLLCFG=On,PRICLKEN=On,FCMEN=On,IESO=On,WDTEN=OFF
Config_End
OSCCON=%01110010 ;16Mhz=%01110010,   8Mhz=%01101100 ,   4Mhz=%01011100
OSCCON2=%11001100;%10000111
OSCTUNE=%01100000

ete

"kodlarda ekisimi yazarmısınız " ne anlama geliyor acaba açıklarmısın?

NRF shift komutları ile çalışır ve 64 Mhz bu komutlar için çok hızlıdır.
Onu biraz yavaşlatman gerekebilir. Bunun için Basic de ;
DEFINE SHIFT_PAUSEUS 50
şeklinde bir komut var. Proton da da benzeri olmalı onu araştır ve deneyerek en uygun pasue değerini bulmaya çalış.

Yukarıdaki tanımlamalarda bir sorun göremedim. Ancak eksik pek çok tanımlama mevcut.
Aşağıdaki örneğe bakarak eksikleri tamamlamaya çalış.

Ete

  CONFIG  FOSC = INTIO67     ; Internal oscillator block
  CONFIG  PLLCFG = OFF       ; Oscillator used directly
  CONFIG  PRICLKEN = ON     ; Primary clock can be disabled by software
  CONFIG  FCMEN = OFF        ; Fail-Safe Clock Monitor disabled
  CONFIG  IESO = OFF         ; Oscillator Switchover mode disabled
  CONFIG  PWRTEN = OFF       ; Power up timer disabled
  CONFIG  BOREN = SBORDIS    ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
  CONFIG  BORV = 190         ; VBOR set to 1.90 V nominal
  CONFIG  WDTEN = ON         ; WDT is always enabled. SWDTEN bit has no effect
  CONFIG  WDTPS = 32768      ; 1:32768
  CONFIG  CCP2MX = PORTC1    ; CCP2 input/output is multiplexed with RC1
  CONFIG  PBADEN = OFF       ; PORTB<5:0> pins are configured as digital I/O on Reset
  CONFIG  CCP3MX = PORTB5    ; P3A/CCP3 input/output is multiplexed with RB5
  CONFIG  HFOFST = ON        ; HFINTOSC output and ready status are not delayed by the oscillator stable status
  CONFIG  T3CMX = PORTC0     ; T3CKI is on RC0
  CONFIG  P2BMX = PORTB5     ; P2B is on RB5
  CONFIG  MCLRE = INTMCLR    ; RE3 input pin enabled; MCLR disabled
  CONFIG  STVREN = ON        ; Stack full/underflow will cause Reset
  CONFIG  LVP = OFF          ; Single-Supply ICSP disabled
  CONFIG  XINST = OFF        ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
  CONFIG  DEBUG = OFF        ; Disabled
  CONFIG  CP0 = OFF          ; Block 0 (000800-001FFFh) not code-protected
  CONFIG  CP1 = OFF          ; Block 1 (002000-003FFFh) not code-protected
  CONFIG  CP2 = OFF          ; Block 2 (004000-005FFFh) not code-protected
  CONFIG  CP3 = OFF          ; Block 3 (006000-007FFFh) not code-protected
  CONFIG  CPB = OFF          ; Boot block (000000-0007FFh) not code-protected
  CONFIG  CPD = OFF          ; Data EEPROM not code-protected
  CONFIG  WRT0 = OFF         ; Block 0 (000800-001FFFh) not write-protected
  CONFIG  WRT1 = OFF         ; Block 1 (002000-003FFFh) not write-protected
  CONFIG  WRT2 = OFF         ; Block 2 (004000-005FFFh) not write-protected
  CONFIG  WRT3 = OFF         ; Block 3 (006000-007FFFh) not write-protected
  CONFIG  WRTC = OFF         ; Configuration registers (300000-3000FFh) not write-protected
  CONFIG  WRTB = OFF         ; Boot Block (000000-0007FFh) not write-protected
  CONFIG  WRTD = OFF         ; Data EEPROM not write-protected
  CONFIG  EBTR0 = OFF        ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
  CONFIG  EBTR1 = OFF        ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
  CONFIG  EBTR2 = OFF        ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
  CONFIG  EBTR3 = OFF        ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks
  CONFIG  EBTRB = OFF

mehmet

Alıntı yapılan: ete - 13 Aralık 2024, 08:51:49"kodlarda ekisimi yazarmısınız " ne anlama geliyor acaba açıklarmısın?
Muhtemelen "eksiğimi" olacak.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Powered by EzPortal