Schon in die Richtung.
Warum müssen wir diesen Interrupt sperren? Warum können wir nicht, das was in StartSwitch() steht, einfach in die Init() Methode reinschreiben und diesen Interrupt immer zulassen?
Code:
void StartSwitch()
{
SWITCH_OFF; // Port-Bit auf LOW
DDRD &= ~SWITCHES; // Port-Bit SWITCHES als INPUT
MCUCR &= ~(_BV(ISC11) | _BV(ISC10)); // Low level erzeugt Interrupt
GICR |= _BV(INT1); // Externen Interrupt 1 zulassen
}
Ein mögliches Problem ist das PollSwitch() nicht mehr richtig funtioniert.
Code:
unsigned char PollSwitch (void)
{
unsigned int i;
int ec_bak = autoencode; // Sichert aktuellen Zustand
/*
Autoencode-Betrieb vom ADC-Wandler unterbinden.
*/
autoencode = FALSE;
DDRD |= SWITCHES; // Port-Bit SWITCHES als Output
SWITCH_ON; // Port-Bit auf HIGH zur Messung
i = ReadADC(SWITCH, 10);
SWITCH_OFF; // Port-Bit auf LOW
Sleep (5);
/*
Autoencode-Betrieb vom ADC-Wandler wiederherstellen.
*/
autoencode = ec_bak;
/*
Die Original Umrechenfunktion von Jan Grewe - DLR wurder ersetzt durch
eine Rechnung ohne FLOAT-Berechnungen.
return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
Wert 61L evtl. anpasssen, falls fuer K1 falsche Werte zurueckgegebn werden.
*/
return ((10240000L / (long)i - 10000L) * MY_SWITCH_VALUE + 5000L) / 10000;
}
Für PollSwitch() muss PORT D als Ausgang und die Tasten Sensoren an (siehe Code) gesetzt werden. Aber für den Interrupt ist das genau anders rum.
Die PollSwitch() Methode kann so geschrieben werden.
Code:
unsigned char PollSwitch (void)
{
unsigned int i;
int ec_bak = autoencode; // Sichert aktuellen Zustand
/*
Autoencode-Betrieb vom ADC-Wandler unterbinden.
*/
autoencode = FALSE;
DDRD |= SWITCHES; // Port-Bit SWITCHES als Output
SWITCH_ON; // Port-Bit auf HIGH zur Messung
i = ReadADC(SWITCH, 10);
SWITCH_OFF; // Port-Bit auf LOW
DDRD &= ~SWITCHES; // Port-Bit SWITCHES als INPUT
Sleep (5);
/*
Autoencode-Betrieb vom ADC-Wandler wiederherstellen.
*/
autoencode = ec_bak;
/*
Die Original Umrechenfunktion von Jan Grewe - DLR wurder ersetzt durch
eine Rechnung ohne FLOAT-Berechnungen.
return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
Wert 61L evtl. anpasssen, falls fuer K1 falsche Werte zurueckgegebn werden.
*/
return ((10240000L / (long)i - 10000L) * MY_SWITCH_VALUE + 5000L) / 10000;
}
Die ISR für diesen Interrupt wird dann so aussehen.
Code:
SIGNAL (SIG_INTERRUPT1)
{
switched = 1;
}
Also nur die Variable switched setzen. Das Rücksetzen dieser Variable ist nach wie vor den Programmierer überlassen.
Mit diesen geänderten Funktionen muss doch alles wie früher funktionieren oder? Kann es dadurch Probleme geben, dass wir diesen external Interrupt 1 immer zulassen statt nur wenn wir ihn brauchen?
AsuroNeu
Lesezeichen