Go Down

Topic: Arduino Due und I2C multiplexer geht nicht (Read 220 times) previous topic - next topic

marceltitan


Hi guys,
I am trying to run a sketch on my Due to control 2 OLEDs - later 12.

On my Arduino Mega the Sketch works fine, but on the Arduino Due it doesn't work.
Only the display I define at first work. It seems so that all commands send to the first display.

My code: https://pastebin.com/vBfjgVzz

Hallo Leute,
Ich versuche einen Sketch auf dem Due zum laufen zu bekommen um 2 und mehr OLEDs zu steuern.
Auf dem Mega funktioniert der Test Sketch ohne Probleme, aber auf dem Due geht nur ein Display an. Und zwar immer das mit der Anstöße welches ich zuerst anspreche. Alle Befehle egal auf welches Display gesendet gehen dann immer zum erstangespeochenden Display

HotSystems

#1
Feb 14, 2020, 12:54 pm Last Edit: Feb 14, 2020, 12:55 pm by HotSystems
Wir sind hier im deutschen Teil des Forums, somit reicht es, wenn du deine Post auch in deutsch schreibst.

Setze deinen Sketch bitte direkt ins Forum und verwende dazu Code-Tags.
Das geht mit der Schaltfläche </> oben links im Editorfenster.
Dann können alle User den Sketch lesen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

marceltitan

Hier der Code
Code: [Select]


#include <Wire.h>
#include <I2CMux.h>
#include <U8glib.h>
#include <Arduino.h>
 
#define I2CMux_ADDR 0x70
I2CMux mux(I2CMux_ADDR);
 
U8GLIB_SSD1306_128X64 First_Oled(U8G_I2C_OPT_FAST);
U8GLIB_SSD1306_128X64 Second_Oled(U8G_I2C_OPT_FAST);
 
const unsigned char bitmap[] PROGMEM = {
 Gekürzt da zu lang fürs Forum
};
 
void draw(void) {
  // graphic commands to redraw the complete screen should be placed here 
  First_Oled.drawBitmapP(0, 0, 16, 64, bitmap);
  Second_Oled.drawBitmapP(0, 0, 16, 64, bitmap);
}
void displayStart(){
 
    Wire.beginTransmission(I2CMux_ADDR);
    Wire.write(1<<2);
    Wire.endTransmission(); 
    delay(1);
    First_Oled.setContrast(100);
    First_Oled.firstPage();
      do {
          draw();
          First_Oled.undoScale();
      }
      while (First_Oled.nextPage());
 
    Wire.beginTransmission(I2CMux_ADDR);
    Wire.write(1<<3);
    Wire.endTransmission(); 
    delay(1);
    Second_Oled.setContrast(100);
    Second_Oled.firstPage();
      do {
          draw();
      }
      while (Second_Oled.nextPage());
}
 
void setup(){
 
    Serial.begin(9600);
    Serial.println("Setup geht");
    Wire.begin();
    Wire.beginTransmission(I2CMux_ADDR);
    Wire.write(0);
    Wire.endTransmission();
   
 
 
    First_Oled.setFont(u8g_font_unifont);
    Second_Oled.setFont(u8g_font_unifont);
 
    displayStart();
   
}
 
void loop() {
  Serial.println("loop geht");
  First_Oled.firstPage();
      do {
          Wire.beginTransmission(I2CMux_ADDR);
          Wire.write(1<<2);
          Wire.endTransmission(); 
          delay(1);
          First_Oled.setContrast(100);
          First_Oled.drawBox(0, 0, 128 , 18);
          First_Oled.setColorIndex(0);
          First_Oled.setFont(u8g_font_fub11);
          First_Oled.drawStr(0 , 15, "Camera ID");
          First_Oled.setColorIndex(1);
          First_Oled.setFont(u8g_font_fub25);
          First_Oled.drawStr(52, 60, "5");
      }
      while (First_Oled.nextPage());
 
   Second_Oled.firstPage();
      do {
          Wire.beginTransmission(I2CMux_ADDR);
          Wire.write(1<<2);
          Wire.endTransmission(); 
          delay(1);
          Second_Oled.setContrast(100);
          Second_Oled.drawBox(0, 0, 128 , 18);
          Second_Oled.setColorIndex(0);
          Second_Oled.setFont(u8g_font_fub11);
          Second_Oled.drawStr(0 , 15, "CVideo Format");
          Second_Oled.setColorIndex(1);
          Second_Oled.setFont(u8g_font_fub25);
          Second_Oled.drawStr(52, 60, "1080i 60");
      }
      while (Second_Oled.nextPage());
}

