Forum: Mikrocontroller und Digitale Elektronik TinyWire: Rückgabewert


von Anfänger in I2C (Gast)


Lesenswert?

Hallo zusammen, bin gerade am verzweifeln und finde auch keine Antwort 
in Tutorials :(
1
 TinyWireM.requestFrom(42,1);
2
 
3
  // wenn Daten ankommen....  
4
  
5
   while ( TinyWireM.available() )
6
   { 
7
      lcd.setCursor(0,2);
8
      lcd.print("Daten werden gelesen");
9
      Nr =TinyWireM.read();
10
         
11
      lcd.setCursor(0,3);
12
      lcd.print(String("Ergebnis ")+ String(Nr));
13
     }

sende eine Request an Slave42( den es momentan noch nicht gibt)
ist es richtig das available immer eine "0" als Rückgabewert zurückgibt 
und diese dann auswertet?
Ich schicke ja momentan ein Packet raus ins Nirvana und dürfte ja keine 
Antwort erhalten und somit dürfe die Whileschleife nicht ausgeführt 
werde, tut sie aber dennoch. Wo ist mein Denkfehler???

[Edit: Subject sinnvoll benannt, damit klar ist, was gefragt wird - 
Mod.]

: Bearbeitet durch Moderator
von A. S. (Gast)


Lesenswert?

Anfänger in I2C schrieb:
> ist es richtig das available immer eine "0" als Rückgabewert zurückgibt
> und diese dann auswertet?

Wenn eine 0 zurückkommt, dann wird while verlassen bzw. nicht 
ausgeführt.

von Hmmm (Gast)


Lesenswert?

Anfänger in I2C schrieb:
> TinyWireM.requestFrom(42,1);

Rückgabewert auswerten!

von Anfänger in I2C (Gast)


Lesenswert?

Das denke ich auch, aer while wird durchgeführt und in der Variable NR 
steht 0. Das ist es ja was ich nicht verstehe. Bei "0" dürfte die while 
Schleife nicht durchlaufen, macht sie aber.

von Hmmm (Gast)


Lesenswert?

Anfänger in I2C schrieb:
> in der Variable NR steht 0. Das ist es ja was ich nicht verstehe. Bei
> "0" dürfte die while Schleife nicht durchlaufen, macht sie aber.

Da steht aber nicht while(Nr).

Werte die Rückgabewerte der Funktionen richtig aus, dann hantierst Du 
auch nicht mit unzuverlässigen Daten rum.

von Anfänger in I2C (Gast)


Lesenswert?

while ( TinyWireM.available() )

bedeutet das nicht, sofern Daten anliegen, führe die Schleife aus, 
richtig??
Da aber keine Daten ankommen(da die Anfrage an einen Slave geschickt 
wird den es nicht gibt), dürfte nichts da sein das die Schleife 
durchlaufen lässt.
Sie läuft aber durch

von Hmmm (Gast)


Lesenswert?

Anfänger in I2C schrieb:
> bedeutet das nicht, sofern Daten anliegen, führe die Schleife aus,
> richtig??

Wenn vorher schon die Abfrage schiefging, weil kein ACK kam, wieviel 
Aussagekraft dürften dann die Rückgabewerte der nachfolgenden Funktionen 
haben?

Hör auf zu pfuschen und werte Fehlerzustände vernünftig aus.

von Schlaumaier (Gast)


Lesenswert?

Du solltest mal das Beispiel dir ansehen.

https://github.com/adafruit/TinyWireM/blob/master/examples/Tiny85_Temp_LCD/Tiny85_Temp_LCD.pde
1
TinyWireM.requestFrom(42,1); <- Das muss an eine Variable übergeben werden.
2
3
Im Beispiel : 
4
 TinyWireM.beginTransmission(DS1621_ADDR);
5
  TinyWireM.send(0xAA);                 // read temperature (for either mode)
6
  TinyWireM.endTransmission();          // Send 1 byte to the slave
7
  TinyWireM.requestFrom(DS1621_ADDR,1); // Request 1 byte from slave
8
  tempC = TinyWireM.receive();          // get the temperature
9
  tempF = tempC * 9 / 5 + 32;           // convert to Fahrenheit 
10
}

[Edit: [c]-Tags eingefügt. Mod.]

: Bearbeitet durch Moderator
von Hmmm (Gast)


Lesenswert?

Schlaumaier schrieb:
> TinyWireM.requestFrom(42,1); <- Das muss an eine Variable übergeben
> werden.
> [...]
> TinyWireM.requestFrom(DS1621_ADDR,1); // Request 1 byte from slave

Da wird kein Rückgabewert ausgewertet, geschweige denn an eine Variable 
übergeben.

von Schlaumaier (Gast)


Lesenswert?

