XC8 Timer1/3/5 interrupt meselesi

Başlatan SBTECH, 30 Eylül 2014, 16:31:44

SBTECH

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;
    }
}
Elektronik ilimdir..

hasankara

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.

SBTECH

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.
Elektronik ilimdir..

hasankara

#3
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.

SBTECH

    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 ..
Elektronik ilimdir..