I2CMUX met TCA9548A

Hardware die niet past in bovenstaande onderwerpen
Berichten: 25
Geregistreerd: 24 Jan 2018, 17:03

I2CMUX met TCA9548A

Berichtdoor Est29 » 31 Dec 2020, 17:17

Bij het gebruik van de sensoren VL53L1X is het gebruik van een I2C Multiplexer TCA9548A noodzakelijk. Zie VL53L1X onderwerp.

Nu de Mux met Oled.
Ik heb een opstelling gemaakt met processor (Nano of Mega), een TCA8548A met twee VL53L1X sensoren en twee OLED-diplay. Dit systeem werkt, maar er doet zich een probleem voor bij powerup. De sensoren werken prima, maar de een (of twee) Oled's starten alleen na upload van het programma maar niet met een los powersupply. Dan moet er eerst een of meerdere keren op de resetknop gedrukt worden. Daarna blijft het systeem wel draaien.
De led's worden aangestuurd door een U8g2-programma. Merkwaardig is, dat als ik de Oled's rechtstreeks op de processors aansluit er geen opstartproblemen zijn. Ook is vreemd dat als ik in het programma de oled1-functie uitschakel het programma niet meer loopt.
Ik heb de bussnelheid terug gebracht naar 100kHz. Heb de pullups verlaagd naar 2k2 ivm extra buscapaciteit. De stijgtijd van de pulsjes is ca 160ns

Wat gaat hier fout in de combinatie van MUX en Oled?
Groeten Est29.

Het programma:
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>
#include "SparkFun_VL53L1X.h"
#include <SparkFun_I2C_Mux_Arduino_Library.h>
QWIICMUX myMux;

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
SFEVL53L1X **distanceSensor;

int horizontaal = 100;
int vertikaal = 50;
int bat = 15;

void setup()
{
Serial.begin(9600);
Serial.println();
Serial.println("Mux-test");
Wire.begin();
Wire.setClock(100000);
u8g2.begin();
myMux.begin();
Serial.print("myMux.begin() :");Serial.println(myMux.begin());

if (myMux.begin() == false){ //Check de MUX.
Serial.println("Mux not detected. Freezing...");
while (1);
}
Serial.println("Mux detected");

distanceSensor[2] = new SFEVL53L1X(Wire);
distanceSensor[3] = new SFEVL53L1X(Wire);

myMux.setPort(1);
Serial.println("Display Port-1");

myMux.setPort(2);
sensorInstel(2);

myMux.setPort(3);
sensorInstel(3);

Serial.println("Einde Setup");
}

void loop(){
myMux.setPort(2); //Tell mux to connect to this port, and this port only
vertikaal = sensorWaarde(2);

myMux.setPort(3);
horizontaal = sensorWaarde(3);
Serial.print(vertikaal); Serial.print(" "); Serial.println(horizontaal);

myMux.setPort(1); //Check de port 1
byte currentPortNumber = myMux.getPort();
Serial.print("CurrentPort: ");Serial.print(currentPortNumber);
oled1 (vertikaal,horizontaal,bat); Serial.println(" Display");

myMux.setPort(0); //Check de port 0
currentPortNumber = myMux.getPort();
Serial.print("CurrentPort: ");Serial.println(currentPortNumber);
oled2();
delay(100);
}

//Functies
//Display-1

void oled1(int vert,int hor,int bat){

u8g2.clearBuffer(); // clear the internal menory
u8g2.setFont(u8g2_font_logisoso20_tr); // choose a suitable font
u8g2.setCursor (5,27);
if(vert<10){u8g2.print(" ");u8g2.print(vert);}
else{ if(vert<100){u8g2.print(" ");u8g2.print(vert);}
else {u8g2.print(vert);}}

u8g2.setFont(u8g2_font_logisoso20_tr); // choose a suitable font
u8g2.setCursor (82,27);
if(hor<10){u8g2.print(" ");u8g2.print(hor);}
else{ if(hor<100){u8g2.print(" ");u8g2.print(hor);}
else {u8g2.print(hor);}}

u8g2.setFont(u8g2_font_logisoso16_tr); // choose a suitable font
u8g2.setCursor (53,27);
u8g2.print("cm");
Serial.print(" meetwaarden weergeven "); //looptest
u8g2.drawFrame(50,0,30,10); // draw a Frame meter
u8g2.drawBox (50,1,bat,8); // draw a Box meter
u8g2.drawFrame(0,0,50,32); // draw a Frame links
u8g2.drawFrame(80,0,45,32); // draw a Frame rechts
u8g2.drawFrame(50,0,30,32); // draw a Frame midden
u8g2.sendBuffer();
}

//Display-2
void oled2(){
u8g2.clearBuffer();
u8g2.drawFrame(0,0,128,32); // draw a Frame meter
u8g2.setCursor (10,22);
u8g2.print("Display-Test");
u8g2.sendBuffer();
}

//Sersor meting
int sensorWaarde(int x){
byte currentPortNumber = myMux.getPort();
Serial.print("CurrentPort: ");Serial.print(currentPortNumber);
int distance = distanceSensor[x]->getDistance(); //Get the result of the measurement from the sensor Serial.print("Vertikaal: ");Serial.print(vertikaal);Serial.println(" mm: ");
Serial.print(" distance: "); Serial.print(distance/10); Serial.println(" cm");
return distance/10;
}

int sensorInstel(int x){
if (distanceSensor[x]->begin() != 0) //Begin returns 0 on a good init
{
Serial.print("Sensor ");
Serial.print(x);
Serial.println(" did not begin! Check wiring");
}
else
{
//Configure each sensor
distanceSensor[x]->setIntermeasurementPeriod(180);
distanceSensor[x]->setDistanceModeLong();
distanceSensor[x]->startRanging(); //Write configuration bytes to initiate measurement
Serial.print("Sensor ");
Serial.print(x);
Serial.println(" configured");
}}

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: I2CMUX met TCA9548A

Berichtdoor shooter » 01 Jan 2021, 15:32

als je in er twee op hebt zitten zul je voor beide ook een begin in de setup moeten zetten, opdat er registers goed gezet worden.
paul deelen
shooter@home.nl

Berichten: 25
Geregistreerd: 24 Jan 2018, 17:03

Re: I2CMUX met TCA9548A

Berichtdoor Est29 » 02 Jan 2021, 12:54

Bedankt Paul,
Je hebt gelijk. Het moest iets met de Setup te maken hebben.
Heb het gevonden. Je moet de in de setup de U8g2.begin() combineren met de poort. als volgt:

in setup():
myMux.setPort(1);
U8g2.begin();

en dit voor iedere poort.
Het werkt. Probleem opgelost.
Dank je wel.
Est29.

Terug naar Overige hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 20 gasten