Forum: Mikrocontroller und Digitale Elektronik Initialisierung EADOGS 204-N via SPI


von Michael W. (micha124)


Lesenswert?

Hallo,

ich verzweifle an der Initialisierung eines EA DOGS104N-A

Angeschlossen an einen Atmega8 (5V) via Levelshifter auf 3,3V erhalte 
ich keinen Mucks vom Display. Hab auch schon das Display getauscht, aber 
daran lags nicht.

Ich vermute, dass ich irgendwas in der Initialiserung falsch mache und 
würde mich freuen, wenn hier mal jemand draufschauen könnte.

Hinweis: Reset ist über einen Transistor angeschlossen, d.h. hier ist 
eine Invertierung vorhanden
1
#include "lcd_spi.h"
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
6
#define SPI_DDR DDRB
7
#define SPI_MOSI PB3
8
#define SPI_MISO PB4
9
#define SPI_SCK PB5
10
#define LCD_CS PB2
11
#define LCD_RESET PB1
12
13
#define LCD_CS_1 PORTB |= (1 << LCD_CS);
14
#define LCD_CS_0 PORTB &= ~(1 << LCD_CS);
15
#define LCD_RESET_1 PORTB |= (1 << LCD_RESET);
16
#define LCD_RESET_0 PORTB &= ~(1 << LCD_RESET);
17
18
void lcd_init(void) {
19
  LCD_CS_0 
20
  
21
  //Reset
22
  LCD_RESET_1
23
  _delay_ms(0.2);
24
  LCD_RESET_0
25
  _delay_us(5);
26
27
  //Init SPI
28
  spi_masterInit();  
29
30
  //Init Display
31
  spi_masterTransmit(0x3A);     
32
  _delay_ms(100);
33
34
  spi_masterTransmit(0x09);     
35
  _delay_ms(50);
36
37
  spi_masterTransmit(0x06);     
38
  _delay_ms(50);
39
40
  spi_masterTransmit(0x1E);    
41
  _delay_ms(50);
42
43
  spi_masterTransmit(0x39);    
44
  _delay_ms(50);
45
46
  spi_masterTransmit(0x1B);
47
  _delay_ms(50);
48
49
  spi_masterTransmit(0x6E);
50
  _delay_ms(50);
51
52
  spi_masterTransmit(0x57);
53
  _delay_ms(50);
54
55
  spi_masterTransmit(0x72);
56
  _delay_ms(50);
57
58
  spi_masterTransmit(0x37);
59
  _delay_ms(50);
60
61
  spi_masterTransmit(0x0F);
62
  _delay_ms(50);
63
64
  _delay_ms(20);    // wait
65
66
  LCD_CS_1;
67
}
68
69
70
71
72
void spi_masterInit(void) {
73
  SPI_DDR |= (1<<LCD_CS) | (1<<SPI_MOSI) | (1<<SPI_SCK) | (1 << LCD_RESET);
74
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR0);
75
}
76
77
void spi_masterTransmit(uint8_t data) {
78
  SPDR = data;
79
  while(!(SPSR & (1<<SPIF)));
80
}

Danke und Gruß

Micha

von jo mei (Gast)


Lesenswert?

Viele Aussagen gemacht, aber keinen Schaltplan geliefert.

Und zuletzt: was wäre denn deine Frage gewesen? Zu beliebigen
Berichterstattungen kann man viel schreiben, bringt aber nicht
viel weiter.

Auch beim Ver-/Beschalten des Displays gibt es vieeeele Möglich-
keiten. Dazu noch der Stolperstein Levelshifter.

von jo mei (Gast)


Angehängte Dateien:

Lesenswert?

Hier gibt's auch noch was zu beachten.

von jo mei (Gast)


Lesenswert?

Hier

Beitrag "DOGM204 per SPI Ansteuern"

hamma schon etwas sehr Ähnliches durchgeackert. Vielleicht
ist es auch das gleiche Problem. Wer suchet der findet.

