Hallo
ich habe momentan ein kleines Problem mit folgendem Code
1 | for (i_messung=0; i_messung<=durchlaufe-1; i_messung++) //Anzahl der geforderten Durchläufe abarbeiten
|
2 | {
|
3 | zaehlstart = 1; //Merker setzen damit Messung beginnen kann
|
4 | while ((ergebnis_da == 0) || (zaehlstart == 1)) //warten auf Fertigstellung der Messung
|
5 | {
|
6 | NOP();
|
7 | }
|
8 | zaehler_low = zaehler_byte2; //oberen 8 Bit in Variable
|
9 | zaehler_low = zaehler_low << 8; //nach oben schieben
|
10 | zaehler_low = zaehler_low + zaehler_byte1; //unteren 8 Bit dazu
|
1 | void interrupt timer0(void)
|
2 | {
|
3 | if (zaehlstart == 1)
|
4 | {
|
5 | zaehler_reset_aktiv; //Hardwarezähler auf null
|
6 | zaehler_high = 0; //obere 16 bit auf Null
|
7 | zaehler_reset_inaktiv; //Zähler freigeben
|
8 | zaehler_messzeit = 0; //Zähler für Messzeit zurücksetzen
|
9 | ergebnis_da = 0; //Ergebnis verarbeitet, Flag zurücknehmen
|
10 | zaehler_enable; //Messsignale freigeben
|
11 | zaehlstart = 0; //Merker zurücksetzen da abgearbeitet
|
12 | bit_16 = 0; //Marker für Bit 16 auf Null
|
13 | }
|
14 |
|
15 | if ((zaehler_messzeit > messzeit) && (ergebnis_da == 0)) //Zeitdauer für Messung abgelaufen
|
16 | {
|
17 | zaehler_disable; //Messung stoppen
|
18 | ergebnis_da = 1; //Merker setzen
|
19 | }
|
20 |
|
21 | if (bit_16 == 0 && zaehler_16 == 1) //Merker auf Null und Eingang auf Eins? (Wechsel von Low nach High)
|
22 | {
|
Es kommt ab und zu mal vor, dass genau zwischen den beiden Überprüfungen
der while-Schleife der Interrupt ausgeführt wird. Das Problem ist dann,
dass die Überprüfung von "ergebnis_da" vor dem Interrupt ein False
geliefert hat und jetzt nach dem Interrupt aber auch "zaehlstart" ein
False liefert und damit die Schleife verlassen wird. Meine einzige Idee
wäre die beiden Überprüfungen während ausgeschaltetem Interrupt in eine
weitere Variable zu stecken und die dann an dieser Stelle auszuwerten.
Gibt es evtl. auch eine andere Lösung?
Silvio