Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: SBTECH - 30 Eylül 2014, 16:31:44

Başlık: XC8 Timer1/3/5 interrupt meselesi
Gönderen: SBTECH - 30 Eylül 2014, 16:31:44
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;
    }
}


Başlık: Ynt: XC8 Timer1/3/5 interrupt meselesi
Gönderen: hasankara - 30 Eylül 2014, 17:05:55
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.
Başlık: Ynt: XC8 Timer1/3/5 interrupt meselesi
Gönderen: SBTECH - 30 Eylül 2014, 17:11:27
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.
Başlık: Ynt: XC8 Timer1/3/5 interrupt meselesi
Gönderen: hasankara - 30 Eylül 2014, 17:27:08
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.
Başlık: Ynt: XC8 Timer1/3/5 interrupt meselesi
Gönderen: SBTECH - 30 Eylül 2014, 17:48:08
    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 ..