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 endasmDEFINE OSC 16ANSELA=0 ANSELB=0 ANSELC=0INTCON2.7=0IPR1=%00100000OSCCON =%01111110  OSCCON2=%00000000OSCTUNE=%10000000CCP1CON=0:CCP2CON=0:CCP3CON=0 ;-------------------------------------------------------------------------------TRISA=0         :PORTA=0TRISB=%00000111 :PORTB=0TRISC=%10000000 :PORTC=0              ;-------------------------------------------------------------------------------DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receiveDEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0DEFINE HSER_SPBRG 25  ' 9600 Baud @ 16MHz, 0,16%DEFINE HSER_CLROERR 1 ' Clear overflow automaticallyRCSTA = $90 ' Enable serial port & continuous receiveTXSTA = $20 ' Enable transmit, BRGH = 0SPBRG = 25  ' 9600 Baud @ 16MHz, 0,16%SYMBOL GIE =INTCON.7 'genel interruptları açıyorSYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyorSYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bitSYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bittemp var BYTe;-------------------------------------------------------------------------------INTCON=%10110000T0CON =%10001101ON INTERRUPT GOTO INTTMR0=3036;-------------------------------------------------------------------------------SYMBOL M2S =PORTB.1;-------------------------------------------------------------------------------RPM VAR WORDrpm=0RPMAYAR VAR WORDREAD 0,RPMAYAR.BYTE0READ 1,RPMAYAR.BYTE1M2 VAR longREAD 30,M2.BYTE0READ 40,M2.BYTE1read 50,m2.byte2read 60,M2.BYTE3M2ONDA VAR BYTEREAD 5,M2ONDAM2AYAR VAR BYTEREAD 6,M2AYARM2AYARONDA VAR BYTE READ 7,M2AYARONDAGELEN VAR BYTEGELEN=0GELEN2 VAR WORDGELEN2=0GELEN3 VAR WORD GELEN3=0GELEN4 VAR WORD GELEN4=0SAYI VAR BYTESAYI=0I VAR BYTEHESAP VAR BYTEHESAP=0SAYAC Var wordSAYAC=0pause 250;-------------------------------------------------------------------------------ACILIS:IF GELEN=61 THEN GELEN=0HSEROUT ["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 50HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]pause 50HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]pause 50HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]pause 2000goto baslaendIFgoto ACILIS;-------------------------------------------------------------------------------BASLA:IF HESAP=1 THEN RPM=SAYI*60HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]HESAP=0SAYI=0ENDIFIF M2S=0 and RPM>=RPMAYAR THEN WHILE M2S=0 :WENDM2=M2+M2AYARm2onda=M2ONDA+M2AYARONDAIF M2>999999 THENM2=0M2ONDA=0endIFIF M2ONDA>99 THEN m2=m2+1M2ONDA=M2ONDA/100ENDIFHSEROUT ["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 10WRITE 5,M2ONDA :PAUSE 10ENDIFIF GELEN=1 THEN hserout ["AYARLAR"]HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]PAUSE 10HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]PAUSE 10GOTO AYARLARENDIFIF GELEN=2 THEN M2=0M2ONDA=0WRITE 30,M2.BYTE0 WRITE 40,M2.BYTE1 WRITE 50,m2.byte2WRITE 60,M2.BYTE3 :PAUSE 10 WRITE 5,M2ONDA   :PAUSE 10HSEROUT ["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 10GELEN=0ENDIFGOTO BASLA;-------------------------------------------------------------------------------AYARLAR:IF GELEN=3 THEN GELEN=101GOTO M2AYARLARENDIFIF GELEN=4 THEN GELEN=101GOTO RPMAYARLARENDIFIF GELEN=0 THEN HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]pause 10HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]GOTO BASLAendIFGOTO AYARLAR;-------------------------------------------------------------------------------M2AYARLAR:IF GELEN<100 AND GELEN2<100 THEN M2AYAR=GELENM2AYARONDA=GELEN2WRITE 6,M2AYAR :PAUSE 10WRITE 7,M2AYARONDA :PAUSE 10GELEN=1GELEN2=0HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]GOTO AYARLARENDIFGOTO M2AYARLAR;-------------------------------------------------------------------------------RPMAYARLAR:IF GELEN=1 THENRPMAYAR=GELEN2WRITE 0,RPMAYAR.BYTE0WRITE 1,RPMAYAR.BYTE1PAUSE 10GELEN2=0HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]PAUSE 10GOTO AYARLARENDIFGOTO RPMAYARLAR;-------------------------------------------------------------------------------DISABLEINT:IF INTCON.1=1 THEN SAYI=SAYI+1INTCON.1=0GOTO ATLAENDIFIF INTCON.2=1 THENHESAP=1INTCON.2=0 'kesme bayrağı sıfırlandıTMR0=3036 'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir.GOTO ATLAENDIF HSERIN ,5,ZIPLA,[WAIT("s"),dec GELEN,dec GELEN2]ZIPLA:TEMP=RCREGRESUME ENABLEATLA:RESUMEENABLE


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 endasmDEFINE OSC 16ANSELA=0 ANSELB=0 ANSELC=0INTCON2.7=0IPR1=%00100000OSCCON  = %01110000;  OSCCON2=%00000000OSCTUNE=%00000000CCP1CON=0:CCP2CON=0:CCP3CON=0 ;-------------------------------------------------------------------------------TRISA=0         :PORTA=0TRISB=%00000111 :PORTB=0TRISC=%10000000 :PORTC=0              ;-------------------------------------------------------------------------------DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receiveDEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0DEFINE HSER_SPBRG 25  ' 9600 Baud @ 16MHz, 0,16%DEFINE HSER_CLROERR 1 ' Clear overflow automaticallyRCSTA = $90 ' Enable serial port & continuous receiveTXSTA = $20 ' Enable transmit, BRGH = 0SPBRG = 25  ' 9600 Baud @ 16MHz, 0,16%SYMBOL GIE =INTCON.7 'genel interruptları açıyorSYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyorSYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bitSYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bittemp var BYTe;-------------------------------------------------------------------------------INTCON=%10110000T0CON=%10000101ON INTERRUPT GOTO INTTMR0H=$0B :TMR0L=$DC;-------------------------------------------------------------------------------SYMBOL M2S =PORTB.1;-------------------------------------------------------------------------------RPM VAR WORDrpm=0RPMAYAR VAR WORDREAD 0,RPMAYAR.BYTE0READ 1,RPMAYAR.BYTE1M2 VAR longREAD 30,M2.BYTE0READ 40,M2.BYTE1read 50,m2.byte2read 60,M2.BYTE3M2ONDA VAR BYTEREAD 5,M2ONDAM2AYAR VAR BYTEREAD 6,M2AYARM2AYARONDA VAR BYTE READ 7,M2AYARONDAGELEN VAR BYTEGELEN=0GELEN2 VAR WORDGELEN2=0GELEN3 VAR WORD GELEN3=0GELEN4 VAR WORD GELEN4=0SAYI VAR BYTESAYI=0I VAR BYTEHESAP VAR BYTEHESAP=0SAYAC Var wordSAYAC=0pause 250;-------------------------------------------------------------------------------ACILIS:IF GELEN=61 THEN GELEN=0HSEROUT ["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 50HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]pause 50HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]pause 50HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]pause 2000goto baslaendIFgoto ACILIS;-------------------------------------------------------------------------------BASLA:IF HESAP=1 THEN RPM=SAYI*60HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]HESAP=0SAYI=0ENDIFIF M2S=0 and RPM>=RPMAYAR THEN WHILE M2S=0 :WENDM2=M2+M2AYARm2onda=M2ONDA+M2AYARONDAIF M2>999999 THENM2=0M2ONDA=0endIFIF M2ONDA>99 THEN m2=m2+1M2ONDA=M2ONDA/100ENDIFHSEROUT ["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 10WRITE 5,M2ONDA :PAUSE 10ENDIFIF GELEN=1 THEN hserout ["AYARLAR"]HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]PAUSE 10HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]PAUSE 10GOTO AYARLARENDIFIF GELEN=2 THEN M2=0M2ONDA=0WRITE 30,M2.BYTE0 WRITE 40,M2.BYTE1 WRITE 50,m2.byte2WRITE 60,M2.BYTE3 :PAUSE 10 WRITE 5,M2ONDA   :PAUSE 10HSEROUT ["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 10GELEN=0ENDIFGOTO BASLA;-------------------------------------------------------------------------------AYARLAR:IF GELEN=3 THEN GELEN=101GOTO M2AYARLARENDIFIF GELEN=4 THEN GELEN=101GOTO RPMAYARLARENDIFIF GELEN=0 THEN HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]pause 10HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]GOTO BASLAendIFGOTO AYARLAR;-------------------------------------------------------------------------------M2AYARLAR:IF GELEN<100 AND GELEN2<100 THEN M2AYAR=GELENM2AYARONDA=GELEN2WRITE 6,M2AYAR :PAUSE 10WRITE 7,M2AYARONDA :PAUSE 10GELEN=1GELEN2=0HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]GOTO AYARLARENDIFGOTO M2AYARLAR;-------------------------------------------------------------------------------RPMAYARLAR:IF GELEN=1 THENRPMAYAR=GELEN2WRITE 0,RPMAYAR.BYTE0WRITE 1,RPMAYAR.BYTE1PAUSE 10GELEN2=0HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]PAUSE 10GOTO AYARLARENDIFGOTO RPMAYARLAR;-------------------------------------------------------------------------------DISABLEINT:IF INTCON.1=1 THEN SAYI=SAYI+1INTCON.1=0GOTO ATLAENDIFIF INTCON.2=1 THENHESAP=1INTCON.2=0 'kesme bayrağı sıfırlandıTMR0H=$0B :TMR0L=$DC  'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir.GOTO ATLAENDIF HSERIN ,10,ZIPLA,[WAIT("s"),dec GELEN,dec GELEN2]ZIPLA:TEMP=RCREGRESUME ENABLEATLA:RESUMEENABLE


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 endasmDEFINE OSC 16ANSELA=0 ANSELB=0 ANSELC=0INTCON2.7=0IPR1=%00100000OSCCON =%01111000  OSCCON2=%00000000OSCTUNE=%10000000CCP1CON=0:CCP2CON=0:CCP3CON=0 ;-------------------------------------------------------------------------------TRISA=0         :PORTA=0TRISB=%00000111 :PORTB=0TRISC=%10000000 :PORTC=0              ;-------------------------------------------------------------------------------DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receiveDEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0DEFINE HSER_SPBRG 25  ' 9600 Baud @ 16MHz, 0,16%DEFINE HSER_CLROERR 1 ' Clear overflow automaticallyRCSTA = $90 ' Enable serial port & continuous receiveTXSTA = $20 ' Enable transmit, BRGH = 0SPBRG = 25  ' 9600 Baud @ 16MHz, 0,16%SYMBOL GIE =INTCON.7 'genel interruptları açıyorSYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyorSYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bitSYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bittemp var BYTe;-------------------------------------------------------------------------------INTCON=%10110000T0CON=%10000101ON INTERRUPT GOTO INTTMR0H=$85 :TMR0L=$EE;-------------------------------------------------------------------------------SYMBOL M2S =PORTB.1;-------------------------------------------------------------------------------RPM VAR WORDrpm=0RPMAYAR VAR WORDREAD 0,RPMAYAR.BYTE0READ 1,RPMAYAR.BYTE1M2 VAR longREAD 30,M2.BYTE0READ 40,M2.BYTE1read 50,m2.byte2read 60,M2.BYTE3M2ONDA VAR BYTEREAD 5,M2ONDAM2AYAR VAR BYTEREAD 6,M2AYARM2AYARONDA VAR BYTE READ 7,M2AYARONDAGELEN VAR BYTEGELEN=0GELEN2 VAR WORDGELEN2=0GELEN3 VAR WORD GELEN3=0GELEN4 VAR WORD GELEN4=0SAYI VAR BYTESAYI=0I VAR BYTEHESAP VAR BYTEHESAP=0SAYAC Var wordSAYAC=0pause 250;-------------------------------------------------------------------------------ACILIS:IF GELEN=61 THEN HSEROUT ["VERI GELDI"]GELEN=0ENDIFGOTO ACILIS;-------------------------------------------------------------------------------DISABLEINT:IF INTCON.1=1 THEN SAYI=SAYI+1INTCON.1=0GOTO ATLAENDIFIF INTCON.2=1 THENHESAP=1INTCON.2=0 'kesme bayrağı sıfırlandıTMR0H=$85 :TMR0L=$EE  'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir.GOTO ATLAENDIF HSERIN,10,ZIPLA,[WAIT("s"),dec GELEN,dec GELEN2]ZIPLA:TEMP=RCREGRESUME ENABLEATLA:RESUMEENABLE

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 receiveDEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1DEFINE HSER_CLROERR 1 ' Clear overflow automaticallyDEFINE HSER_SPBRG 160 ' 9600 Baud @ 16MHz, -0,08%SPBRGH = 1BAUDCON.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