- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Programm wird nur einmal durchlaufen

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    23.03.2009
    Beiträge
    10
    Anzeige

    Powerstation Test
    Hallo
    Ich hab jetzt gleich noch eine weitere Frage, mache dafür aber nicht extra einen weiteren Thread auf. In diesem Artikel von RN-Wissen wird gezeigt wie man eine LED blinken lassen kann ohne Timer:
    https://www.roboternetz.de/wissen/in...ken_ohne_Timer

    Dort wird die Funktion sleep_ms () benuzt. Und die drei Bibliotheken:
    <avr/io.h>
    <util/delay.h>
    <stdint.h>

    Ist diese Funktion in einer diesen Bibliotheken bereits definiert? Also in avr/io soweit cih weiss nicht... aber vielleicht in einer anderen? Und kann man diese Funktion, wenn man die oberen Bibliotheken "inkludiert" hat, einfach benutzen?

    Jedoch wird sie im Programm am Anfang nochmal dekliniert mit:
    void sleep_ms(uint16_t ms);
    Ist es notwendig, des zu machen?

    Karl

  2. #12
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    in der delay.h ist sowohl eine

    delay_loop(X)

    die X*3 prozessorzyklen wartet

    als auch eine sleep_us, die in mikrosekunden wartet, dafür muss man die frequenz des controllers mit in den projekteinstellungen angeben!

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Das ist nicht ganz richtig...
    In der delay.h gibt es keine Funktion sleep_ms(), dafür allerdings eine Funktion _delay_ms().
    Nachteil dieser _delay_ms() ist, dass man damit maximal
    262.14 ms / F_CPU in MHz
    warten kann. Bei einem Takt von 8 MHz also gerade mal 32,768 ms.

    In dem Beispielprogramm wurde deswegen die Funktion sleep_ms() eingebaut, die in einer Schleife die Funktion _delay_ms(1) aufruft und somit das Problem behebt.

    Die Funktion findest Du im Beispiel unter der main()

    Gruß,
    askazo

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    23.03.2009
    Beiträge
    10
    Hallo

    Aber warum wird das Problem mit der Schleife behebt? Das ganze wartet dann einfach eine ms länger.

    Und warum ist die Funktion mit delay ms soweit unten beim Programm? Müsste das nicht vor dem LEDblinken sein?

    Grüsse!

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    In der delay.h gibt es keine Funktion sleep_ms(), dafür allerdings eine Funktion _delay_ms().
    ja das war ein wenig voreilig und falsch erinnert

    Aber warum wird das Problem mit der Schleife behebt? Das ganze wartet dann einfach eine ms länger.
    Code:
    /**
       \ingroup util_delay
    
       Perform a delay of \c __us microseconds, using _delay_loop_1().
    
       The macro F_CPU is supposed to be defined to a
       constant defining the CPU clock frequency (in Hertz).
    
       The maximal possible delay is 768 us / F_CPU in MHz.
    
       If the user requests a delay greater than the maximal possible one,
       _delay_us() will automatically call _delay_ms() instead.  The user
       will not be informed about this case.
     */
    Code:
    /**
       \ingroup util_delay
    
       Perform a delay of \c __ms milliseconds, using _delay_loop_2().
    
       The macro F_CPU is supposed to be defined to a
       constant defining the CPU clock frequency (in Hertz).
    
       The maximal possible delay is 262.14 ms / F_CPU in MHz.
    
       When the user request delay which exceed the maximum possible one,
       _delay_ms() provides a decreased resolution functionality. In this
       mode _delay_ms() will work with a resolution of 1/10 ms, providing
       delays up to 6.5535 seconds (independent from CPU frequency).  The
       user will not be informed about decreased resolution.
     */
    das limit liegt also bei 6.5 sekunden
    mit verringerter auflösung

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Gut, das ganze mal ausführlicher:
    Mal angenommen, wir haben einen Takt von 8 MHz. Dann könnte mit der Funktion _delay_ms() bei einem Aufruf eine maximale Wartezeit von ~32ms erreicht werden. Wenn wir nun eine ganze Sekunde warten wollen, müssten wir _delay_ms() mehrmals hintereinander aufrufen.

    Genau das macht die Funktion sleep_ms() mit einer Schleife. Damit das ganze verständlich bleibt, wird in der Schleife genau 1ms gewartet und das ganze n-mal widerholt. Somit erreichen wir durch den Befehl sleep_ms(1000) eine Wartezeit von ziemlich genau 1000ms, also eine Sekunde.


    An welcher Stelle im Programm die eigentliche Funktion steht, ist egal und bleibt dem Stil des Programmierers überlassen. Sie kann also vor oder hinter der Stelle stehen, an der sie aufgerufen wird.
    Wichtig ist nur, dass die Deklaration, also der Prototyp der Funktion vor dem Aufruf steht.

    [edit]
    When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency)
    Das war mir auch neu...interessant!
    Danke für die Info.,
    [/edit]

    Gruß,
    askazo

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    23.03.2009
    Beiträge
    10
    Hallo.
    Danke für die ausführliche Antwort. Jetzt verstehe ich das mit der Funktion sleep_ms...
    sleep_ms wird ja als Funktion definiert mit:
    sleep_ms (uint16_t ms)
    Für was steht das uint16_t? Ich konnte diese Frage leider nicht übers Netz beantworten und hab auch schon im C-Tutorial danach gesucht, aber es wird oft benutzt aber leider nicht gesagt für was es ist, ich schätze mal das ist so weil es eine ziemlich simple Bedeutung hat...

    Karl

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    UnsignedINTeger16bit_Typedef

    also n vorzeichenloser 16bit integer, Typedef steht für benutzerdefinierter datentyp

  9. #19
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ich würde dir nur raten dich trotzdem mit Timer zu beschäftigen.
    In der Zeit in der das sleep_ms() oder _delay_ms() durchlaufen wird, kann das Programm nichts anderes machen. Du kannst in der Zeit keine Taste abfragen und nichts ansteuern. Unterbrechen kannst du das nur mit Interrupts.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    23.03.2009
    Beiträge
    10
    Hallo.
    Ich bin mich zurzeit auch sehr stark mit Timern am beschäftigen, versteh aber irgendwie nicht alles... ich kenn auch nur das Mikrocontroller.net Tut. von den Timern und das auf RN-Wiki. Gibts dazu vielleicht ein Buch oder ein sehr ausführliches anderes Tutorial?
    Mein Ziel wäre es eben schlussendlich ein Servo ansteuern zu können.

    Grüsse!

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress