de Wire.h lib.

Arduino specifieke Software
Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

de Wire.h lib.

Berichtdoor paysan » 17 Apr 2016, 11:05

Ik heb een vraag over de I2C lib genaamd Wire.h

Op de Arduino zit een dedicated I2C poort ( op de DUE zelfs 2) op de pins zoals beschreven op deze pagina:

https://www.arduino.cc/en/Reference/Wire

De eerste vraag is over Wire.begin()

Zoals op de reference pagina kun je tussen de haakje het adres van het device benoemen.
Maar wat als je meer dan 1 device op de bus hebt zitten?

En nog meer verwarring:

Ik lees ook ergens dat je met Wire.begin() de pins van de I2C bus kan her-definieren:

Just add the following line to your setup function:
Wire.begin(0, 2);
where 0 is for the SDA and 2 is for SCLK. Note that this setup is for an ESP-01 device. By default, the pins are 4(SDA) and 5(SCLK).

Dit is in tegenstrijd met het eerste geval waar je met Wire.begin het adres ingeeft.
De IDE geeft er ook een foutmelding op.


Er zou ook Wire.pins(x, y) bestaan.

I2C SDA = GPIO #4 (default)
I2C SCL = GPIO #5 (default)
If you want, you can connect to I2C devices using other 2 pins in the Arduino IDE, by calling Wire.pins(sda, scl) before any other Wire code is called

Dit geeft een foutmelding omdat Wire.pins niet zou bestaan in de Wire.h die ik gebruik.

Dan nu de laatste vraag:

Er is een voorbeeld van een I2C LCD display aan een ESP8266.
Die gebruikt ook gewoon de Wire.h lib. ( Wire.h zou in de IDE ingebakken zijn. Dus andere keus is er niet)

https://www.youtube.com/watch?v=lP-nLxadeSs&app=desktop

Hoe kan dit terwijl de ESP niet een I2C HW poort heeft.
Dit zou dan werken met bit-banging.

Is Wire.h zo slim dat hij zelf kan bepalen wanneer bit-banging te gebruiken ipv tegen een echte I2C poort aan moet kletsen?

Ik zou graag van iemand willen horen hoe dit alles nu precies zit.

mvg, Wim

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: de Wire.h lib.

Berichtdoor nicoverduin » 17 Apr 2016, 11:17

paysan schreef:Ik heb een vraag over de I2C lib genaamd Wire.h

Op de Arduino zit een dedicated I2C poort ( op de DUE zelfs 2) op de pins zoals beschreven op deze pagina:

https://www.arduino.cc/en/Reference/Wire

De eerste vraag is over Wire.begin()

Zoals op de reference pagina kun je tussen de haakje het adres van het device benoemen.
Maar wat als je meer dan 1 device op de bus hebt zitten?

Als je een adres toevoegt dan gaat jouw programma als "slave" gedragen. Zoals het er staat aangegeven. Vul je niets in dan ben je de Master.

paysan schreef:En nog meer verwarring:

Ik lees ook ergens dat je met Wire.begin() de pins van de I2C bus kan her-definieren:

Just add the following line to your setup function:
Wire.begin(0, 2);
where 0 is for the SDA and 2 is for SCLK. Note that this setup is for an ESP-01 device. By default, the pins are 4(SDA) and 5(SCLK).

Dit is in tegenstrijd met het eerste geval waar je met Wire.begin het adres ingeeft.
De IDE geeft er ook een foutmelding op.


Er zou ook Wire.pins(x, y) bestaan.

I2C SDA = GPIO #4 (default)
I2C SCL = GPIO #5 (default)
If you want, you can connect to I2C devices using other 2 pins in the Arduino IDE, by calling Wire.pins(sda, scl) before any other Wire code is called

Dit geeft een foutmelding omdat Wire.pins niet zou bestaan in de Wire.h die ik gebruik.

Niet alle hardware staat pin swapping toe. De libraries van de IDE zitten tjokvol met allerlei #ifdefs daar wordt bepaald of een functie is toegestaan. Niet alle hardware staat software matige pin swapping toe.

paysan schreef:Dan nu de laatste vraag:

Er is een voorbeeld van een I2C LCD display aan een ESP8266.
Die gebruikt ook gewoon de Wire.h lib. ( Wire.h zou in de IDE ingebakken zijn. Dus andere keus is er niet)

https://www.youtube.com/watch?v=lP-nLxadeSs&app=desktop

Hoe kan dit terwijl de ESP niet een I2C HW poort heeft.
Dit zou dan werken met bit-banging.

Is Wire.h zo slim dat hij zelf kan bepalen wanneer bit-banging te gebruiken ipv tegen een echte I2C poort aan moet kletsen?

Ik zou graag van iemand willen horen hoe dit alles nu precies zit.

mvg, Wim


