- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 13

Thema: Neu in der C-Programmierung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131

    Neu in der C-Programmierung

    Hallo Zusammen,
    ich habe vor mich mit C-Programmierung zu beschäftigen, nachdem ich jetzt schon eine ganze Weile mit Bascom und Assembler programmiert habe.
    Und gleich habe ich ein Problem:
    Im Atmel Studio habe ich eine Funktion "void Wait10ms(void)" definiert, vor dem Programmteil int main(void).
    Jetzt wird dieser Programmteil in Atmel Studio im Einzelschrittmodus nicht aufgerufen!
    Im Hauptprogramm rufe ich diesen über "Wait10ms()" auf, aber der Einzelschritt springt nicht in die Funktion "Wait10ms".
    Wie geht das richtig?

  2. #2
    shedepe
    Gast
    Hey, als erstes. Wenn du fragen zu Code hast poste den Code !
    Dann zu deiner Frage, verwendest du den Debugger oder den Simulator?

    Beim Debugger gibt es einmal die Variante des Einzelschritt der innerhalb der derzeitigen Methode bleibt und einmal die Variante die in eine aufgerufene Methode reinspringt. Die Tastenkombinationen dafür sollten oben im Debugmenü stehen.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Hier der Code:

    #include <avr/io.h> // Deklarationen einfügen
    #define Takt 1000000UL // Systemtakt 1MHz intern

    void Warte1ms() ;


    /************************************************** **********
    * Anfang der Hauptfunktion *
    ************************************************** **********/

    int main(void)
    {

    DDRB = 0xFF ; // Port B ist Ausgang
    PORTB = 0 ; // Anfangswert Null

    /*********************************************
    * 5 Takte Low / 5 Takte High gibt Takt / 10 *
    *********************************************/

    while (1) // unendliche Schleife

    {

    Warte1ms() ; // Wartefunktion ca 1ms
    PORTB ++ ; // Portzähler + 1

    }

    }

    void Warte1ms(void)
    {

    for (unsigned int i = Takt/4000ul; i > 0; i--) ;


    }

    Im Einzelschrittmodus wird immer die Stelle "void Warte1ms(void) übersprungen. Der gelbe Balken kommt nie in "for (unsigned int i = Takt/4000ul; i > 0; i--) an.

  4. #4
    shedepe
    Gast
    Wie gesagt, es gibt dabei 2 verschiedene Arten von Einzelschrittmodi. Schau dir das Debugmenü in Atmelstudio an.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Möglicherweise optimiert der Kompiler die Zeile

    for (unsigned int i = Takt/4000ul; i > 0; i--) ;

    einfach weg, weil seiner Meinung nach nichts passiert. Versuch mal:

    for (unsigned volatile nt i = Takt/4000ul; i > 0; i--) ;

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.10.2006
    Beiträge
    131
    Jetzt wird in die Funktion gesprungen, aber ich sehe nicht, dass die Variable i in irgendeiner Weise heruntergezählt wird. Der gelbe Balken verlässt die Funktion wieder nach nur einem Schritt. Beim nächsten Mal steht dann in i wieder der Startwert.<br>Ich würde schon gerne sehen, dass die Variable i heruntergezählt wird bevor die For-Scleife wieder verlassen wird.

  7. #7
    neuer Gast
    Gast
    Gibt es überhaupt einen Inhalt zu void warte 1ms?

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Ich gehe mal davon aus, dass Du AVRStudio zusammem mit WINAVR benutzt. Dann steht Dir die Bibliotheksfunktion
    Code:
    void _delay_ms (double __ms)
    zur Verfügung. Erläuterungen z.B. hier (klick). Die Bibliothek befindent sich (abhängig von Betriebssystem und Installation) z.B. in: C:\WinAVR-20100110\avr\include\util\delay.h AUF DEINEM Computer.

    Sieht schon etwas komplexer aus als Deine Funktion :
    Code:
    void
    _delay_ms(double __ms)
    {
        uint16_t __ticks;
        double __tmp = ((F_CPU) / 4e3) * __ms;
        if (__tmp < 1.0)
            __ticks = 1;
        else if (__tmp > 65535)
        {
            //    __ticks = requested delay in 1/10 ms
            __ticks = (uint16_t) (__ms * 10.0);
            while(__ticks)
            {
                // wait 1/10 ms
                _delay_loop_2(((F_CPU) / 4e3) / 10);
                __ticks --;
            }
            return;
        }
        else
            __ticks = (uint16_t)__tmp;
        _delay_loop_2(__ticks);
    }
    Sie funktioniert eine begrenzte Anzahl Millisekunden. Einschränkungen sind in der Funktionsbeschreibung im oben genannten Link zu nongnu.org und im Quelltext der _delay_ms ausführlich genannt. Lies das mal durch und - vielleicht Probierst Du mal das ? !
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. Programmierung
    Von Kene im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 8
    Letzter Beitrag: 02.10.2010, 19:30
  2. programmierung
    Von jonasspieker im Forum Robby RP6
    Antworten: 7
    Letzter Beitrag: 22.06.2010, 13:39
  3. Led Programmierung
    Von cbr600 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 13.10.2007, 14:18
  4. LCD Programmierung?
    Von AndreasHB im Forum Robby CCRP5
    Antworten: 1
    Letzter Beitrag: 01.01.2005, 21:23
  5. [ERLEDIGT] Pic-Programmierung
    Von kickerstar im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 13.09.2004, 14:13

Berechtigungen

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

Solar Speicher und Akkus Tests