TinyWire: Rückgabewert

Gast #6699573
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.]
Gast #6699882
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.]
Gast #6699919
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.
Gast #6700706
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.
Gast #6700717
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.
Gast #6700775
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.
Gast #6700778
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.
Gast #6700794
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
Gast #6700835
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren