mikrocontroller.net

Forum: Compiler & IDEs Zeitschaltuhr (Anfänger)


Autor: Jannik S. (jannik)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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);


}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t i;

for (i = 0; i < 100; i++)
  _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.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario Richter (mario001) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.