Hallo zusammen,
versucht seit Tagen eine ganz einfache Kommunikation zwischen zwei
Attiny's 85 per I2C zur Übung hinzubekommen. Leider bekomme ich es nicht
hin. Habe mehrere Beispiele und verschiedene Bibliotheken ausprobiert
und da ich es nicht hinbekomme, vermute ich, das in meinen Code ein
Fehler ist und ich ihn nicht finde. Ich hoffe das Ihr mir helfen könnt?
es soll eigentlich nur ein Byte vom Slave geholt werden um am Master die
dementsprechende LED leuchten zu lassen, aber es tut sich nichts.
-Master-
https://github.com/lucullusTheOnly/TinyWire
1
#include<TinyWire.h>
2
3
voidsetup()
4
{
5
pinMode(1,OUTPUT);
6
pinMode(3,OUTPUT);
7
pinMode(4,OUTPUT);
8
TinyWire.begin();
9
}
10
11
unsignedlongmessungsticker=0;// alle 10 Sekunden eine Messung
12
unsignedlongmessticker=0;// 1 Sekunden für die Messung
13
booleanmessunglaeuft=false;
14
15
16
17
voidloop()
18
{
19
// Messkommando schicken und Warteschleife steuern
digitalWrite(3,HIGH);//Kontroll LED wenn Daten angefordert werden
34
}
35
36
voidreceiveEvent(intanzahl)
37
{
38
while(TinyWireS.available()){
39
TinyWireS.read();
40
digitalWrite(1,HIGH);//Kontroll LED wenn Daten empfangen werden
41
}
42
43
messen=true;
44
}
hatte auch beide schonmal mit dieser Bibliothek getestet
https://github.com/lucullusTheOnly/TinyWire
habe es leider auch nicht hinbekommen.
Bin leider nur Gelegenheitsprogrammierer und finde den Fehler nicht, bin
dankbar um jede Hilfe. DANKE!!!
Scheitert es am Sender oder Empfänger, und was zeigen deine LEDs an?
Falls du es nicht hast, solltest du dir einen Logic Analyzer oder ein
Oszilloskop besorgen.
Ohne Not würde ich keinen I2C Slave selber implementieren. Schon gar
nicht einfach zur Übung.
Übe in dem du einen I2C Master programmierst und mit einem fertigen I2C
Baustein redest.
2 Controller können gut über UART miteinander reden.
Dazu kommt dass man mit der Arduino Kacke immer voll im Blindflug
unterwegs ist. 2 verkorkste Funktionsaufrufe und alles soll magisch
funktionieren. Aber wehe es tut nicht.
Man würde einen I2C Slave eigentlich hauptsächlich Interrupt basiert
implementieren. Wie das mit Arduino hier gehen soll weiß der Geier.
Hallo,
es passiert nichts. Egal ob Master oder Slave.
Habe unzählige Versuche gestartet und habe bei manchen Versuchen es
geschafft, das mal am Slave bzw. Master eine LED blinkte(im Request bzw.
Receive Funktion eingebaut zum testen). Aber habe es nie hinbekommen das
im Master einer der drein LED leuchteten. Deshalb meine Vermutung, das
im Code was falsch ist
Cyblord -. schrieb:> Wie das mit Arduino hier gehen soll weiß der Geier.
Schau doch in den Quelltext! Es wird mit Interrupts gemacht - was für
eine Überraschung.
Stefan ⛄ F. schrieb:> Cyblord -. schrieb:>> Wie das mit Arduino hier gehen soll weiß der Geier.>> Schau doch in den Quelltext!
In Arduino Libs? Nein danke mir ist schon schlecht.
> Es wird mit Interrupts gemacht - was für> eine Überraschung.
Mag sein. Hilft der Applikation aber wenig wenns nicht klappt.
Dann lege den Slave erstmal zur Seite und benutze nur den Master ganz
alleine. Reduziere deinen Code auf ein Minimum, indem du z.B. einfach
immer nur ein 0x55 and die Adresse 0xF0 sendet.
Dann schaust du dir auf dem Oszilloskop oder Logic Analyzer an, ob das
Signal korrekt aussieht. Falls du nicht weisst, wie das Signal ausseehen
soll, lies den Wikipedia Artikel zu I²C und dann die Spezifikation
https://www.nxp.com/docs/en/user-guide/UM10204.pdf
Wenn das klappt, versuchst du Cyblords Empfehlung, zum Beispiel einen
PCF8574 anzusteuern.
Erst wenn das klappt, nimmst du deinen eigenen Slave dazu, lässt LED's
aufleuchten.
Und erst danach solltest du es erwägen, die Messung wieder einzubauen.
Sonst hast du nämlich zu viele unbekannte Baustellen gleichzeitig und
blickst nicht durch.
Bin auch gerne für eine andere Kommunikation unter den Attiny's
einverstanden.
Ein Attiny soll dazu dienen Messerwerte aufzunehmen und zum anderen zu
senden, der wiederum soll eine Pumpe steuern. Wobei es vom ersten
mehrere geben wird.
so ungefähr der Plan
Oly schrieb:> Bin auch gerne für eine andere Kommunikation unter den Attiny's> einverstanden.> Ein Attiny soll dazu dienen Messerwerte aufzunehmen und zum anderen zu> senden, der wiederum soll eine Pumpe steuern. Wobei es vom ersten> mehrere geben wird.> so ungefähr der Plan
Jaja immer das Gleiche. Anfänger gehen immer gleich voll auf
Multi-Controller Architekturen. Und versagen. LASS ES! Das ist sehr
anspruchsvoll. Es gibt selten einen Grund für sowas.
Wenn es wirklich einen Grund gibt, nehme einen fertigen Bus dafür,
welcher auch das höhere Protokoll dafür, Adressierung, Fehlerbehandlung,
Retrys usw. usw. mitbringt. Ein nackter I2C, SPI, UART übertragen nun
mal nur Bytes. Ok I2C bringt mehr mit. Aber die Slaves zu programmieren
ist grottig.
Als Anfänger kannst du diese Kommunikation unter vielen Teilnehmern
nicht ordentlich koordinieren. Du müsstest wichtige Mechanismen neu
erfinden die es in anderen (Feld)Bussen schon gibt.
Ich werfe mal Modbus in den Raum.
Oly schrieb:> verbunden sind Pin 7 und 5 untereinander mit jeweils einen 10k Ohm> wiederstand als pullup
Wie wär's, wenn du statt zweier wiEderstände zwei Widerstände einbauen
würdest?
Mario M. schrieb:
> In der loop() vom Slave muss TinyWireS_stop_check() aufgerufen werden.Cyblord -. schrieb:> Und hier sieht man wie grottig die API ist.
Es wird immer peinlicher.
Du hast immer noch nicht in den Quelltext geschaut, über den du so grob
lästerst. Sonst hättest du bemerkt, dass der Hinweis von Mario falsch
ist. Die von ihm genannte Funktion existiert in der verwendeten
Bibliothek nämlich gar nicht.
Ich versuche es mit I2C, weil man es mir in diesem Forum empfohlen hat.
Wie gesagt, nehme gerne etwas einfacheres wenn es geht.
Es hängt jeweils ein 10k Wiederstand am SCL und am SDA.
TinyWireS_stop_check() werde ich ausprobieren, danke.
Stefan ⛄ F. schrieb:> Du hast immer noch nicht in den Quelltext geschaut, über den du so grob> lästerst. Sonst hättest du bemerkt, dass der Hinweis von Mario falsch> ist. Die von ihm genannte Funktion existiert in der verwendeten> Bibliothek nämlich gar nicht.
Ich verlasse mich eben darauf dass ihr Arduino Spezialisten euch
auskennt. Wie gesagt, ich werde sicher niemals in dieses grottige
Framework schauen. Außer ich möchte mich mal für etwas ganz doll
bestrafen. Dann habe ich die Wahl ob ich eine echt fiese Domina buche,
oder mir den Arduino Quelltext reinziehe. Das entscheide ich dann
spontan.
Jetzt wird es verwirrend. Ich habe in die
https://github.com/lucullusTheOnly/TinyWire geschaut. Dachte das wäre
nun der aktuelle Stand der Dinge, weil er diese zuletzt nannte.
Stefan ⛄ F. schrieb:> Jetzt wird es verwirrend. Ich habe in die> https://github.com/lucullusTheOnly/TinyWire geschaut. Dachte das wäre> nun der aktuelle Stand der Dinge, weil er diese zuletzt nannte.
Vielleicht reden wir jetzt nochmal über die grottige API in grottigen
Libs die irgendwo auf github in irgendeiner Version liegen? Nein?
Ohne Not würde ich I²C nicht implementieren!
Das ist sinnvoll, wenn Du mit einem Baustein kommunizieren willst, der
nichts anderes versteht/kann.
Ich würde ein einfacher zu kontrollierendes Verfahren wie z.B. RS232
oder RS485, abhängig von der gewünschten Entfernung, Umgebung und dem
Datenvolumen, verwenden.
Cyblord -. schrieb:> Vielleicht reden wir jetzt nochmal über die grottige API
Nein ganz sicher nicht. Und mit dir doppelt sicher nicht. Du willst
nämlich gar nicht helfen.
Stefan ⛄ F. schrieb:> Nein ganz sicher nicht. Und mit dir doppelt sicher nicht. Du willst> nämlich gar nicht helfen.
Ich habe bereits mehr als du geholfen. Ich habe eine brauchbare
Alternative zu dem Wahnsinn I2C-Slave + Arduino aufgezeigt. Mit einem
UART und Modbus RTU könnte man ohne viel Aufwand viele Slaves abfragen.
Konsistent und immerhin Standardkonform. D.h. man kann sogar mit 3rd
Party Clients drauf zugreifen. DAS ist ein sauberes vorgehen. Wenn man
unbedingt eine Multi-Controller Architektur braucht.
Das hat auch Chance ein paar Jahre zu laufen. Im Gegensatz zum
Vergewaltigen von I2C für längere Strecken. Plus grottige Slave
Implementierung die nur zwischen 0 Uhr und Mitternacht auf dem
Labortisch einmal kurz funktioniert.
Oly schrieb:> TinyWireS_stop_check() werde ich ausprobieren, danke.Oly schrieb:> jetzt mal ne Frage, ist der Quellcode soweit ok das er laufen müsste> oder ist da schon etwas falsch?
Hängt davon ab, ob du den bereits gemeldeten Fehler korrigiert hast.
Der Atiny-85 ist für so Spielchen denkbar schlecht geeignet zum üben.
Wenn du denn so was üben willst, kauf dir 2 Nanos. Die kosten auch kaum
die Welt, sind aber wegen ihren nicht zu "überhäuften" Pins viel besser
zum Handhaben.
"überhäuften" Pins = Man hat sehr viele Funktionen auf einen Pin. Man
muss ergo den Atiny erst mal in den passenden Modus setzen, damit die
Pins die gewünschte Funktion haben. Bei Anfängern sehe ich da ein
Problem.
Davon abgesehen ist meiner Meinung nach der i2c Bus (den ich liebe)
grundsätzlich nicht das richtige Mittel um 2 Prozessoren miteinander
reden zu lassen.
Der Bus ist Spitzenklasse um externe Teile aller Art mit 2 Drähten +
Strom anzuschließen. Besonders mag ich ihn bei Displays die 160x mit
i2c-Interface.
Hallo Oly,
lass dich von dem Arduino-Gegner (Cyblord) nicht verunsichern.
Es wird auch mit dem ATtiny85 funktionieren.
Nur mit dem Multi-Master-System wirst du wohl Probleme bekommen.
Hier mal eine gute Seite, in der alles für Arduino beschrieben ist.
http://hlembke.de/arduinoablage/crate.php?20150411i2c
Du musst nur für den ATtiny einige Änderungen einbauen.
Brian, das sind die Beispiele nachdem ich gehe :)
das erste Beispiel davon klappt, nur die weiteren nicht mehr, z.B. der
Slave sendet. Im Master habe ich die Serielle Ausgabe abgeändet so das
eine LED leuchten müsste und das ist nicht der Fall.
Oly schrieb:> Brian, das sind die Beispiele nachdem ich gehe :)> das erste Beispiel davon klappt, nur die weiteren nicht mehr, z.B. der> Slave sendet. Im Master habe ich die Serielle Ausgabe abgeändet so das> eine LED leuchten müsste und das ist nicht der Fall.
Was meinst du mit "der Slave sendet" ?
Normal sendet der Master und der Slave quittiert.
Brain 2.0 schrieb:> Was meinst du mit "der Slave sendet" ?> Normal sendet der Master und der Slave quittiert.
Er denkt das das eine Bi-Direktionale Verbindung ist.
Brain 2.0 schrieb:> Was meinst du mit "der Slave sendet" ?> Normal sendet der Master und der Slave quittiert.
Überhaupt nicht. Der Slave kann auch senden.
> Er denkt das das eine Bi-Direktionale Verbindung ist.
Womit er völlig recht hat.
Cyblord -. schrieb:> Überhaupt nicht. Der Slave kann auch senden.
Sicher. Nur halt nicht aus eigenem Antrieb, sondern nur dann, wenn der
Master es ihm befiehlt.
Und genau auf dieses Verhalten muss halt auch die Software ausgelegt
sein.
c-hater schrieb:> Cyblord -. schrieb:>>> Überhaupt nicht. Der Slave kann auch senden.>> Sicher. Nur halt nicht aus eigenem Antrieb, sondern nur dann, wenn der> Master es ihm befiehlt.
Das hat auch niemand behauptet. Nur die Aussagen da oben sind schlicht
falsch (kann nicht senden, keine Bidirektionale Verbindung).
Cyblord -. schrieb:> (kann nicht senden, keine Bidirektionale Verbindung).
Ich habe nicht geschrieben das er KEINE Bidirektionale Verbindung
möglich ist. Sonder nur das er DENKT er hat eine. Das ist ein
Unterschied.
Wie nämlich schon geschrieben muss man das Initialisieren.
Schlaumaier schrieb:> Kleine Hinweis nebenbei. Ich würde es bei 2 Atiny über die Serielle> Verbindung machen. Das ist einfacher und belastet nicht den i2c Bus.
Ist ja krass, hat ja noch niemand vorgeschlagen....
Brian,
im Beispielpunkt unter "Der Slave sendet!"
Verwende jetzt für beide https://github.com/lucullusTheOnly/TinyWire.
Habe es soweit hinbekommen, das beim Slave beide LED`s leuchten. Also
empfangen und senden schein zu klappen. Doch beim Master leuchtet nichts
auf :(
Schlaumaier, wenn ich es auch dann noch damit hinbekomme, wenn es ca 10
Slaves werden und es funktioniert, bin ich nicht abgeneigt es zu
probieren. Für ein kleines Beispiel wäre ich dankebar oder einer Seite
wo es auf deutsch erklärt wird.
danke
Cyblord -. schrieb:> Ist ja krass, hat ja noch niemand vorgeschlagen....
Ich lese nicht jeden Beitrag.
Ach und nur so nebenbei. Ich selbst würde es über 433 Mhz-Funk-Teil
machen. Was ich auch schon Testweise mal gemacht habe. Das ist nämlich
dann noch viel einfacher, und braucht kein Kabel. Und ich muss mich
nicht wirklich an die 2-Teile Begrenzung halten, sondern nur jeden ein
"Namen" geben.
Daran habe ich auch schonmal gedacht Schlaumaier. Aber für alle Module
ein RC Modul zu besorgen, dachte ich mir das die Wire Methode erstmal
besser ist.
Schlaumaier schrieb:> Ach und nur so nebenbei. Ich selbst würde es über 433 Mhz-Funk-Teil> machen. Was ich auch schon Testweise mal gemacht habe. Das ist nämlich> dann noch viel einfacher, und braucht kein Kabel. Und ich muss mich> nicht wirklich an die 2-Teile Begrenzung halten, sondern nur jeden ein> "Namen" geben.
Häh? Welche "2-Teile-Begrenzung"? I2C kann natürlich wesentlich mehr
Peers ab als nur zwei. Und I2C kann auch tatsächlich gleichberechtigte
bidirektionale Verbindungen schaffen. Nur ist das dann halt keine
Master/Slave-Architektur mehr, sondern eine Multimaster-Architektur.
Die grundsätzlichen Probleme bei einer solchen I2C-Architektur sind
übrigens lustigerweise genau dieselben wie bei einem Funknetz. Man hat
de facto nur halbduplex-Verbindungen und man muss Kollisionen sinnvoll
behandeln.
Genau genommen ist das bei I2C aber deutlich einfacher als bei einem
Funknetz. Man hat nämlich zwei Vorteile: Erstens sieht das Protokoll
bereits auf PHY-Level Kollisions-Detektion vor und zweitens: man hat nur
mit seinen eigenen Sendern zu tun, nicht auch noch mit den Unmassen
fremder Sender im selben Funkband...
Nochmals danke an allen die zum Thema beigetragen haben(ob sinnvoll oder
nicht)
doch wie zu anfang gefragt, liegt der Fehler evtl am Code, wurde nicht
beantwortet. Doch ich bin soweit das es am Code liegen muss, denn mit
1
// wenn Daten ankommen....
2
while(TinyWire.available())
3
{
4
digitalWrite(1,!digitalRead(1));
5
// byte Nr = TinyWire.read();
6
// if (Nr=1) digitalWrite(1,HIGH);
7
// if (Nr=2) digitalWrite(3,HIGH);
8
// if(Nr=3) digitalWrite(4,HIGH);
9
}
flackert die LED, also kommen irgendwelche Daten an.
Mit den If Anweisungen kommt aber keine LED zum leuchten, wo ist der
Fehler???
Oly schrieb:> Ich versuche es mit I2C, weil man es mir in diesem Forum empfohlen hat.
Ehrlich, das mußt du jetzt aber mal verlinken! Dann ist der Abend
wahrscheinlich gerettet...ich mach mal ein Bier auf...
Gruß Rainer
Oly schrieb:> Daran habe ich auch schonmal gedacht Schlaumaier. Aber für alle Module> ein RC Modul zu besorgen, dachte ich mir das die Wire Methode erstmal> besser ist.
Nicht 1 sonder 2. Du brauchst ein SENDER + ein EMPFÄNGER. Kosten im 5 er
Pack (=5 Pärchen + Antenne !!!!) ca. 5 Euro aus China.
Hier auch einzeln. : https://www.ebay.de/itm/313508818040
Bedenke bitte das du PRO Arduino ein komplettes Paket brauchst wenn du
eine Antwort erwartest. !!!!! = 1 Sender der was sendet, und das
Empfangsmodul für die Antwort. Das sind 2 getrennte TEILE. !!!!
Die WIRE Methode ist (jedenfalls bei i2c) nicht gut. Es gibt hier im
Forum jede Menge Threads die sich über die Reichweite einer i2c
Verbindung und den damit verbundenen Stress auslassen.
Wenn du die Serielle Methode nutzt, ist die Reichweite bedeutet besser
und die Verbindung sicherer.
Und ab einen Abstand von ca. 10 Metern kann es eh Problematisch werden.
Schlaumaier, es werden max. 3m sein aber bei ca 10 Slaves werde ich
erstmal nichts mit Funk anfangen, danke.
Seriel weiß ich noch nicht, als letztes vielleicht wenn ich hiermit
nicht weiter vorankomme. Doch der Ergeiz ist stärker das jetzt zu
schaffen und scheinbar bin ich kurz vorm Ziel.
Ich muss eine Byte Variable in int umwandeln, das scheint das Problem zu
sein. Mit ((int)Bytevariable) klappt es nicht :(
Oly schrieb:> Ich muss eine Byte Variable in int umwandeln, das scheint das Problem zu> sein. Mit ((int)Bytevariable) klappt es nicht :(
Schwachsinn. Das klappt immer. Oder anders ausgedrückt: dein Problem ist
schlicht wo anders...
Oly schrieb:> Seriel weiß ich noch nicht, als letztes vielleicht wenn ich hiermit> nicht weiter vorankomme.
Seriell kannst du bei mehr als 2 Teilen i.d.R. vergessen.
Deshalb mag ich ja Funk. Der MASTER (z.b. ein Mega wegen mehr Speicher)
kontrolliert alles . Er sendet den Text " ATINY-1, Status". Alle hören
mit, Atiny-1 auch. Atiny-1 hört sein Namen und antwortet.
Das kann ich rein theoretisch mit einer unbegrenzten Menge machen.
Alternativ wäre vielleicht ein ESP-8266-NOD via Wlan interessant. Aber
das ist ne bessere + andere Baustelle. Und dient nur der Weiterbildung
deines Wissens.
Cyblord -. schrieb:> Das hat auch niemand behauptet. Nur die Aussagen da oben sind schlicht> falsch (kann nicht senden, keine Bidirektionale Verbindung).
Genau so falsch wie deine Aussage.
Es hat keiner geschrieben "kann nicht senden".
Hauptsache ordentlich rumstänkern.....
Möchte ich nicht ausschließen, doch verstehen tue ich gerade nichts.
1
for(intzaehler=0;zaehler=3;zaehler=zaehler+1){
2
digitalWrite(3,HIGH);
3
delay(500);
4
digitalWrite(3,LOW);
5
delay(500);
6
}
dieser Code klappt, die LED blikt wie verrückt.
Doch wenn ich "zaehler=3" mit ((int)messergebnis) ersetze (byte
messergebnis=3) dann blinkt die LED nicht. Warum????
Oly schrieb:> for (int zaehler=0; zaehler=3; zaehler = zaehler+1){
Ist dir klar, dass zaehler=3 eine Zuweisung und keine
Vergleichs-Operation ist? Kein Wunder, dass diese For-Schleife endlos
lange läuft.
Wegen den Messergebnissen möchte ich erneut an das "volatile" erinnern.
Lies erstmal, wozu das gut ist, dann verstehst du auch, inwiefern es mit
deinem Problem zusammen hängt.
Nach wie vor solltest du meine obigen Ratschläge bezüglich
LogicAnalyzer/Oszilloskop und der strukturierten Vorgehensweise
beachten. Sonst bekommst du es nur zufällig ans Laufen ohne wirklich zu
lernen.
Schlaumaier schrieb:> Seriell kannst du bei mehr als 2 Teilen i.d.R. vergessen.
Wieder derselbe Unsinn. Man kann auch mit seriellen
("USART")-Verbindungen einen Multimaster-Bus aufbauen. Mit genau
denselben Problemen wie bei einem Multimaster-I2C-Bus und zusätzlich der
Tatsache, dass Kollisions-Detektion zwar auf dem PHY-Level möglich wäre,
aber von vielen physischen Schnittstellen nicht (oder nicht wirklich)
unterstützt wird. Zusätzlich das Problem, dass es dafür keinen
standardisierten Mechanismus zu Adressierung gibt. Oder: zu viele davon,
was allerdings effektiv genauso wirkt, als gäbe es gar keinen...
> Deshalb mag ich ja Funk.
Wer Funk kennt, nimmt Kabel. Wo immer möglich.
und noch etwas, die Messergebnisse sind eine Zufallszahl von 1-3 die in
einer bytevariable gespeichert werden. Die umwandlung in ein Int klappt
nicht, warum auch immer. Das mit der For-Schleife war ein Beispiel wo es
mit einer direkten zuweisung klappt und mit der umwandlung von byte zu
Int nicht.
c-hater schrieb:> Wieder derselbe Unsinn.
Wann lernen manche Leute zu verstehen was sie lesen.
Bei dir ist ja ein Ansatz vorhanden. ;)
Immerhin beschreibst du sehr gut, die Gründe wieso man das vergessen
kann bzw. sollte.
Aber zu deiner Erklärung meiner Schreibweise, Reihenfolge von gut nach
böse.
1.) Kein Problem (kann jedes Kind, bzw. gibts Anleitungen im Netz ohne
Ende)
2.) Ist einfach (gibt weniger Anleitungen)
3.) Ist machbar aber man muss dabei denken (gibt kaum Anleitungen wenn
dann eher von Freaks)
4.) kannst du vergessen = mag gehen aber die Probleme übersteigen den
Nutzen um ein vielfaches.
5.) Geht nicht.
Oly schrieb:> Möchte ich nicht ausschließen, doch verstehen tue ich gerade nichts.
Lass dir über den Seriellen Monitor einfach das Ergebnis anzeigen was
ankommt. Danach kannst du über Umwandlungen etc. nachdenken.
Oder was ich immer als Alternative mache, hänge an den i2c ein 1602
Display (16 Zeichen 2 Zeilen) via i2c Bus und gib darauf einfach während
der Testphase das aus was du wissen willst.
Schlaumaier, ich habe leider zwar ein Display, aber ohne I2C :(
wie ich das ganze noch über den Seriellen Monitor anschließen soll, weiß
ich ehrich gesagt nicht.
Aber wenn ich eine Zahhl 3 z.B. übertrage, denke ich, das sie ankommt.
Wenn ich dann dieses wieder umwandel in int, damit die jeweilige LED
ansprint, passiert leider nichts.
was möchtest Du mir damit sagen if(==)???
Oly schrieb:> wie ich das ganze noch über den Seriellen Monitor anschließen soll, weiß> ich ehrich gesagt nicht.
Das macht die IDE selbst. Allerdings habe ich aktuell den Pin.-Plan des
Atiny nicht im Kopf, beim Nano muss ich der das nur sagen, und wenn es
am USB-Port hängt bekomme ich das Ergebnis.
Wie gesagt. Bei Atiny sind die Pins "Überbelegt" deshalb ist der
Schwerer zu Handhaben als der Nano + Co.
volatile byte messergenis genommen. jetzt sehe ich das die LED zweimal
blinkt. Somit sollte die Zahl zwei übertragen werden. Doch am Master
wird nichts angezeigt, auch wenn ich dort mit volatile arbeite.
Nachtrag :
https://www.christians-shop.de/Set-LCD-2004-I2C-Modul-20x4-Zeichen-Beleuchtung-Blau-I2C-Modul-fuer-Arduino
So was o.ä. solltest du dir anschaffen. Ist kinderleicht anzusteuern,
gibt zwar "nur" Text aus in festen Zeilen aber das reicht meist völlig
aus.
Wenn du das Foto betrachtest da ist ein kleines Modul drauf, das ist das
i2c-to-Display Adapter-Platine.
So ein Set meinte ich. Mit der Adapter-Platine stellst du die Adresse
ein, den Treiber/Libary (ist in der IDE mit drin) hast du das in 3
Zeilen angesteuert.
Selbst wenn man es hinterher nicht mehr braucht, für Debugging ist es
einfach klasse, besonders bei Atinys ;)
Ist aber nur meine Meinung.
> was möchtest Du mir damit sagen if(==)???
im oberen Code steht:
if (Nr==1) digitalWrite(1,HIGH);
später dann:
// if (Nr=1) digitalWrite(1,HIGH);
ist zwar auskommentiert, könnte aber dazu geführt haben, daß die LED
nicht flackert.
if(==)
ich wollte damit ( digitalWrite(1,!digitalRead(1));) zeigen/sagen das
definitiv Daten ankommen.
Das mit Nr=1 oder Nr ==1 waren jeweils nur Versuche. Aber bei beidem
reagirte die LED nicht. Ich sende 1 Byte und zwar die Zahl 3 , nur am
Master kommt wohl was anderes an oder ich konvertiere es falsch, ich
habe keine Ahnung, doch da scheint das Problem zu liegen.
digitalWrite(3,HIGH);//Kontroll LED wenn Daten angefordert werden
34
}
35
voidreceiveEvent(intanzahl)
36
{
37
while(TinyWire.available()){
38
TinyWire.read();
39
digitalWrite(1,HIGH);//Kontroll LED wenn Daten empfangen werden
40
}
41
messen=true;
42
}
scheint soweit alles zu funktionieren(LED's blinken), doch es wird immer
"0" auf dem Seriellenmonitor ausgegeben. Müsste/solle ja "3" sein, wo
liegt der Fehler?
Mit einem Logic Analyzer/Oszilloskop könntest du sofort sehen, ob es am
Master oder am Slave liegt.
Wie gesagt: Du hast da zu viele Baustellen gleichzeitig offen.
Oly schrieb:> void requestEvent() {> for (int zaehler=0; zaehler==messergebnis; zaehler = zaehler+1){> digitalWrite(3, HIGH);> delay(1000);
Dein TiniWire ist mir nicht so bekannt.
Aber üblicher Weise (Wire) läuft requestEvent() im ISR Kontext.
Darum wird dein delay(1000) versagen, denn dessen Timer benötigt
ebenfalls eine ISR.
Eigentlich sollen I²C Anfragen vom Slave immer sofort beantwortet
werden. Verzögerungen erfordern clock-stretching, was den ganzen I²C Bus
so lange lahm legt. Dieses clock-stretching ist auf den Mastern manchmal
gar nicht oder fehlerhaft implementiert.
Wenn dein Slave Anfragen nicht sofort beantworten kann, dann macht man
das normalerweise in drei Stufen:
1) Master sendet einen Befehl "jetzt bitte messen!"
2) Master fragt wiederholt "bist du fertig?"
Wenn der Slave diese Frage mit "ja" beantwortet, dann
3) Master ruft das Messergebnis ab "gebe mir bitte das Messergebnis"
Oly schrieb:> Andere Frage dazu, wie bekomme ich die I2C Adresse von dem Display dann> raus um es anzusteuern?
Ich empfehle dir trotzdem das andere 160* Display mit zu bestellen.
Das Problem bei deinen Display ist, das es von der Software her schwerer
anzusteuern ist. Da es keine festen Zeilen besitzt. Was beim Atiny85 zu
einen 2. Problem führt. Du brauchst mehr Speicher. Und der ist im
Atiny85 knapper als z.b. im Nano.
Und da das andere Display MIT CONTROLLER nur knapp 5 Euro kostet, ist
das eine gute Investition.
Kleiner Tipp für Testzwecke wenn kein Display vorgesehen ist. Einfach
ein Steckboard-Kabel (Buchse - Buchse) durchschneiden und an den i2c-Bus
anlöten. Dann kannst du mit 2 Buchse-Stecker Kabel das Display
problemlos als Debugger anzeigen bei allen Projekten nutzen. ;)
Oly schrieb:> scheint soweit alles zu funktionieren(LED's blinken), doch es wird immer> "0" auf dem Seriellenmonitor ausgegeben. Müsste/solle ja "3" sein, wo> liegt der Fehler?
Du machst ein Fehler im Code.
Du musst die Serielle Aufgabe DIREKT nach den Read machen. Am besten 2
x.
Einmal schreibst du Serial.print("hier bin ich"); und DANN in der
nächsten Zeile das was du willst. Dadurch weißt du genau WO der Wert der
angezeigt wird ausgelesen wird.
Ach ja, der Serielle Monitor funktioniert NUR an den Arduino-Teil was
mit USB verbunden ist mit der IDE.
Womit wir wieder beim Thema sind. Ein Text-Display funktioniert immer
;)
Schlaumaier schrieb:> Und da das andere Display MIT CONTROLLER nur knapp 5 Euro kostet, ist> das eine gute Investition.
Kleiner Tipp nebenbei. Kauf beide und ein Nano dazu. Dann kannst du mit
den LCD-Display mit den Nano üben. Und glaub mir einfach. Du brauchst
die Übung.
LCD-Displays haben i.d.R. kein Zeichensatz, im Gegensatz zu den 160x
Displays.
Zu den Textdisplays. Wichtig ist das da Steht. "kompatibel mit HD44780".
Die Nr ist verschlüsselt. die ersten 2 Ziffern geben die Anzahl der
Zeichen an pro Zeile, die nächsten 2 Ziffern die Anzahl der Zeilen.
2004 = 20 Zeichen x 4 Zeilen.
Der Zeichensatz ist international. Was bedeutet solange die KEINE öäü
etc. benutzt kannst du alles perfekt lesen. ;) Ich umgehe das Problem
einfach in den ich mir ein Wort ohne Sonderzeichen einfallen lasse, oder
Abkürzungen. Was auf Display's eh meist keine schlechte Idee ist. ;)
Hallo und Danke Schlaumaier für die ausführliche Info!
Ich habe mir bereits einen Arduiono mini Pro angeschlosssen und ihm den
Code des Masters verpasst. Daher konnte ich im S.Monitor sehen was
gesendet wird.
Komischerweise funktionierte es einwandfrei, nur halt mit dem Attiny
nicht. Habe herrausbekommen das die verwendete Bibliothek nicht für den
Master auf Attiny geeignet ist und fehlerhaft ist. Von daher benutze ich
jetzt die von Adafruit und es läuft so wie es sein sollte.
Um auf das Display zurückzukommen, da werde ich den Mini an mein
vorhandenes Display(ohne I2C) anschließen und diesen ins I2C netz mit
einbinden so das er mir sagen kann, welche Daten fließen ;)
Oly schrieb:> Um auf das Display zurückzukommen, da werde ich den Mini an mein> vorhandenes Display(ohne I2C) anschließen und diesen ins I2C netz mit> einbinden so das er mir sagen kann, welche Daten fließen ;)
Solange du nicht an die Speichergrenze des Atiny triffst, wieso nicht ;)
Schlaumaier schrieb:> Solange du nicht an die Speichergrenze des Atiny triffst
Hoffentlich versteht er den ironischen Witz, bzw. die ernsthafte Warnung
die darin verborgen liegt.
Stefan ⛄ F. schrieb:> Hoffentlich versteht er den ironischen Witz, bzw. die ernsthafte Warnung> die darin verborgen liegt.
Hoffe ich auch.
Immerhin muss alles in ca. 6 KBytes Speicher rein die ich bei ein
Atiny85 nutzen kann, wenn ich das richtig im Kopf habe. Wogegen ein Nano
ca. 30 Kbytes hat die ich nutzen kann.
Das LCD-Display braucht komplexere Ansteuerung ergo mehr Speicher als
ein HD44780 Typ. Bei ein HD44780 brauche ich nur den meist eh genutzten
i2c Treiber und eine billige Ansteuerung. Das spart Speicher ohne Ende
im Atiny.
Was der Grund ist, wieso ich die HD44780 Teile lieber einsetze. Davon
abgesehen kann ich sie meist besser ablesen.
Nachtrag : Ich nutze die Atiny-85 nur um die Beleuchtung meiner
Modellautos zu steuern via i2c und PCF8574 und teilweise Fernbedienung
(IR). Und das sogar OHNE Platine als SMD. 1:24 ist halt klein. ;)
Kann man schöne Beleuchtungseffekte machen, inkl. Warnblinker etc.
Oly schrieb:> m Attiny wird nicht mehr stehen als angegeben und das Display wird> nicht mit dem Attiny gesteuert.
JA. Ist klar.
Ich meinte ja auch das es ein Unterschied zwischen "User-Mode" und
Entwicklungsmodus gibt. Und im letztern ist ein Display mit Text eine
schnelle + Speichersparende Möglichkeit für DEBUG-Infos angezeigt zu
bekommen.
Ein Beispiel. JEDES meiner Programme zeigt im Debub-Modus als erster auf
den Display "Programm gestartet". Warum : Damit ich weiß das das sauber
übertragen wurde, und der Chip gestartet ist. Dann kommen da Debug
infos.
Bei meinen Auto-Prg. z.b. wollte ich wissen welches Prg. im Programm
gerade läuft. Also "Warnblinker, Blinker rechts / Links, Beleuchtung an,
aus". Das war während der Entwicklungszeit wichtig.
Da das Display nicht ins Auto passt, habe ich die paar Zeilen für den
Steuercode entfernt als es fertig war, und das war's.
Das coole halt ist. Ich drücke 1 auf der China-Fernbedienung aus meinen
Starter-Set und das Auto macht die Front-Scheinwerfer (helle SMD-LED)
an. ;)
Aber so was muss erst mal laufen. Und da mache ich jede Menge Fehler
zwischendurch. ;) Testen tue ich die erste Runde eh auf ein Digipark
Fertig-Platinchen direkt am AKTIVEN USB-HUB.
NIEMALS ein Arduino DIREKT am PC ANSCHLIESSEN. USB-PORTS sind fast immer
irreparable auf den Mainboard.
das klingt sehr gut!
Mein Arduino wird über einen TTL Converter gespeist, von daher ist er
nicht direkt angeschlossen.
Das Display was ich habe, ist ein 1602 und braucht noch ein paar
Strippen mehr, da es kein I2C Modul besitzt. Daher dachte ich, das ich
diese Kombi als Debugger über I2C später anschließen möchte
Oly schrieb:> Das Display was ich habe, ist ein 1602 und braucht noch ein paar> Strippen mehr, da es kein I2C Modul besitzt.
Das Modul gibt es einzeln. Kostet ca. 1.50
Und ist mega zu empfehlen.
1.) Die Ansteuerung ist um einiges leichter. Libs laden, Ini-Befehl ,
fertig.
2.) Man spart das wichtigstes was ein Arduino hat. PORTS = Anschlüsse.
https://www.christians-shop.de/I2C-IIC-Serielle-Schnittstelle-fuer-LCD-Display-1602-und-2004
<- das das nackte Modul.
Hier mal ein Link für deine Weiterbildung.
http://www.sprut.de/electronic/lcd/
--- hier ein Code aus den Beispielen der IDE bei mir.
//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a
16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.print("Hello, world!");
}
void loop()
{
}
Das ist alles. -> lcd.print("Hello, world!");
Wenn du dein 1602 an i2c anklemmst.
Schlaumaier schrieb:> Und die Addfruit-Libs ist viel größer als die LiquidCrystal_I2C.h
Sie kann halt auch einiges mehr und ist modular aufgebaut, mit viel
wiederverwendbarem Code. Kann man mögen, muss man nicht.
Ich habe mir für diese SSD1306 Displays eine schlankere Variante
gebastelt. Ich habe mich in das sanfte vertikale Scrollen verliebt :-)
http://stefanfrings.de/arduino_oled/index.html
Gibt es diese Displays eigentlich in größer? Nicht unbedingt mehr Pixel,
aber mehr Zentimeter?
Oly schrieb:> for (int zaehler=0; zaehler==messergebnis; zaehler = zaehler+1){
Google mal nach "c++ for schleife" oder ähnlichem.
Eventuell solltest du mal mit kleinen Programmen/Tutorials beginnen?
Viel Glück!
Stefan ⛄ F. schrieb:> Sie kann halt auch einiges mehr und ist modular aufgebaut, mit viel> wiederverwendbarem Code. Kann man mögen, muss man nicht.>> Ich habe mir für diese SSD1306 Displays eine schlankere Variante> gebastelt. Ich habe mich in das sanfte vertikale Scrollen verliebt :-)
Ich sag ja auch nicht das sie schlecht ist. Nur das ich sie nicht in
einen Atiny stecken will. Die hat halt das Recht auf mehr Platz bei mir.
Mein "einziger" 1306er wird mit einen Mega angesteuert.
Und zum Debug reicht mir ein Display was mir was anzeigen kann.