Forum: Mikrocontroller und Digitale Elektronik Problem mit DCF Uhr und Soft PWM


von devil1979 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo mal wieder.

Diesmal ein neues Problem. In obigen Programm soll eine DCF uhr und ein 
Thermometer gleichzeitig laufen, soweit sogut. Zeitgleich sollen 3 LEDs 
im Sekundentakt hochgedimmt werden. Das soll die Datei rgbleds.c 
übernehmen. Hier frage ich den Wert der Sekundenvariable ab und schreibe 
ihn in die PWM Variable. Das funktioniert soweit gut, die LEDS dimmen im 
Sekundentakt bis zum Wert 10 hoch. das Problem ist, das während das 
passiert die Sekunden auf dem Display nicht mehr hochzählen. Der Wert 
bleibt auf null, erst nach 30 Sek wo die PWM Routine nicht mehr arbeitet 
zeigt das Display wieder was an. Es scheint, das die PWM Routine die 
Displayroutine blockiert aber wieso? Ich habs auch schon mit einer if- 
Abfrage versucht, da läuft zwar die Uhr aber das Dimmen funktoniert 
nicht.

von Stefan E. (sternst)


Lesenswert?

devil1979 schrieb:
> Der Wert
> bleibt auf null, erst nach 30 Sek wo die PWM Routine nicht mehr arbeitet
> zeigt das Display wieder was an. Es scheint, das die PWM Routine die
> Displayroutine blockiert aber wieso?

Gegenfrage: während in MOND() die Schleifen durchlaufen werden (was 30 
Sekunden dauert), wie und wo wird denn die Displayroutine da aufgerufen?

von devil1979 (Gast)


Lesenswert?

Ach so, das heiß also, dass solange die Schleifen durchlaufen werden 
nichts anderes mehr passiert. Aber wie kann man das besser machen?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Bearbeite beides ( Uhr und PWM ) in Interrupts. Für die PWM bietet sich 
doch ein Timer Interrupt ( Compare oder Overflow ) geradezu an. Das 
Hauptprogramm muss dann nur noch den Sekundentakt in die PWM register 
übertragen und evtl. das Softdimmen machen.

von Tom (Gast)


Lesenswert?

devil1979 schrieb:
> Ach so, das heiß also, dass solange die Schleifen durchlaufen werden
> nichts anderes mehr passiert.

Wie soll etwas anderes passieren (außer Interruptabarbeitung), wenn der 
Prozessor in der Schleife festhängt. Du mußt dafür sorgen, dass die 
Hauptschleife schneller durchlaufen wird und nicht so lange in einer 
Einzelaufgabe festhängt. Zerlege die Routine Mond() in kleine 
Teilaufgaben, so dass bei jedem Hauptschleifendurchlauf nur eine kurze 
Zeit benötigt wird.

von Thorsten S. (whitejack)


Lesenswert?

das Zauberwort heißt immer wieder: "State Machine"

Der Prozessor kann nur einen Befehl zur Zeit abarbeiten, egal ob 
Interrupts an oder aus.

Das einzige was wirklich parallel arbeiten kann, sind die im Prozessor 
befindlichen Hardwareeinheiten wie ADC etc. Diese KANN man anstoßen 
damit sie loslegen. Man kann sie abfragen (pollen) oder sie melden sich 
über einen Interrupt zurück wenn sie fertig sind.

Ein Interrupt kann den Prozessor in seiner momentanen Arbeit 
"unterbrechen/stören" und Ihn an einer völlig anderen Stelle 
weiterarbeiten lassen, das passiert u.u. zwischen 2 deiner 
Programmzeilen. Dann kehrt er zu der Stelle zurück wo er vor der STÖRUNG 
war. Ein Interrupt ist für dich wie ein unsichtbarer Funktionsaufruf. 
Ansonsten musst du in deinem Programm dafür sorgen dass der Prozessor 
nicht irgendwo hängen bleibt.
Eine Möglichkeit sind State Machines in Funktionsaufrufen. Bei jedem 
Aufruf kannst du einen Zähler innerhalb der Funktion einen weiterzählen 
lassen und führst entsprechende Teilroutinen aus...

TS.

von sascha1979 (Gast)


Angehängte Dateien:

Lesenswert?

Ok, das habe ich soweit verstanden, nur an der Umsetzung hapert es noch 
etwas. Ich habe dasd Programm jetzt mal mit einer State Machine 
versucht. Die LEDS leuchten nun in der vorgegebenen Zeit auf, und das 
Display läuft auch weiter. Nur wird der PWM Wert nicht hochgezählt. Wie 
kann ich den Wert der Sekundenvariable direkt bei jedem Durcjlauf in die 
PWM Variable schreiben. Ich dachte wenn ich jetzt die Funktion 
sekündlich aufrufe und immer 1 zum PWM Wert addiere müsste es eigentlich 
funktionieren, dem ist aber nicht so. Sorry wenn das sehr einfache 
Fehler sind, aber ich bin leider noch nicht ganz so fit bei der 
Programmierung und muss in ca. einem Monat mein Technikerschulprojekt 
fertig haben.

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.