Schlaumaier schrieb:
> tempC = TinyWireM.receive();          // get the temperature
>   tempF = tempC * 9 / 5 + 32;           // convert to Fahrenheit

Und was ist das.

von Hmmm (Gast)


Lesenswert?

Schlaumaier schrieb:
> Schlaumaier schrieb:
>> tempC = TinyWireM.receive();          // get the temperature
>>   tempF = tempC * 9 / 5 + 32;           // convert to Fahrenheit
>
> Und was ist das.

Auf jeden Fall nicht das, wovon Du gebrabbelt hast:

Schlaumaier schrieb:
> TinyWireM.requestFrom(42,1); <- Das muss an eine Variable übergeben
> werden.

Auf die Gefahr hin, mich zu wiederholen: Du hast von NICHTS, wozu Du 
ständig wirre Kommentare absonderst, auch nur die geringste Ahnung. Es 
war eine gute Entscheidung, Deinen "Pucki"-Account zu löschen, jetzt 
halte doch bitte auch als Gast Deine Klappe.

von Schlaumaier (Gast)


Lesenswert?

Naja gut das der Code nicht von mir ist, sondern von den Coder der Libs.

Sonst müsste ich mich ja schämen. ;)

von Test (Gast)


Lesenswert?

1
#include <Wire.h>
2
3
void setup()
4
{
5
  Serial.begin(57600);
6
  Wire.begin(); 
7
}
8
9
unsigned long messungsticker = 0;   // alle 10 Minuten eine Messung
10
unsigned long messticker = 0;       // 10 Sekunden für die Messung
11
boolean messunglaeuft = false;
12
byte gasflasche = 0;
13
14
void loop()
15
{
16
  // Messkommando schicken und Warteschleife steuern
17
  if ( (!messunglaeuft) && (millis()-messungsticker>600000L) ) {
18
    Wire.beginTransmission(42); 
19
  gasflasche=random(1,7);
20
    Wire.write(gasflasche);
21
    boolean allesgut = Wire.endTransmission();    
22
  
23
  messunglaeuft=true;
24
  messungsticker=millis();
25
  messticker=millis();
26
  }
27
  
28
  // Messzeit beendet, Datenübertragung initialisieren
29
  if ( (messunglaeuft) && (millis()-messticker>10000) ) {
30
    Wire.requestFrom(42,1);
31
    messunglaeuft=false;
32
  }
33
34
  // wenn Daten ankommen....  
35
   while ( Wire.available() )
36
   { 
37
     byte druck = Wire.read();
38
   
39
   // In ganzen Sätzen antworten....
40
   Serial.print(F("In Flasche "));
41
   Serial.print(gasflasche);
42
   Serial.print(F(" besteht ein Druck von "));
43
   Serial.print(druck);
44
   Serial.print(F(" bar."));
45
   Serial.println();
46
   } 
47
}

In diesem Tut

http://hlembke.de/arduinoablage/crate.php?20150411i2c

Wird es genauso gemacht und in anderen genau so. Daher sehe ich meinen 
Fehler nicht wirklich. Da wird auch nichts in einer Variable gespeichert 
und ausgewertet.

von Einer K. (Gast)


Lesenswert?

Test schrieb:
> In diesem Tut
>
> http://hlembke.de/arduinoablage/crate.php?20150411i2c
>
> Wird es genauso gemacht und in anderen genau so.

Mist schmeckt gut, denn tausend Fliegen könne nicht irren....


Das Problem:
Wire.requestFrom(42,1);
Liefert dir eine Statusmeldung.
Diese ignorierst du konsequent und arbeitest trotzdem mit den Werten.
Selbst wenn der Fehler in 5000 weiteren Tutorials auftaucht, Fehler 
bleibt  Fehler.


Ja, TinyWire und Wire unterscheiden sich.
Sind halt unterschiedliche Libs für unterschiedliche Hardware.

Was sie aber beide tun: Sie liefern dir einen Status.

von Test (Gast)


Lesenswert?

OK, wenn sich alle irren, wie wird es dann richtig gemacht? Bin ja für 
alles offen und möchte es verstehen und richtig machen.

von Einer K. (Gast)


Lesenswert?

Test schrieb:
> wie wird es dann richtig gemacht?

Erst prüfen, ob der Baustein überhaupt bereit ist, mit dir zu sprechen.
1
Wire.beginTransmission(address);
2
error = Wire.endTransmission();
Wenn das schon in die Hose geht, dann macht es keinen Sinn, da noch 
irgendeinen Request absetzen zu wollen.


Zudem:
1
size_t anzahl = Wire.requestFrom(42,1);
Wenn anzahl == 0, dann war das große Versagen...


Ich würde ja sagen, dass bei einem solchen Versagen auch 
TinyWireM.available()  eine 0 liefern sollte. Aber das tut deine Lib 
offensichtlich nicht.

