Also, für Interrupts ist erstmal die Datei sect30.inc wichtig, dort die
"variable vector section" sowie der Ausdruck "#pragma INTERRUPT
nameDesInterrupts". Um nun eine neue ISR zu schreiben gehst du am
besten folgendermaßen vor: deklariere in deiner headerdatei eine
Funktion
void nameDesInterrupts(void); darunter schreibst du
#pragma INTERRUPT nameDesInterrupts
in der sect30.inc trägst du an die Stelle des gewünschten Interrupts
folgendes ein:
.glb _nameDesInterrupts ;
.lword _nameDesInterrupts ;
(also den Namen der ISR mit Unterstrich) Wichtig hierbei ist es nicht
einfach eine Neue einzufügen sondern die Betreffende zu ersetzten. Hier
kommt es auf die Reihenfolge und Position an. Sie bestimmt bei welchem
Interrupt deine ISR aufgerufen wird. In der Doku gibt es irgendwo eine
Tabelle wo die einzelnen Interrupts swie ihre relativen Positionen
aufgeführt sind. BTW so ein Interruptvektor ist vier Bytes breit. Damit
eine Interruptroutine auch funktioniert muß mind. noch die
entsprechende Priorität eingestellt sein (0..7) wobei 0 den Interrupt
ausschaltet und 7 die höchste Priorität ist.
Um die Interrupts zu aktivieren machst du noch ein
asm( "\tFSET I");
Noch was, wenn du einen Interrupt innerhalb eines Interrupts ändern
willst solltest du ungefähr sowas machen:
asm("\tFCLR I");
asm("\tBCLR 0,0380H"); // hier was du machen willst
asm("\tnop");
asm("\tnop");
asm("\tFSET I");
einfach so z.B einen Interrupt abschalten funktioniert nicht, da der
Compiler einen mov-Befehl draus macht. Hat was mit dem Instructionqueue
zu tun...
Man möge mich ergänzen und berichtigen....
Gruß
Peter