Registro PIC12 TRIS no configurado, sin salida GP0 GP2

Originalmente hice esta pregunta en Stack Overflow. Creo que aquí habría habido una mejor audiencia.

Estoy tratando de programar un PIC12C508A para hacer un circuito de aprendizaje LED simple. He leído algunos ejemplos, la hoja de datos de Microchip, pic12c508a.h y pic12c508a.inc. He intentado configurar el registro TRIS usando un programa C y un programa ASM pero no funciona. Usando MPLAB X, el compilador XC8 y el simulador incorporado para verificar los registros SFR, puedo ver que el TRIS no se actualiza incluso cuando el WREG tiene los valores correctos. Si alguien tiene experiencia con esto, revise mi código y vea si estoy haciendo algo mal.

#include <xc.h>

// -- CONFIG
#pragma config MCLRE = ON       // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config WDT = OFF        // Turn Watchdog Timer Off.
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
#pragma config OSC = IntRC      // Internal RC Oscillator

// -- Internal Frequency
#define _XTAL_FREQ 400000

int main()
{
    OPTION = 0b11011111; // Added this from feedback on Stack Overflow
             //--0----- Clear T0CS per PIC12C508A datasheet on using GP2 as output

    TRIS = 0b111010;  // 0x3A
           //---0-0 Set GP0 and GP2 as outputs

    GPIO = 0b000100;  // 0x04
           //---1-0 Set GP2 as HIGH and GP0 as LOW

    for(int countdown = 10; countdown > 0; --countdown) {
        __delay_ms(60000); // Delay 1 minute.
    }

    GPIO = 0b000001;  // 0x01
           //---0-1 Set GP2 as LOW and GP0 as HIGH

    while(1)
        NOP();
}

También lo probé en ensamblaje, que es bastante idéntico a los tutoriales de Gooligum para modelos PIC básicos. (Actualización: todavía no he intentado configurar el registro de OPCIÓN en ASM).

  list  p=12c508a
  #include <p12c508a.inc>

  __CONFIG  _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC

RCCAL CODE    0x0FF   ; Processor Reset Vector
      res     1       ; Hold internal RC cal value, as a movlw k

RESET CODE    0x000   ; RESET VECTOR
      movwf   OSCCAL  ; Factory Calibration

start
      movlw   b'111010' ; Configure GP0/GP2 as outputs
      tris    GPIO      ;
      movlw   b'000100' ; Set GP2 HIGH - GREEN LED
      movwf   GPIO

      goto    $         ; loop forever

      END

Todo esto parece bastante sencillo, pero cuando uso puntos de interrupción y examino los registros SFR en el simulador, puedo ver que los registros GPIO y TRIS nunca cambian, aunque el WREG mantendrá los valores correctos. Examiné la salida ASM que genera el compilador XC8 y es casi idéntica a la ASM que escribí cuando se trata de configurar los registros.

También intenté usar valores HEX y valores enteros directos y los resultados son los mismos.

Respuestas (1)

El problema de que TRIS no se actualice parece ser un error en el núcleo del simulador PIC508 de MPLAB X. Cumplí tu código con MPLAB X y falló en el simulador. Luego cargué el archivo hexadecimal en MPLAB 8.92 y simuló perfectamente.

Recomiendo usar MPLAB 8.92 para chips de gama baja hasta que (si es que lo hacen) eliminen los errores de MPLAB X, pero si desea continuar usando MPLAB X, cambie el procesador a PIC12F508 (que no tiene este problema).

Alguien en StackOverflow captó mi error. Tengo el _XTAL_FREQ configurado en 400Khz, no en 4Mhz. Cuando hice el cambio y programé un 12C, funcionó en la placa de pruebas. El simulador, como bien apuntaste, sigue sin funcionar en MPLAB X. Gracias por la ayuda.