60 nap alatt Arduino #28 - I2C busz általában

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
szla
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2017. január 20. péntek, 8:38

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: szla »

Sziasztok!
Kipróbáltam az I2C scannert egy Nano-n, az eredeti és a módosított változatot is. A program lefutott a "addr: 44" címig, majd megállt. (A hőmérőm a 0x49-es címen van.)
A Serial.print( (counter%4) ? "\t":"\n"); utáni
delay(1);"
-et megnöveltem 20-ra, így már elment az "addr: 48" -as címig. A következő lenne az élő cím, de erre már nem ír ki semmit.
Mi lehet az oka?

(Az Ardunio oldalon talált másik scanner program lefut, és látja is a 0x49-en az eszközt. A tanfolyamos hőmérő program egyébként működik, a kiolvasást persze átírtam az eredeti 72 helyett 73-ra.)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: Robert »

Melyik keretrendszer?
Arduino.cc vagy Arduino.org?
Melyik verzó?


A tesztprogramok a 0022, 1.0.5 és 1.6.5 verziókkal kerültek tesztelésre.


Az Arduino 1.8.0 és 1.8.1 hulladék!
Összelapátolták a két ágat és összevissza működnek.....
1.5.0....1.5.9 közt Béta verziók
1.6.7...1.6.13 - misztikus hibák
http://www.tavir.hu - a gazda :)
szla
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2017. január 20. péntek, 8:38

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: szla »

1.0.5-r2-vel próbálkozom.
szla
Újonc
Újonc
Hozzászólások: 11
Csatlakozott: 2017. január 20. péntek, 8:38

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: szla »

Úgy emlékszem, hogy a .cc oldalról töltöttem le. A névjegyben nem látom hogy cc vagy org.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: Robert »

Ilyen scan közbeni elakadásra 2 ok is lehet még:
- kontakthiba (dugdosós kábel/panel),
- a felhúzóellenállás kimaradt vagy túl nagy (>10k; mind2),
- gerjed az IC (100nF kerámia a táplábaira),
- nem kap az IC tápfeszt és parazita módon az I2C buszról szedi össze.
http://www.tavir.hu - a gazda :)
venmedve
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2017. február 2. csütörtök, 18:29

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: venmedve »

Sajnos valami nem működik A monitoron az látszik, hogy a kontroller a 0x44 -es címnél leáll.
Screenshot 2017-02-27 18.08.40.png
Az EXT1 nélkül rendben lefut a teszt, ám ekkor természetesen nem talál semmit!
Screenshot 2017-02-27 18.12.50.png
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: Robert »

A tanfolyam Arduino 1.6.5, Arduino 1.0.5 és Arduino-0022 rendszerekhez készült.
Az összelapátolt 1.8.0 / 1.8.1 (Arduino.cc + Arduino.org) - nem érzem megbízhatónak....
http://www.tavir.hu - a gazda :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: Robert »

Ez mit csinál?

Kód: Egész kijelölése

/*
  TWI/I2Cscanner
  (c) TavIR http://www.tavir.hu
 
 This sketch tests the standard 7-bit addresses
 from 0 to 127. Devices with higher bit address
 might not be seen properly. Work only at hardware I2C/TWI!

 Tested via Arduino 1.0.2
 
  Founded at arduino.cc forum
  Modified 12 March 2013
  by TavIR / Robert Cseh
 
  This example code is in the public domain.
 */

#include <Wire.h>