von Achim H. (pluto25)


Lesenswert?

Das CS wird auch benötigt die Bytes zu syschronisieren. Mindestens nach 
dem Reset und auch bei riesen Pausen von mehreren ms. Die kleinste 
Störung und es wird nur noch Quatsch empfangen.
Wecher Chip arbeitet im EDog? Da Miso angeschlossen ist kann der etwas 
mitteilen. Schon mal was gefragt? Antwortet er?

von jo mei (Gast)


Lesenswert?

A. H. schrieb:
> Das CS wird auch benötigt

Nicht unbedingt.

jo mei schrieb:
> Hier
>
> Beitrag "DOGM204 per SPI Ansteuern"
>
> hamma schon etwas sehr Ähnliches durchgeackert.

von Michael W. (micha124)


Angehängte Dateien:

Lesenswert?

Hallo,
danke schonmal für die Antworten.

Den verlinkten Thread kenne ich, der hat aber nicht die Lösung gebracht.

Schaltplan habe ich aktuell nicht gezeichnet. Aber hier textuell:

Atmega-Ausgang -> Levelshifter (mit Pullup) HighSide -> Levelshifter 
low-side (mit Pullup) -> Display

Einzige Ausnahme: Reset, der via Transistor angesteuert wird (da der 
Levelshifter nur 4 Kanäle hat)

Eine Änderung habe ich nun vorgenommen (aber auch die ist noch nicht die 
endgültige Lösung):

Die Bytes wurden nicht in 3 Bytes, sondern nur in 1 Byte und auch nicht 
als LSB übermittelt. Das ist korrigiert.

Ich hab auch mal mein DSO angehängt (Messung direkt am Display) und auch 
dort sieht mir alles ok aus

Hinweis: das DSO decodiert bereits LSB, daher wird das Initbyte als 1F 
statt F8 angezeigt.

Update:
Mir ist noch aufgefallen, dass die Nibbles hinten statt vorne waren. Das 
hab ich korrigert (init_1) - aber ebenfalls keine Reaktion des Displays

Grüße Micha

: Bearbeitet durch User
von Michael W. (micha124)


Angehängte Dateien:

Lesenswert?

Hallo,

noch ein Nachtrag, da nach der Schaltung gefragt wurde (die ich leider 
auf die schnelle nicht komplett zeichnen kann)

Anbei der allgemeine Schaltungsteil.

