Forum: Compiler & IDEs Zeitschaltuhr (Anfänger)


von Jannik S. (jannik)


Angehängte Dateien:

Lesenswert?

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);


}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von peter dannegger (Gast)


Lesenswert?

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

von Mario R. (mario001) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.