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.
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).
Justin