HotSystems

Betreibst du alles an 3,3 Volt mit einem externen Netzteil ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

 Wire.endTransmission(); liefert eine Erfolgsmeldung
Das könnte einen Hinweis liefern
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

postmaster-ino

Hi

Riecht doch so, daß der MUX nicht umschaltet - wenn Dem die Pegel nicht reichen, schaltet Der nicht (mehr?) um.
Sobald ein Display was anzeigt, geht vll. die Spannung in die Knie und der MUX hat keine Lust mehr.

MfG

marceltitan

Also ich ich betreibe das nur über den und Port.

Also Meldung kommt bei Wire.endTransmission() die 2.

Soll ich ausprobieren die Displays über externe 5v zu betreiben?

marceltitan

Also wenn ich mit extern 5v die Displays betreibe, und Ground verbinde tut sich leider trotzdem nichts

HotSystems

#8
Feb 14, 2020, 07:17 pm Last Edit: Feb 14, 2020, 07:18 pm by HotSystems
Du solltest dir mal das Datenblatt ansehen, für welche Spannung das Display spezifiziert ist.

Nicht einfach alles an 5Volt betreiben.
Die Pins vom Due sind nur 3,3V und du kannst dann Probleme haben, wenn der Rest dann 5 Volt liefert.
Bis zum zerstören des Due.

Ein Levelshifter könnte da helfen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

marceltitan

Der spannungsbereich, reicht laut Datenblatt.

Ich glaube das es irgendwie am Due liegt.. beim mega geht es ja, egal ob mit 3,3 oder mit 5 Volt

postmaster-ino

Hi

Der Mega kann ggf. einfach mehr Strom liefern?
Klar kann auch der Due einen Schuss haben - aber Das geht eher in die Richtung: Jammern auf hohem Niveau.

Viel wahrscheinlicher ist, daß der Due die Befehle von der Fehlerquelle bekommt ;)
Noch nicht im Besitz eines Due.

MfG

combie

#11
Feb 14, 2020, 10:02 pm Last Edit: Feb 14, 2020, 11:04 pm by combie
Quote
Noch nicht im Besitz eines Due.
Aber ich und muss sagen, dass I2C ganz prächtig mit dem DUE funktioniert.

Ansonsten möchte ich dafür wetten, dass sich die Lösung beim Abgleich mit den Datenblättern finden lässt.

Dabei hilfreich: Oszi und LA
Auch den Links hier folgen




Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

combie

So, habe mir das mal genauer angeschaut....
Mit nur Wire funktioniert der Multiplexer perfekt.

Problem 1:
Die U8glib.h nutzt nicht Wire.
Kommt sich offenbar damit sogar ins Gehege.
So versagt die Multiplexer Kanalumschaltung. mit dem Fehler 2

Problem 2:
Auch den Multiplexer weg zu lassen, hat keinen Erfolg.
Bei der Verwendung von U8G_I2C_OPT_DEV_1 oder U8G_I2C_OPT_DEV_0 gewinnt der jeweils letzte Eintrag und damit landet alles auf einem Display

Offensichtlich ist die Lib nicht für DualDisplays geeignet.

Ich sehe keine einfache Lösung.




Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

marceltitan

Aber das kann doch so nicht richtig sein. Wie ist es dann möglich das ich über den Mega bereit 8 Display einzeln am laufen hatte?

noiasca

#14
Feb 15, 2020, 08:36 am Last Edit: Feb 15, 2020, 08:37 am by noiasca
doch, dich Aussage kann richtig sein (und Combie liegt sehr oft richtig).
Z.B. kann man in einer Lib definieren was abhängig vom Prozessor kompiliert wird, daher kann ich dir auch eine Lib unterjubeln, die für jeden Prozessor was anderes macht.

Daher die Frage an dich: hast du die Lib überprüft, wie die Lib das Display am Due ansteuert und/oder ob es Unterschiede zum Mega gibt? Wenn ja welche? Wenn nein ... machen.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Go Up