Forum: Mikrocontroller und Digitale Elektronik DOGM132-5 mit SPI ansteuern


von Thomas (Gast)


Lesenswert?

Hallo,

ich versuche ein EA DOGM132-5 132x32 Pixel Grafikdisplay über SPI 
anzusteuern. Doch nicht mal die Initialisierung geht.


Ich verwende die Schaltung auf Seite 4 unten "Low Voltage" mit 9 Volt 
Kontrastspannung:
http://www.lcd-module.de/deu/pdf/grafik/dogm132-5.pdf

Reset halte ich dauerhaft auf high über 10 kOhm. A0 ist dauerhaft auf 
GND (=Command)

Zur Ansteuerung nehme ich einen PIC18F452 mit 10 MHz

Hier der C-Code. Die Initialisierung ist direkt aus dem Datenblatt 
übernommen.

//Alle Pins als Ausgang
set_tris_a(0);
set_tris_b(0);
set_tris_c(0);
set_tris_d(0);
set_tris_e(0);
//SPI einstellen
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
delay_ms(100);

//Initialisierung "low voltage"
SPI_WRITE(0x40);delay_ms(1);
SPI_WRITE(0xA1);delay_ms(1);
SPI_WRITE(0xC0);delay_ms(1);
SPI_WRITE(0xA6);delay_ms(1);
SPI_WRITE(0xA2);delay_ms(1);
SPI_WRITE(0x2D);delay_ms(1);
SPI_WRITE(0x23);delay_ms(1);
SPI_WRITE(0x81);delay_ms(1);
SPI_WRITE(0x1F);delay_ms(1);
SPI_WRITE(0xAC);delay_ms(1);
SPI_WRITE(0x00);delay_ms(1);
SPI_WRITE(0xAF);delay_ms(1);

delay_ms(1000);

//all on
SPI_WRITE(0b10100101);
delay_ms(1000);

//all off
SPI_WRITE(0b10100100);

while(1)
{}

Achso, das Problem: 1. Nichts passiert. 2. Hab kein Oszi.

Ein paar Fragen habe ich schon mal:
1. Kann das delay_ms zwischen den Befehlen beliebig groß sein?
2. Muss ich den SPI Dout vom PIC an den SPI Din vom Display verbinden? 
An der Leitung ist ein Pullup mit 10k: gut, schlecht, egal? Die 
Clock-Leitung hat keinen Pullup.
3. Für die Kondensatoren nehme ich 1µF Elkos, ist das OK? Funktion der 
Pins ist laut Datenblatt "LC Drive". Mit 100nF Kerkos passiert auch 
nichts.
4. Sonst noch Ideen wo der Fehler liegen könnte?

Besten Dank,
Gruß,
Thomas

von munter (Gast)


Lesenswert?

Eins vorweg, ich kenn mich mit GLCDs nicht aus.

> 2. Muss ich den SPI Dout vom PIC an den SPI Din vom Display verbinden?

Ich denke: Ja

> 3. Für die Kondensatoren nehme ich 1µF Elkos, ist das OK? Funktion der
> Pins ist laut Datenblatt "LC Drive". Mit 100nF Kerkos passiert auch
> nichts.

Im Datenblatt steht, man soll einen 1µ C nehmen, nix von Elko, also 
warum nimmst Du einen Elko?

Woher hast Du die 1ms delays? Schau mal hier:
http://www.lcd-module.de/eng/pdf/zubehoer/st7565r.pdf

Ab Seite 51 steht was zur initialisierung. Da steht was von insgesamt 
5ms...die überschreitest Du...evtl. liegst daran, dass die 1ms zu lang 
sind?

von Erwin R. (er-tronik)


Angehängte Dateien:

Lesenswert?

Ich habe das Display bisher zwar mit AVR und STM32 angesteuert, aber 
sollte beim PIC ja so ähnlich gehen.

1. Zwischen den Befehlen muß überhaupt kein Delay sein. Die Zeit für die 
SPI-Übertragung reicht als Delay aus.

2. Wenn deine PIC-Pins als PushPull-Ausgänge geschaltet sind, brauchst 
Du keine Pullup-Widerstände. Das Display hat keinen Daten-Ausgang, die 
MISO-Leitung am Controller bleibt also frei.

3. Es ist egal, was für 1 µF Kondensatoren Du benutzt. Ich hab zunächst 
Elkos mangels Kerkos eingesetzt, beides klappt hervorragend. Nur bei 
Elkos auf die Polarität achten (CAP1N/1P/3N/3P).

4. Sehr wichtig ist die Reset-Leitung. Bitte das Display unbedingt nach 
dem Power-On kurz resetten. Also die Reset-Leitung kurz auf Low, dann 
wieder auf High. Erst danach die Init-Sequenz starten. Ich hatte auch 
zunächst die Reset-Leitung fest auf High gelegt und keinerlei Erfolge 
erziehlt.

