Forum: Mikrocontroller und Digitale Elektronik I/O-Ports taktflankengesteuert


von Waldemar T. (sanchez251)


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

von A.K. (Gast)


Lesenswert?

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.

von AVRFan (Gast)


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 :-).

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
Noch kein Account? Hier anmelden.