SPI mit DogM204

Hallo ans Forum,

ich arbeite derzeit mit dem Arduino Micro und versuche eine DogM204-Display zum laufen zu bekommen. Um dieses mittels Hex-Befehle zu initalisieren, soll SPI verwendet werden. Angeschlossen ist meiner Meinung nach alles korrekt, leider bekomme ich nur die Ansteuerung über SPI nicht hin.

Hat jemand vllt eine Idee wie das ganze realisiert werden kann?
Danke für eure Hilfe.

Mfg
Eyk

Hallo,

laut Datenblatt angeschlossen? Ansonsten bitte Schaltplan und Code zeigen.
Vorbeugend für Neulinge. Der Code Tag Button </> befindet sich oben links.

Hallo,

erstmal vielen Dank für die schnelle Antwort.
Nachfolgend der Code:

#include <SPI.h>

void setup() {
  Serial.begin(9600);
  SPI.begin();

pinMode(MISO,OUTPUT);
pinMode(SCK,OUTPUT);
pinMode(MOSI,INPUT);

SPI.transfer(0x3a)
SPI.transfer(0x09)
SPI.transfer(0x06)
SPI.transfer(0x1e)
SPI.transfer(0x39)
SPI.transfer(0x1b)
SPI.transfer(0x6e)
SPI.transfer(0x57)
SPI.transfer(0x72)
SPI.transfer(0x38)
SPI.transfer(0x0f)
}

Quasi will ich ja nur die Hex-Werte zum initialisieren übermitteln, aber anscheinend fehlt noch was. Müssen beispielsweise die Pins anders definiert werden? Bei dem Arduino Micro sind die Pins für SPI ja fest vorgegeben?!

eyk107:
Quasi will ich ja nur die Hex-Werte zum initialisieren übermitteln, aber anscheinend fehlt noch was. Müssen beispielsweise die Pins anders definiert werden? Bei dem Arduino Micro sind die Pins für SPI ja fest vorgegeben?!

Um das Display zu initialisieren, muss es nicht per SPI angesprochen werden, das geht auch per I2C.

Und du musst nicht alle Werte an das Display senden.
Hier kommt es ganz darauf an, was dein Display können soll.

Hallo,

es fehlt zum Bsp. der CS (Chip Select) Pin. Nur die Richtung definieren reicht nicht aus. CS ist Standardmäßig High.
Wenn ein SPI Device angesprochen wird muß der auf LOW. Am Ende wieder auf High.
Kannst du deine Zeilen noch kommentieren. Irgendwie fehlt mir da noch ein Reset usw.
Das das Display mit 3,3V arbeitet und nicht mit 5V ist bekannt?

Auch Befehle hintereinander zu senden reicht auch nicht. Das Display muß wissen das es Befehle sind und keine Daten. Dafür gibts den "CD Pin". Wartezeiten in µs müssen auch eingehalten werden.

Edit:
okay, nach Reset muß 150ms gewartet, danach braucht der Controller scheinbar keine Wartezeiten zwischen den Befehlen. Los gehts auf jeden Fall mit LOW am Resetpin, 1ms warten, Resetpin auf High, 150ms warten, dann folgen die eigentlichen Init-Befehle laut Datenblatt.
Dann kommt es darauf ob die 3 Wire oder 4 Wire SPI angeschlossen hast. Wegen dem CD Pin.
Einfacher vom Verständnis her ist 4 Wire. Damit haste volle Kontrolle.
Wenn das klappt, kannste auf I2C wechseln, spart 2 Leitungen. Wobei ich meine auch mit 4 Leitungen dran habe.

Hallo,

oben steht etwas Müll. Ich war beim 240er statt 204 gelandet. Es kommt aber noch besser. Es gibt ein fertiges Bsp. von EA. Zwar in reinem C geschrieben, sollte aber reichen für eine Init im Sketch.

Davon schauste dir erstmal die lcd_spi.h und lcd_spi.c an.
In der main.c steht drin wie sie es angeschlossen haben. Ohne CS Pin. Müßte demzufolge 3Wire sein.

Hallo,

schon weiter gekommen? Wenn nicht, in der lcd_spi.c steht ab Zeile 39 die komplette Initialisierung drin.
Für den SPI Mode gibts Arduino Befehle.
https://www.arduino.cc/en/Reference/SPI

