Wie man im Dateianhang sieht bin ich ein Anfänger :) Nichts desto trotz möchte ich mir eine kleine Zeitschaltuhr zusammenbauen und so nebenbei das mcu programmieren in cpp anfangen. *Ziel meines Programmes soll sein: Dass mein UV-Belichter eine Elektronische Zeitschaltuhr bekommt. Diese hat an zwei Ports jeweils eine 7-Segment anzeige um bis 99 sec anzuzeigen. Aktiviere ich nun den Countdown wird ein Pin geschaltet und ein Relais zieht an. Somit ist der UV-Belichter an und die Zeit soll nun auf dem Display heruntergezählt werden (in sec.). Wenn sie 0 erreicht hat soll das Gerät abschalten und wieder für ein neustart bereit sein. Fangen wir aber erstmal gaaaanz klein an, da mir noch jede Grundlage fehtl. Zunnächst interessiert mich einfach: Wie bekomm ich eine "einfache" Zeitverzögerung im Programmablauf hin? In einem 1 sec takt? Ich habe es mal im Anhang versucht, jedoch denke ich dass das nicht die elegante Lösung ist. da der Code so unheimlich groß wird. Ich denke ihr versteht mein Problem? Programm: #include <avr/io.h> #include <inttypes.h> #ifndef F_PCU #define F_PCU 8000000UL /*Quarz mit 8MHz*/ #endif #include <avr/delay.h> /*Definiert _delay_ms_() */ int main(void) { DDRB = 0xff; PORTB = 00000001; _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); PORTB = 00000010; _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); PORTB = 00000100; _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); PORTB = 00001000; _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); PORTB = 00010000; _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); PORTB = 00100000; _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); _delay_ms(99999999); }
Erstens, "cpp" ist keine Programmiersprache. Du willst wahrscheinlich in C programmieren. Falls du wirklich ganz genau weißt, was du tust, kannst du dich auch an C++ rantrauen, ist aber gerade auf einem Controller nicht unbedingt der erste Rat für einen Anfängern. Nein, C++ ist nicht einfach ,,modernes C'', es ist eine sehr verschiedene Programmiersprache, die mehr zufällig einen Teil der Syntax von C übernommen hat. Zweitens, bitte lies die gültigen Wertebereiche für _delay_ms() in der Doku nach. Ich kann dir ohne Nachrechnen sagen, dass _delay_ms(10) für alle derzeitigen AVR- Taktfrequenzen garantiert realisierbar ist, nennenswert größere Werte u. U. schon nicht mehr. (Bei 1 MHz geht auch noch _delay_ms(100), aber du hast ja 8 MHz.) Eine Sekunde sollte man daher also verzögern als:
1 | uint8_t i; |
2 | |
3 | for (i = 0; i < 100; i++) |
4 | _delay_ms(10); |
Wenn du mit dem Tutorial dann ein wenig weiter bist, wirst du dich unbedingt mit den Timern beschäftigen wollen, damit du nicht einfach nur sinnlos die CPU-Zeit verwartest. Falls _delay_ms() deinen Code sehr stark aufbläht: diese Funktion geht nur mit eingeschalteter Optimierung so, wie sie gehen soll. Ohne diese zieht sie zur Laufzeit auszuführende Gleitkommaberechnungen nach, die nicht nur groß sind sondern auch so langsam, dass das Timing völlig daneben liegt.
Auch wenn delay_ms mit so großen Zahlen funktionieren würde, dann käme ja eine Verzögerung von 5,8 Tagen raus. Du brauchst also viel Geduld beim Testen dieses Programms. Und solche Copy+Paste Monster sollte man sich schleunigst abgewöhnen, sonst sieht man schnell selber nicht mehr durch. Wiederholte Routinen immer in Schleifen zusammenfassen, gleiche Programmteile in Unterfunktionen. Und nicht die Main-Loop vergesssen !!! Peter
Hallo, natürlich kann man längere Verzögerungen mit den Delay-Funktionen erreichen, aber ich würde dir empfehlen, gleich mal einen Blick auf die Timer-Funktionen zu werfen und das ganze dann über Timer-Interrupts zu realisieren. Grund: Wenn du Delay-Funktionen nimmst, ist der Controller während deren Abarbeitung "tot", d.h. er zählt sich einen Wolf und kann nichts anderes mehr machen (außer bei einem Interrupt). Nimmst du einen Timer, läuft der quasi nebenher und sagt dem Controller Bescheid, wenn eine bestimmte Zeit abgelaufen ist. Außerdem ist die Realisierung über einen Timer deutlich genauer als über die Delay-Funktionen. Grüße, Mario
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.