I2C s AD7991

Arduino je pojav za katerega bi težko rekli, da opisuje samo HW ali samo SW, zato mu tu namenajm poseben prostor.

Moderator: tilz0R

I2C s AD7991

OdgovorNapisal/-a Peter123 » 21 Avg 2019, 11:17

Želim komunicirati s AD7991 in Arduino Nano: https://www.analog.com/en/products/ad79 ... t-overview
Kot vidim na osciloskopu se ukaz za branje sploh ne pošlje? Kakšen predlog?

Tole je trenutna koda:
Koda: Izberi vse
#include<Wire.h>
#define Addr 0x29 //Probal tudi 28, na 29 vidim odgovor na i2C dekoderju.

void setup()
{
  Serial.begin(9600);
  Serial.println("Setup start");
  Wire.begin();
  Serial.println("Setup end");
}

void loop()
{
  //Serial.println("Loop start.");
  unsigned int data[2];
  Wire.beginTransmission(Addr);
  Wire.write(0x1F);           //Sumim da se tole ne pošlje.
  Wire.endTransmission();
  delay(300);

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Stop I2C Transmission
  Wire.endTransmission();

  // Request 2 bytes of data
  Wire.requestFrom(Addr, 2);

  // Read 2 bytes of data
  // raw_adc msb, raw_adc lsb
  if (Wire.available() == 2)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
  }
  delay(300);

  // Convert the data
  int raw_adc = (((data[0] & 0x0F) * 256) + (data[1] & 0xF0)) / 16 ;
  Serial.print("data[0]: ");
  Serial.println(data[0]);
  Serial.print("data[0]: ");
  Serial.println(data[1]);
  // Output data to serial monitor
  Serial.print("Digital value of Analog input on Channel 1: ");
  Serial.println(raw_adc);
  delay(500);
}


In tole je rezultat na terminalu:
Koda: Izberi vse
Setup start
Setup end
data[0]: 128
data[0]: 87
Digital value of Analog input on Channel 1: 5
data[0]: 128
data[0]: 87
Digital value of Analog input on Channel 1: 5
... se ponavlja...

Se že nekaj časa ukvarjam s tem pa ???
Kakšen predlog?
Peter123
 
Prispevkov: 988
Pridružen: 09 Feb 2015, 14:20
Kraj: 1117 Lj.
Zahvalil se je: 21 krat
Prejel zahvalo: 128 krat
Uporabnika povabil: jmivsek
Število neizkoriščenih povabil: 26

Re: I2C s AD7991

OdgovorNapisal/-a s54mtb » 21 Avg 2019, 11:26

Peter123 je napisal/-a:Kot vidim na osciloskopu se ukaz za branje sploh ne pošlje? Kakšen predlog?


Kaj se dogaja na I2C? Dobiš ACK? Imaš pullup upore?
Namesto "Zahvali se" sprejemam tudi šalco kofeta: https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 10048
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1386 krat
Prejel zahvalo: 3428 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 222

Re: I2C s AD7991

OdgovorNapisal/-a Peter123 » 21 Avg 2019, 12:48

Najbolje da prilepim kar vidim:
scope_1.jpg

Tole se periodično ponavlja.
Drugih ukazov ne ujamem.
LP
Peter
Peter123
 
Prispevkov: 988
Pridružen: 09 Feb 2015, 14:20
Kraj: 1117 Lj.
Zahvalil se je: 21 krat
Prejel zahvalo: 128 krat
Uporabnika povabil: jmivsek
Število neizkoriščenih povabil: 26

Re: I2C s AD7991

OdgovorNapisal/-a tilz0R » 21 Avg 2019, 13:29

Imaš mogoče logični analizator? Vidim, da manjka ACK iz strani slave-a. Pošlješ 0b01010010 aka 0x52 (left align) aka 0x29 (right align). Oba byta se pravilno začneta z start in končata z stop sekvencami.

Wire.write se kot kaže ne pošlje, ker wire.begintransaction ni prejel ACK-ja.

Vsaj tako pravi moje razumevanje I2C protokola, a mogoče sem falil :)
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1697
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 221 krat
Prejel zahvalo: 442 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: I2C s AD7991

OdgovorNapisal/-a Peter123 » 21 Avg 2019, 13:38

Sem posnel še 2 sliki:
scope_2.jpg
Takole izgleda pri adresi 29, dalj časa po izmenjavi adres ni nič.

scope_3.jpg
Takole izgleda če uporabim adreso 28.
Peter123
 
Prispevkov: 988
Pridružen: 09 Feb 2015, 14:20
Kraj: 1117 Lj.
Zahvalil se je: 21 krat
Prejel zahvalo: 128 krat
Uporabnika povabil: jmivsek
Število neizkoriščenih povabil: 26

Re: I2C s AD7991

OdgovorNapisal/-a s54mtb » 21 Avg 2019, 14:32

Če primerjam tvojo sliko
Slika
https://s5tech.net/download/file.php?id=46537&mode=view

z datasheetom
iic.JPG


moraš imeti A0 pin na 1.
Namesto "Zahvali se" sprejemam tudi šalco kofeta: https://www.buymeacoffee.com/s54mtb
Uporabniški avatar
s54mtb
 
Prispevkov: 10048
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 1386 krat
Prejel zahvalo: 3428 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 222

Re: I2C s AD7991

OdgovorNapisal/-a Peter123 » 21 Avg 2019, 14:56

Kot jaz vidim na sliki iz datasheeta je lahko A0 0 ali 1?
Sem probal vsilit še ukaz pisanja: Wire.write(0xA2); pred ukazom za branje:
data[0]: 27
data[1]: 87
Digital value of Analog input on Channel 1: 181
Še vedno ni to pravi rezultat, oziroma se ne spreminja s spreminjanjem vhodne napetosti.
Peter123
 
Prispevkov: 988
Pridružen: 09 Feb 2015, 14:20
Kraj: 1117 Lj.
Zahvalil se je: 21 krat
Prejel zahvalo: 128 krat
Uporabnika povabil: jmivsek
Število neizkoriščenih povabil: 26


Vrni se na Arduino

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron