[avr / i2c] Pakket naar sensor geeft 'random' waardes

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 06-10 15:45

LauPro

Prof Mierenneuke®

Topicstarter
Momenteel ben ik bezig om met een AVR een Honeywell sensor uit te lezen.

Specs hierover: http://sensing.honeywell....ical-note-008210-5-en.pdf

In principe geeft de sensor zodra hij is opgestart continue data door zolang je hem een i2c read request stuurt. Het lijkt echter zo te zijn dat de data die ik eruit haal continue veranderd qua waarde. Ik heb even een scope op de i2c-lijn gezet en deze lijkt ook willekeurig te zijn ook als er geen airflow is.

Wanneer er wel airflow is lijken sommige waardes te kloppen maar veel ook niet. Ik check wel of er 14 databits zijn overigens. Iemand enig idee waar ik het moet zoeken?

C:
1
2
3
4
5
uint16_t res;
i2c_init();
i2c_start_wait((zephyr_addr<<1)+I2C_READ);
res = (i2c_readAck() << 8) + i2c_readNak();
i2c_stop();

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!

Alle reacties


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 27-09 13:03
En met een scope op het signaal van de sensor zelf? Zie je daar ook een variërende waarde? Zit de airflow in de range van de sensor?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 06-10 15:45

LauPro

Prof Mierenneuke®

Topicstarter
Ik heb nu geen airflow. Op de scope ook random waardes te zien. Het lijkt erop dat ik meerdere waardes terugkrijg. Ik poll op dit moment elke seconde de data.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • SA007
  • Registratie: Oktober 2002
  • Laatst online: 06-10 16:32

SA007

Moderator Tweaking
Er zijn heel erg veel sensors die slecht gaan meten als hun voedingsspanning buiten het optimale bereik is of als er teveel storing op deze lijn zit.

Ik zou die scope ook eens op de VCC/GND lijnen hangen en kijken of daarin niks vreemds zit.

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 06-10 15:45

LauPro

Prof Mierenneuke®

Topicstarter
Voedingslijn is strak op 5 volt. GND 0. Dit dacht ik ook eerst dat er mogelijk te weinig spanning was. In de datasheet staat tussen 3 Vdc en 10 Vdc.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 06-10 21:27

Damic

Tijd voor Jasmijn thee

Je doet de 4 traps toch?

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • Sissors
  • Registratie: Mei 2005
  • Niet online
Is het compleet random of enkele bits random?

Acties:
  • 0 Henk 'm!

  • Flake
  • Registratie: Februari 2001
  • Laatst online: 01-11-2024
Ligt het niet aan je bus? Pull ups in place? ACKs komen door?

Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 06-10 15:45

LauPro

Prof Mierenneuke®

Topicstarter
Wat bedoel je met 4 traps? Voor zover ik weet de het eerste byte het adres en daarna 2 bytes data.
Sissors schreef op donderdag 07 april 2016 @ 21:41:
Is het compleet random of enkele bits random?
Enkele bytes zijn random lijkt het.
Flake schreef op vrijdag 08 april 2016 @ 07:24:
Ligt het niet aan je bus? Pull ups in place? ACKs komen door?
ACK's zijn er en pull ups ook.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • jeroen3
  • Registratie: Mei 2010
  • Laatst online: 13:11
Hij heeft een 14 bits data veld. En je moet 2 keer 8 bits lezen om te starten, daarna komen 2 met data. Vervolgens herhaal je telkens 2 reads, waar de 14 bit waarde in zit.

Lees op een je een oneven aantal bytes, dan zit je de 14 bit variabele verkeerd in elkaar te schuiven, en lijkt het inderdaad random.

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 06-10 21:27

Damic

Tijd voor Jasmijn thee

LauPro schreef op vrijdag 08 april 2016 @ 14:55:
[...]
Wat bedoel je met 4 traps? Voor zover ik weet de het eerste byte het adres en daarna 2 bytes data.

[...]
Enkele bytes zijn random lijkt het.
[...]
ACK's zijn er en pull ups ook.
Table 1 Startup sequence (pagina 2) of doet die dat automatisch?

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 06-10 15:45

LauPro

Prof Mierenneuke®

Topicstarter
jeroen3 schreef op vrijdag 08 april 2016 @ 15:45:
Hij heeft een 14 bits data veld. En je moet 2 keer 8 bits lezen om te starten, daarna komen 2 met data. Vervolgens herhaal je telkens 2 reads, waar de 14 bit waarde in zit.

Lees op een je een oneven aantal bytes, dan zit je de 14 bit variabele verkeerd in elkaar te schuiven, en lijkt het inderdaad random.
Een READ bestaat uit 3x8 bits, 1 address byte en 2 data bytes. Dat voer ik nu zo uit:
C:
1
2
3
4
i2c_start_wait((zephyr_addr<<1)+I2C_READ);
res = i2c_readAck();
res = (res << 8) + i2c_readNak();
i2c_stop();
Op de scope zie ik ook netjes 3 bytes staan.

Dus in principe hou ik dan toch 3 bytes en niet twee? Ik heb ook getest om geen address byte meer te sturen en alleen te lezen, maar dan krijg ik niets...

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Acties:
  • 0 Henk 'm!

  • 3xhaas
  • Registratie: Februari 2002
  • Laatst online: 26-09-2024
Je krijgt niet meer dan 3 bytes, omdat je daarna een i2c_stop() doet.
De 4 trap wordt waarschijnlijk de start up mee bedoelt.
Die bestaat namelijk uit 4 stappen, waarbij je het serienummer uitleest.
1 - read - returns 0x0000
2 - read - returns Reg0[15:0]
3 - read - returns Reg1[15:0]
4 - read - returns corrected flow {00,[13:0]}
Maar als je elke keer je data gewoon overschrijft heb je hier geen last van. Alleen maar interessant als je het serienummer wilt weten...

Je stappen lijken in ieder geval correct, namelijk:
1 - start(adress)
2 - wait for ack
3 - read high byte
4 - give ack
5 - read low byte
6 - give nak
7 - stop

Ik zou je code wat meer opsplitsen en zo stap voor stap kijken waar het fout gaat, dus zoiets als:
code:
1
2
3
4
5
6
i2c_start_wait(0x93); //of juiste adres hier 0x93 = ((0x49<<1) | 1)
res = i2c_readAck();
res2 = i2c_readNak();
i2c_stop();
res <<= 8;
res |= res2;


Welke waarde hebben je pullups? Soms als ze een te grote weerstand hebben bij een lage spanning gaat het niet helemaal lekker. Zeker bij een hoge bussnelheid.
Op welke frequentie draait je i2c bus? Probeer deze eens naar 100kHz te zetten als hij daar niet al op staat. Of anders nog lager.
Pagina: 1