Dus als je echt wilt weten wat er mogelijk is zul je de library sources moeten doorlopen.
Daarnaast moet je je ook nog eens realiseren dat de compiler package voor de ESP een hele andere is dan die voor de Arduino. Wat men doet als er een nieuw bordje uitkomt, is een nieuwe implementatie maken zodanig dat je er met de Arduino IDE mee kan werken. Dus vanaf de buitenkant "lijkt" het dat je dezelfde library hebt. In werkelijkheid is dat dus niet zo. Voor de ESP heb je hele andere sources dan die voor de Arduino's.vDat noemen ze "porting to another platform". En dat is maar goed ook. Anders zou je beperkt blijven tot de Arduino functionaliteit op een 32 bit platform en dat is niet echt handig.
Maar voor al deze "ports" betaal je wel een prijs en dat is snelheid. Door continu maar de compatibiliteit in stand te houden van Wiring (de basis van Arduino) heb je wel een eenvoudige manier om de processors te programmeren, maar dan heb je altijd een laag(vak meerdere) tussen jouw .ino sketch en de feitelijke hardware IO etc. Daardoor lijkt het allemaal hetzelfde maar is het absoluut niet. En dus heb je veel meer code te doorlopen om het van de Arduino eenvoudige code naar de feitelijke machine code van de processor te gaan.
Er zijn bijvoorbeeld voor de Arduino al libraries als FastIO om sneller IO te sturen dan de standaard digital Reads en writes tot wel een faktor 50!!
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

Re: de Wire.h lib.

Berichtdoor paysan » 17 Apr 2016, 15:19

Nico, als je deze link even open maakt zie je een voorbeeld waarin Wire.begin(sda, scl) gebruikt wordt.
Hoe kan dat?

http://www.esp8266.com/viewtopic.php?f=29&t=5564

Ik snap je verhaal hier boven, maar in dit geval is de referentie (handleiding) nog steeds die van de Arduino. Ik,kan niks vinden over de wire.h van het esp platform.

Wim

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: de Wire.h lib.

Berichtdoor nicoverduin » 17 Apr 2016, 17:31

Ja dat is een ESP8266 met zijn eigen wire library. Die wordt standaard meegeleverd met de Arduino installatie voor de ESP8266. Dat zijn hele andere sources als die van de Arduino.

Dit is de Wire.h van de Arduino:
cpp code
/*
TwoWire.h - TWI/I2C library for Arduino & Wiring
Copyright (c) 2006 Nicholas Zambetti. All right reserved.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts
*/

#ifndef TwoWire_h
#define TwoWire_h

#include <inttypes.h>
#include "Stream.h"

#define BUFFER_LENGTH 32

// WIRE_HAS_END means Wire has end()
#define WIRE_HAS_END 1

class TwoWire : public Stream
{
private:
static uint8_t rxBuffer[];
static uint8_t rxBufferIndex;
static uint8_t rxBufferLength;

static uint8_t txAddress;
static uint8_t txBuffer[];
static uint8_t txBufferIndex;
static uint8_t txBufferLength;

static uint8_t transmitting;
static void (*user_onRequest)(void);
static void (*user_onReceive)(int);
static void onRequestService(void);
static void onReceiveService(uint8_t*, int);
public:
TwoWire();
void begin();
void begin(uint8_t);
void begin(int);
void end();
void setClock(uint32_t);
void beginTransmission(uint8_t);
void beginTransmission(int);
uint8_t endTransmission(void);
uint8_t endTransmission(uint8_t);
uint8_t requestFrom(uint8_t, uint8_t);
uint8_t requestFrom(uint8_t, uint8_t, uint8_t);
uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t);
uint8_t requestFrom(int, int);
uint8_t requestFrom(int, int, int);
virtual size_t write(uint8_t);
virtual size_t write(const uint8_t *, size_t);
virtual int available(void);
virtual int read(void);
virtual int peek(void);
virtual void flush(void);
void onReceive( void (*)(int) );
void onRequest( void (*)(void) );

inline size_t write(unsigned long n) { return write((uint8_t)n); }
inline size_t write(long n) { return write((uint8_t)n); }
inline size_t write(unsigned int n) { return write((uint8_t)n); }
inline size_t write(int n) { return write((uint8_t)n); }
using Print::write;
};

extern TwoWire Wire;

#endif


En deze is van de ESP8266 en die is toch wezenlijk anders

cpp code
/*
TwoWire.h - TWI/I2C library for Arduino & Wiring
Copyright (c) 2006 Nicholas Zambetti. All right reserved.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts
Modified December 2014 by Ivan Grokhotkov (ivan@esp8266.com) - esp8266 support
Modified April 2015 by Hrsto Gochkov (ficeto@ficeto.com) - alternative esp8266 support
*/

#ifndef TwoWire_h
#define TwoWire_h

#include <inttypes.h>
#include "Stream.h"



#define BUFFER_LENGTH 32

