Tengo un problema con el modo de suspensión en PIC16F628a.
Configuración:
El microcontrolador funciona con un oscilador interno de 4Mhz.
Oscilador externo de 32kHz en pines T1OSI / T1OSO.
El siguiente programa funciona bien (con 1 pulso en RA1) con "SLEEP ()" comentado.
También estoy seguro de que TIMER1 usa un oscilador externo, porque los pulsos desaparecen si desconecto el cristal externo.
Pero cuando trato de usar el modo SLEEP (), la interrupción TIMER1 no se activa PIC, no obtengo nada en RA1. Creo que echo de menos algo obvio aquí.
Código abajo:
#define _XTAL_FREQ 4000000
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#include <xc.h>
void interrupt isr(void){
if(TMR1IF){
TMR1ON = 0;
RA1 =~ RA1;
TMR1H = 0x80;
TMR1L = 0x00;
TMR1IF = 0;
TMR1ON = 1;
}
}
void main(void) {
CMCON = 0x07; // comparators off
TRISA = 0x00;
RA0=1;
RA1=0;
RA2 = 0;
__delay_ms(5000);
RA0 = 0;
__delay_ms(500);
T1CKPS0 = 0;
T1CKPS1 = 0;
TMR1CS = 1;
TMR1H = 0x80;
TMR1L = 0x00;
T1OSCEN = 1;
T1CONbits.nT1SYNC = 1;
TMR1IE = 1;
GIE = 1; //Enable Global Interrupt
PEIE = 1;
TMR1ON = 1;
while(1){
SLEEP();
}
}
Gracias por su ayuda.