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


von Dr.Unheil (Gast)


Angehängte Dateien:

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 !

von Karl H. (kbuchegg)


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)

von Peter D. (peda)


Lesenswert?


von Dr.Unheil (Gast)


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

von Karl H. (kbuchegg)


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.

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.