class TwoWire : public Stream
{
private:
static uint8_t rxBuffer[];
static uint8_t rxBufferIndex;
static uint8_t rxBufferLength;

static uint8_t txAddress;
static uint8_t txBuffer[];
static uint8_t txBufferIndex;
static uint8_t txBufferLength;

static uint8_t transmitting;
static void (*user_onRequest)(void);
static void (*user_onReceive)(int);
static void onRequestService(void);
static void onReceiveService(uint8_t*, int);
public:
TwoWire();
void begin(int sda, int scl);
void pins(int sda, int scl) __attribute__((deprecated)); // use begin(sda, scl) in new code
void begin();
void begin(uint8_t);
void begin(int);
void setClock(uint32_t);
void setClockStretchLimit(uint32_t);
void beginTransmission(uint8_t);
void beginTransmission(int);
uint8_t endTransmission(void);
uint8_t endTransmission(uint8_t);
size_t requestFrom(uint8_t address, size_t size, bool sendStop);

uint8_t requestFrom(uint8_t, uint8_t);
uint8_t requestFrom(uint8_t, uint8_t, uint8_t);
uint8_t requestFrom(int, int);
uint8_t requestFrom(int, int, int);

virtual size_t write(uint8_t);
virtual size_t write(const uint8_t *, size_t);
virtual int available(void);
virtual int read(void);
virtual int peek(void);
virtual void flush(void);
void onReceive( void (*)(int) );
void onRequest( void (*)(void) );

inline size_t write(unsigned long n) { return write((uint8_t)n); }
inline size_t write(long n) { return write((uint8_t)n); }
inline size_t write(unsigned int n) { return write((uint8_t)n); }
inline size_t write(int n) { return write((uint8_t)n); }
using Print::write;
};

extern TwoWire Wire;

#endif


Dus je zit volgens mij gewoon appels en peren te vergelijken.

De Arduino Reference
Dit is de reference zoals Arduino die maakt voor haar Arduino libraries. Al die andere boards zijn zogenaamde 3rd party boards. Dat zij dit compatible maken en Arduino deze toevoegd wil nog niet zeggen dat ze in de standaard zijn opgenomen. De Arduino Reference is dus uitsluitend voor Arduino en niet de rest.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

Re: de Wire.h lib.

Berichtdoor paysan » 17 Apr 2016, 18:11

Nico, het is me nu helemaal duidelijk.

Je had beter Nico Verduino kunnen heten denk ik.
Of is dat een oud grapje?

Net als iedereen vraagt of mijn broer soms Ko heet.

Mvg, wim nijntjes

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: de Wire.h lib.

Berichtdoor nicoverduin » 17 Apr 2016, 22:05

paysan schreef:Nico, het is me nu helemaal duidelijk.

Je had beter Nico Verduino kunnen heten denk ik.
Of is dat een oud grapje?

Net als iedereen vraagt of mijn broer soms Ko heet.

Mvg, wim nijntjes
Nee hoor....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

Re: de Wire.h lib.

Berichtdoor paysan » 17 Apr 2016, 22:55

Nog een mooi stukje documentatie gevonden:

http://arduino.esp8266.com/versions/1.6 ... rence.html

Hier staat ook iets over de Wire I2C.

Wim

Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

Re: de Wire.h lib.

Berichtdoor paysan » 18 Apr 2016, 14:54

Het gaat niet goed.

Een BMP180 aangesloten eerst op pin 0 en 2 van een ESP201.
Daarna nog een keer op pin 12 3n 13.

De sketch compileert en upload goed.
Met de logic analyzer in I2C mode gekeken op pin 0 en 2 en later op 12 en 13 van de ESP201.
Later ook nog een keer op een WeMos D2. Zelfde resultaat.
Er komt niets herkenbaars uit.

Wie heeft een idee wat hier fout gaat?
cpp code
#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 pressure;

void setup()
{
Wire.begin(12, 13);
Serial.begin(9600);

if (pressure.begin())
Serial.println("BMP180 init success");
else
{
Serial.println("BMP180 init fail\n\n");
}
}

void loop()
{}

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: de Wire.h lib.

Berichtdoor nicoverduin » 18 Apr 2016, 15:07

Dit al eens bekeken? https://github.com/esp8266/Arduino/issues/887
En het lijkt erop dat je pinnen en datapin namen door elkaar haalt. Standaard is I2C op GPIO4 en GPIO5.
Zie plaatje
Afbeelding
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 79
Geregistreerd: 07 Dec 2012, 10:27
Woonplaats: Paesens (Frl)

Re: de Wire.h lib.

Berichtdoor paysan » 19 Apr 2016, 13:19

Het werkt nu Nico.
Ik heb Wire.begin(D1, D2); er tussen gezet.
Dank voor de info.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: etibofofiue, itedipi, PatrickAbomi en 103 gasten