PIC12 TRIS-Register nicht eingestellt, kein GP0-GP2-Ausgang

Ich habe diese Frage ursprünglich bei Stack Overflow gestellt. Ich denke, hier wäre ein besseres Publikum gewesen.

Ich versuche, einen PIC12C508A für eine einfache LED-Lernschaltung zu programmieren. Ich habe einige Beispiele gelesen, das Microchip Datasheet, pic12c508a.h und pic12c508a.inc. Ich habe versucht, das TRIS-Register mit einem C-Programm und einem ASM-Programm zu setzen, aber es geht nicht. Mit MPLAB X, dem XC8-Compiler und dem eingebauten Simulator zum Überprüfen der SFR-Register kann ich sehen, dass das TRIS nicht aktualisiert wird, selbst wenn das WREG die richtigen Werte enthält. Wenn jemand Erfahrung damit hat, schau dir bitte meinen Code an und schau, ob ich etwas falsch mache.

#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();
}

Ich habe es auch in der Assemblierung ausprobiert, die ziemlich identisch mit den Gooligum-Tutorials für grundlegende PIC-Modelle ist. (Update: Ich habe noch nicht versucht, das OPTION-Register in ASM zu setzen.)

  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

Das alles scheint ziemlich einfach zu sein, aber wenn ich Breakpoints verwende und die SFR-Register im Simulator untersuche, kann ich sehen, dass die GPIO- und TRIS-Register nie geändert werden, obwohl das WREG die richtigen Werte enthält. Ich habe die ASM-Ausgabe untersucht, die der XC8-Compiler generiert, und sie ist fast identisch mit der ASM, die ich geschrieben habe, wenn es um das Setzen der Register geht.

Ich habe auch versucht, HEX-Werte und gerade ganzzahlige Werte zu verwenden, und die Ergebnisse sind dieselben.

Antworten (1)

Das Problem, dass TRIS nicht aktualisiert wird, scheint ein Fehler im PIC508-Simulatorkern von MPLAB X zu sein. Ich habe Ihren Code mit MPLAB X erfüllt und er ist im Simulator fehlgeschlagen. Ich habe dann die Hex-Datei in MPLAB 8.92 geladen und es wurde perfekt simuliert.

Ich empfehle die Verwendung von MPLAB 8.92 für Low-End-Chips, bis (falls überhaupt) sie die Fehler aus MPLAB X herausbekommen, aber wenn Sie MPLAB X weiterhin verwenden möchten, wechseln Sie den Prozessor zu PIC12F508 (der dieses Problem nicht hat).

Jemand auf StackOverflow hat meinen Fehler bemerkt. Ich habe die _XTAL_FREQ auf 400 kHz eingestellt, nicht auf 4 MHz. Als ich die Änderung vornahm und einen 12C programmierte, funktionierte es auf dem Steckbrett. Wie Sie bereits betont haben, funktioniert der Simulator in MPLAB X immer noch nicht. Vielen Dank für Ihre Hilfe.