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
bei jedem aufruf ne variable um 1 erhöhen und erst umschalten wenn 100 erreicht ist. (+ dann variable zurücksetzen)
Naja würde mal sagen: einfach nur bei jedem 100. Interrupt die Led umschalten.
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 | }
|
Wärs nicht schöner das Toggeln und Rücksetzen nicht in der ISR zu machen, sondern in der Main-Loop?
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 | }
|
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.