- Labornetzteil AliExpress         
Ergebnis 1 bis 8 von 8

Thema: Brauch hilfe bei Erklärung des Codes

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.06.2012
    Beiträge
    12

    Brauch hilfe bei Erklärung des Codes

    Anzeige

    Praxistest und DIY Projekte
    hallo,
    ich wollte mal fragen ob mir jemand mal den Code erklären könnte? Habe irgendwie eine Blockade. Je länger ich mir das angucke, desto mehr bin ich verwirrt.

    Code:
    #define F_CPU 11056000UL
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    
    //
    // Der Prescaler muss so gewählt werden, dass der Ausdruck
    // für MILLISEC_BASE einen Wert kleiner als 128 ergibt
    // MILLISEC_BASE ist der Timerwert, der 1 Millisekunde Zeitdauer ergeben
    // soll.
    //
    #define PRESCALER      128
    #define PRESCALER_BITS (1<<CS02);
    
    #define MILLISEC_BASE  ( F_CPU / PRESCALER / 1000 )	// =115 ->1ms    (wurde durch 1000 geteilt um 1ms zu erhalten)
    #define CENTER         ( MILLISEC_BASE / 2 )
    
    //
    // Konfiguration der Servoleitungen
    //
    #define NR_SERVOS      3
    #define SERVO_DDR      DDRA
    #define SERVO_PORT     PORTA
    
    uint8_t ServoPuls[NR_SERVOS] = { 1<<PA0, 1<<PA1, 1<<PA2 };
    //
    // Werte für die Servoposition
    // Gültige Werte laufen von 0 bis 2 * CENTER
    // 0           ... ganz links
    // CENTER      ... Mittelstellung
    // 2 * CENTER  ... ganz rechts
    //
    volatile uint8_t ServoValue[NR_SERVOS];
     
    ISR (TIMER0_COMP_vect) 
    {
      static uint8_t ServoId = 0;
     
    /
      SERVO_PORT &= ~ServoPuls[ServoId];
     
    
      if( ++ServoId >= NR_SERVOS )
        ServoId = 0;
     
    
      SERVO_PORT |= ServoPuls[ServoId];
     
    
      OCR0 = MILLISEC_BASE + ServoValue[ServoId];
    }
     
    void InitServo()
    {
      uint8_t i;
     
    
      SERVO_DDR = ServoPuls[0] | ServoPuls[1] | ServoPuls[2] ;
     
    
      for( i = 0; i < NR_SERVOS; ++i )
        ServoValue[i] = CENTER;
     
    
      OCR0 = MILLISEC_BASE + ServoValue[0];
      TIMSK |= (1<<OCIE0);
      TCCR0 = (1<<WGM01) | PRESCALER_BITS;  //  CTC mode
    }
     
    int main(void)
    {
      InitServo();
     
      sei();
     
      _delay_ms( 1000 );
     
    
      while( 1 ) {
     
     
        ServoValue[0] += 1;
        if( ServoValue[0] > 2*CENTER )
          ServoValue[0] -= 2*CENTER;
     
        ServoValue[1] += 1;
        if( ServoValue[1] > 2*CENTER )
          ServoValue[1] -= 2*CENTER;
     
        ServoValue[2] += 2;
        if( ServoValue[2] > 2*CENTER )
          ServoValue[2] -= 2*CENTER;
     
        
     
        _delay_ms( 40 );
      }
    }
    für die Erklärungen der einzelnen Zeilen wäre ich sehr dankbar.
    Geändert von jobo84 (11.08.2012 um 22:20 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.187
    Wo hakt es denn genau?
    Die einzelnen Zeilen sind doch relativ gut dokumentiert.
    Zuerst wird der Prescaler für den Timer berechnet und mit den #defines zugewiesen.
    In der TIMER0_COMP_vect werden die einzelnen Servoimpulse nacheinander ausgegeben.
    In der InitServo wird der Timer 0 und die benötigten Servoausgänge initialisiert.

    In der Hauptschleife werden die Variablen für die Servoimpulslänge gesetzt.

    Was mir bei den ganzen Sache fehlt sind die Pausen.
    Normale Servos wollen zwischen zwei Impulsen eine Pause von 20ms haben.
    Bei speziellen "schnellen" Servos dürfen es auch 10ms sein.
    Das scheint mir auf den ersten Blick in diese Routine nicht implementiert zu sein.

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von jobo84 Beitrag anzeigen
    für die Erklärungen der einzelnen Zeilen wäre ich sehr dankbar.
    Absolut dreist.

    "Ich habe keine Ahnung von C, möchte aber möglichst schnell zu einem Ergebnis kommen ohne es erst lernen zu müssen. Könnte daher bitte mal jemand seine Zeit damit verschwenden, mir diesen Code haarklein zu erklären, damit ich vielleicht die nötigen Änderungen für meine Bedürfnisse vornehmen kann, auch ohne C eigentlich zu können."

    Hier geht er sogar noch einen Schritt weiter, und bittet gleich darum, das komplette Programm für ihn zu schreiben:
    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=123837

    Und vermutlich ist das hier auch von ihm:
    http://www.mikrocontroller.net/topic/267484#new
    MfG
    Stefan

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    26.06.2012
    Beiträge
    12
    dreist ist das nicht.
    man möchte schneller c lernen und außerdem bin ich dabei zu lernen.

    du hast sehr viel Zeit im leben.
    Geändert von jobo84 (11.08.2012 um 22:29 Uhr)

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.652
    Zitat Zitat von jobo84 Beitrag anzeigen
    ... man möchte schneller c lernen.
    Das sehe ich auch eher dreist. Denn "man möchte schneller C lernen" sehe ich hier nicht, sondern man möchte schneller C gelernt bekommen - sprich eingetrichtert bekommen. Ein gewisses Maß an eigenem Bemühen ist beim Lernen eben notwendig. Und wozu glaubst Du hätten so viele Leute hier im Internet C-Tutorials geschrieben?

    http://www.rn-wissen.de/index.php/C-Tutorial
    Geändert von oberallgeier (11.08.2012 um 22:38 Uhr)
    Ciao sagt der JoeamBerg

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    26.06.2012
    Beiträge
    12
    Zitat Zitat von sternst Beitrag anzeigen

    "Ich habe keine Ahnung von C....
    wer hat gesagt das ich keine Ahnung habe. Ich bin nur nicht so lange dabei.
    Ich hätte für mein Code bezahlt. Wo liegt das Problem

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von jobo84 Beitrag anzeigen
    wer hat gesagt das ich keine Ahnung habe.
    Du selbst. Denn es wäre ja ansonsten nicht nötig gewesen, pauschal für alle Zeilen eine Erklärung zu erbitten.
    MfG
    Stefan

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    26.06.2012
    Beiträge
    12
    manchmal ist es auch so, dass man vor lauter Bäumen den Wald nich sieht.
    Oder wenn die Nerven wieder mal blank sind, dann ist jedes Mittel Recht, um wieder einen klaren Gedanken zu fassen.
    Und um die Motivation wieder ankurbeln zu können.
    Geändert von jobo84 (12.08.2012 um 09:09 Uhr)

Ähnliche Themen

  1. Erklärung einige codes
    Von asurox im Forum Asuro
    Antworten: 1
    Letzter Beitrag: 03.05.2009, 11:35
  2. Oh man ich brauch Hilfe....Asurolib was ist avr/****.h
    Von dabKer im Forum Software, Algorithmen und KI
    Antworten: 0
    Letzter Beitrag: 18.12.2008, 19:33
  3. Antworten: 9
    Letzter Beitrag: 02.01.2008, 21:05
  4. brauch Hilfe zum ADC
    Von molleonair im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 13.03.2006, 14:17
  5. brauch hilfe für projekt
    Von chioro im Forum PIC Controller
    Antworten: 4
    Letzter Beitrag: 20.02.2006, 11:17

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad