|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
frenki Moderator
Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6555 Aktiv.: 29.40 Kraj: Ljubljana (JN76GB)
|
Objavljeno: Čet Feb 08, 2018 4:35 pm Naslov sporočila: Komunikacija z I2C napravo se zapleza |
|
|
Malo sem se igral z enim TFT displayem, pa sem poleg obestil še en DS1307 RTC na I2C. Zadeva lepo spelje, potem pa se po nekem naključnem času ustavi. Po resetu ali preklopu napajanja ponovno spelje. DS1307 je priključen po specificiranem v datasheetu. Pullup-i na linijah so ok, tudi vse ostalo bi moralo biti normalno. Menjal sem tudi Arduino plato (Mega 2560 / Due), vendar se napaka manifestira na obeh na enak način. Predpostavljam, da bi lahko šlo za problem v knjižnicah.
Zanima me, ali je že kdo naletel na podoben problem ... kako/če ga je rešil? Nekega resnega debuga se nisem šel, mi je pa sumljivo tole:
Koda: |
void DS1307::_waitForAck()
{
pinMode(_sda_pin, INPUT);
digitalWrite(_scl_pin, HIGH);
while (digitalRead(_sda_pin)==HIGH) {}
digitalWrite(_scl_pin, LOW);
}
|
|
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.90 Kraj: Grosuplje
|
Objavljeno: Čet Feb 08, 2018 6:13 pm Naslov sporočila: |
|
|
Frenki, se ustavi kompletni program ali se samo DS ne odzove več?
Probaj še kakšno drugo knjižnjico npr.: tole.
_________________ Lp, Jaka |
|
Nazaj na vrh |
|
|
frenki Moderator
Pridružen-a: Ned 23 Feb 2003 21:26 Prispevkov: 6555 Aktiv.: 29.40 Kraj: Ljubljana (JN76GB)
|
Objavljeno: Čet Feb 08, 2018 9:55 pm Naslov sporočila: |
|
|
Jaka ustavil se je v celoti. Iz tega stanja ga je zbudil samo reset ali power cycle. Možno, da bi s predlagano knjižnico delalo. Ampak saj je tudi s to, dokler se ni znašel v neki čudni situaciji. Zadevo sem rešil, vzroka pa zaenkrat nisem našel (možno, da mi ga kaj lomi prastari 1307). Našel sem en star AD-jev AN, kjer je opisana možna/delujoča rešitev ("Solution 1: Clocking Through the Problem").
Opis: |
|
Download |
Ime datoteke: |
AN686.pdf |
Velikost datoteke: |
44.49 KB |
Downloadano: |
2 krat |
|
|
Nazaj na vrh |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14555 Aktiv.: 65.29 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Čet Feb 08, 2018 10:49 pm Naslov sporočila: |
|
|
Na kakih nivojih sta liniji, ko zadeva obstoji? Ko je vodilo prosto, sta obe liniji visoki. Če imaš na mikrokontrolerju kak prosti pin daj gor eno ledico, katero pred rabo vodila recimo vključiš, ko je vpis na vodilu končan pa izključiš. Tako boš ugotovil a ga lomi i2c ali kaj drugega.
_________________ lp
Silvo |
|
Nazaj na vrh |
|
|
gustinmi Član
Pridružen-a: Tor 26 Feb 2019 13:41 Prispevkov: 14 Aktiv.: 0.22
|
Objavljeno: Tor Feb 26, 2019 2:30 pm Naslov sporočila: |
|
|
A si preveril naslove i2c naprav. Npr s:
Koda: |
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(57600);
while (!Serial);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
} |
Načeloma ni noben problem imeti v več naprav vzporedno priključenih na vodilo. Samo moraš jih naslavljat pravilno. Pull-upi so samo enkrat za celo i2c vodilo, ne za vsako napravo posebej valjda..
|
|
Nazaj na vrh |
|
|
Mbili Član
Pridružen-a: Tor 03 Jan 2012 20:14 Prispevkov: 34 Aktiv.: 0.23 Kraj: Ljubljana
|
Objavljeno: Tor Feb 26, 2019 11:48 pm Naslov sporočila: Re: Komunikacija z I2C napravo se zapleza |
|
|
frenki je napisal/a: |
...
Zanima me, ali je že kdo naletel na podoben problem ... kako/če ga je rešil? Nekega resnega debuga se nisem šel, mi je pa sumljivo tole:
void DS1307::_waitForAck()
{
pinMode(_sda_pin, INPUT);
digitalWrite(_scl_pin, HIGH);
while (digitalRead(_sda_pin)==HIGH) {}
digitalWrite(_scl_pin, LOW);
}
|
Poudarjeno označen del kode ni v redu. Tega se ne sme tako pisati. V primeru, da DS1307 zaradi takega ali drugačnega razloga pošlje NACK, se zadeva vrti v neskončni zanki. V WHILE zanki bi mora biti še nek števec (timeout), ki po maksimalnem številu ponovitev povzroči izstop iz zanke in po zanki je potrebno dodati kodo, ki obravnava potem tak primer.
|
|
Nazaj na vrh |
|
|
Eisenhorn Član
Pridružen-a: Tor 08 Dec 2009 11:50 Prispevkov: 200 Aktiv.: 1.14 Kraj: LJ
|
Objavljeno: Pet Mar 01, 2019 2:09 pm Naslov sporočila: |
|
|
Se ti program ustavi ali se izvaja naprej? Imel sem podoben problem pri I2C komunikaciji med Arduino Mega in enim ICjem. I2C komunikacija se je naključno sesula, program se je normalno izvajal naprej (z neuspešno I2C komunikacijo) do izklopa in ponovnega vklopa. Rešil sem tako da sem sam spisal celoten program v Atmel Studio.
Lp
|
|
Nazaj na vrh |
|
|
bostjang Član
Pridružen-a: Tor 03 Jan 2006 15:29 Prispevkov: 3175 Aktiv.: 14.25 Kraj: Postojna
|
Objavljeno: Ned Mar 10, 2019 10:02 am Naslov sporočila: |
|
|
Ni problem samo neskončno čakanje. Narobe je že to, da se čaka na SDA. Linijo se samo bere. Ko je SCL visok, se SDA sploh ne sme spreminjati (razen pri START in STOP). Smiselna funkcija bi bila readAck().
|
|
Nazaj na vrh |
|
|
Dorijan Član
Pridružen-a: Ned 22 Jun 2008 10:48 Prispevkov: 2481 Aktiv.: 12.87 Kraj: južnoprimorska
|
Objavljeno: Sre Mar 13, 2019 2:00 pm Naslov sporočila: |
|
|
+1
while brez timouta se pogosto uporablja v računalniški kodi ampak pri krmilnikih je običajno samo za glavno zanko. Predvsem bi se ga morali izgobitati uporabi v zadevah izven mikrokrmilnika. (Problem v veliko arduino knjižnicah za i2c in SPI senzorje)
Program ne sme zmrznit, če začasno prekineš povezavo z periferijo.
_________________ Če nekaj deluje, razstavi in ugotovi zakaj. |
|
Nazaj na vrh |
|
|
damjango Član
Pridružen-a: Pon 03 Sep 2012 7:56 Prispevkov: 721 Aktiv.: 5.09 Kraj: Murska Sobota
|
Objavljeno: Sob Mar 06, 2021 11:00 am Naslov sporočila: |
|
|
Koda: |
Wire.write (0b10000000 + (in << 3)); |
Ker sem v komunikaciji I2C bolj začetnik, me zanima, če ta koda pomeni premikanje bitov za 3 mesta?
|
|
Nazaj na vrh |
|
|
bostjang Član
Pridružen-a: Tor 03 Jan 2006 15:29 Prispevkov: 3175 Aktiv.: 14.25 Kraj: Postojna
|
|
Nazaj na vrh |
|
|
mato1111 Član
Pridružen-a: Pet 28 Dec 2012 14:42 Prispevkov: 612 Aktiv.: 4.44 Kraj: Vrhnika
|
Objavljeno: Sob Mar 06, 2021 6:04 pm Naslov sporočila: |
|
|
damjango je napisal/a: |
Ker sem v komunikaciji I2C bolj začetnik, me zanima, če ta koda pomeni premikanje bitov za 3 mesta? |
Tisto v notranjem oklepaju ja.
|
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|