pic16f628a timer1 interrumpir la activación del sueño

1

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.

    
pregunta Seitan

3 respuestas

0

su función de suspensión está incorporada en un bucle infinito (no ingresó ninguna condición de prueba en su bucle while)

while(1){sleep()}

puede utilizar el indicador de interrupción TIMER1 como condición de prueba de bucle; por ejemplo

while(TMIF==0){sleep()}

Esto dejará a la MCU en modo de suspensión hasta que la bandera cambie y se convierta en 1.

    
respondido por el Igbokwe Danny
0

Está ejecutando el temporizador 1 en modo contador. Cuando está en modo contador, puede hacer que se ejecute sincronizado o asíncrono. En el modo sincronizado, el temporizador deja de contar y no se genera ninguna interrupción cuando se va a dormir. Por lo tanto, debe configurar T1SYNC para que ejecute en modo asíncrono (activo bajo). Consulte la hoja de datos de la sección 7.1 en adelante para obtener más información.

    
respondido por el Adam Z
0

Bueno, finalmente he logrado resolver el problema.
No está relacionado con el código, es más de lo que tengo que hacer con devboard (ql-200).
Como parece, cuando se pone el PIC en modo de suspensión, el oscilador usa mucha menos energía y, por lo tanto, es desviado por el programador devboard (que está conectado a los pines T1OSI / T1OSO). Por lo tanto, el oscilador no se genera en el modo de suspensión.
Todo funciona bien cuando se retira del tablero de herramientas.
Para cualquier persona que se tope con este hilo, el código anterior funciona bien y podría usarse para propósitos de prueba.

    
respondido por el Seitan

Lea otras preguntas en las etiquetas