An PB1-PB5 hängt dann der Levelshifter (einer von diesen hier: 
https://www.amazon.de/ARCELI-Converter-Bidirektionales-Shifter-Arduino/dp/B07RDHR315/ref=sr_1_3?keywords=level+shifter+3.3v+5v&qid=1672081763&sr=8-3)

Die low-Seite hat 3,3V über einen Schaltregler.

Auf High und Low-Seite sind PullUps mit 4k7 eingefügt.

Danach gehts dann direkt ins Display gemäß der Beschaltung im Datenblatt

https://www.lcd-module.de/fileadmin/pdf/doma/dogs104.pdf

(lediglich die Kondensatoren sind Film statt Elko, da ich keine 1µ Elkos 
da habe)

Grüße Micha

: Bearbeitet durch User
von jo mei (Gast)


Lesenswert?

Michael W. schrieb:
> Anbei der allgemeine Schaltungsteil.

Das hilft allein überhaupt nicht weiter. Auch nicht dein Prosa-
Zusatz-Schaltplan. Prosa-Schaltpläne sind einfach voll scheisse.

Michael W. schrieb:
> Danach gehts dann direkt ins Display gemäß der Beschaltung im Datenblatt

Im Datenblatt gibt es viele Beschaltungen. Sollen wir, die dir
helfen sollen, hellsehen welche Version du angewendet hast?

von Michael W. (micha124)


Lesenswert?

jo mei schrieb:
> Das hilft allein überhaupt nicht weiter. Auch nicht dein Prosa-
> Zusatz-Schaltplan. Prosa-Schaltpläne sind einfach voll scheisse.

zu allererst würde ich doch mal vorschlagen, hier freundlich und 
sachlich zu bleiben.

Ja ich weiß, dass vollständige Schaltpläne wesentlich besser zu lesen 
sind.
Ich bekomm das Ding aber aktuell leider nicht gezeichnet. Target kennt 
weder das Display noch den Levelshifter. D.h. ich müsste das dann 
irgendwie manuell machen, fotografieren etc. - und das für effektiv ein 
paar direkte Kabelverbindungen und 8 Pullup-Widerstände. Das ist ja 
schließlich keine Raketentechnik.

Ich gehe doch mal davon aus, dass man sich das gerade noch vorstellen 
kann
Die Prosa sollte aber doch eigentlich ausreichen, um sich das 
vorzustellen. Das sind ja effektiv nur direkte Verbindungen.

>
> Michael W. schrieb:
>> Danach gehts dann direkt ins Display gemäß der Beschaltung im Datenblatt
>
> Im Datenblatt gibt es viele Beschaltungen. Sollen wir, die dir
> helfen sollen, hellsehen welche Version du angewendet hast?

Im verlinkten Datenblatt hat es exakt eine einzige Beschaltung für SPI 
auf Seite 4 rechts oben - sonst sind da nur für I2C und die Beleuchtung 
(die bei meinem Typ nicht relevant ist).

Und ja - ich bin dankbar für Hilfe, geflame hilft aber nicht.

Grüße und Danke

Micha

von jo mei (Gast)


Lesenswert?

Michael W. schrieb:
> Die Prosa sollte aber doch eigentlich ausreichen, um sich das
> vorzustellen. Das sind ja effektiv nur direkte Verbindungen.

Nein. Es geht darum zu sehen ob du alles richtig gemacht hast.
Typische Aussage eines Users der Probleme hat: "Die Schaltung
brauche ich nicht zu zeigen, ich habe alles überprüft".

Die Problematik geht über den Schaltplan hinaus, auch der
Aufbau ist Teil der Funktionalität die schiefgehen kann. Ja
ich weiss schon, du hast alles korrekt aufgebaut.

Wenn es so weiter geht dann ist das eine Salamitaktik die
hier kaum einer haben will.

von jo mei (Gast)


Lesenswert?

Michael W. schrieb:
> zu allererst würde ich doch mal vorschlagen, hier freundlich und
> sachlich zu bleiben.

Habe ich dich beschimpft? Habe ich dich beleidigt? Was ist
unfreundlich daran nüchtern die Sachlage zu beschreiben?
Du willst etwas vom Forum, von denen die bereit sind Hilfe-
stellung zu geben. Da kann man zumindest erwarten dass du
kooperativ bist und dir nicht die Popel mühselig einzeln
aus der Nase ziehen lässt.

Was ist nmit meinem Hinweis auf
Beitrag "DOGM204 per SPI Ansteuern"  ?
Hast du alle Aspekte dort beachtet? Ich sehe in deiner Source
durchaus Diskrepanzen.

von Sascha W. (sascha-w)


Lesenswert?

Also dein SPI-Init setzt LCD_RESET auf High, obwohl es doch an der 
Stelle eigentlich Low sein sollte - zumindest hast du es vorher schon 
mal auf Low gesetzt.
Die Bilder aus dem Beitrag 26.12.2022 18:56 sind aber nocht von Dir - 
Oder?
Dort werden jeweils 3-Byte übertragen.

Sascha

von Michael W. (micha124)



Lesenswert?

Hallo,

wenn es hilft, hab ich jetzt versucht, den Rest mal irgendwie da 
reinzupacken. Habe für den Levelshifter und das Display jetzt ne 
Stiftleiste als Ersatz genommen und hoffe, das ist dennoch verständlich.

> Was ist nmit meinem Hinweis auf
> Beitrag "DOGM204 per SPI Ansteuern"  ?
> Hast du alle Aspekte dort beachtet? Ich sehe in deiner Source
> durchaus Diskrepanzen.

ich denke, dass da alles berücksichtigt ist - wo siehst Du da noch 
Diskrepanzen?

Ich hab zur Sicherheit nochmal den aktuelle Stand vom Code angehängt

Sascha W. schrieb:
> Also dein SPI-Init setzt LCD_RESET auf High, obwohl es doch an der
> Stelle eigentlich Low sein sollte - zumindest hast du es vorher schon
> mal auf Low gesetzt.

Der Reset wird durch die Levelshiftung via Transistor invertiert. D.h. 
Atemga-High ist Display-Low und umgekehrt

> Die Bilder aus dem Beitrag 26.12.2022 18:56 sind aber nocht von Dir -
> Oder?
> Dort werden jeweils 3-Byte übertragen.

doch, die Bilder sind von mir.

Für jedes Byte müssen 3 Bytes übertragen werden gemäß Datenblatt 
(https://www.lcd-module.de/fileadmin/pdf/doma/dogs104.pdf Seite 7, SPI)
Das war einer der Punkte, die evtl. im ersten Wurf des Codes noch nicht 
berücksichtigt wurden, da ich zu dem Zeitpunkt noch dachte, dass das die 
SPI-Logik des Prozessors macht.

Siehst Du da einen Fehler (Achtung: LSB-Auswertung des DSO reversiert 
das erste Byte ggü der Darstellung im Datenblatt)?

Grüße und Danke

Micha

von Veit D. (devil-elec)


Lesenswert?

Hallo,

du bist ja bemüht alle Fragen beantworten. Aber wenn man auf den 
Schaltplänen keine Pin Nummern lesen kann die wir hier auch überprüfen 
wollen, dann wird das Stückwerk so leider nichts. Klingt hart ist aber 
leider so. Versetze dich einmal in unsere Lage. Wir können nur das lesen 
was du uns zeigst. Wir sehen nicht was du alles vor die liegen hast.

Welcher Levelshifter ist das der externe Widerstände benötigt?

Welches Display hast du konkret? DOGS102 oder ein DOGS104 oder ein 
DOGM204?
Deine Angaben dazu sind leider durcheinander.

EA bietet für fast alle Display Bsp. Code an.
https://www.lcd-module.de/support/application-note.html

von jo mei (Gast)


Lesenswert?

Michael W. schrieb:
> lcd_spi.c

Wo ist denn deine Funktion main(..)?
Ohne geht's nicht.
Bitte gesamten Kontext zeigen.

Dann nochmal meine Fragen:

jo mei schrieb:
> Habe ich dich beschimpft? Habe ich dich beleidigt? Was ist
> unfreundlich daran nüchtern die Sachlage zu beschreiben?

von Frank S. (_frank_s_)


Lesenswert?

Michael W. schrieb:
> Anbei der allgemeine Schaltungsteil.

Ich habe es vielleicht überlesen, aber im Schaltplan fehlt die 
Spannungsversorgung an AVCC. Meines Wissens nach (man darf mich da gern 
korrigieren) versorgt der AVCC den Port C und damit dürften dann die 
Signale für I2C an PC4 und PC5 Essig sein.

MfG von der Spree
Frank

von Michael W. (micha124)


Angehängte Dateien:

Lesenswert?

Hi,

> Hallo,
>
> du bist ja bemüht alle Fragen beantworten. Aber wenn man auf den
> Schaltplänen keine Pin Nummern lesen kann die wir hier auch überprüfen
> wollen, dann wird das Stückwerk so leider nichts. Klingt hart ist aber
> leider so. Versetze dich einmal in unsere Lage. Wir können nur das lesen
> was du uns zeigst. Wir sehen nicht was du alles vor die liegen hast.

sorry - dass die Pin-Nummern beim Display nicht lesbar waren, hab ich 
übersehen. Hab nochmal ein größeres Bild angehängt.

> Ich habe es vielleicht überlesen, aber im Schaltplan fehlt die
> Spannungsversorgung an AVCC. Meines Wissens nach (man darf mich da gern
> korrigieren) versorgt der AVCC den Port C und damit dürften dann die
> Signale für I2C an PC4 und PC5 Essig sein.

AVCC ist natürlich auch angeschlossen - das fehlt(e) nur auf dem Plan

> Welcher Levelshifter ist das der externe Widerstände benötigt?

LevelShifter ist so einer:
https://www.amazon.de/ARCELI-Converter-Bidirektionales-Shifter-Arduino/dp/B07RDHR315/ref=sr_1_3?keywords=level+shifter+3.3v+5v&qid=1672081763&sr=8-3

Die gesonderten PullUps siund vermutlich nicht notwendig - die hab ich 
im Rahmen der Fehlersuche angefügt.

Die Signale an sich kommen beim Display ja auch an (mit den PullUps). 
High-Pegel hier 3,2V, Low-Pegel 0,03V

> Welches Display hast du konkret? DOGS102 oder ein DOGS104 oder ein
> DOGM204?
> Deine Angaben dazu sind leider durcheinander.

Display ist ein DOGS104N-A (War im Titel leider falsch)

>
> EA bietet für fast alle Display Bsp. Code an.
> https://www.lcd-module.de/support/application-note.html

Den hab ich auch mit als Basis genommen.

> Wo ist denn deine Funktion main(..)?
> Ohne geht's nicht.
> Bitte gesamten Kontext zeigen.

Das main.c hab ich aus Übersichtlichkeitsgründen weggelassen, weil da 
nix Display-spezifisches drinsteht - dort wird (aktuell) lediglich 2 
Sekunden gewartet und dann die lcd_init()-Funktion aufgerufen.

jo mei schrieb:
> Habe ich dich beschimpft? Habe ich dich beleidigt? Was ist
> unfreundlich daran nüchtern die Sachlage zu beschreiben?
In Deinen ersten drei Posts hab ich mich erstmal angepampt gefühlt - und 
im späteren Post ging das dann weiter ("voll scheisse", "Sollen wir etwa 
hellsehen", "wer suchet der findet" etc.) - wenn das nicht so gemeint 
war ok. Ich will darauf jetzt aber auch nicht weiter eingehen, weil das 
OffTopic ist. Für mich war das mit der Anmerkungn erledigt.

Grüße und Danke

Micha

von DerEinzigeBernd (Gast)


Lesenswert?

Du solltest lernen, mit Deinem Schaltplanzeichenprogramm eigene 
Symbole zu erstellen. Das hilft Dir --unabhängig vom Problem hier-- 
brauchbare Schaltpläne zu erstellen.

von Joe G. (feinmechaniker) Benutzerseite


Lesenswert?

Die Sozialkompetenz einiger Forenmitglieder läßt tatsächlich zu wünschen 
übrig.

Aus meiner Erfahrung (2 Displays „gehimmelt“) reagieren die Displays aus 
der DOGxxx-Serie unglaublich empfindlich auf Überspannung. Auf dem 
Steckbrett mal kurz an einer Leitung 5V statt 3.3v und das wars mit dem 
Display. Ab diesem Moment hilft auch keine korrekte 
Initialisierungsroutine mehr.

von Michael W. (micha124)


Lesenswert?

Hallo,

Joe G. schrieb:
> Aus meiner Erfahrung (2 Displays „gehimmelt“) reagieren die Displays aus
> der DOGxxx-Serie unglaublich empfindlich auf Überspannung. Auf dem
> Steckbrett mal kurz an einer Leitung 5V statt 3.3v und das wars mit dem
> Display. Ab diesem Moment hilft auch keine korrekte
> Initialisierungsroutine mehr.

den Tod dürfte/könnte das erste Display gestorben sein. Da hatte ich den 
falschen Schaltregler erwischt. Daher habe ich das dann auch getauscht 
und penibelst darauf geachtet, dass dies nur 3,3 V abbekommt. Daher 
würde ich das beim aktuellen eher ausschließen wollen.

Weiß jemand was "messbares" mit dem ein solcher Tod festgestellt werden 
kann?

Grüße Micha

von Michael W. (micha124)


Lesenswert?

Hi,

Nachtrag: ich hab grad mal testhalber nochmal ein niegelnagelneues 
Display drangehängt - auch das tut kein Mucks und bekommt auch definitiv 
nur 3,3V

Grüße Micha

von Veit D. (devil-elec)


Lesenswert?

Hallo,

kontrolliere einmal mit dem Controller Manual ob SPI auf SPI Mode 3 
eingestellt ist und dann fehlt mir ein CS Pegel High als erste 
Einstellung bevor überhaupt irgendwas mit SPI Übertragung beginnt. Auch 
ein Reset funktioniert nur wenn der Pin vorher auf High Pegel steht. 
Also High - Low - High. Welchen Takt hat dein SPI? Darf max. 1 MHz sein.

An der Display Beschaltung kann ich keinen Fehler erkennen.

Ist es dir möglich dein Programm soweit zu kürzen das sich alles nur 
noch ums Display dreht? Und damit ein komplettes Programm zu zeigen wo 
alles enthalten ist?

: Bearbeitet durch User
von Mario M. (thelonging)


Lesenswert?

Setze mal vor LCD-Reset noch LCD_CS_1 und die Pause danach scheint mir 
recht kurz zu sein.

von Michael W. (micha124)


Angehängte Dateien:

Lesenswert?

Hi,

> kontrolliere einmal mit dem Controller Manual ob SPI auf SPI Mode 3
eingestellt ist

Dies war SPI Mode 2 gestanden. Hab ich geändert (CPOL=1, CPHA=1)

> und dann fehlt mir ein CS Pegel High als erste
> Einstellung bevor überhaupt irgendwas mit SPI Übertragung beginnt.

hab ich angefügt

> Auch ein Reset funktioniert nur wenn der Pin vorher auf High Pegel steht.
> Also High - Low - High.

Arrg - das war die Lösung. Der Reset wurde nicht mehr auf 1 (0 im Code 
aufgrund Invertierung) gesetzt :-(

> Welchen Takt hat dein SPI? Darf max. 1 MHz sein.

Systemtakt ist 2MHz, SPI damit bei 125kHz

> Ist es dir möglich dein Programm soweit zu kürzen das sich alles nur
> noch ums Display dreht? Und damit ein komplettes Programm zu zeigen wo
> alles enthalten ist?

Das Programm (bzw. die lcd_spi.c) ist nur Display. Aufgerufen wird 
lcd_init()

Wie gesagt - das Display funktioniert nun. Es war (neben evtl. den 
anderen Einstellungen) der nicht wieder gelöste Reset.

Ich hab den aktuellen Stand nochmal angehängt als Referenz für andere.
Hier muss ich noch ein bisschen aufräumen und evtl. unnötig lange delays 
entfernen.

Das Display zeigt nun eine "0", einen blinkenden Cursor und auf den 
restlichen Stellen Müll an (da kein cls implementiert)

Vielen vielen Dank für die Hilfe!

Grüße Micha

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

schön zu hören.

Einen Tipp noch wie ich das definieren würde. Ich würde das schon in der 
Definition mit Kommentar passend ändern. Das stiftet irgendwann später 
weniger Verwirrung. Und beim Lesen des Displays Manuals und der 
Ansteuerfunktionen ist das für das Lesen 1:1 identisch.
1
//Reset - Achtung: Reset-Leitung wird durch Schaltung invertiert
2
#define LCD_RESET_1 PORTB &= ~(1 << LCD_RESET);
3
#define LCD_RESET_0 PORTB |= (1 << LCD_RESET);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.