Hi @all! Kennt jemand von euch eine Möglichkeit seine I/O-Ports taktflankengesteuert abzufragen? Bei den externen Interrups geht das ja ohne probleme... aber geht das auch bei normalen I/O-Ports? wenn ich sie z.b. in einer schleife abfrage kann ich das eigentlich nur nach einen zustand (z.b. sbis portB, 1), was zur folge hat, dass er den daraus resultierenden Befehl dauern hintereinander ausführt, wenn ich mit dem Finger auf der taste bleibe. Ich programmiere meinen mega162 in Assembler mit AVRstudio. gruß waldemar
Den "pin change interrupt" gibt's zwar nicht bei allen AVRs, aber beim Mega162 durchaus schon. Wenn es das nicht ist, dann verrate mal mehr über den Kontext. Also was du damit wirklich erreichen willst.
>wenn ich sie z.b. in einer schleife abfrage kann ich das eigentlich nur >nach einen zustand (z.b. sbis portB, 1) Und die Information über aufgetretene Flanken erhälst Du dann, wenn Du den Tastenzustand abspeicherst, denn dann kannst Du bei der nächsten Abtastung den aktuellen Wert mit dem vorherigen vergleichen. Das Abspeichern kannst Du auf elegante Weise dadurch bewerkstelligen, dass Du das C-Flag je nach Tastenzustand setzt bzw. nicht setzt, und den Wert anschließend in ein "Tastenzustandsbyte" (jeder Taste musst Du ein solches spendieren) schiebst. Das ist ruck-zuck gemacht:
1 | lds r16, TASTENZUSTAND |
2 | clc
|
3 | sbis PIND, PIN_TASTE |
4 | sec
|
5 | rol r16 |
6 | sts TASTENZUSTAND, r16 |
7 | |
8 | ; Die acht Bits in TASTENZUSTAND enthalten die Ergebnisse |
9 | ; der letzten acht Tastenabfragen ('Tastenzustands-Historie') |
Nun geben Dir die niedrigwertigsten beiden Bits in TASTENZUSTAND (bzw. r16) Auskunft über das Taster-Geschehen: XXXXXX01 --> Taste wurde gerade gedrückt; XXXXXX10 --> Taste wurde gerade losgelassen.
1 | lds r16, TASTENZUSTAND |
2 | andi r16, 0x11 ; Bits 2...7 interessieren nicht --> ausmaskieren |
3 | |
4 | cpi r16, 0x01 |
5 | ; wenn erfuellt z. B. LED einschalten |
6 | |
7 | cpi r16, 0x10 |
8 | ; wenn erfuellt z. B. LED ausschalten |
Natürlich gibt es noch hundert andere Möglichkeiten, das zu realisieren. Ich hab Dir nur eine vorgestellt, die mir besonders gut gefällt :-).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.