Forum: Mikrocontroller und Digitale Elektronik blinkende LED


von Andreas Sch. (Gast)


Angehängte Dateien:

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?

von Ronny (Gast)


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....

von Schoasch (Gast)


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++;
}

von Ronny (Gast)


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 ...

von Andreas Sch. (Gast)


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?

von Ronny (Gast)


Lesenswert?

Lies dir im Datenblatt nochmal das Kapitel über den Timer1
durch,insbesondere was die Taktquellen/Teiler und das TCNT1 Register
angeht.Da steht prima beschrieben,WAS eigentlich WIE zählt.

von Rahul (Gast)


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.

von Rahul (Gast)


Lesenswert?

Und das Interrupt-Flag musst du auch löschen...
(wurde oben aber schon erwähnt...)

von Rahul (Gast)


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").

von Andreas Sch. (Gast)


Lesenswert?

Ja, hab den atmega8

Ich werd mir das im Datenblat nochmal genauer anschauen....

von Andreas Sch. (Gast)


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...

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.