PIC12 TRIS El registro no se configura, no hay salida GP0 GP2

2

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.

    
pregunta Justin

1 respuesta

3

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 el uso de MPLAB 8.92 para chips de gama baja hasta que, si es que lo hace, eliminen los errores de MPLAB X, pero si desea continuar utilizando MPLAB X, cambie el procesador a PIC12F508 (que no tiene este problema) ).

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas