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.]
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.
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.
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.
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
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.
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.
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.
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.
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.
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_tanzahl=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.
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.
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?
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.
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
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.
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.
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.
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.