Hallo,
in einem Programm, das ich gerade entwickle, sollen ein DCF-Signal
empfangen und abhängig von Uhrzeit und Datum verschiedene Texte etc. auf
einem LCD (HD44780) angezeigt werden.
Als Beispiel sag ich mal, er sollte die Uhrzeit am LCD anzeigen und
darunter die Tageszeit (nachts, vormittags, abends ...). Das ganze wird
noch etwas komplizierter, läuft aber im Prinzip darauf hinaus.
Für den DCF-Empfang habe ich die Routine aus dem Forum verwendet, sie
wird alle 10ms per Timer-Interrupt aufgerufen.
Ich hatte bisher noch nie Empfangsprobleme. Treten diese nur sehr selten
auf oder muss man ständig damit rechnen (RTC mitlaufen lassen)? Wenn der
Empfang ab und zu (3x pro Woche) für einige Minuten ausfällt, könnte ich
damit leben.
Das LCD braucht mehr oder weniger lange Pausen zwischen den Befehlen.
Sollte ich nun im Interrupt "Flags" setzen und in der Mainloop
bearbeiten oder direkt im Interrupt alles anzeigen? Sollte das LCD immer
komplett gelöscht und neu gemalt werden?
Ich kann die einzelnen Teile programmieren, aber wie muss das gesamte
Programm strukturiert werden, ohne Timing-Probleme zu bekommen?
Mahlzeit,
nehm dir ein Blatt Papier, einen Bleistift und benutze Brain 2.0. Die
meisten Fragen kannst du dir dann selber beantworten (nennt sich
Planung). Danach können wir hier gerne weitermachen.
MfG
Servus!
Da Du schriebst, Du könnest programmieren, wundert mich Deine Frage
schon etwas. Aber gut...
Normalerweise sieht man zu, daß ein Interrupt immer sehr kurz nur
ausgeführt wird. Das geht die anfallenden Arbeiten an wie auch die
Sprache: Ich verwende meist Assembler. Hier werden dann Flaggen gesetzt,
z.B. in einer globalen Statusvariablen.
Im Hauptprogramm wird die Hauptlast der erforderlichen Arbeiten
erledigt. Hierbei achte ich darauf, nur sehr kleine Arbeitsschritte pro
Durchlauf zu erledigen, da ich es mir dann ersparen kann, z.B. einen
nebenläufigen Prozeß (mit einem Betriebssystem auch noch, das dann
gebraucht wird) zu generieren, um Tasteneingaben usw. zu erledigen.
Um das alles zu schaffen, solltest Du Dich in Wikipedia z.B. mit dem
Konzept der Statusmaschine vertrautmachen. Das ist eine einfache, aber
effiziente Möglichkeit, auch komplexere Programmabläufe zu steuern.
Wenn Du soviel Spaß in Dein Programm stecken willst, nur diejenigen
Textteile an das LCD-Modul zu übertragen, die neu sind, bitte sehr. Ist
allerdings normalerweise nicht nötig.
Gruß - Wolfgang
Erstmal vielen Dank für die Antworten.
Ich würde mich noch als Anfänger bezeichnen (sonst würd ich ja auch
nicht sowas fragen ;) , aber da ich schon einige kleine Sachen
programmiert habe, ist es kein Problem für mich, ein LCD anzusteuern
etc.
Jedoch habe ich noch nie ein Projekt mit mehreren, voneinander
unabhängigen Teilen sinnvoll strukturiert.
Das Prinzip der Statusmaschine ist mir schon bekannt, ich wüsste aber
nicht, wie ich bei diesem Problem ansetzen müsste.
Zur Zeit bin ich soweit, dass die DCF-Empfangsroutine im Interrupt das
Signal entschlüsselt und im RAM abspeichert. In der Hauptschleife
vergleiche ich die Uhrzeit mit den Grenzwerten und gebe dann Uhrzeit und
Tageszeit aus.
Der Prozessor ist also ständig damit beschäftigt, 4000 mal pro Sekunde
die Uhrzeit zu vergleichen und das LCD neu zu bemalen, während sich die
Zeit gar nicht ändert. Ist das gut so?
Wie sieht es jetzt mit dem DCF77-Empfang aus? Ich habe noch nie
Empfangsstörungen beobachten können, aber im Forum schon oft davon
gelesen.
Ist eine kleine RTC notwendig? Kann diese in den Interrupt hinein?
Hi
>Der Prozessor ist also ständig damit beschäftigt, 4000 mal pro Sekunde>die Uhrzeit zu vergleichen und das LCD neu zu bemalen, während sich die>Zeit gar nicht ändert. Ist das gut so?
Nein. Wozu 4000 mal? Es muss doch nur etwas verglichen und angezeigt
werden, wenn sich etwas relevantes ändert.
MfG Spess
Ich schrieb:> Ich hatte bisher noch nie Empfangsprobleme. Treten diese nur sehr selten> auf oder muss man ständig damit rechnen (RTC mitlaufen lassen)?
Ne RTC ist einfach zu implementieren, also rein damit.
Ansonsten, wenn die Hausfrau in der Nähe staubsaugt oder bei Gewitter
wird Mumpitz angezeigt.
Ich schrieb:> direkt im Interrupt alles anzeigen?
Macht man nicht, da man sonst im Main nichts anzeigen darf. Außerdem
macht das Interrupts langsam und andere Interrupts können verloren
gehen.
Ich schrieb:> Sollte das LCD immer> komplett gelöscht und neu gemalt werden?
Sieht stümperhaft aus (sichtbares Flackern), daher besser alten Text mit
neuen Text überschreiben. Ist der neue Text kürzer, schreibt man
Leerzeichen.
Ich schrieb:> Ich kann die einzelnen Teile programmieren, aber wie muss das gesamte> Programm strukturiert werden, ohne Timing-Probleme zu bekommen?
PC ausschalten, Papier und Bleistift nehmen, Programmablaufplan
aufmalen.
Peter
Ich schrieb:> Wie sieht es jetzt mit dem DCF77-Empfang aus? Ich habe noch nie> Empfangsstörungen beobachten können, aber im Forum schon oft davon> gelesen
Wenn Du Nähe Frankfurt wohnst brauchst Du dir keine Sorgen machen.
Gruß Anja
Nein, wohne in Oberbayern ;)
@peda
Der Code, den ich aus den Forum habe, lässt die Zeit einfach stehen,
wenn Müll reinkommt.
Ich werd nochmal drüber nachdenken und das Programm umschreiben, bei
Erfolg / Problemen meld ich mich wieder.
@all: Danke für die hilfreichen Antworten!