Forum: Mikrocontroller und Digitale Elektronik LED programmieren mit ATmega8


von David G. (lynx)


Lesenswert?

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

von cguru (Gast)


Lesenswert?

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.

von David G. (lynx)


Lesenswert?

Wie kann ich denn den Timer wieder ausschalten?

von cguru (Gast)


Lesenswert?

Indem du die prescaler bits im config register des timers alle wieder 
auf 0 setzt.

von David G. (lynx)


Lesenswert?

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?!?!?!

von cguru (Gast)


Lesenswert?

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

von David G. (lynx)


Lesenswert?

Super jetzt klappts, vielen Dank!!!

von cguru (Gast)


Lesenswert?

Freut mich, kein Problem ;)

von Gast3 (Gast)


Lesenswert?

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

von David G. (lynx)


Lesenswert?

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.

von Gast3 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.