mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik blinkende LED


Autor: Andreas Sch. (Gast)
Datum:
Angehängte Dateien:

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

Autor: Ronny (Gast)
Datum:

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

Autor: Schoasch (Gast)
Datum:

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

Autor: Ronny (Gast)
Datum:

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

Autor: Andreas Sch. (Gast)
Datum:

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

Autor: Ronny (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

Autor: Andreas Sch. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, hab den atmega8

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

Autor: Andreas Sch. (Gast)
Datum:

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

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.