5. Und A0 mußt Du natürlich auch ansteuern. Für die Initialisierung muß 
die natürlich auf Low sein, aber wenn Du Daten zum Display schicken 
willst, muß die natürlich auf High liegen.

6. Die Initialisierungssequenz, die Du benutzt hast, ist für die 
"Low-Voltage" version. Funktioniert natürlich nur, wenn Du eine externe 
9-12 Volt Spannung für das Display hast (Siehe Schalbild im Datenblatt 
Seite 4  "LOW VOLTAGE"). Wenn Du die Schaltung nach "LOW POWER" oder 
"WIDE RANGE" aufgebaut hast, dann unbedingt auch die dazu passende 
Initialiserungssequenz benutzen.

Als Anhang habe ich mal ein Projekt von mir mit einem DOGM128, also der 
größeren Version dieses Displays, das aber identisch angesteuert wird. 
Der Controller ist übrigends ein STM32F101C8 Cortex-M3.

Erwin

von Thomas O. (tarzanwiejane)


Lesenswert?

A0 dauerhaft auf GND ist nicht empfehlenswert. Da kannst du nur 
Kommandos rueberschicken, aber keine Displaydaten die dann angezeigt 
werden.
Siehe dazu Punkt (6) in der Tabelle auf Seite 5 deines Datenblattes...

Ich vermute auch das eines oder zwei deiner Delays zu kurz sind. 
Zumindest bei den DOG Textdisplays brauchen da einige Befehle ein 
laengeres. Schau mal in das Datenblatt des Controllers, da findest du 
dazu anstaendige Infos.

cu Tarzanwiejane

von Thomas (Gast)


Lesenswert?

Danke an alle für die Tipps, es geht aber immer noch nicht.


@ munter (Gast)
"Im Datenblatt steht, man soll einen 1µ C nehmen, nix von Elko, also
warum nimmst Du einen Elko?"

Weil ich nur 100 nF Kerkos habe.


"Woher hast Du die 1ms delays? Schau mal hier:
http://www.lcd-module.de/eng/pdf/zubehoer/st7565r.pdf

Ab Seite 51 steht was zur initialisierung. Da steht was von insgesamt
5ms...die überschreitest Du...evtl. liegst daran, dass die 1ms zu lang
sind?"

OK, habe die Delays rausgenommen, hilft aber nicht.


@ Erwin Reuss
Gut zu wissen, dass es auch mit Elkos geht.
Danke für den Hinweis mit der Reset Leitung, steht ja auch im 
ausführlichem Datenblatt (vom Controller, das Datenblatt vom Display 
enthält auch die Initialisierung aber ohne die Details). Ich verwende 
natürlich die passende Beschaltung mit 9 Volt für die Kontrastspannung.
A0 habe ich (noch) nicht genutzt um die Schaltung einfach zu lassen. 
Display initialisieren und alle Pixel an/aus geht auch so (also es 
sollte gehen... )

@ Thomas Otto
Zum testen erst mal ohne A0. Der lange Delay bei den Textdisplays ist 
mir bekannt, scheint hier aber anders zu sein. Eher anders rum, dass die 
Initialisierung nur 5ms dauern soll.


Also, ich werde doch mal 1 µF Kerkos kaufen und schauen ob ich noch 
einen anderen SPI-IC zum testen habe, vielleicht läuft da ja auch was 
schief. Ist mein erster Versuch mit SPI.

Gruß,
Thomas

von yann (Gast)


Lesenswert?

hi thomas,
ich sehe,du hast dich schon mit dem LCD DOGM132-5 beschäftigt.ich möchte 
auch dieses Display einsteuern aber ich weiss nicht wie ich anfangen 
soll.kannst du mir vielleicht einen Schaltplan oder so was schicken 
damit ich erstmal sehen kann wie ich überhaupt das ganze aufbauen kann.
Danke im Voraus

von yann (Gast)


Lesenswert?

hi Erwin,
ich möchte ein DOGM132-5 LCD mit AVR (Assembler) über SPI einsteuern.ich 
sehe dass du dich mit diesem LCD schon beschäftigt hast.kannst du  mir 
vielleicht einen Schaltplan erreichen damit ich sehe wie ich anfangen 
kann.
danke

von Raimund R. (raimund)


Lesenswert?

hat denn jetzt jemand ein DOGM128E-6 ans laufen bekommen?
Vielleicht mit BASCOM???
Bislang habe ich nichts finden können

von Mark K. (marcellino)


Lesenswert?

Hallo

Gibt es inzwischen etwas Neues zum Thema Dogm 132?

Seit einiger Zeit wird das Dogm 128x64 von Bascom unterstützt. Ich habe 
es auch erfolgreich zum Laufen gebracht. Nun habe ich hier ein 132-5 und 
habe zwei oder drei Werte in der Initialisierung des Displays aus der 
Bascom Library angepasst. Jetzt bekomme ich wenigstens schon mal einen 
Text angezeigt.

