blinkende LED

Gast #339288
Lesenswert?
• ▲
▼
Hi,

ich hab mir mal ein Programm zusammengebaut das eine LED 1 Sekunde
auflechtenlässt und dann 1 Sekunde nicht und so weiter.

Jetzt ist es aber so das die LED zuerst 1s nichts tut und dann immer
leuchted.

Kann mir vieliecht bitte jemand sagen warum die LED nicht aufhört zu
leuchten?
Angehängte Dateien:
Gast #339289
Lesenswert?
• ▲
▼
Sieht einiges merkwürdig aus....

Schau dir mal deine Interrupt-Routine an,Counter hängt immer zwischen 0
und 1.Ist das beabsichtigt?Und nach dem 1. Overflow fängt TCNT1 dann
auch wieder bei 0 mit zählen an....
Gast #339290
Lesenswert?
• ▲
▼
Ähm.. ein bisschen verwirrend(und überkompliziert)hast du das ganze
schon programmiert.
Ich nehme mal an, dass du entweder das TimerInterruptFlag und/oder den
Timer Wert zurücksetzen musst.(Ich hab mit AVRs noch nichts gemacht
;-))

Aber deine Abfragen sind doch ziemlich... verwirrend bis sinnlos. Die
Variable Counter wird um 1 erhöht wenn diese 0 ist. Sobald sie einen
anderen Wert als 0 hat wird sie auf Null gesetz?!

Also ich würd folgende Wege nehmen.
1.(ohne interrupt)
while(1)
{
LED=!LED;
delay_ms(1000); //Eine Einfache delay-funktion ist sicher in einer Lib

}

2.(Mit interrupt)
Einfach den Timer so einstellen, dass er,wenn möglich, jede Sekunde
einen Interrupt macht und danach einfach den Zustand des Leds wechseln

SIGNAL(SIG_OVERFLOW1)/* signal handler for tcnt1TCNT1 = 61935; overflow
interrupt */
{
 LED=!LED;
}

in diesem Sinne

Oder ansonst halt ein Variable Hochzählen und dann das LEd wechseln

SIGNAL(SIG_OVERFLOW1)/* signal handler for tcnt1TCNT1 = 61935; overflow
interrupt */
{
 if(counter==1000) //Gilt nur wenn jede Millisekunde ein Interrupt
                     erfolgt
  {
   LED=!LED;
   counter=0;
  }
counter++;
}
Gast #339291
Lesenswert?
• ▲
▼
Probier den Vorteiler von Timer1 mal auf 1024 zu setzen,in das
dazugehörige Capture/Compare Register schreibst du 3600 (aufpassen,16
Bit Wert,siehe Datenblatt).Dann anstatt overflow-interrupt einfach den
compare-interrupt zum toggeln nehmen.und schon brauchst du keinen
Counter mehr ...
Gast #339292
Lesenswert?
• ▲
▼
Danke erstmal für eure Mühe, ich weis ich bin ein schwerer fall :)

also

SIGNAL(SIG_OVERFLOW1)/* signal handler for tcnt1TCNT1 = 61935;
overflow
interrupt */
{
 LED=!LED;
}

hab ich jetzt mal anstatt dem counter probiert, und die LED blinkt (nur
eben im 10.. Sekundentakt).

ich dachte die zeit stellt man bei "TCNT1 = 61935;" ein, also je nach
takt und teiler oder?

oder hab ich da was wichtiges übersehen?
Gast #339294
Lesenswert?
• ▲
▼
Wenn du schon den Overflow-Interrupt benutzt und den Counter vorher mit
einem Wert initialisierst, dann solltest du diesen Wert auch in der ISR
auch wieder in das Register schreiben, weil der Timer sonst einfach bei
0 weitermacht.
Gast #339296
Lesenswert?
• ▲
▼
ch beziehe mich mal auf das Datenblatt des ATmega8:
Auf Seite 86 wird der "Normal Mode" des Timers 1 beschrieben (den du
ja verwendest).
Wenn du uns noch deinen Controller nennen würdest, könnte man dir im
entsprechenden Datenblatt auch diese Textstelle zeigen...
(Ich beziehe mich grundsätzlich auf das "Complete Datasheet", nicht
die Vertriebsversion "Summary").
Gast #339298
Lesenswert?
• ▲
▼
so hab jetzt mal 61935 in der ISR nochmal ins register geschrieben:

SIGNAL(SIG_OVERFLOW1)/* signal handler for tcnt1TCNT1 = 61935; overflow
interrupt */
{
  LED =! LED;
  TCNT1 = 61935;
}

jetzt funktioniert eigentlich alles.
was mich jetzt noch beschäftigt ist die sache mit dem Interrupt-Flag...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren