I/O-Ports taktflankengesteuert

OP #459582
Lesenswert?
• ▲
▼
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
Gast #459606
Lesenswert?
• ▲
▼
>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 :-).

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.