Interrupción RTCC no funciona

1

Este es mi primer uso de la interrupción RTCC para dspic33F y P24h. He configurado la fecha y la alarma, cuando la alarma se enciende, el LED adjunto en el PIN 15 parpadeará. El código se compila, pero no hay ningún resultado en el LED.

aquí está el código:

#include<p33Fxxxx.h>


 volatile unsigned int counter=0;

 void __attribute__((interrupt,auto_psv)) _RTCCInterrupt(void)

 {
     counter=1;

 _RTCIF = 0;     // clear flag


 } // RTCC interrupt service routine



 void initRTCC( void)
 {
    // Enables the OSCON write and set
    //_SOSCEN =1;
    asm volatile ("mov #OSCCON,W1");
    asm volatile ("mov.b    #0x46, W2");    // unlock sequence
    asm volatile ("mov.b    #0x57, W3");
    asm volatile ("mov.b    #0x02, W0");    // SOSCEN =1
    asm volatile ("mov.b    W2, [W1]");
    asm volatile ("mov.b    W3, [W1]");
    asm volatile ("mov.b    W0, [W1]");


    //_RTCWREN = 1;       // unlock setting
    asm volatile("disi  #5");
    asm volatile("mov   #0x55, w7");
    asm volatile("mov   w7, _NVMKEY");
    asm volatile("mov   #0xAA, w8");
    asm volatile("mov   w8, _NVMKEY");
        asm volatile("bset  _RCFGCAL, #13");    // RTCWREN =1;
    asm volatile("nop");
    asm volatile("nop");

    _RTCEN = 0; // disable the clock

    // set 07/11/2011 MON 23:59:30
    _RTCPTR = 3;        // start the sequence
    RTCVAL = 0x2011;    // YEAR
    RTCVAL = 0x0711;    // MONTH-1/DAY-1
    RTCVAL = 0x0159;   // WEEKDAY/HOURS
    RTCVAL = 0x5930;    // MINUTES/SECONDS


    // lock and enable
    _RTCEN = 1;         // start the clock
    _RTCWREN = 0;       // lock settings
 } // initRTCC

 void setALARM( void)
 {
    // disable alarm
    _ALRMEN = 0;

    // set the ALARM for a specific day of)
    _ALRMPTR = 2;       // start the sequence
    ALRMVAL = 0x0711;   // MONTH-1/DAY-1
    ALRMVAL = 0x0200;   // WEEKDAY/HOUR
    ALRMVAL = 0x0100;   // MINUTES/SECONDS

    // set the repeat counter
    _ARPT = 0;          // once
    _CHIME = 1;         // indefinitely

    // set the alarm mask
    _AMASK = 0;    
    _ALRMEN = 1;        // enable alarm
    _RTCIF = 0;         // clear flag
    _RTCIE = 1;         // enable interrupt

 } // set ALARM



  main( void)
 {
    TRISB=0;
    initRTCC();
   setALARM();
   _RTCIF = 0;

    while( 1){

        if (counter==1) {

            PORTB = 0xffff;
            counter =0;}

    }
    // repeat the main loop

 } // main
    
pregunta Ilyas Hamad

1 respuesta

1

Las interrupciones siempre deben estar habilitadas globalmente. Hay una instrucción especial para ese propósito:

sei

Esto establece un indicador de interrupción global en la CPU. Del mismo modo, hay una instrucción para deshabilitar esta bandera:

cli

Puede que ya haya una función sei () disponible en los encabezados. Pero como está familiarizado con el ensamblaje en línea, también puede usarlo de esa manera.

    
respondido por el Dzarda

Lea otras preguntas en las etiquetas