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?
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....
Ä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++; }
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 ...
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?
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.
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.
Und das Interrupt-Flag musst du auch löschen... (wurde oben aber schon erwähnt...)
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").
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.