Hi
Nun, in C kann ich dir nicht helfen, aber prinzipiell ist es nicht
geschickt, in einer While-Schleife auf ein Ereignis zu warten. Dein
Programm kann dann ja nichts anderes ausführen. In Assembler gehe ich
folgenden Weg:
Ich habe eine Variable, die dan zuletzt gelesenen Portzustand hat, eine
zweite, die in einer Leseroutine den neuen gelesenen Wert bekommt.
Etwa so:
1 | Read_IO:
|
2 | In Reg_A, Port_x
|
3 | STS New_In, Reg_A
|
4 | ...
|
5 | Ret
|
Diese Routine wird am Anfang der Schleife ständig durchlaufen. Natürlich
kann New_In eventuell auch andere Bits aufnehmen, hier kann ich sie alle
einsammeln. Reicht ein Byte nicht, wird ein zweites hinzugenommen.
In einer weiteren Routine erfasse ich die Flanken der Signale. Zuerst
wird Old_In mit New_In EOR-Verknüpft. Die gesetzten Bits im Ergebnis
zeigen auf geänderte Bits hin. Nun wird mit New_IN und dem Ergebnis aus
der XOR Verknüpfung über eine Und-Verknüpfung der Wechsel von 0 nach 1
detektiert und in einem FlankenByte eingetragen.
Gleiche Vorgehensweise mit Old_In und dem Ergebnis der XOR ergibt die
Flanke von 1 nach 0
Etwa so:
1 | Set_Flag:
|
2 | LDS Reg_A, New_In
|
3 | LDS Reg_B, Old_In
|
4 | EOR Reg_A, Reg_B ; Ergebnis u rgeänderte Bits
|
5 | Push Reg_A ; merken
|
6 | LDS Reg_B, New_IN
|
7 | AND Reg_A, Reg_B ; Ergebnis sind die Flanken von 0 nach 1
|
8 | STS Low_to_High, Reg_A
|
9 | POP Reg_A
|
10 | LDS Reg_B, Old_In
|
11 | AND Reg_A, Reg_B ; Ergebnis sind Flanken von 1 nach 0
|
12 | STS High_to_Low,Reg_A
|
13 | LDS Reg_A, New_In
|
14 | STS Old_In, Reg_A ; zum Schluß noch Neu nach Alt schieben
|
15 | ret
|
Im Programm schaust du nur nach den Flankenbits, bearbeitest die
Ereignisse und setzt das Flankenbit zurück oder machst mit der nächsten
Aufgabe weiter.
Nix mehr mit irgendeiner Wait oder While-Anweisung. Ach ja, berechtigter
Einwand: ist nicht entprellt. Aber natürlich kannst du auch erst nach
dem Entprellen die Variable New_In beschreiben, das verändert an den
Flanken nix.
Gruß oldmax