Christian schrieb:
> Jetzt funktioniert es ohne Probleme. Sind solche Hilfsvariablen die
> beste Lösung für LCD-Befehle, die in der ISR gebraucht werden?
Im Grunde ja.
Man nennt die Dinger 'Jobflags'.
Sie zeigen der Hauptschleife an, dass ein Job zu erledigen ist, bei dir
das löschen eines LCD.
Aber im Grunde hast du trotzdem immer noch einen falschen Ansatz.
Die ISR soll sich nämlich im Grunde überhaupt nicht um das LCD kümmern.
Die ISR macht eine Modusumschaltung. Dein LCD geht vom Modus "Ausgabe 1
anzeigen" über in den Modus "Ausgabe 2 anzeigen". Und die Hauptschleife
entscheidet, was dazu alles notwendig ist.
> In der Interrupt - Routine habe ich unter if(dddd == 1) noch ein
> lcd_clear();. Dieser Befehl scheint dem Programm nichts auszumachen,
> erst bei zwei LCD-Befehlen arbeitet der µC nicht korrekt. Sollte ich das
> noch vorhandene lcd_clear(); aus der Routine auch entvernen?
Ja. Schmeiss es raus. Und wechsle deine Sichtweise der Dinge. Die ISR
geht es überhaupt nichts an, dass da ein LCD existiert (siehe oben mit
den Modi)
> Warum funktioniert die Verwendung im main und im Interrupt zusammen
> nicht?
Weil du nicht darauf achtest, welche Anweisungen in der Hauptschleife
unterbrichen werden, wenn der Interrupt kommt.
Du hast momentan eine gemeinsam genutzte Resource, die aus mehreren
Threads angesprochen wird.
Stell dir einen Drucker vor und 2 Threads. Der 2.te Thread kann den
ersten jederzeit unterbrechen.
So, jetzt versucht der 1.te Thread eine Ausgabe am Drucker zu machen. Er
will "Willkommen" dort hinschreiben. Also fängt er an:
W hinmalen
i hinmalen
l hinmalen
l hinmalen
und jetzt schlägt der 2.te Thread zu und gibt seinerseits etwas auf dem
Drucker aus: "Hallo"
H hinmalen
a hinmalen
l hinmalen
l hinmalen
o hinmalen
der 2. Thread hat seinen Job erledigt und die Kontrolle geht zum 1.ten
Thread zurück. Der wurde bei der Ausgabe unterbrochen und macht dort
weiter wo er unterbrichen wurde. Also malt er weiter
k hinmalen
o hinmalen
...
Auf dem Druckerpapier steht dann: WillHallokommen
So. jetzt kanns natürlich noch dicker kommen. Was ich so lapidar als
'hinmalen' bezeichnet habe, sind in Wirklichkeit ja auch Aktionen, die
eine gewisse Zeit dauern und in sich wieder aus vielen Aktionen
bestehen. Je nachdem, wo genau der 2-te Thread den ersten unterbricht,
kann da alles mögliche entstehen. Von "der eine Thread hat den Cursor an
die Position 10 geschickt, der andere ändert ihm das 'unter dem Arsch'"
bis hin zu "der eine Thread schaltet die Portpins so wie er sie braucht,
die ihm der andere gleich wieder anders umschaltet".