-         

+ Antworten
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
    109

    Neu in der C-Programmierung

    Anzeige

    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
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.125
    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
    109
    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
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.125
    Wie gesagt, es gibt dabei 2 verschiedene Arten von Einzelschrittmodi. Schau dir das Debugmenü in Atmelstudio an.

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    358
    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
    109
    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.158
    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 Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    358
    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
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    1.762
    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)

+ Antworten
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. [ERLEDIGT] Pic-Programmierung
    Von kickerstar im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 13.09.2004, 15:13

Berechtigungen

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