I2C Code Verständnissfrage

Gast #3684892
Lesenswert?
• ▲
▼
Hallo Forum

Da ich gerne einen Brushless Motor ansteuern möchte, habe ich mir dazu 
folgende Hardware bestellt:

http://mikrokopter.de/ucwiki/en/BL-Ctrl_V1.2 (Englisch)
http://mikrokopter.de/ucwiki/BL-Ctrl_V1.2 (Fast das selbe auf Deutsch)
Könnte ihr die Sprache wählen die euch besser passt :P

Nun, auf der Englischen Seite dieses Wikis ist ganz unten ein 
Programmausschnitt zu finden, welcher den Regler über I2C ansteuert.
(Hier für die Faulen): 
http://mikrokopter.de/ucwiki/en/BL-Ctrl_V1.2#AVR_.28plain.29

Nun verstehe ich aber diesen Code nicht so ganz. Der Anfang ist noch 
relativ klar. Zuerst wird I2C Initialisiert, danach halt die Adresse des 
Reglers & Die Geschwindigkeit eingestellt. Den nächsten Teil verstehe 
ich allerdings nichtmehr:
1
   
2
     uint8_t ret;
3
     while (1) {
4
       ret = i2c_start(TWI_BLCTRL_BASEADDR + (motor << 1) + I2C_WRITE);
5
          if (ret) {
6
                          // release bus
7
              i2c_stop();
8
                          // failed... maybe print error or something
9
          } else {
10
              i2c_write(speed);
11
              i2c_stop();
12
          }
13
          _delay_ms(50);
14
      }

Dieser Teil mit dem "ret" leuchtet mir nicht ein. Kann mir einer diesen 
Code ausschnitt erklären, was dieser genau macht? Wofür könnte er gut 
sein? Laut den Kommentaren wohl irgend eine Erkennung einer 
Fehlfunktion, aber wie?

Vielen dank falls mir da einer weiterhelfen kann!

Zudem, angenommen ret ist nicht true, somit würde ja der Teil zwischen 
den else Klammern ausgeführt werden. Dort wird allerdings nur die 
Geschwindigkeit übertragen. Wo wird die Adresse mitübertragen? Hat dies 
vielleicht etwas mit diesem ret zutun?

Versuche das ganze nun seit mehr als 2 Stunden zu verstehen aber ich 
werde nicht schlau draus.

Vielen dank für jeden Tipp!
#3684899
Lesenswert?
• ▲
▼
Helper schrieb:

> Dieser Teil mit dem "ret" leuchtet mir nicht ein.

Was leuchtet dir daran nicht ein?

Wo kommt denn dieses 'ret' her? Wie kriegt es seinen Wert?

Ja wohl hier
1
   ret = i2c_start(TWI_BLCTRL_BASEADDR + (motor << 1) + I2C_WRITE);

ret erhält also den Wert, den die Funktion i2c_start zurück liefert.
Also gehst du mal her und siehst in der Doku nach, was diese Funktion 
für einen Wert liefert (oder du studierst den Code der Funktion unter 
welcdhen Umständen die Funktion welchen Returnwert liefert)

Da der Wert so verwendet wird
1
   if( ret )

hat der wohl 'boolsche' Eigenschaften. Ein Wert ungleich 0 gilt als 
logisch wahr (TRUE) und ein Wert von 0 gilt als logisch falsch (FALSE). 
D.h. da ergibt sich schon alleine daraus die Vermnutung, dass die 
Funktion einen derartigen Wert liefern wird, je nachdem ob sich die 
Gegenstelle gemeldet hat oder nicht. D.h. die Funktion liefert einen 
Fehlercode und hier wird er ausgewertet. Denn wenn keine Gegenstelle 
gefunden wurde oder die sich nicht meldet, dann hat es auch keinen Sinn, 
der irgendwelche Befehle zu übermitteln.


> Dort wird allerdings nur die Geschwindigkeit übertragen. Wo wird
> die Adresse mitübertragen?

Ähm. Hier vielleicht?
1
  ....    i2c_start(TWI_BLCTRL_BASEADDR + (motor << 1) + I2C_WRITE);
2
                    **********************************

Mann der Berge, du musst Code schon auch ordentlich lesen. Steht doch 
alles da!

> Hat dies vielleicht etwas mit diesem ret zutun?

Nö.
i2c_start versucht den Kontakt zur Steuerung mit der Adresse 
"TWI_BLCTRL_BASEADDR + (motor << 1)" herzustellen. WEnn das gut geht, 
dann setzt es dieser Steuerung einen neuen Geschwindigkeitswert. Wenn 
nicht, dann eben nicht.

Was daran ist jetzt so schwer zu verstehen?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.