mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED programmieren mit ATmega8


Autor: David G. (lynx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: cguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: David G. (lynx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann ich denn den Timer wieder ausschalten?

Autor: cguru (Gast)
Datum:

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

Autor: David G. (lynx)
Datum:

Bewertung
0 lesenswert
nicht 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?!?!?!

Autor: cguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: David G. (lynx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super jetzt klappts, vielen Dank!!!

Autor: cguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Freut mich, kein Problem ;)

Autor: Gast3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: David G. (lynx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.