Nun bin ich aber kein Programmierer und bräuchte Hilfe bei der Anpassung 
der Library bezüglich der anderen Displayauflösung (132x32 statt 
128x64).

Kann mir da jemand helfen?

Viele Grüße

von Philipp F. (nerdture)


Lesenswert?

Hi, ich habe nun schon einige threads durchgewühlt um häufige Fehler bei 
der Ansteuerung zu finden. Bei mir will mein DOGM132 am ATmega8 nicht 
funktionieren.
Habe nun sogar schon mit dem Oszilloskop überprüft ob die SPI daten 
zusammen mit der clock richtig ankommen. Vielleicht stimmt aber einfach 
an der Software was nicht. Ich wäre euch total dankbar wenn da mal 
jemand kurz drüberschaut:
1
void spi_master_transmit(char cData)
2
{
3
4
  PORTB &= ~CS_LCD;  
5
  PORTC &= ~LC_A0;
6
  
7
  SPDR = cData;
8
  while(!(SPSR & (1<<SPIF)));
9
  
10
  PORTC |= LC_A0;
11
  PORTB |= CS_LCD;
12
  
13
  _delay_us(10);
14
}
(Habe es auch schon ohne das aus und wieder anschalten von CS und A0 
vor/nach jedem Befehl probiert)
1
int main (void)
2
{  
3
  DDRB = 0xFF;
4
  DDRC = 0xFF; //output
5
6
  int cnt = 0;
7
  while(1) {
8
    cnt = cnt % 4;
9
    if(cnt == 0) {
10
      SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
11
    } else if(cnt == 1) {
12
      SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPHA);
13
    } else if(cnt == 2) {
14
      SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL);
15
    } else if(cnt == 3) {
16
      SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPHA)|(1<<CPOL);
17
    }
18
  
19
  
20
    //reset LCD
21
    PORTC &= ~0b100000;
22
    PORTC &= ~LC_RST;
23
    delay_hundredth(50);
24
25
    PORTC |= LC_RST;
26
    PORTC |= 0b100000;
27
    _delay_us(50);
28
    
29
    
30
    //Select LCD and turn off A0
31
    PORTB &= ~CS_LCD;
32
    PORTC &= ~LC_A0;
33
    _delay_us(50);
34
    
35
    
36
    //lcd internal reset
37
    //spi_master_transmit(0b11100010);
38
    //_delay_us(50);
39
    
40
    // sequence
41
    spi_master_transmit(0x40);
42
    spi_master_transmit(0xA1);
43
    spi_master_transmit(0xC0);
44
    spi_master_transmit(0xA6);
45
    spi_master_transmit(0xA2);
46
    spi_master_transmit(0x2D);
47
    spi_master_transmit(0x23);
48
    spi_master_transmit(0x81);
49
    spi_master_transmit(0x1F);
50
    spi_master_transmit(0xAC);
51
    spi_master_transmit(0x00);
52
    spi_master_transmit(0xAF);
53
    
54
    delay_hundredth(100);
55
    
56
    // all points on
57
    spi_master_transmit(0b10100101);
58
    delay_hundredth(100);
59
60
    // all points off
61
    spi_master_transmit(0b10100100);
62
    delay_hundredth(100);
63
    
64
    PORTC |= LC_A0;
65
    PORTB |= CS_LCD;
66
    delay_hundredth(200);
67
    
68
  }
69
}

Das Display ist im Low-power-mode mit zwei spannungen betrieben (10V an 
VOUT und 3,3V an VDD,VDD2 und SPI).
An PortC pin 5, hängt eine LED, daher diese befehle.

Am Display tut sich einfach gar nichts. Das bleibt komplett schwarz (ist 
en weiß auf schwarz display). Sollte sich da nicht wenigstens schon 
irgendwas ein bisschen verändern, wenn man eine Spannung anlegt?

Viele Grüße,
Philipp

von Erwin R. (er-tronik)


Lesenswert?

In der aktuellen Elektor-Ausgabe September-2009 findet ihr ein Projekt 
"OBD2-Analyser NG". Hier ist das DOGM132 an einem AT90CAN128 
angeschlossen. Der komplette Sourcecode kann über folgenden Link 
heruntergeladen werden:

http://www.er-forum.de/obd-diag-dl/index.php?&direction=0&order=&directory=DXM%20-%20Diamex-OBD2-Modul/open-source%20handheld

von Philipp F. (nerdture)


Lesenswert?

Hi,
also auch bei mir geht das Display nun.
Was ich geändert habe:
Nicht mehr im Dual-Power mode sondern mit den zusätzlichen Kondensatoren 
betreiben. Jetzt gehts... (Die Initialisierung muss dann natürlich auch 
entsprechend angepasst werden)

Komische Sache trotzdem...

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.