erstmal Danke für deine ausführliche Hilfe.
Nur so richtig weiter bin ich noch nicht:

  1. CS fehlt - kann im Datenblatt keinen Anschluss dafür finden?!
  2. Waittime - In dem C-Beispielprogramm wird komischerweise keine Waittime verwendet

Finde das Datenblat im allgemeinen irgendwie etwas dürftig, hätte nicht gedacht das das so ein Krampf wird. Aber irgendwie wirds schon klappen :slight_smile:

Mfg
eyk

#include <SPI.h>

void setup() 
{
  pinMode(MISO,OUTPUT);
  pinMode(SCK,OUTPUT);
  pinMode(MOSI,INPUT); 
  SPI.begin();
  //Serial.begin(9600);
  SPI.beginTransaction (SPISettings (1000000, LSBFIRST, SPI_MODE0)); 
  digitalWrite(11,LOW); //CS low

pinMode(10,OUTPUT);   //Reset
pinMode(11,OUTPUT);  //CS*/

digitalWrite(10,LOW); // Reset
delay(1);
digitalWrite(10,HIGH);
delay(200);
digitalWrite(10,LOW);

SPI.transfer(0x3a);
SPI.transfer(0x09);
SPI.transfer(0x06);
SPI.transfer(0x1e);
SPI.transfer(0x39);
SPI.transfer(0x1b);
SPI.transfer(0x6e);
SPI.transfer(0x57);
SPI.transfer(0x72);
SPI.transfer(0x38);
SPI.transfer(0x0f);

digitalWrite(11,HIGH); 
}

void loop() {
  // put your main code here, to run repeatedly:

}

Hallo,

ja okay, die Pinbelegung von dem Display ist wirklich etwas doof. Einen echten CS Pin gibts wirklich nicht.

Wie hier auf Seite 4 dargestellt, brauchste nur 3 Leitungen.
SOD, Output, also zum Arduino hinein, falls du das Display auslesen willst, eigentlich braucht man das nicht.
SID, Input, hier sendet der Arduino Daten/Befehle ins Display
SCK, Taktleitung, vom Arduino zum Display

Falls man jetzt mehrere SPI Geräte am Bus hat, dann braucht man einen CS Pin. Das zeigt die Beschaltung auf Seite 4 rechts. Die haben einfach ein UND Gatter an die Taktleitung geklebt und den 2. Eingang als CS deklariert. Nicht die sauberste Art und Weise aber es funktioniert. Es wird die Taktleitung unterbrochen mittels Tor Schaltung.

Zum testen alleine am SPI brauchste demzufolge nur erstmal SCK, SID, Reset Pin.
Die restliche Beschaltung muß auch stimmen mit den vielen Kondensatoren.
Takt max. 1 MHz.
Seite 7.
Beim starten mit Reset ist 2x 1ms drin. Danach brauch der Displaycontroller keine extra Wartezeiten mehr.
Das mit den 150ms hatte ich gestern mit dem 240er DOGM verwechselt. Hat einen anderen Controller drin.
Der Controller von deinem 204er brauch nur paar ns zwischendurch. Die ergeben sich mit 1MHz automatisch.
Man könnte vorbeugend µs delays einfügen. Aber wenn das EA in ihren Code nicht hat, brauchst du das auch nicht.

Die 3,3V beachtest Du? Ub und Signalpegel. Ohne Beleuchtung kannste das Display an die 3,3V vom Arduino anschließen.
Noch ein 100nF Keramik dicht an die Display Ub Pins.
Den Takt, SID und Reset Eingang kannste mit Spannungsteilern im kOhm Bereich auf 3,3V Pegel bringen.

Für dauerhaften Einsatz, egal ob SPI oder I2C empfehle ich dir einen Levelshifter/Pegelkonverter.
Bsp.

Es gibt auch 4fache und noch billiger, Hauptsache bidirektional, damit universal einsetzbar.

Verwende quasi für alles die 3,3V vom Arduino Micro. Die kondensatoren habe ich auch alle verbaut.
Siehst du denn im Quellcode irgendwelche Fehler bzw. irgendwas vergessen?!
Danke nochmal für deine Hilfe.

Mfg
Eyk

Hallo,

