www.mikrocontroller.net

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


Autor: Balesi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
 if (!(v-sek % 4))
    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

Autor: Wolfgang M. (womai)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Balesi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Wolfgang,

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

Genau richtig für diese Anwendung!

Autor: Balesi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"
//<<in der main:>>

if (!(Blinkcode == 0xFF))
    Blinkcode = Blinken(merker,Blinkcode);

//<<in der Funktion:>>

uint8_t Blinken(uint8_t mark, uint8_t code)
{
  // code:
  // DB = Dauerblinken
  // zahl x = x * 1/4 sekunden
  // Dann Blinken los
  if ((!(code == 0xDB)) && ((v_sek+code) > mark) )
  {
    code--;
  }  
//Hier die eigentliche Blinkfunktion:
  if ((v_sek>>2)%3) // 1/4-Sek-zähler durch vier teilen = 1s und modulo3
    LED_on;  // Rest 1 und Rest 2
  else 
    LED_off; // Rest 0

  return (code);
}

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

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.