www.mikrocontroller.net

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


Autor: Waldemar T. (sanchez251)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
    lds   r16, TASTENZUSTAND
    clc
    sbis  PIND, PIN_TASTE
    sec
    rol   r16  
    sts   TASTENZUSTAND, r16

    ; Die acht Bits in TASTENZUSTAND enthalten die Ergebnisse 
    ; 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.
    lds   r16, TASTENZUSTAND
    andi  r16, 0x11     ; Bits 2...7 interessieren nicht --> ausmaskieren

    cpi   r16, 0x01
    ; wenn erfuellt z. B. LED einschalten
    
    cpi   r16, 0x10      
    ; 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.