Originalmente hice esta pregunta en Stack Overflow. Creo que aquí habría sido una mejor audiencia.
Estoy intentando 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 establecer el registro TRIS utilizando 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 está actualizando, incluso cuando el WREG tiene los valores correctos. Si alguien tiene experiencia con esto, compruebe 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 los modelos PIC básicos. (Actualización: todavía no he intentado establecer 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 se cambian aunque el WREG mantenga los valores correctos. He examinado la salida ASM que genera el compilador XC8 y es casi idéntica a la ASM que escribí cuando se trata de establecer los registros.
También he intentado usar valores HEX y valores enteros rectos y los resultados son los mismos.