Forum: Mikrocontroller und Digitale Elektronik "positive Flanken" (SW) zählen


von Balesi (Gast)


Lesenswert?

Guten Morgen.

Gibt es eigentlich eine einfache Möglichkeit "positive Flanken" zu 
zählen. Es ist unglücklich ausgedrückt.

ich habe einen Zähler der 1/4 Sekunden (v-sek) zählt. jetzt brauche ich 
eine Variable die die Sekunden hochzählt.

Mein Ansatz war:
1
 if (!(v-sek % 4))
2
    sekunde++;
Das blöde ist natürlich, das dieser Zustand (v-sek%4) eine viertel 
Sekunde lang bleibt und die Variable "sekunde" nicht einmal sondern 
zigmal hochgezählt wird.

Bisher habe ich immer Hilfsvariablen genommen und irgendwie verbastelt.
geht das nicht einfacher? Wie macht Ihr das?

Für einen schlauen Tipp bin ich dankbar

von Wolfgang M. (womai)


Lesenswert?

Und warum nicht einfach

int sekunde;
sekunde = vsek >> 2;

Nachdem sekunde ein Integerwert ist, erhoeht der sich nur (und auch nur 
einmal), wenn sich vsk um 4 erhoeht. Problem geloest.

Wolfgang

von Balesi (Gast)


Lesenswert?

Hallo Wolfgang,

das ist ein sehr guter Tipp, da bin ich gar nicht drauf gekommen. Vielen 
Dank!

Genau richtig für diese Anwendung!

von Balesi (Gast)


Lesenswert?

Ich nochmal,

habe jetzt Code generiert, der diese Funktion eingebaut hat.

Endprodukt soll folgendes realisieren können:
Ich übergebe einen "Code" an die Blinkfunktion. Ist die Blinkfunktion 
ein, blinkt eine LED (2 sek. ein, 1 sek. aus) --> funktioniert
Ist der Code 0xDB (DB steht für Dauerblinken) blinkt die LED dauerhaft
Ist der Code eine Zahl (maximal 180 (0xB4 also immer kleiner DB) blinkt 
die LED eine bestimmte Zeit lang.
(180 zählt die 1/4 Sekunden Rückwärts --> 180/4 = 45sek --> 15 x 2sek 
ein und 1sek aus)
Ist der Code 0xFF ((FF steht für oFF) blinkt die LED gar nicht, ist also 
aus.

Leider habe ich gerade das Problem, das die Funktion eben NICHT 
dauerblinkt sondern sich irgendwann abschaltet.
Hier der Code, was habe ich übersehen?
Blinkcode übergeb ich mit 0xDB
Randbedingungen:
v_sek ist der 1/4Sekundenzähler, der per Interrupt hochzählt (8Bit)
merker, ist ein Zeitstempel, der mir die Startzeit übergibt (wichtig für 
blinken auf bestimmte Zeit)
In DB spielt merker keine Rolle. wird mit merker = '0' "ausgeliefert"
1
//<<in der main:>>
2
3
if (!(Blinkcode == 0xFF))
4
    Blinkcode = Blinken(merker,Blinkcode);
5
6
//<<in der Funktion:>>
7
8
uint8_t Blinken(uint8_t mark, uint8_t code)
9
{
10
  // code:
11
  // DB = Dauerblinken
12
  // zahl x = x * 1/4 sekunden
13
  // Dann Blinken los
14
  if ((!(code == 0xDB)) && ((v_sek+code) > mark) )
15
  {
16
    code--;
17
  }  
18
//Hier die eigentliche Blinkfunktion:
19
  if ((v_sek>>2)%3) // 1/4-Sek-zähler durch vier teilen = 1s und modulo3
20
    LED_on;  // Rest 1 und Rest 2
21
  else 
22
    LED_off; // Rest 0
23
24
  return (code);
25
}

(Habe ich erwähnt, dass ich mit einem Atmel arbeite? ATTiny24. Und 
AVRStudio und WinAVR)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.