www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Positive Flanke erkennen


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es eine Möglichkeit am atmega8 in C programiert nur die Falnke von 
0 auf 1 auszuwerten. Ich brauche ein Schaltsignl von ca. 5ms was könnte 
man da machen um das zu bekommen?

Danke schon mal an alle die sich die Mühe mache mir zu helfen.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint8_t  u8Sample;
uint8_t  u8SampleLast


_u8Sample = PINC;  // zu testende Variable

if (    ( u8Sample     & (1<<PC3) ) != 0 )
     && ( u8SampleLast & (1<<PC3) ) == 0 )   )
{
  // pos Flanke
}
if (    ( u8Sample     & (1<<PC3) ) == 0 )
     && ( u8SampleLast & (1<<PC3) ) != 0 )   )
{
  // neg Flanke
}
u8SampleLast = u8Sample;

Autor: Chapmy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Chapmy
Ja, Interrupt ginge theoretisch auch, aber Frank lernt gerade erst das 
C-Laufen, er muss sich noch ein wenig am Tisch/Sofa usw. festhalten (Nix 
für ungut, Frank)... ;-)


@ Lippy
Besser so, denn sonst muss jedesmal ausmaskiert (&) werden,
und lesen kann man es auch noch ein wenig besser:
uint8_t  u8Sample;
uint8_t  u8SampleLast

_u8Sample = PINC & (1<<PC3);  // Signal einlesen

if (    u8Sample     != 0 
     && u8SampleLast == 0    )
{
  // pos Flanke
}
if (    u8Sample     == 0 
     && u8SampleLast != 0    )
{
  // neg Flanke
}
u8SampleLast = u8Sample;

Oder für Kurzschreiber, die das ganze Programm auf einer Bildschirmseite 
haben wollen:
uint8_t  sig, sig_alt;

sig = PINC & (1<<PC3);  // Signal einlesen

if (  (sig!=sig_alt) &&  (sig_alt=sig) ) {
  //  steigende Flanke
}
if (  (sig!=sig_alt) && !(sig_alt=sig) ) {
  //  fallende Flanke
}
Grundlagen:
Das Ganze steht in der Haupschleife und wird zyklisch aufgerufen.
if-Abfragen werden von links nach rechts abgearbeitet,
also erst Vergleich, dann Zuweisung.
sig!=sig_alt  zeigt einen Pegelwechsel an.
sig_alt=sig   weist dem Merker den aktuellen Wert zu.
sig_alt=sig   für die if-Abfrage wird das Ergebnis der Zuweisung
              (also sig) hergenommen

Autor: Martin Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber in der Kurzform werde ich doch niemals eine fallende Flanke 
erkennen?!
sig_alt wird ja schon vorher überschrieben (beim Test auf positive 
Flanke) und somit geht der Test auf Ungleich immer schief...

Ahoi, Martin

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.