PIC18F66K22 - RTCC con cristal externo

2

Detalles del proyecto: (aunque estoy más interesado en las respuestas teóricas)

  • MCU: PIC18F66K22
  • IDE: MPLAB X IDE
  • Programador: PICKit 3
  • Compilador: C18
  • Proyecto: Reloj de calendario en tiempo real

He comenzado a hacer que funcione el RTCC interno de mi PIC. Encuentro que hay pequeños tutoriales sobre este tema y ninguno que sea teórico o sin demasiados detalles técnicos (específicos del microcontrolador). La hoja de datos, que es específica para mi microcontrolador, por otro lado, parece carecer de información (¿no está seguro de si es de mi conocimiento?)

¿Cómo configuro el Reloj / Crystal externo y RTCC?

  • ¿Tengo que configurar los registros TRIS (Tristate / Datadirection) para los pines de Crystal?
  • ¿Tengo que configurar la entrada de Crystal high para que empiece a oscilar? (¿o un pulso corto o algo así?)
  • ¿Está la parte debajo de la configuración correcta?

    #pragma config RTCOSC = SOSCREF // RTCC Clock Select (RTCC uses SOSC)

  • ¿RTSECSEL (RTCC Seconds Clock Output Select) debe configurarse en (10) ?: RTCC source clock is selected for the RTCC pin (the pin can be LF-INTOSC or SOSC, depending on the RTCOSC (CONFIG3L<1>) bit setting) ? Tengo otro periférico conectado al pin RTCC, ¿se convertirá esto en una salida para el Clock Seconds ? (De alguna manera confuso, pero creo que la Selección de salida de reloj se puede usar para seleccionar la entrada?: #)

Para aquellos que no les gusta la teoría

El código de prueba

Tal vez un error rápido se ve aquí. El ensamblaje es de la hoja de datos.

  

(hoja de datos: "Para que se establezca el bit RTCWREN, solo hay uno   ventana de tiempo de ciclo de instrucción permitida entre la secuencia 55h / AA y   la configuración de RTCWREN. ")

También #pragma config RTCOSC = SOSCREF // RTCC Clock Select (RTCC uses SOSC) Y los registros TRISC están configurados.

_asm
movlw 0x55
movwf EECON2,0
movlw 0xAA
movwf EECON2,0
bsf RTCCFG,5,0
_endasm

RtccInitClock();
PADCFG1bits.RTSECSEL1 = 1;
PADCFG1bits.RTSECSEL0 = 0;
RTCCFGbits.RTCEN = 1;
RTCCFGbits.RTCWREN = 0;
    
pregunta Paul

1 respuesta

1

¡Mi RTCC se está ejecutando! Por alguna depuración adecuada, descubrí que RTCWREN no se estaba configurando, por lo que nunca podría establecer RTCEN. Parece que la secuencia de desbloqueo para la escritura RTC tuvo que tener una interrupción deshabilitada. El código de ensamblaje de la hoja de datos no se podía utilizar directamente en mi código ni se describía en la hoja de datos, pero también se resolvieron algunas pruebas y errores. No tuve que configurar LAT / entrada / salida para los pines osc.

Pero tenga en cuenta que debe configurar los bits de configuración correctos ( #pragma config RTCOSC = SOSCREF // RTCC Clock Select (RTCC uses SOSC)

void rtccEnable(){
    rtccUnlock();//RTCWREN can only be written with the unlock sequence (see Example 18-1).

    RTCCFGbits.RTCEN = 1;

    rtccLock();
}

void rtccUnlock(){//RTCWREN can only be written with the unlock sequence (see Example 18-1).
//Refer to Section 18.0 “Real-Time Clock and Calendar (RTCC)” for the unlock sequence (Example 18-1).
    _asm
    BCF INTCON, 7,1
    MOVLW 0x55
    MOVWF EECON2,1
    MOVLW 0xAA
    MOVWF EECON2,1
    bsf RTCCFG,5,1
    _endasm
}
void rtccLock(){
    RTCCFGbits.RTCWREN = 0;
    INTCONbits.GIE = 1; //Re-enable interrupts.
}

void rtccDebug(){
    xportSendTextDebug("-----[RTCC]-----");
    if(RTCCFGbits.RTCEN){
        while((BOOL)RTCCFGbits.RTCSYNC){}
        xportSendTextDebug("[RTCC] is on");
    }else{
        xportSendTextDebug("[RTCC] is off!");
    }
}
    
respondido por el Paul

Lea otras preguntas en las etiquetas