mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik µC-Programm strukturieren, was muss wohin? [avrasm]


Autor: Ich (Gast)
Datum:

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

Autor: Sauger (Gast)
Datum:

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

Autor: Wolfgang (Gast)
Datum:

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

Autor: Ich (Gast)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Anja (Gast)
Datum:

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

Autor: Ich (Gast)
Datum:

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

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.