Hi
Ein (fast) gleiches Projekt hab ich jetzt aufgelegt. Ist ein Count-Down
meiner restlichen Arbeitszeit... um die Kollegen etwas zu ärgern ....
Soll in 1/10 Sekunden bis zur Rente die Restzeit anzeigen und noch so
ein paar "Spielereien" bieten. Allerdings, ich habe mich für die
Codierung der Anzeigen über den Controller entschieden und bei 11
Anzeigen war ich mir nicht sicher, ob der Multiplexer den Anzeigen genug
Zeit läßt, aufzuleuchten. Immerhin, hat jede Anzeige nur 1/11 Zeit.
Frühere Projekte mit 4 7-Segmentanzeigen habe ich im mSek. Takt
durchgeschoben und so eine gleichmäßige Anzeige erhalten. Daher hab ich
mich für einen Atmega16 entschieden, der nicht viel teurer als der
Atmega8 ist, dafür aber 32 IO-Pins hat. So kann ich 2 Gruppen a 6
7-Segmentanzeigen multiplexen und hoffe, das es anschaulich ist.
Nun zum Programm ein paar Worte:
Die Anzeige soll als Count-Down fungieren
Es soll eine Schlange oder fallende Balken dargestellt werden
Sie soll einfache Texte in Laufschrift anzeigen, so wie "HALLO"
und natürlich soll auch mal die Tageszeit dargestellt sein.
Daher werden die 7 -Segmente im einer Matrix vom Controller angesteuert
und nicht über einen diskreten 7 Segment-Decoder.
Deine Vorgehensweise sollte in etwa so sein:
Liste der Funktionen aufstellen:
Eingabe von Werten, also Uhr stellen
Anzeige-Modus
Ansteuern der Anzeigen
Erfassen der Tastersignale
evtl. Relais schalten
evtl. Signaltöne ausgeben
sieht bei mir grob so aus:
Start
Initialisierung
Loop
Read_IO ; lesen der Eingänge, entprellen, Flanken erfassen
Read_Ser ; evtl. lesen der seriellen Schnittstelle
Chk_Order ; Befehle dekodieren
Order_1 ; Uhr stellen ( Modus 1 )
Order_2 ; Uhrzeit anzeigen
Order_3 ; Lichtspiele
Order_4 ; Countdown
Chk_ISR_Flag ; Flankenbits aus Timer-ISR auswerten
Flag_1 ; Anzeige aktualisieren und ausgeben
Send_Ser ; Daten an PC senden
Set_IO ; evtl. Relaisausgänge oder Tonerzeugung aktivieren
Go_Loop
------------------ end Program -------------------
------------------ Zeitinterrupt -----------------
Timer_ISR:
Register_retten
Zeitflag_1_setzen ; Millisekunden^0
Zeitflag_2_setzen ; Millisekunden^1
Zeitflag_3_setzen ; Millisekunden^2
Zeitflag_4_setzen ; Sekunde
Register_zurück
RETI
------------------End Interrupt -------------------
Sinn macht es, die Anzeige mit einem Flag aus der Timer-ISR zu triggern,
damit diese schön gleichmäßig aufgerufen wird.
Gruß oldmax