Positive Flanke erkennen

Gast
1
uint8_t  u8Sample;
2
uint8_t  u8SampleLast
3

4

5
_u8Sample = PINC;  // zu testende Variable
6

7
if (    ( u8Sample     & (1<<PC3) ) != 0 )
8
     && ( u8SampleLast & (1<<PC3) ) == 0 )   )
9
{
10
  // pos Flanke
11
}
12
if (    ( u8Sample     & (1<<PC3) ) == 0 )
13
     && ( u8SampleLast & (1<<PC3) ) != 0 )   )
14
{
15
  // neg Flanke
16
}
17
u8SampleLast = u8Sample;
Moderator (Firma: Titel) Persönliche Seite
@  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:
1
uint8_t  u8Sample;
2
uint8_t  u8SampleLast
3

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

6
if (    u8Sample     != 0 
7
     && u8SampleLast == 0    )
8
{
9
  // pos Flanke
10
}
11
if (    u8Sample     == 0 
12
     && u8SampleLast != 0    )
13
{
14
  // neg Flanke
15
}
16
u8SampleLast = u8Sample;

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

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

5
if (  (sig!=sig_alt) &&  (sig_alt=sig) ) {
6
  //  steigende Flanke
7
}
8
if (  (sig!=sig_alt) && !(sig_alt=sig) ) {
9
  //  fallende Flanke
10
}
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
Gast
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.