Hallo zusammen, habe erst vor kurzem mich mit dem Thema Mikrocontroller und Programmieren befasst, bin also noch blutiger Anfänger;) Ich hab mich soweit durch das AVR-Tutorial durchgearbeitet und wollte jetzt selber mal etwas programmieren und dachte dabei an eine recht simple Konstruktion mit einem Taster und einer LED. Die LED soll beim drücken des Tasters blinken und beim wiederhotem drücken wieder aus sein. Ich hab mir da so ein paar Gedanken gemacht, wie das ganze aussehen könnte: Ich schreibe ins "main", dass, wenn beim Taster eine fallende Flanke vorliegt, also das bit auf 0 gesetzt wird, ein Unterprogramm geöffnet wird, also ein interrupt. In diesem Unterprogramm ist dann das Timer interrupt aufgeführt, dass die LED blinken lässt und ein weiteres interrupt, das beim wiederholten drücken des Tasters (steigende Flanke) die LED wieder ausschaltet, also den port auf 0b11111111 stellt. Doch wenn ich das so programmiere läuft doch das timer interrupt weiter und die LED blinkt immernoch oder??? gibt es da einen Befehl wie das interrupt wieder deaktiviert werden kann? Und funktiert mein Programm in dieser Weise überhaupt oder habt ihr Vorschläge wie ich das besser programmieren könnte? Bin für jede Hilfe dankbar:) Gruß David
Du müsstest in der main() den Taster pollen, also ständig abfragen ob er z.B. auf 0 gezogen wurde. Am besten debouncen, so dass der Taster ein paar ms gedruckt sein muss damit die Aktion ausgeführt wird. Mit dem Taster wählst du dann Blinken oder NichtBlinken aus. Das Blinken kann man z.B. so machen, dass man einen Timer verwendet und den Overflow Interrupt zum Umschalten der Led benutzt. Soll die Led nicht blinken, würde ich einfach den Timer ausschalten und das Bit in dem entsprechenden Port der Led auf 0 stellen, damit sie auch aus ist. Beim Anschalten, entsprechend umgekehrt. Dein Controller führt den Code in der main() die ganze Zeit aus. Kommt es zum Overflow des Timers springt er in den Interrupt, schaltet die Led um und spring wieder zurück an die Stelle in der main(), von der er kam.
Indem du die prescaler bits im config register des timers alle wieder auf 0 setzt.
Der prescaler ist doch der Vorteiler, der den Systemtakt durch einen bestimmten Faktor teilt (1, 8, 64, 256, 1024)....soweit ich das verstanden habe...und den soll ich auf 0 setzen?!?!?!
Aktuelles Atmgea8 Datenblatt S.72: Bit 2:0 – CS02:0: Clock Select in TCCR0: CS02 CS01 CS00 Description 0 0 0 No clock source (Timer/Counter stopped).
Wichtig ist aber ganz besonders Folgendes: Du schreibst: > Die LED soll beim drücken des Tasters blinken und beim wiederhotem drücken wieder aus sein. Das heisst also dass die LED solange blinkt, wie der Taster gedrueckt wird "beim Druecken". Wie Du da das zweite Druecken verwenden willst, ist mir nicht klar. Gast3
Ich hab das jetzt so programmiert, dass beim ersten drücken ein Unterprogramm aufgerufen wird, in dem der Timer aufgeführt ist und die LED somit blinkt. Wenn der Taster dann nochmal gedrückt wird, verweist dieses Unterprogramm auf ein weiteres Unterprogramm, wo der Timer deaktiviert und die LED ausgeschaltet wird und wieder zurück ins main springt.
Was ich damit sagen wolte ist, dass die Aufgabenstellung schon nicht klar und eindeutig formuliert war. Wenn das aber geschafft ist, ist die Loesung auch nicht mehr weit. Gast3
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.