Forum: Mikrocontroller und Digitale Elektronik LED seltener umschalten


von Konrad (Gast)


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

von xeox (Gast)


Lesenswert?

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

von was-willst-du (Gast)


Lesenswert?

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

von Konrad (Gast)


Lesenswert?

das ist mir klar, das will ich doch

von Ahem (Gast)


Lesenswert?

>das ist mir klar, das will ich doch

Na, dann mach es doch!

von Karl H. (kbuchegg)


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.

1
uint8_t cnt;
2
3
ISR( ... )
4
{
5
  cnt++;
6
  if( cnt == 100 ) {
7
    cnt = 0;
8
    ... LED toggeln
9
  }
10
11
  ....
12
}

von Guido Körber (Gast)


Lesenswert?

It's not a trick, it's a Zähler...

von Dominique G. (dgoersch)


Lesenswert?

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

von schobbe (Gast)


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..
1
timer_isr(){
2
  
3
  #ifdef LED_TEST
4
  static unsigned char counter = 0;
5
  counter += 1;
6
  if (counter == 100) /* 1 kHz: Alle 100 ms wird getoggelt -> 10 Hz -> sichtbar */
7
  {
8
     LED_PORT ~= LED_PORT;
9
  }   
10
  #endif
11
12
}

von schobbe (Gast)


Lesenswert?

ahja und counter = 0 nicht vergessen...

:-)

von Karl H. (kbuchegg)


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.

von Dominique G. (dgoersch)


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.

von Karl H. (kbuchegg)


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.

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.