- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Neu in der C-Programmierung

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

    Neu in der C-Programmierung

    Anzeige

    Praxistest und DIY Projekte
    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 Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Schreib mal so:
    for (unsigned int i = Takt/4000ul; i > 0; i--)
    {
    asm("nop");
    }

    Dann wird es funktionieren. Ausserdem solltest du das Takt/4000ul vorher machen, sonst wird es bei jedem Durchlauf neu berechnet. Das sind dann etliche Takte mehr.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von Hubert.G Beitrag anzeigen
    Schreib mal so:
    Ausserdem solltest du das Takt/4000ul vorher machen, sonst wird es bei jedem Durchlauf neu berechnet. Das sind dann etliche Takte mehr.
    Ein Kompiler versucht alle konstanten Ausdrücke im Vorlauf zu berechnen. D.h. da wird im kompilierten Code nichts berechenet, sondern i wird mit 250 vorgeladen.

  10. #10
    HaWe
    Gast
    mach deinen Zähler volatile!

    Code:
    void Warte1ms(void)
    {
      volatile unsigned int i;
      for (i = Takt/4000ul; i > 0; i--) ;
    }

    edit:
    das ist übrigens genau das, was ich meine, wenn ich sage:
    nacktes C ist für Anfänger absolut nicht geeignet!

    Daher gibt es für Anfänger C per Arduino IDE.
    da gibt es Timer mit Millisekunden
    millis()
    oder Microsekunden
    micros()
    und
    delay(msec)
    und
    delayMicroseconds(usec)

    Ansonsten musst du dir die Timer callbacks selber programmieren.
    ( * schauder * )


    Code:
    int outPin = 8;                 // digital pin 8
    
    void setup()
    {
      pinMode(outPin, OUTPUT);      // sets the digital pin as output
    }
    
    void loop()
    {
      digitalWrite(outPin, HIGH);   // sets the pin on
      delayMicroseconds(50);        // pauses for 50 microseconds      
      digitalWrite(outPin, LOW);    // sets the pin off
      delayMicroseconds(50);        // pauses for 50 microseconds      
    }
    Geändert von HaWe (15.11.2015 um 22:06 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

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

Berechtigungen

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

12V Akku bauen