@ 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