Problem mit DCF Uhr und Soft PWM

Gast #2443281
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.
Angehängte Dateien:
Gast #2443471
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.
#2443488
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.
Gast #2446557
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren