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.
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?
Ach so, das heiß also, dass solange die Schleifen durchlaufen werden nichts anderes mehr passiert. Aber wie kann man das besser machen?
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.