Forum: Mikrocontroller und Digitale Elektronik I2C Code Verständnissfrage


von Helper (Gast)


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!

von Karl H. (kbuchegg)


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?

von Peter D. (peda)


Lesenswert?

Irgendwo wirst Du ja den Quelltext zu i2c_start() haben.
Und da einfach mal reinschauen, was dort gemacht wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.