CCS C den XC8 e doğru birkaç deneme yapıyorum . Register seviyesinde yazmaya çalışıyorum .Timer0 için işlem yaptım sıkıntısız çalıştırdım . Ama aynı işlemi timer5 için beceremedim. Timer5 bir şekilde sayıyor yoklama yöntemiyle kontrol ettiğimde sıkıntı yok gözüküyor ama bir türlü interrupt ile çalıştıramadım.
while 1 in içindeki kısmı uncomment ettiğimde istediğim sonucu alıyorum , nerde hata yapıyor olabilirim acaba ?
#include<pic18f46k22.h>
#include "config.h"
#define DI1 !PORTCbits.RC0
#define DI2 !PORTCbits.RC1
#define DI3 !PORTCbits.RC2
#define DI4 !PORTAbits.RA5
#define relay1 LATA4
#define relay2 LATA3
#define relay3 LATA2
#define relay4 LATA1
#define relay5 LATA0
unsigned char Timer0Config;
void SetupClock(void);
int i = 0;
void main(void)
{
void SetupClock();
TRISAbits.RA0=0;
TRISAbits.RA1=0;
TRISAbits.RA2=0;
TRISAbits.RA3=0;
TRISAbits.RA4=0;
relay1 =0;
relay2 =0;
relay3 =0;
relay4 =0;
relay5 =0;
TRISAbits.RA5=1;
TRISCbits.RC0=1;
TRISCbits.RC1=1;
TRISCbits.RC2=1;
T5CONbits.TMR5CS=0x01;
T5CONbits.T5CKPS=0x03;
T5CONbits.T5SOSCEN=0;
T5CONbits.T5SYNC=1;
T5CONbits.T5RD16=1;
T5CONbits.TMR5ON=1;
// IPR5bits.TMR5IP=1; //TMR5 priority bit
PIE5bits.TMR5IE=1; //overflow interrupt enable
PIR5bits.TMR5IF=0; //tmr5 overflow interrupt flag
//3036 yükleniyor..
TMR5H= 0x0B;
TMR5L= 0xDC;
PIR5bits.TMR5IF=0;
INTCONbits.GIEH=1;//global interrupt enable bit.
while(1){
/*
if(PIR5bits.TMR5IF ){
i++;
if(! (i%200)) {
relay2 =~relay2;
}
}
*/
}
}
void SetupClock()
{
OSCCONbits.IRCF0 = 1;
OSCCONbits.IRCF1 = 1;
OSCCONbits.IRCF2 = 1;
}
void interrupt high_ISR(){
if(PIR5bits.TMR5IF )
{
i++;
// relay3=~relay3;
if(! (i%200)) {
relay2 =~relay2;
}
PIR5bits.TMR5IF == 0;
TMR5H= 0x0B;
TMR5L= 0xDC;
}
}
interrupta girip girmediğini kontrol et. bunu debug yaparak görebilirsin yada interrupt içerisine girer girmez led yakmasını isteyerek bunu kontrol etmiş olabilirsin.
interruptı set etmeyle ilgili bir sıkıntı var mı acaba ben onu soruyorum , şuan interrupt fonksiyonuna girmiyor kod , neden girmiyor olabilir onu soruyorum zaten.
datasheette interrupt şemasına bakabilirsin.
mesaj birleştirme:: 01 Ekim 2014, 07:31:25
sende bak 114. sayfadaymış.
mesaj birleştirme:: 30 Eylül 2014, 17:41:02
IPC8bits.U2IP = 0b001; // 0: isr diable <1:7> : oncelik
IPC8bits.U2IS = 0b000;
INTCONbits.MVEC = 1; // 0: single vector 1: multi vector
INTCONbits.FRZ = 1; // 1:debug yaparken dondur
INTCONbits.TPC = 0b000; // 000 = Disables proximity timer
INTCONbits.SS0 = 0; // Single vector is presented with a shadow register set
INTEnableInterrupts();
void __ISR(_UART2_VECTOR, IPL6) UART2_ISR(void) {
// if(IFS1bits.U2RXIF){
u2kayit[u2say] = UARTGetDataByte(UART2);
IFS1bits.U2RXIF = 0;
if (u2say < 255)u2say++;
else u2say = 0;
// }
}
ilk parça benim programımdan isr init kısmı ikinci kısımda isr fonksiyonu. isr yazdığım zaman direk bende çalıştıramamıştım. datasheet e bakarak çözebilmiştim.
INTCONbits.PEIE_GIEL=1;//enable low priority interrupts.
bu satırı ekledim çalıştı gözden kaçırmışım demekki default olarak timer5 interrupt ı low priority e sahipmiş ..
Bu arada debug için Proteus VSM viewer haricinde cof dosyasını atıp debug etmeyi becerebilen var mı vsm ile proteus debuga giderken bi sıkıntı oluyor bende INIT Error: Return code 6, No Target gibi bi error veriyor mplab ..