www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Komunikacija z I2C napravo se zapleza

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6540
Aktiv.: 29.45
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Čet Feb 08, 2018 4:35 pm    Naslov sporočila:  Komunikacija z I2C napravo se zapleza Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5766
Aktiv.: 25.97
Kraj: Grosuplje

PrispevekObjavljeno: Čet Feb 08, 2018 6:13 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
frenki
Moderator
Moderator



Pridružen-a: Ned 23 Feb 2003 21:26
Prispevkov: 6540
Aktiv.: 29.45
Kraj: Ljubljana (JN76GB)

PrispevekObjavljeno: Čet Feb 08, 2018 9:55 pm    Naslov sporočila:   Odgovori s citatom

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").


AN686.pdf
 Opis:

Download
 Ime datoteke:  AN686.pdf
 Velikost datoteke:  44.49 KB
 Downloadano:  2 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14551
Aktiv.: 65.53
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Čet Feb 08, 2018 10:49 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gustinmi
Član
Član



Pridružen-a: Tor 26 Feb 2019 13:41
Prispevkov: 14
Aktiv.: 0.23

PrispevekObjavljeno: Tor Feb 26, 2019 2:30 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Mbili
Član
Član



Pridružen-a: Tor 03 Jan 2012 20:14
Prispevkov: 34
Aktiv.: 0.23
Kraj: Ljubljana

PrispevekObjavljeno: Tor Feb 26, 2019 11:48 pm    Naslov sporočila:  Re: Komunikacija z I2C napravo se zapleza Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Eisenhorn
Član
Član



Pridružen-a: Tor 08 Dec 2009 11:50
Prispevkov: 200
Aktiv.: 1.15
Kraj: LJ

PrispevekObjavljeno: Pet Mar 01, 2019 2:09 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bostjang
Član
Član



Pridružen-a: Tor 03 Jan 2006 15:29
Prispevkov: 3158
Aktiv.: 14.23
Kraj: Postojna

PrispevekObjavljeno: Ned Mar 10, 2019 10:02 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Dorijan
Član
Član



Pridružen-a: Ned 22 Jun 2008 10:48
Prispevkov: 2481
Aktiv.: 12.93
Kraj: južnoprimorska

PrispevekObjavljeno: Sre Mar 13, 2019 2:00 pm    Naslov sporočila:   Odgovori s citatom

+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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
damjango
Član
Član



Pridružen-a: Pon 03 Sep 2012 7:56
Prispevkov: 721
Aktiv.: 5.12
Kraj: Murska Sobota

PrispevekObjavljeno: Sob Mar 06, 2021 11:00 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bostjang
Član
Član



Pridružen-a: Tor 03 Jan 2006 15:29
Prispevkov: 3158
Aktiv.: 14.23
Kraj: Postojna

PrispevekObjavljeno: Sob Mar 06, 2021 4:47 pm    Naslov sporočila:   Odgovori s citatom

Hočeš reči začetnik v C-ju? Saj je vse to na spletu.
https://www.w3schools.in/c-tutorial/operators/
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mato1111
Član
Član



Pridružen-a: Pet 28 Dec 2012 14:42
Prispevkov: 611
Aktiv.: 4.46
Kraj: Vrhnika

PrispevekObjavljeno: Sob Mar 06, 2021 6:04 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group