Periférico RTCC, PIC24F16KA102, Problemas para acceder a los valores

1

Descripción periférica mínima

Para leer los valores de este periférico RTCC en particular, debe leer los datos de un solo registro (RTCVAL), donde la información que representa depende de un puntero. Este puntero lo establece el usuario; sin embargo, se reduce automáticamente con cada lectura y escritura en el registro RTCVAL.

La descripción de este registro es la siguiente:

RTCVALesunregistroúnico.Lospunterosparaesteregistro(RTCPTR<1:0>)estánenotroregistrollamadoRCFGCAL(página157delahojadedatosvinculadaacontinuación).

Elformatoderegistroeselsiguiente:

Problema

Al intentar leer los valores del registro RTCVAL no recibo información que represente un formato de fecha y hora (por ejemplo, recibir 30 por meses).

A continuación se muestra cómo intento acceder a estos datos:

unsigned char arr[9]; //This array will contain the RTCC Values before post process
unsigned int RTCCtemporary = 0;

RCFGCALbits.RTCPTR1 = 1; // Setting the Pointer to 11
RCFGCALbits.RTCPTR0 = 1; // So that the information given first is - Year


arr[0] = (char)RTCVAL; // Arr[0] now contains the year 
                           // The information that is pointed at by RTCVAL NOW 
                           // is Months and Days

RTCCtemporary = RTCVAL; // RTCCtemporary Holds Months and Days 
                            // Where RTCVAL Points NOW at WeekDay and Hours

arr[2] = (char)RTCCtemporary; // arr[2] now holds the Day Information    

asm("MOV _RTCCtemporary,W0");           
asm("SWAP W0");               //swapping bytes to have months first
asm("MOV W0, _RTCCtemporary");
arr[1] = (char)RTCCtemporary; //arr[1] now holds Month Information.

arr[3] = (char)RTCVAL;  // arr[3] now holds  Hours

RTCCtemporary = RTCVAL;       //RTCCtemporary now holds Minutes and seconds 
asm("MOV _RTCCtemporary,W0");           
asm("SWAP W0");               //swapping bytes to have minutes first
asm("MOV W0, _RTCCtemporary");
arr[4] = (char)RTCCtemporary; //arr[4] now holds minutes 

Pero, por supuesto, esto no funciona correctamente, los valores que recibo no tienen mucho sentido. Un posible indicador de problema es que cuando los bits del puntero se configuran, el registro real que contiene el puntero no cambia para representar el nuevo valor del puntero. Eso es un poco preocupante.

Al leer la hoja de datos, también se encontrará con que el registro RTCVAL solo se escribe si el bit RTCWREN se activa primero. Para activar RTCWREN tienes que pasar por una secuencia de desbloqueo. Recuerde que esto es SOLO para escribir en los registros RTCVAL. Por supuesto, todavía lo intenté para ver si en este caso hará alguna diferencia y no, no lo hace.

Otra causa de este problema podría estar dentro de mi configuración de este periférico, así que también lo enumeraré a continuación:

    if(RCFGCALbits.RTCEN == 0) //ensures that set up is only run once.
    {
        RCFGCALbits.RTCOE = 0; 
        asm("MOV #NVMKEY, W1");
        asm("MOV #0x55, W2");
        asm("MOV W2, [W1]");
        asm("MOV #0xAA, W3");   //all Assembly represents unlock sequence
        asm("MOV W3, [W1]");
        asm("BSET RCFGCAL, #13");
        RCFGCALbits.RTCPTR1 = 1;  //pointers incremented
        RCFGCALbits.RTCPTR0 = 1;
        RTCVAL = 0x0013; // setting the year
        RTCVAL = 0x0904; // setting the Mont and Day
        RTCVAL = 0x0314; // WeekDay and Hours
        RTCVAL = 0x3000; // Minuets and Seconds
        //turn on RTCC 
        RCFGCALbits.RTCEN = 1;   //RTCC enabled 
        asm("MOV #NVMKEY, W1");
        asm("MOV #0x55, W2");
        asm("MOV W2, [W1]");   // Relocking. 
        asm("MOV #0xAA, W3");
        asm("MOV W3, [W1]");
        asm("BCLR RCFGCAL, #13");
   }

Sorprendentemente, incluso en la configuración, el cambio de puntero no parece afectar el registro que lo contiene, lo que quizás indique que no está cambiando en absoluto.

El código mencionado aquí funciona si se extrae en un proyecto nuevo, sin embargo, no funciona dentro del proyecto en el que necesita estar funcionando. El puntero se actualiza en el proyecto nuevo, por lo tanto, si alguien puede proporcionar un método para depurar un registro que no se está inicializando aunque se ejecute la instrucción, probablemente responderá a esta pregunta.

Gracias por tu tiempo.

Más información

Aunque cuando se establecen los punteros y el registro RCFGCAL no cambia, los valores apuntados por RTCVAL sí cambian, aunque a un valor incorrecto. Por ejemplo, si configuro RTCPTR1 = 1 y RTCPTR0 = 0, apunta a WEEKDay and Hours cuando debería estar apuntando a Month and Day.

Notas :

1) Manual de referencia de RTCC: enlace

2) Página del dispositivo PIC24F16KA102: enlace

3) El periférico RTCC no se ha apagado individualmente.

    
pregunta Volcano

1 respuesta

1

Gracias al soporte de Microchips, resulta que el problema estaba en la versión 8.87 de MPLAB IDE.

Si tiene el registro RTCVAL en su ventana de vigilancia. La instrucción para establecer el valor para los punteros parece no tener efecto. En su lugar, son decrementados por el reloj.

    
respondido por el Volcano

Lea otras preguntas en las etiquetas