60 nap alatt Arduino #28 - I2C busz általában
Re: 60 nap alatt Arduino #28 - I2C busz általában
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.)
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.)
Re: 60 nap alatt Arduino #28 - I2C busz általában
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
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
Re: 60 nap alatt Arduino #28 - I2C busz általában
1.0.5-r2-vel próbálkozom.
Re: 60 nap alatt Arduino #28 - I2C busz általában
Úgy emlékszem, hogy a .cc oldalról töltöttem le. A névjegyben nem látom hogy cc vagy org.
Re: 60 nap alatt Arduino #28 - I2C busz általában
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.
- 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
Re: 60 nap alatt Arduino #28 - I2C busz általában
Sajnos valami nem működik A monitoron az látszik, hogy a kontroller a 0x44 -es címnél leáll.
Az EXT1 nélkül rendben lefut a teszt, ám ekkor természetesen nem talál semmit!Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.
Re: 60 nap alatt Arduino #28 - I2C busz általában
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....
Az összelapátolt 1.8.0 / 1.8.1 (Arduino.cc + Arduino.org) - nem érzem megbízhatónak....
http://www.tavir.hu - a gazda
Re: 60 nap alatt Arduino #28 - I2C busz általában
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
Re: 60 nap alatt Arduino #28 - I2C busz általában
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.
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.
Re: 60 nap alatt Arduino #28 - I2C busz általában
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:
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:
A lényeg:
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?
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);
}
}
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();
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
Re: 60 nap alatt Arduino #28 - I2C busz általában
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
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
Re: 60 nap alatt Arduino #28 - I2C busz általában
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.
Ezt viszont nem értem....Ha I2C komunikációval egy sima mikrovezérlőről töltöm bele azt a kódot akkor az is meg felelő?
http://www.tavir.hu - a gazda
Re: 60 nap alatt Arduino #28 - I2C busz általában
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?
Re: 60 nap alatt Arduino #28 - I2C busz általában
Igen. És a mikrovezérlőre a programot.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?
http://www.tavir.hu - a gazda
Re: 60 nap alatt Arduino #28 - I2C busz általában
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?
Ú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?