mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Portabfrage über Whileschleife


Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ein Problem mit folgender Portabfrage:

//Auf fallende Flanke an PD2 warten

While (!(PIND & (1<<PD2)))
{}

Das Signal (fallende Flanke) liegt an PD2 an, springt aber nicht aus
der Schleife raus. Gibt es noch eine andere Möglichkeit das zu 
definieren,
oder ist der Fehler in der Whileabfrage?

Habe einen ATMEGA16.

Autor: Ben jamin (scarab)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst du mit Flanke?
Wenn du eine Flanke erkennen willst musst du den alten zustand ja 
irgendwo zwischenspeichern und dann vergleichen.
Du fragst lediglich ab ob PD2 == 0 ist.

edit: wenn du solange warten (nix machen) willst bis PD2 == 0 ist dann 
versuch mal:

// solange PD2==1 nix machen
While (PIND & (1<<PD2))
{}

Autor: Stefan Weßels (swessels)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit erkennst Du nur den Zustand des Pins im Momnent der Abfrage. Das 
ist keine Flankenerkennung!

Außerdem wartest Du gerade in Deinem Code so lange, bis der PORT "high" 
ist!

Sinngemäß hast Du geschrieben:

warte, solange der PORT nicht high ist. Laß mal die Negation (das '!') 
weg, dann sollte es funktionieren.

Gruß,
Stefan

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Weßels schrieb:
> Damit erkennst Du nur den Zustand des Pins im Momnent der Abfrage. Das
> ist keine Flankenerkennung!
>
> Außerdem wartest Du gerade in Deinem Code so lange, bis der PORT "high"
> ist!
>
> Sinngemäß hast Du geschrieben:
>
> warte, solange der PORT nicht high ist. Laß mal die Negation (das '!')
> weg, dann sollte es funktionieren.
>
> Gruß,
> Stefan

Alles klar dann probiere ich das mal so, danke euch.

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Nun, in C kann ich dir nicht helfen, aber prinzipiell ist es nicht 
geschickt, in einer While-Schleife auf ein Ereignis zu warten. Dein 
Programm kann dann ja nichts anderes ausführen. In Assembler gehe ich 
folgenden Weg:
Ich habe eine Variable, die dan zuletzt gelesenen Portzustand hat, eine 
zweite, die in einer Leseroutine den neuen gelesenen Wert bekommt.
Etwa so:
Read_IO:
  In Reg_A, Port_x
  STS  New_In, Reg_A
  ...
Ret
Diese Routine wird am Anfang der Schleife ständig durchlaufen. Natürlich 
kann New_In eventuell auch andere Bits aufnehmen, hier kann ich sie alle 
einsammeln. Reicht ein Byte nicht, wird ein zweites hinzugenommen.
In einer weiteren Routine erfasse ich die Flanken der Signale. Zuerst 
wird Old_In mit New_In EOR-Verknüpft. Die gesetzten Bits im Ergebnis 
zeigen auf geänderte Bits hin. Nun wird mit New_IN und dem Ergebnis aus 
der XOR Verknüpfung über eine Und-Verknüpfung der Wechsel von 0 nach 1 
detektiert und in einem FlankenByte eingetragen.
Gleiche Vorgehensweise mit Old_In und dem Ergebnis der XOR ergibt die 
Flanke von 1 nach 0
Etwa so:
Set_Flag:
  LDS   Reg_A, New_In
  LDS   Reg_B, Old_In
  EOR   Reg_A, Reg_B      ; Ergebnis u rgeänderte Bits
  Push  Reg_A             ; merken
  LDS   Reg_B, New_IN
  AND   Reg_A, Reg_B      ; Ergebnis sind die Flanken von 0 nach 1
  STS   Low_to_High, Reg_A
  POP   Reg_A
  LDS   Reg_B, Old_In
  AND   Reg_A, Reg_B      ; Ergebnis sind Flanken von 1 nach 0
  STS   High_to_Low,Reg_A
  LDS   Reg_A, New_In
  STS   Old_In, Reg_A     ; zum Schluß noch Neu nach Alt schieben
ret
Im Programm schaust du nur nach den Flankenbits, bearbeitest die 
Ereignisse und setzt das Flankenbit zurück oder machst mit der nächsten 
Aufgabe weiter.
Nix mehr mit irgendeiner Wait oder While-Anweisung. Ach ja, berechtigter 
Einwand: ist nicht entprellt. Aber natürlich kannst du auch erst nach 
dem Entprellen die Variable New_In beschreiben, das verändert an den 
Flanken nix.
Gruß oldmax

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Generell sollte so eine Abfrage via Interupt auf fallende Flanke gelöst 
werden. Wenn es möglich ist.

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Generell solle ein Interrupt nur für schnelle Signale benutzt werden. 
Normalerweise reicht pollen völlig aus, speziell, wenn es sich um Taster 
uder Kontakte handelt. Schnelle Signale sind Impulse, deren Signalzeit 
kürzer wie die Programmzykluszeit ist.
Gruß oldmax

Autor: heiko_h (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oldmax schrieb:
> Hi
> Generell solle ein Interrupt nur für schnelle Signale benutzt werden.
> Normalerweise reicht pollen völlig aus, speziell, wenn es sich um Taster
> uder Kontakte handelt. Schnelle Signale sind Impulse, deren Signalzeit
> kürzer wie die Programmzykluszeit ist.
> Gruß oldmax

Wie kann ich eine Portabfrage auf Flanke mit Polling machen?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
heiko_h schrieb:
> Wie kann ich eine Portabfrage auf Flanke mit Polling machen?

alten status merken, neuen status einlesen wenn von 0->1 dann positive 
flanke, neuen status als alten status übernehmen

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
Einfach meine Beiträge lesen...
Gruß oldmax

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.