Hallo liebe community,
ich habe ein nerviges Problem was ich nicht lösen kann, ich hoffe jemand
hatte das selbe und hat es lösen können.
Nun ich habe mir ein board selber designed mit einem Atmega328 mit einem
internal clock (8MHz), die Schaltung habe ich angehangen,
Betriebsspannung kommt vom USB 5 V. Das System hat einen arduino
bootloader.
Der nachfolgender Link zeigt das vorgehen für solch ein Projekt und die
richtigen Einstellungen zu übertragen.
https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard
Den bootloader habe ich über ISP und einen AVR mkII gelasht.
Nachdem ich alles vorbereitet hatte kam das coden (Arduino 1.8.5), Code
im Anhang, einpaar Spielereien eingebaut, wie LEDs blinken, einpaar
seriele Ausgaben etc. funktioniert alles so wie gewollt.
Dann habe ich angefangen die I2C Komponente anzusprechen, dafür habe ich
die standard Wire Library verwendet, wie auf dem Schaltplan zu sehen ist
ein SHT31 (Addr. 0x44, Lib von Adafruit) verbaut und ein OLED mit einem
SSD1306 Chip (Addr. 0x3C, Lib von Adafruit), Anschlusse mehrmals
überprüft (auf der Schaltung sowie der Platine). Sobald ich anfange die
Befehle zu senden hängt das Programm, es ist bekannt das in der Wire Lib
eine while-Schleife gibt (Wire.endTransmision()) die unendlich auf ein
ACK wartet, sprich da hängt es fest. Nun gut, dachte das Problem ist die
Adresse aber alles ist richtig, pullup Widerstände sind auch vorhanden
(probiert mit 10k, 4,7k und 1k, leider erfolglos). Keins der I2C devices
(setClock() variirt) antwortet, mit unterschiedlichen i2c_scan probiert,
da wurde nichts gefunden, hängt halt fest oder gibt einfach alle
Adressen raus.
Dann ging es an die Elektronik, erstmal mit einem Multimeter, SDA und
SCL hängen leider immer bei 1,8 V - 2 V fest, sollten aber bei 5 V sein,
sprich keine Veränderung wenn eine Kommunikation stattfindet. Weiter mit
einem Osszi, die Signale sehen immer noch so mikrig aus.
Einzeln die Pins ausprobiert mit hoch und runterschalten die Flanken
kommen, daraufhin verschiedene SoftwareI2C ausprobiert, die Flanken
kommen aber keine Werte bzw. die I2C Devices reagieren nicht. Das OLED
hatte ich davor noch an einem Arduino Nano programmiert und es
funktioniert mit den selben Libs und Einstellungen.
Also zurück zu der Software, meine Vermuttung ist es, dass die 8MHz eine
Rolle spielen oder irgendwelche Einstellungen falsch sind bzw. vergessen
wurden.
Hatte jemand schon mal soein Projekt gemacht bzw. was/wo kann ich noch
ansetzen um die Problemquelle zu finden. Hoffe ich habe nichts vergessen
und jemand hätte noch einen Vorschlag was ich ausprobieren kann bzw. wo
mein Denkfehler ist.
vorweg: ich hab wenig bis keine Ahnung von der Arduino Umgebung.
m a k e r schrieb:> Dann ging es an die Elektronik, erstmal mit einem Multimeter, SDA und> SCL hängen leider immer bei 1,8 V - 2 V fest,
hast du es mal mit nur dem "Arduino" ohne OLED/SHT31 versucht?
mach mal Bilder vom Oszillogram, aber wenn du die Pins nicht zerschossen
hast ist da irgendwo noch ein Fehler im Programm den ich so nicht sehe.
m a k e r schrieb:> Dann habe ich angefangen die I2C Komponente anzusprechen,
ist die Adresse im 7 oder 8 Bit Format? und erwartet wire 7 oder 8 Bit?
m a k e r schrieb:> mit unterschiedlichen i2c_scan probiert,> da wurde nichts gefunden, hängt halt fest oder gibt einfach alle> Adressen raus.
also doch eher hardware Problem?
versuch mal eventuell in einer Schleife die Pins nacheinander auf alle
zustände zu setzen (low/high/input bzw. tristate) und miss nach, dann
erkennst du falls ein Pin defekt ist oder es Probelme beim Aufbau gibt
(Lötbrücken, Fehler im Layout ...)
was hast du denn? einen Mega8 wie im Bild oder einen Mega328 wie im
Text?
hast du deiner Arduino Umgebung mitgeteil dass es sich um einen
Mega8/328handelt der bei 8MHz läuft? hast du eventuell mal einen im
Schaltplan und den anderen real vor dir, dann hast du vllt. völlig
falsche Pins. Toggle mal PC4/5 und halt ne LED (+Widerstand) dran, ist
das wirklich der richtige?
das "hängt bei 1.8-2V" ist entweder tristate (ohne Pullup) oder ein zu
kleiner pullup und kommt nicht runter. hast du die Pins nicht
ausversehen doppelt definiert?
m a k e r schrieb:> Einzeln die Pins ausprobiert mit hoch und runterschalten die Flanken> kommen, daraufhin verschiedene SoftwareI2C ausprobiert, die Flanken> kommen aber keine Werte bzw. die I2C Devices reagieren nicht.
Bilder, bei Prosa kann man sich viel Vorstellen und nur wenig wirklich
wissen.
m a k e r schrieb:> SDA und SCL hängen leider immer bei 1,8 V - 2 V fest,> sollten aber bei 5 V sein
Ich hoffe das hast du mit einem Oszilloskop gemessen, nicht mit einem
Multimeter. Wenn dem so ist, dann liegt mit Sicherheit ein
Hardwarefehler vor.
Denn weder der AVR, noch das Display ist dazu imstande, so einen
Spannungspegel zu verursachen - bei korrekter Beschaltung, wohlgemerkt.
Der SSD1306 Controller verträgt am I²C maximal 3,6 Volt. Den hast du mit
deinen 5V womöglich zerstört. Außerdem brauchen meine Displays mit
diesem Chip ein externes Reset Signal.
Guten morgen alle zusammen, vielen Dank für die rege Diskussion und
Tips.
K. S. schrieb:> hast du es mal mit nur dem "Arduino" ohne OLED/SHT31 versucht?
Ich habe mich überwunden und das 2x2mm großen SHT31 von meiner Platine
entlötet. Scheint wohl so zu sein das der Chip einige Probleme hat oder
ich habe unsauber gelötet, hatte leider noch nicht so viel Glück mit den
Sensoren von Sensirion.
Es funktionier alles, aber leider ohne SHT31, ich schaue mal ob ich es
wieder anlöte oder vorerst so belasse.
Stefanus F. schrieb:> Der SSD1306 Controller verträgt am I²C maximal 3,6 Volt. Den hast du mit> deinen 5V womöglich zerstört. Außerdem brauchen meine Displays mit> diesem Chip ein externes Reset Signal.
Hängt von der eingesetzten Variante ab, hatte ich leider nicht in der
Beschreibung geschrieben, RST wird nicht unbedingt benötigt.
Anselm schrieb:> Nicht dass du einen Hardwarefehler hast (z.B.: SDA/SCL bei einem> vertauscht)
Ein häufiger Fehler, aber nach 1000x Prüfen war ich mit sicher das es
hier nicht der Fall ist ))
K. S. schrieb:> Toggle mal PC4/5 und halt ne LED (+Widerstand) dran, ist> das wirklich der richtige?
Ich sehe hierbei keinen Mehrwert wenn ein Oszi zur Verfügung steht.
K. S. schrieb:> was hast du denn? einen Mega8 wie im Bild oder einen Mega328 wie im> Text?
Ist natürlich einwenig verwirend, aber die Bezeichnung war nicht von
mir, pinout ist aber identisch
Stefanus F. schrieb:> Denn weder der AVR, noch das Display ist dazu imstande, so einen> Spannungspegel zu verursachen - bei korrekter Beschaltung, wohlgemerkt.
ich hab mal vor lange zeit bei so einem Modul [1](Mega8 mit FM
transmitter) einen ähnlichen Pegel gemessen (ich glaube eher richtung
2-2.5V), da war etwas sehr falsch konfiguriert, später hats dann
funktioniert, daher würd ich das nicht völlig ausschließen.
Stefanus F. schrieb:> Ich hoffe das hast du mit einem Oszilloskop gemessen, nicht mit einem> Multimeter.
steht doch oben, mit beidem.
aber es wäre mal gut nur den "Arduino" mit einem I2C Scanner Programm in
Endlosschleife ohne Module (aber mit Pullup) zu testen und dann Bilder
vom Oszillogramm hier hochladen.
m a k e r schrieb:> Sobald ich anfange die> Befehle zu senden hängt das Programm, es ist bekannt das in der Wire Lib> eine while-Schleife gibt (Wire.endTransmision()) die unendlich auf ein> ACK wartet, sprich da hängt es fest.
glaub ich nicht, entweder ein ACK oder NACK kommt im letzten Takt, der
Mega wird den Clock Pegel als low und damit Clock stretching erkennen.
edit: ignorier das hier, kam gleichzeitig mit deinem letzten Post
[1] https://hackaday.com/2014/11/12/2-fm-transmitter-for-rasberry-pi/