Hallo,
leider habe ich keine Lösung anzubieten, sondern nur eine Bestätigung des Problems:
Der Interrupt für die Kollisionstaster funktioniert nur beim ersten Mal korrekt. Wird ein Taster-Interrupt mit dem Befehl StartSwitch freigegeben und anschließend durch einen Tastendruck ausgelöst, so wird die ISR (Interrupt Service Routine) in der Datei asuro.c
SIGNAL (SIG_INTERRUPT1)
{
switched=1;
StopSwitch();
}
korrekt ausgelöst. Die globale Variable switched wird (auf 1) gesetzt, die Interruptfreigabe wird aufgehoben.
Wird jedoch anschließend der Taster-Interrupt erneut mit StartSwitch freigegeben, so wird die ISR sofort und ohne zusätzlichen Tastendruck ausgelöst.
Folgendes Programm macht dies deutlich, die zweite Ausgabe auf dem Terminal erfolgt auch ohne Tastendruck.
Code:
#include "asuro.h"
int i;
void Ausgabe(void)
{
PrintInt(PollSwitch());
SerWrite(" ",3);
PrintInt(switched);
SerWrite("\r\n",2);
}
void Kollision(void)
{
StartSwitch();
while (!switched) {
SerWrite("Taste?",6);
SerWrite("\r\n",2);
}
switched=0;
}
int main(void)
{
Init();
Kollision();
Ausgabe();
BackLED(ON,ON);
Msleep(1000);
Kollision();
Ausgabe();
BackLED(OFF,OFF);
while(1);
return 0;
}
Vermutlich wird in der Routine StopSwitch, die die Interruptfreigabe wieder sperrt und stets sofort nach einem Taster-Interrupt aufgerufen wird, vergessen, ein entsprechendes Register(-bit) im Mega8 zurückzusetzen, um den Ausgangszustand wiederzuerlangen?!
Er wäre schön, wenn jemand, der sich mit den Registern des Mega8 auskennt, sich die entsprechenden Routinen noch einmal anschauen könnte.
Ulli
Lesezeichen