Hallo,
MPLab, XC8, PIC12F675, Simulator: "Real Pic Simulator"
ohne große Umschweife, kann mir jemand auf die Sprünge helfen?
Im Leben noch keinen PIC etc. programmiert habe ich mich nach langem Abwägen für die vorliegende Konfiguration entschieden.
Doch schon die ersten Schritte bringen mich zur Verzweiflung.
Es will mir nicht gelingen ein Mini-Programm zum "TMR0 Overflow Interrupt" zu schreiben.
Einer meiner Ansätze:
#include <xc.h>
#define _XTAL_FREQ 4000000
int R_count;
void __interrupt(void)
{
GP5 = ~GP5; //zur Kontrolle
INTCON &= ~(1<<T0IF); // clear timer0 overflow bit.
R_count = 1; // ob der Rest so Ok ist wird interessant,
GIE = 0; // sobalt der Interrupt überhaupt ausgeführt wird.
PEIE = 1;
} //RETFIE wird von XC8 autom. generiert, ebenso GIE=0. (heißt es)
void main()
{
__CONFIG(0x3f70); //?
TRISIO = 0; // Setzt alle GPIO als Ausgang
ANSEL = 0; // all ports digital
CMCON = 7; // Comparator aus
GPIO = 0x00; // start with all outputs =1
GIE = 1; // bit7 global interrupt enable
PEIE = 1; //Enable Peripheral Interrupt
OPTION_REG = 0x08; // oder auch 0x48;
R_count = 0;
TMR0 = 239; // preset for timer register, Counter zählt, doch kein Interrupt bei Überlauf
while(1)
{ if (R_count == 1 ) {GP1 = 1; R_count = 0;} else GP1 = 0; //Kontrolle Interrupt
GP0 = ~GP0;
__delay_us(100);
}
}
Die Ausgänge GPIO werden im Oszilloscope visualisiert.
Ist GIE = 0; läuft main() wie vorgesehen, Rechtecksignal an GP0
Ist GIE = 1; meldet "Real Pic Simulator" den Fehler: "out of code"
der Simulator von OshonSoft zeigt brav das Rechtecksignal an GP0
aber auch hier kein Interrupt bei TMR0 Überlauf.
Bisher habe ich noch keinen Interrupt hinbekommen.
Was muß ich ändern damit der Interrupt angesprochen wird?
Vielen Dank
Ergänzung_1
Bin einen halben Schritt weiter.
Ich muß anmerken, MPlab empfiehlt die Verwendung von XC8. Doch Die wenigen verfügbaren Erläuterungen / Beispiele verwenden alle Möglichen C Variationen, nur seltenst XC8.
Das gilt auch für MPlab selbst.
Seit mehr als zwei Wochen versuche ich mich an der Einarbeitung.
Gerade eben bin ich auf ein PIC Beispiel gestoßen. Die Interrupt Routine lautet:
void interrupt priority lowISR(void) // wird vom Compiler moniert
Paßt natürlich nicht für XC8, merkt man schon wenn nicht #include <xc.h> gegeben ist.
Dennoch, ich hatte schon einiges probiert, noch ein Versuch:
void interrupt lowISR(void) // vom Compiler akzeptiert
void interrupt ISR(void) // vom Compiler akzeptiert
Diese Beiden bringen mich den Schritt weiter, der Interrupt wird aufgerufen.
Allerdings, die Interruptroutine springt vom Ende an den Anfang.
Der Debugger zeigt am Ende ein RETFIE, der Prog.Counter springt aber an Adr. 0x04
Bei XC8 (finde ich gerade nicht) stand etwas von void __interrupt(void) oder so ähnlich.
In einem Beispiel finde ich:
For 8-bit compilers, change any occurrence of the interrupt qualifier e.g., from:
void interrupt low_priority myLoIsr (void)
to the following:
void __interrupt(low_priority) myLoIsr(void)
Es funktioniert nicht, habe aber noch nicht alle Variationen durch.
Vielleicht hat doch jemand Erfahrung damit.
Gruß juppkk
Lesezeichen