mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LEDs mit Zeitverzögerung und Abschaltung


Autor: Dr.Unheil (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe folgendes Problem ich möchte 2 LEDs mit 4 Tastern steuern. Je 2 
Taster schalten eine LED ein, welche eine Nachlaufzeit im 
Sekundenbereich haben soll ca. 30 bis 60sec. Wird aber einer der Taster 
während der Nachlaufzeit dedrückt, sollen sofort alle LEDs abschalten.
PB0 oder PC2 High ist setzen PC0 auf High
PB1 oder PC3 High ist setzen PC1 auf High
PB0,PC2,PB1 oder PC3 setzen PC0 und PC1 auf Low wenn die Nachlaufzeit 
aktiv ist.
Timer und Ausgänge funktionieren, Nachlaufzeit nicht so ganz....
Kann mir wer die Lösung des Problems nennen ???
Alles läuft auf einem Atmega8 mit internem Standarttakt
Code ist angehängt.
Danke !

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> int time;
> time=3600;

Wo hast du den Wert von 3600 her?

Dein µC läuft mit 1000000 Hz  (Standardeinstellung)

Du hast einen Vorteiler von 1024. D.h dein Timer zählt in 1 Sekunde um
1000000 / 1024 = 976.5 hoch.
Wenn du also 30 Sekunden abzählen willst, musst du warten, bis der Timer 
den Wert 976.5 * 30 = 29296.8  erreicht hat.

(Aufpassen: der maximale Wert, der in einen int passt, lautet 32767. Für 
Werte, die größer sind musst du also auf unsigned gehen. Dann gehts bis 
65564)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Dr.Unheil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Danke für die Tips... was sagt Ihr denn allgemein zu dem Programm, das 
kann man doch bestimmt einfacher machen oder ? und warum läuft es nur im 
Simulator korrekt und nicht auf dem STK500 ?

Gruss
Dr.Unheil

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dr.Unheil wrote:
> Hallo,
> Danke für die Tips... was sagt Ihr denn allgemein zu dem Programm,

Ist ziemlicher Müll.
(Mag zwar hart klingen, ist aber so)

* Lass den Timer in Ruhe, wenn er einmal tickt.
Es hat keinen Sinn, dem Timer innerhalb der Schleife ständig einen neuen 
Vorteiler zu verpassen. Initialisierungen heissen Initialisierungen, 
weil sie nur einmal gemacht werden.

* Zeit abzählen macht man, indem man den Timer einen Interrupt auslösen 
lässt, wenn eine bestimmte Zeitdauer abgelaufen ist.

* 0<<PC0  ist immer 0. Eine binäre 0 kannst du nach links schieben sooft 
du willst, sie bleibt trotzdem 0. Insbesondere kann man so nicht 
abfragen, ob ein bestimmter Pin auf 0 liegt.

* Eine kleine Statemachine wäre sicherlich einfacher. Dein Programm ist 
in einem bestimmten Zustand, repräsentiert durch eine Variable und 
verschiedene Werte in dieser Variablen. Wenn ein Ereignis eintritt 
(Taste gedrückt, Zeit abgelaufen, ...) dann wechselt die 'Maschine' in 
einen neuen Zustand über.

* Greif auf 16-Bit Register (TCNT1H, TCNT1L) mit dem Sammelnamen (TCNT1) 
zu. Der Compiler kümmert sich schon um die richtige Reihenfolge.

* Du benutzt Taster ohne sie zu entprellen. Das gibt Ärger.

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.