www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED seltener umschalten


Autor: Konrad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen

Hab nen Interrupt der mit ner Frequenz von 1kHz ausgeführt wird. Zum 
erkennen das er läuft wird jedes Mal ne LED umgeschaltet. Wie kann ich 
das erreichen, dass er z.B nur jedes 100. mal die umschaltet, damit ich 
das auch sehen und nicht nur messen kann

Autor: xeox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei jedem aufruf ne variable um 1 erhöhen und erst umschalten wenn 100 
erreicht ist. (+ dann variable zurücksetzen)

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja würde mal sagen: einfach nur bei jedem 100. Interrupt die Led 
umschalten.

Autor: Konrad (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist mir klar, das will ich doch

Autor: Ahem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>das ist mir klar, das will ich doch

Na, dann mach es doch!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Konrad wrote:
> das ist mir klar, das will ich doch

Ja, und. Wo ist jetzt das Problem?

eine Variable muss her, welche als Zähler fungiert.
Bei jedem ISR Aufruf zählst du 1 zum Zähler dazu.
Ist der Wert des Zählers danach 100, dann schaltest du die Led um
und setzt den Zähler wieder auf 0.


uint8_t cnt;

ISR( ... )
{
  cnt++;
  if( cnt == 100 ) {
    cnt = 0;
    ... LED toggeln
  }

  ....
}

Autor: Guido Körber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
It's not a trick, it's a Zähler...

Autor: Dominique Görsch (dgoersch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wärs nicht schöner das Toggeln und Rücksetzen nicht in der ISR zu 
machen, sondern in der Main-Loop?

Autor: schobbe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum soll das "schöner" sein...

ist doch nur ne test-routine.. würde das ganze so lokal wie möglich 
machen, damit man es einfach auch wieder rausschmeissen kann..

timer_isr(){
  
  #ifdef LED_TEST
  static unsigned char counter = 0;
  counter += 1;
  if (counter == 100) /* 1 kHz: Alle 100 ms wird getoggelt -> 10 Hz -> sichtbar */
  {
     LED_PORT ~= LED_PORT;
  }   
  #endif

}


Autor: schobbe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahja und counter = 0 nicht vergessen...

:-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dominique Görsch wrote:
> Wärs nicht schöner das Toggeln und Rücksetzen nicht in der ISR zu
> machen, sondern in der Main-Loop?

Über Schönheit kann man streiten.
Aber komplizierter wärs auf jeden Fall.
Ganz abgesehen davon, dass das dann am Sinn der Sache, nämlich möglichst 
genau zu messen in welchen Abständen die ISR aufgerufen wird, vorbei 
geht. Vom Setzen des Job-Flags bis zum Zeitpunkt an dem Die Mainloop 
darauf anspricht vergeht ja auch Zeit. Blöd nur, dass dieser Zeitversatz 
davon abhängt, wo dir Mainloop genau war, als das Jobflag gesetzt wurde.

Autor: Dominique Görsch (dgoersch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm stimmt auch wieder, in dem Fall ists wohl andersherum echt besser. 
Ich hab mir ansonsten generell angewöhnt die ISRs so kurz wie möglich zu 
halten, also einfach nur Zähler hochsetzen und gut und den Rest dann in 
der Mainloop abfragen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dominique Görsch wrote:
> Hmm stimmt auch wieder, in dem Fall ists wohl andersherum echt besser.
> Ich hab mir ansonsten generell angewöhnt die ISRs so kurz wie möglich zu
> halten, also einfach nur Zähler hochsetzen und gut und den Rest dann in
> der Mainloop abfragen.

Das ist ja auch grundsätzlich eine gute Strategie.
Nur muss man immer auch aufpassen, dass der Aufwand nicht höher als der 
Nutzen ist. Eine LED umschalten dauert ein paar Taktzyklen. Ein Jobflag 
setzen dauert auch ein paar Taktzyklen. Kommt sich also im Endeffekt 
mehr oder weniger aufs gleiche raus. Und dann gewinnt die einfachere 
Lösung.

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.