von Hmmm (Gast)


Lesenswert?

Test schrieb:
> Wird es genauso gemacht und in anderen genau so. Daher sehe ich meinen
> Fehler nicht wirklich.

Du verzichtest darauf, den Fehler "Device antwortet nicht" auszuwerten, 
erwartest aber, dass Dein Code auch dann funktioniert, wenn es fehlt.

Test schrieb:
> OK, wenn sich alle irren, wie wird es dann richtig gemacht?

Wie schon oben geschrieben:

Hmmm schrieb:
> Anfänger in I2C schrieb:
>
>> TinyWireM.requestFrom(42,1);
>
> Rückgabewert auswerten!

Welche Rückgabewerte was bedeuten, findest Du in der Dokumentation. 
Mindestens "hat geklappt" vs. "hat nicht geklappt" solltest Du 
unterscheiden.

von Test (Gast)


Lesenswert?

Danke für die Hilfe, habt ihr ein Tut wo es vernünftig (auf deutsch) 
beschrieben wird?
Und wenn ich euch Profis schonmal an der Strippe habe, ist eine 
Verbindung bei 2-3m mit I2C OK oder macht es keinen Sinn und ich sollte 
was anderes nehmen?

von Hmmm (Gast)


Lesenswert?

Test schrieb:
> habt ihr ein Tut wo es vernünftig (auf deutsch) beschrieben wird?

Nein.

Test schrieb:
> ist eine Verbindung bei 2-3m mit I2C OK

Nein. Kann funktionieren, muss aber nicht.

von Einer K. (Gast)


Lesenswert?

I2C kann vieles....
Es gibt I2C-Expander, I2C-Extender und sogar auch eine 
Dokumentation/Spezifikation.

Eigentlich ist I2C für Aufbauten auf einer Platine, in einem Gerät, 
gedacht.
Es ist von Hause aus nicht HotPlug fähig.

Ein Fall, wie bei dir, dass plötzlich ein IC auf einer Platine fehlt, 
kommt praktisch nie vor.
Ein Defekt wäre das.

Ausnahme:
Das ACK-Polling bei I2C EEPROM nach dem schreiben

von Test (Gast)


Lesenswert?

Also teste ich erstmal mit einem Slave ob eine Verbindung auf 3m 
funktioniert, sonst brauche ich erstmal gar nicht weitermachen.

Welche Verbindung auf diese Distanz könnt ihr empfehlen?

Naja, kein Tut ist natürlich blöd.

von Hmmm (Gast)


Lesenswert?

Test schrieb:
> Welche Verbindung auf diese Distanz könnt ihr empfehlen?

Kommt auf Deine Anforderungen an. Wenn nur 2 Geräte kommunizieren 
sollen, reicht RS232.

Test schrieb:
> Naja, kein Tut ist natürlich blöd.

Du lernst mehr, wenn Du nicht nur alles vorgekaut konsumierst, sondern 
Dir auch das Grundlagenwissen aneignest. Und natürlich beim Verwenden 
fremder Libraries die dazugehörige Dokumentation liest.

von Schlaumaier (Gast)


Lesenswert?

Hmmm schrieb:
> Test schrieb:
>> Welche Verbindung auf diese Distanz könnt ihr empfehlen?
>
> Kommt auf Deine Anforderungen an. Wenn nur 2 Geräte kommunizieren
> sollen, reicht RS232.

Und falls es Kabellos sein soll , 433 Mhz Verbindung. Alternativ zu 
einen ESP-8266(-NOD ) wechseln und Wlan.

von Test (Gast)


Lesenswert?

Mehrere Slaves werden es auf jedenfall, aber im Prinzip kommunizieren 
zwei.

von Hmmm (Gast)


Lesenswert?

Test schrieb:
> Mehrere Slaves werden es auf jedenfall

RS485 wäre eine Lösung.

von Test (Gast)


Lesenswert?

Würde das mit dem Attiny85 klappen?

von Hmmm (Gast)


Lesenswert?

Nimm lieber etwas mit vollwertigem UART.

von Schlaumaier (Gast)


Lesenswert?

Test schrieb:
> Würde das mit dem Attiny85 klappen?

Technisch ja. Aber der hat zu wenig Pins, da wird das mega eng.

Den Atiny-85 setzte ich nur ein wenn ich die Beleuchtung eines 
Modellautos steuern will, via i2c-Pcf8574. Das Teil kann (wegen der 
wenigen Pins , meist nur 1-2 Jobs gleichzeitig machen.

von Test (Gast)


Lesenswert?

Was willst denn da auch viel Steuern? An/aus, blinken , hell/dunkel? 
Muss das über i2c laufen?

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.