Hallo zusammen,
ich möchte in einem Atmega16 die Flanken an mehreren Input Pins
auswerten (sowohl positive Flanke als auch negative Flanke). Entprellen
möchte ich erst mal nicht betrachten. Laufzeit spielt auch kein Problem.
Das Programm ist relativ simpel
1 |
|
2 | DDRA = 0; // alles Eingänge
|
3 | PORTA = 0;
|
4 | bla
|
5 | bla
|
6 | while(1)
|
7 | {
|
8 | PINA_akt = PINA; // aktueller Portzustand
|
9 | PosFlankePinA0 = ((PINA_akt & (1<<PINA0)) ==0) && ((PINA_Backup & (1<<PINA0)) !=0); // PosFlanke des PinA1
|
10 | NegFlankePinA0 = ((PINA_akt & (1<<PINA0)) !=0) && ((PINA_Backup & (1<<PINA0)) ==0); // NegFlanke des PinA1
|
11 | PINA_Backup = PINA_akt; // Portzustand im letzten Zyklus
|
12 | bla
|
13 | bla
|
14 | bla
|
15 | }
|
Soweit, so gut. Funktion ist ok.
Nur sieht das alles nicht besonders schön aus. Und wenn ich mir das
Disassembly ansehe, klappen sich mir die Fußnägel hoch.
Mein nächster Versuch war:
1 | while(1)
|
2 | {
|
3 | PINA_akt = PINA;
|
4 | PosFlankenPortA = (!PINA_akt & PINA_Backup); // PosFlanke aller PortA Pins
|
5 | NegFlankenPortA = (PINA_akt & !PINA_Backup); // NegFlanke aller PortA Pins
|
6 | PINA_Backup = PINA_akt;
|
7 | bla
|
Dummerweise geht das gar nicht.
Woran liegt das? Wo ist mein Denkfehler?
Und gibt es noch eine andere Möglichkeit, das Ganze in ein bis zwei
Zeilen abzufertigen?
Danke, Tobi