Es macht keinen Spaß, das zu debuggen, weil es 1. Spagetticode und 2.
ein Codefetzen ohne Anfang und Ende ist. Deshalb lasse ich das.
Ich würde eine kleine Hauptschleife bauen und darin die betreffende
Variable abfragen.
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | volatile uint8_t beobachtete_variable;
|
5 |
|
6 | void arbeitsroutine(void)
|
7 | {
|
8 | // Portpin schalten
|
9 |
|
10 | // ADC-Messung ausführen
|
11 |
|
12 | // LCD-Ausgabe machen
|
13 | }
|
14 |
|
15 | int main(void)
|
16 | {
|
17 | ddr_einstellen();
|
18 | timer2_initialisieren();
|
19 | sei();
|
20 |
|
21 | while(1)
|
22 | {
|
23 | if ( beobachtete_variable == 1 )
|
24 | {
|
25 | arbeitsroutine();
|
26 | beobachtete_variable = 0; // Alles abgearbeitet
|
27 | }
|
28 | }
|
29 | }
|
Dabei ist darauf zu achten, dass die arbeitsroutine() beendet sein muss,
wenn die nächste Änderung der beobachteten_variable passiert. Das kann
je nach Frequenz deines Timer2 und der Änderungsfrequenz der
beobachteten_variable sehr kritisch sein oder man kann es entspannt
angehen.
Um herauszufinden ob man sich Sorgen machen muss, kann man in der Timer2
ISR seinerseits die beobachtete_variable prüfen. Wenn in der Timer2 ISR
eine Änderung notwendig wird, aber die beobachtete_variable vom
vorherigen Aufruf noch auf 1 steht, dann ist ein Zeitkonflikt
aufgetreten, Das kann man zählen und entsprechend die arbeitsroutine()
optimieren.
Optimierungspotential sehe ich bei:
* der ADC-Messung. Die ADC-Messung selbst braucht eine gewisse Zeit.
Wenn Mittelwerte gebildet werden, umso länger.
Man kann diese Zeit verkürzen, wenn die ADC-Initialisierung einmalig
vorab gemacht wird und die Referenz etc. nicht umgeschaltet wird. Auch
kann man sich überlegen die ADC Messung bereits in der Timer2 ISR zu
starten und in der Arbeitsroutine nur noch kurz Ergebnis warten zu
müssen.
* die LCD-Ausgabe.
Man kann diese Zeit verkürzen, indem man einen Teil der Ausgabe bereits
macht, wenn die beobachtete_variable noch nicht geändert ist. Wenn die
Änderung kommt, setzt man nur noch den eigentlichen Wert in die mit
vorbereitete LCD Anzeige ein.
* dem Schalten des Portpins.
Das kann man ebenfalls in der Timer2 ISR erledigen, wenn man den Inhalt
der beobachtete_variable ändert. Wenn die Änderung des Portpins
besonders wichtig ist, könnte man den auch ändern, wenn die
arbeitsroutine() unterbrochen wurde.