Hi, since a couple of days I am trying to get the built-in CPS Module to work on the PIC16LF1947 with the AN6 (=RF1) pin but without any succes. I don't think the CPS module is even oscillating while if the appropriate registers CPSCON0 and CPSCON1 are set it should start up. Also looking at the Timer1, that uses the CPS oscillator as source, it doesn't count anything. I really don't know what I am doing wrong. It all seems to be so straight forward but it isn't at all.
Code:#include <htc.h>#include <pic.h> #include <stdio.h> __CONFIG( WDTE_OFF //Wacthdog Timer Disable & FOSC_INTOSC & MCLRE_ON & FCMEN_OFF //Fail-Safe Clock Monitor enable bit enabled & LVP_OFF //Low Voltage Programing On & CP_OFF //Table Read-Protect & CLKOUTEN_ON); //Clock out enable bit #define _XTAL_FREQ 8000000 void capInit(void); void interrupt isr(void); int reading; int average = 0; void main(void){ OSCCON = 0b01110010; // 4xPLL off, 4MHz, internal clock ANSELA = 0; // Digitaal TRISA = 0; // Ouput LATA = 0; // Low signal LATF = 0; // Low signal ANSELF = 1; // Analoog TRISF = 1; // Input RA1 = 0; // Red RA2 = 0; // Green RA3 = 0; // Bleu capInit(); while(1){} } void capInit(void){ CPSCON0 = 0b10001101; // Cap sense ON, internal osc, High Range CPSCON1 = 0b00000110; // channel 6 OPTION_REG = 0b11101000; // T0CS: Transition on RA4/T0CKI // Prescaler assigned to WDT TMR0IF = 0; TMR0IE = 1; T1CON = 0b01000001; TMR1IF = 0; TMR1IE = 1; T1GCON = 0b11110001; TMR1GIF = 0; TMR1GIE = 1; GIE = 1; } void interrupt isr(void){ if (TMR0IE && TMR0IF) // Overflow interrupt TMR0IF = 0; // Clear T0IF every time if (TMR1GIF && TMR1GIE){ // Gate interrupt TMR1GIF = 0; TMR0 = 0; reading = TMR1L + (unsigned int)(TMR1H << 8); if (reading < average - (average >> 4)) RA1 = 1; else if (reading > average - (average >> 3)){ RA2 = 1; average = average - (unsigned int)(average >> 4); average = average + (unsigned int)(reading >> 4); } TMR1L = 0x00; // Reset Timer1 TMR1H = 0x00; // " " TMR1ON = 1; // Restart Timer1 TMR0 = 0xFE; T1GGO = 1; } }




Bookmarks