I2C
Úvodní stránka › Fórum › Hardware › Sběrnice › I2C
- Toto téma obsahuje celkem 10 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel rakocid a poslední změna proběhla před 8 roky a 6 měsíci.
-
AutorPříspěvky
-
20.3.2016 v 0:42 #6390rakocidÚčastník
Prosím Vás nemal niekto skúsenosť s i2c komunikáciou medzi dvomi arduinami? Využívam jeden ako Master-reader a druhy Slave-writer… Master mi po čase stále zamrzne pri komunikácií, nabehne až keď Slave reštartujem. Riešim to už dlhu dobu a neviem si stým radi :/
20.3.2016 v 8:47 #6391posjirkaÚčastníkhod se kod a zapojení … ale to jak to máš opravduzapojené, né stažené z netu 🙂
20.3.2016 v 15:15 #6392rakocidÚčastníkMASTER:
#include <DS3231.h>
#include <Wire.h>DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;
int c[18] ;
float humid, templ = 20, humid_2, temp2 = 20,humid_3, temp3 = 20,humid_4, temp4 = 20,humid_5, temp5 = 20, humid_6, temp6 = 20;void setup()
{
Wire.begin();
}void loop()
{
Wire.requestFrom(44, 18);
int x = 0;while (Wire.available())
{
c[x] = Wire.read();
x++;
}if(c[0] < 35 && c[0] > 5){
humid_5 = c[2];
temp5 = (c[0]*10)+(c[1]/10);
temp5 = temp5/10;}if(c[3] < 35 && c[3] > 5){
humid_4 = c[5];
temp4 = (c[3]*10)+(c[4]/10);
temp4 = temp4/10;}if(c[6] < 35 && c[6] > 5){
humid = c[8];
templ = (c[6]*10)+(c[7]/10);
templ = templ/10;}if(c[9] < 35 && c[9] > 5){
humid_2 = c[11];
temp2 = (c[9]*10)+(c[10]/10);
temp2 = temp2/10;}if(c[12] < 35 && c[12] > 5){
humid_3 = c[14];
temp3 = (c[12]*10)+(c[13]/10);
temp3 = temp3/10;}if(c[15] < 35 && c[15] > 5){
humid_6 = c[17];
temp6 = (c[15]*10)+(c[16]/10);
temp6 = temp6/10;}Serial.println(templ);
Serial.println(temp2);
Serial.println(temp3);
Serial.println(temp4);
Serial.println(temp5);
Serial.println(temp6);Serial.print(Clock.getHour(h12, PM), DEC);
Serial.print(‚ ‚);
Serial.print(Clock.getMinute(), DEC);
Serial.print(‚ ‚);
Serial.print(Clock.getSecond(), DEC);delay(2000);
}SLAVE:
#include <Wire.h>
byte c[18] ;void setup() {
Wire.begin(44);
Wire.onRequest(requestEvent);
}void loop() {
//…
}void requestEvent()
{
Wire.write(c,18);
}Program je dosť dlhý prepísal som základ toho ako využívam wire, dufam že len vtom budem mať neaku chybu, mam to zapojene na testovanie takto… používam aj ethernet modul, pretože udaje posielam po sieti. Odpory používam 4,7 kOhm
Attachments:
20.3.2016 v 15:29 #639520.3.2016 v 19:21 #6410posjirkaÚčastníkještě jak to máš od sebe vzdálené, Někdy to blbne když je to daleko. Pak se snižuje odpor PULL UP třeba na 2k2 nebo 1k0 … Kdyžtak to zkus a jak budu mít chvilku tak se na to já nebo někdo jiný podívá …
20.3.2016 v 20:03 #6414rakocidÚčastníkmusím použivať odpory?, keď mam na wire zbernicu pripojene ds3231? myslím že už ds3231 obsahuje odpory. Skúsil som to snimi aj bez nich ale správalo sa to rovnako. mohlo by pomocť vyradiť z ds3231 interne rezistory a pridať externe s nižsím odpor?
Alebo som rozmýšľal neposielať naraz 18 bytov ale rozdeliť to. Pýtať si napríklad po troch postupne. Nieje to veľa? Ale neviem ako sa to robí, či sa to dá. DS3231 knižnica funguje tak že si pýta stále len to čo potrebuje s funkciami (getSecond(); getMinute();…). Dalo by sa takéto slave zariadenie urobiť aj z arduino nano?
Ďakujem za radi
20.3.2016 v 20:56 #6417posjirkaÚčastníkco spíš použít formu dotaz/odopvěď.
Můžeš si říct, že char(2) je dotaz na minutu, char(3) dotaz na hodinu, …
tím pádem nebudeš posílat 18 bytů (bitu?) v základu je I2C (TWI) navržena pro komunikaci po 8 bitech + adresa + start/stop bity.
Zkus si poslat jednoduché informace : … posílej si stále dokola číslo po každém přijmuti jej zvyš o 1.je to super pro monitorování stability komunikace. Při každé přijmuté odpovědi si můžeš ověřit, že jsi dostal správné data, případně si nechat rozsvítit LED diodu jako chybu .25.3.2016 v 21:58 #6460rakocidÚčastníkvyskúšal som posielať 3 bajty, vzdialenosť minimálna, zdroj som zvýšil na 2 ampere, nikdy to nevydrží dlhšie ako hodinu.
27.3.2016 v 23:13 #6472posjirkaÚčastníka po 2 hodinách se ti zhroutí komunikace nebo resetuje arduno?
Pokud linka videl bych to na zahlcený buffer, pokud reset arduna tak chyba v čipu.
zkoušel jsi i jiný arduino?
Stačil by čip s ledkou…31.3.2016 v 10:55 #6484rakocidÚčastníkArduino nano som vymenil, nepomohlo.
Program zamrzne v casti ked komunikuje cez zbernicu wire.
Zacne pracovat az po restartovani arduino nano (slave). Restartovanie len mastra nepomaha.
Co by znamenalo keby bol zahlceny buffer?4.4.2016 v 0:08 #6508rakocidÚčastníkProblem vyrieseny. Dakujem za rady.
Hodnoty ktore som posielal boli prijate pomocou bezdrotoveho priimaca nrf24. Ked boli na väcsiu vzdialenost niektore hodnoty boli na tolko skreslene ze ich nedokazalo poslat dalej.Bohužial som sem ani tu cast programu nenapisal. Wire zbernica funguje skvele. -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.