Nachdem Reset von 200ms, die du nun locker verkürzen kannst auf 10ms, darf der Resetpin nicht wieder auf Low, der bleibt dann auf High.
Ich würde ja erstmal, wenn es keine anderen Grud gibt, die Initbefehle der EA Initialisierung nehmen und schauen ob das läuft. Danach kannste immer noch Änderungen vornehmen. Die Hexwerte würde ich noch groß schreiben. Also zum Bsp. statt 0x3a eben 0x3A. Sind kleine aber feine Unterschiede im ASCII Code. Ich weis nicht wie klein a interpretiert wird. Als Hexzahl sicherlich egal, aber sicher ist sicher.

Solange die Beschaltung stimmt, kannste mit falschen Befehlen nichts kaputt machen.
Jetzt gehts ans testen.
Falls nichts zuckt, füge ein 500ms delay vor der gesamten Initialisierung ein. Hilfe manchmal nach Power On.
Kannste dann immer noch reduzieren.

Doc_Arduino:
Ich würde ja erstmal, wenn es keine anderen Grud gibt, die Initbefehle der EA Initialisierung nehmen und schauen ob das läuft. Danach kannste immer noch Änderungen vornehmen.

Na hab ja die gleichen Befehle wie in der Initialisierung von EA. Leider tut sich trotz der anderen Änderungen trotzdem nichts :-/ Ich probiere mal noch ein bisschen rum, vllt geht ja noch was.
Trotzdem erstmal vielen Dank

Mfg

Hallo,

Die Pinpegel am Anfang von Init stimmen auch?
Ohne diesem Display kann ich nur theoretisch helfen.
Am Ende der Initbefehle von EA steht

ClrDisplay();
DisplayOnOff(DISPLAY_ON | CURSOR_ON | BLINK_ON);

dann guckste weiter runter wo die Funktionen stehen

für Display löschen wäre dann zu schicken ... WriteIns(0x01);

Statt WriteIns dein Transferbefehl, ist klar ne. Es geht um die Hexzahl.

und für Display einschalten ... WriteIns(0x08+data);
die 3 Dinge sind in der lcd_spi.h definiert mit

#define DISPLAY_ON 0x04
#define DISPLAY_OFF 0x03
#define CURSOR_ON 0x02
#define CURSOR_OFF 0x05
#define BLINK_ON 0x01
#define BLINK_OFF 0x06

also würde ich erstmal 3x schreiben zum testen

WriteIns(0x08+0x04);
WriteIns(0x08+0x02);
WriteIns(0x08+0x01);

dann sollte sich irgendwas tun hoffe ich.

hab eben mal spaßenshalber pin3,4,5 mal als Output und High gesetzt. Leider ändert sich an der Spannung nichts. Hatte den Arduino eigentlich erst ausgepackt, aber anscheinend ist der defekt. Trotzdem nochmal vielen Dank für deine Hilfe.
Jetzt hab ich wenigstens besser verstanden, wie das display angesprochen wird.
mfg

Hallo,

defekt? Zeig mal bitte den Pin Testcode? Alles vom Arduino abgesteckt?

Da kann ja eigentlich nicht viel verkehrt sein, oder ich stehe gerade völlig aufn Schlauch

void setup() {
  // put your setup code here, to run once:
 pinMode(3,OUTPUT);  
 pinMode(4,OUTPUT);  
 pinMode(5,OUTPUT);   

}

void loop() {
  // put your main code here, to run repeatedly:
 digitalWrite(3,HIGH);
 digitalWrite(4,HIGH);
 digitalWrite(5,HIGH);
}

Hallo,

manchmal geht es echt blöd zu. Hatte auch schon im Code Mist stehen und mich gewundert das die einfachsten Dinge nicht funktionierten. Aber der Testcode ist okay. Wahrscheinlich wirklich kaputt.

Kannste LED 13 blinken lassen?

Dann hilft im Moment wirklich nur ein neuer.

Doc_Arduino:
Hallo,

manchmal geht es echt blöd zu. Hatte auch schon im Code Mist stehen und mich gewundert das die einfachsten Dinge nicht funktionierten. Aber der Testcode ist okay. Wahrscheinlich wirklich kaputt.

Ach klar, du hast vollkommen Recht, manchmal sieht man die eigenen Fehler nicht.
Werden mir dann mal einen neuen besorgen.
Trotzdem vielen Dank für deine Hilfe