Hallo leute, ich bräuchte mal eure Hilfe zu folgendem Problem, ich komme
da gedanklich gerade nicht weiter:
Ich habe in meinem uC ein Programm mit zwei Funktionen, zwischen diesen
möchte ich gerne mit einem Taster umschalten.
Das Umschallten an sich stellt kein Problem dar, eine kleine
debounce-routine für den Taster habe ich in einem Timer-Interrupt
realisiert, der alle 13,6ms aufgerufen wird:
ISR(TIM0_OVF_vect)
{
// Wenn Taster nach 13ms weiterhin gedrückt, dann Flag für gedrückten
// Taster setzen ("Taster ist gedrückt
if(!(PINB & (1<<PINB2)) && (taster_flag == 1))
{
taster_gedr = 1;
}
else
{
taster_gedr = 0;
taster_flag = 0;
}
// Wenn Taster gedrückt, dann flag setzen
if(!(PINB & (1<<PINB2)))
{
taster_flag = 1;
}
}
In der Main-Schleife möchte ich nun mit dem Flag "taster_gedr" zwischen
den Programmen umschalten.
Das Problem stellt sich insofern dar, die beiden Programme während der
gedrückten Taste gegeneinander abzuriegeln, d.h. bei meiner Lösung
schalten sich die Programme ständig um solange die Taste gedrückt ist.
Es ist also ein Glücksspiel, wie bei einer nicht Entprellten Taste, das
andere Programm zu erwischen.
Hier mal der Teil zum Umschalten im Hauptprogramm:
if((taster_gedr == 1) && (prognr == 1))
{
prognr = 2;
taster_gedr = 0;
}
else if((taster_gedr ==1) && (prognr == 2))
{
prognr = 1;
taster_gedr = 0;
}
Die Lösung ist ziemlich trivial, das weiss ich selber, nur komme ich
grad nicht auf eine solche. Es würde eigentlich reichen, eine Flag im
Hauptprogramm zu setzen, die es ausschließen würde, dass in der ISR die
taster_gedr Flag wieder auf 1 gesetzt wird, solange der Taster gedrückt
ist.
Wäre über Hilfe sehr dankbar!
Falls der komplette Code nötig ist, bitte bescheid geben!