void setup()
{ Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner"); }

void loop()
{ byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 0; 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("Unknow 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(8000);
}
http://www.tavir.hu - a gazda :)
venmedve
Újonc
Újonc
Hozzászólások: 4
Csatlakozott: 2017. február 2. csütörtök, 18:29

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: venmedve »

A probléma akkor is megvan ha a lekérdezést kiveszem a programból.
Már csak a soros kommunikáció megy és a végén villog a 13-as lábon a led.
A kommunikáció megállása után a led nem villog tovább.
Vagyis úgy tüni, az AVR lefagy.
Az EXT1 lehúzása után minden rendben működik, persze az i2c bus nélkül.
Azaz másik eszköz i2c bus LCD kiválóan megy.
A Tipp nem jött be :(
Az SCL és SDA lábakon 3.3 K van és rendben van.

Még egyszer mondanám. A soros kommunikáció áll le.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: Robert »

Soros kommunikáció tapasztalatok:
Arduino-1.6.11(mindenféle kiegészítővel;Win8); Arduino-1.0.5 (szűz virtuális PC; Win8); Alappanel: UNO/Ch340; UNO/Mega16U2. COM illesztő: CH340/341 (2016 illetve 2014-es is);

- az Ext1 panel ha csak tápot kap, akkor néha beesik feltöltési hiba is.
- Ez reprodukálható más shieldekkel is (motorshield, Multufunctional, stb), több I2C eszközzel felfűzve. Az AVR fagy le.
- 3.3V USB táp megvan,
- felépítés a szokásos: USB illesztő, soros 1k ellenállás a panelen Tx/Rx vonalon; DTR adja a resetet.
Mind az UNO, Diecimila, UNO/340 hibára futott (Diecimila talán kevesebbszer, de az valószínű optikai csalódás).


Google - wire communication, error, freeze és társai....


Eredmény:
Az eredeti tanfolyami mintakód:

Kód: Egész kijelölése

/*  I2Cscan
    (Arduino-1.0.4)
 I2CScanner minta
 60+15 nap alatt arduino tanfolyam
 (c) TavIR http://www.tavir.hu  */

#include <Wire.h>
  //TWI-t hasznalunk
int counter, data;
  //ket valtozo

void setup() {
  pinMode(13, OUTPUT);
    //D13 LED
  digitalWrite(13, LOW);
    // D13 kikapcsol
  Serial.begin(9600);
    //Sorosport 9600 bps sebessegu
    
  Serial.println();   
  Serial.println();   
  Serial.println("I2CScanner ready!");
  Serial.println();
    //Fejlecet irunk ki  
  Wire.begin();        
    //TWI inicializalas  
}

void loop() {
  for (counter=1; counter<128; counter++) {
      //1..128-ig nezzuk a buszt
    Wire.requestFrom(counter,1);
      //szolitsuk meg az i. eszkozt  
    Serial.print("addr: ");
      //irjuk ki a cimet
    if (counter<16) Serial.print("0");
      //hogy egyformak legyenek a kiirasok
    Serial.print(counter,HEX);
    if (Wire.available()) {
        //ha van valami a buszon a cimen, jelezzuk
      Serial.print(" found!");
    }
    else {
        //ha nincs semmi - uresen marad
      Serial.print("       ");
    }
     
    Serial.print( (counter%4) ? "\t":"\n");
        //vagy TAB vagy soremeles jon
  }
  while(1) {
      //villogjunk az idok vegezeteig
    digitalWrite(13,HIGH);
    delay(300);
    digitalWrite(13,LOW);
    delay(300);
  }
}
Ebben a hiba:
TWI/I2C kommunikáció megnyitásra kerül, de:
- nincsen meg a lezárása (Wire.endTransmission())
- az eszköz elérhetőség(wire.avaiable()) az nem az ERROR-t adja vissza (Arduino 1.0.2 után változott ?)
- belső túlcsordulás/buffer vagy hasonló okozza valószínűleg a hibát.
- TWI kezelés az Arduinoban a TimeOutot nem kezeli ahogyan a kommunikáció kezdetén/újrakezdetén az inicializálást sem.

Megoldás:
A kódban a hibák javítva, és a ERROR kezelés már az új módon:

Kód: Egész kijelölése

/*
  TWI/I2Cscanner
  (c) TavIR http://www.tavir.hu
 
 This sketch tests the standard 7-bit addresses
 from 0 to 127. Devices with higher bit address
 might not be seen properly. Work only at hardware I2C/TWI!

 Tested via Arduino 1.0.2
 
  Founded at arduino.cc forum
  Modified 12 March 2013
  by TavIR / Robert Cseh
 
  This example code is in the public domain.
 */

#include <Wire.h>

void setup()
{ Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner"); }

void loop()
{ byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 0; 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("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }   
    else
    { 
         Serial.print("No device 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(8000);
}


A lényeg:

Kód: Egész kijelölése

Wire.beginTransmission(address);
    error = Wire.endTransmission();
Azaz a TWI kommunikációt le kell zárni, nem csinálunk mindenféle eljárást közben!.
Volt olyan fórumbejegyzés is, hogy mind a TWI, mind a soros kommunikáció megszakítást használ és sikerül összeakadniuk (nem mentek beje mélyebben).

Tapasztalat?
http://www.tavir.hu - a gazda :)
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: IzLuCSi »

Sziasztok

Egy gyroscopot szeretnék egy mikrovezérlővel össze kötni. Ezt hogyan lehet meg oldani?

A lenti videóban az arduino oldaláról másoltak ki egy program kódot amit aztán arduino panelon keresztül töltöttek fel a gyroskopra. Ha I2C komunikációval egy sima mikrovezérlőről töltöm bele azt a kódot akkor az is meg felelő?
Vagy csak a mikrovezérlőbe kéne tölteni azt a kódot és akkor kiolvassa az adatokat? Vagy hogyan kéne?
https://www.youtube.com/watch?v=EexrtrXu5cI

Köszönöm a segítséget
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: Robert »

A gyorsulásmérő szenzor - nem programozható. A mikrokontroller szólítja meg és olvassa ki az adatokat. Majd számolja ki, adja soros porton át vissza az eredményt.
Ha I2C komunikációval egy sima mikrovezérlőről töltöm bele azt a kódot akkor az is meg felelő?
Ezt viszont nem értem....
http://www.tavir.hu - a gazda :)
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: IzLuCSi »

Tehát ha van egy MPU6050 es gyroscopom akkor csak rá kell kötnöm a megfelelő tápfeszültséget és egy mikrovezérlőt ami I2C vel leszedi róla az adatokat? Ennyi az egész?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: Robert »

Tehát ha van egy MPU6050 es gyroscopom akkor csak rá kell kötnöm a megfelelő tápfeszültséget és egy mikrovezérlőt ami I2C vel leszedi róla az adatokat? Ennyi az egész?
Igen. És a mikrovezérlőre a programot.
http://www.tavir.hu - a gazda :)
IzLuCSi
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2017. szeptember 26. kedd, 14:34

Re: 60 nap alatt Arduino #28 - I2C busz általában

Hozzászólás Szerző: IzLuCSi »

A videóban lévő, arduino oldaláról letöltött programot kell a mikrovezérlőre rá égetni?
Úgy tudom az Arduino valamilyen egyszerüsitett C nyelvet használ. Attól még az müködik MPLAB X -en C nyelvü fordítóval?
Válasz küldése