Forum: Mikrocontroller und Digitale Elektronik Probleme mit Electronic Assembly Display


von lcd-ler (Gast)


Lesenswert?

Hallo

ich versuche gerade das Electronic Assembly Display zu programmieren.

Irgendwie habe ich Probleme zu verstehen wofür beim Power/Icon/Contrast 
Contral das Ion, Bon, C5 und C4 ist.

Ebenso beim Contrast set das C0-C3 und beim Bias Set das 1/4 und 1/5

Habe keine richtige Erklärung in den Datenblättern gefunden und somit 
weiß ich nicht wie ich es einstellen soll.


http://www.lcd-module.de/eng/pdf/zubehoer/st7036.pdf

MfG

von lcd-ler (Gast)


Lesenswert?

Die Electronic Assembly Displays werden anscheinend doch nicht so häufig 
benutzt wie ich dachte.

von Johann L. (radiostar)


Lesenswert?

Richte Dich an die Codebeispiele im Datenblatt des Displays, dann geht's 
in der Regel auch. Im Datenblatt des Controllers brauchst Du überhaupt 
nicht herumzusuchen, es ist unübersichtlich und bringt (zumindest mir) 
keinen nennenswerten Informationsgewinn.

von spess53 (Gast)


Lesenswert?

Hi

>Die Electronic Assembly Displays werden anscheinend doch nicht so häufig
>benutzt wie ich dachte.

Eigentlich schon. Aber normalerweise reicht die Initialisierung aus dem 
Displaydatenblatt.

C5...C0 ist der Kontrast, auf 2 Register verteilt
Bias bestimmt die Anzahl Spannungsstufen der LCD-Ansteuerung (siehe 
S.60..64)
BON Schaltet die Displayspannungserzeugung (bei 3,3V ein, bei 5V aus)

MfG Spess

von Peter D. (peda)


Lesenswert?

lcd-ler schrieb:
> ich versuche gerade das Electronic Assembly Display zu programmieren.

Es gibt nicht das Electronic Assembly Display, sondern viele.
Solange Du also nicht den Typ angibst, wird auch keiner was dazu sagen 
können.


Peter

von lcd-ler (Gast)


Lesenswert?

>Eigentlich schon. Aber normalerweise reicht die Initialisierung aus dem
>Displaydatenblatt.

Es ist doch die Frage welche Einstellungen ich benütze. Die 
Initialisierung bezieht sich nur auf 8 Bit ich benütze aber SPI. Und 
ausführliche Hinweise für SPI habe ich nicht gefunden.

Wie wird der Kontrast eingestellt. Alles durchprobieren und schauen was 
am besten ist. Wie stellt ihr den Kontrast ein.

>Bias bestimmt die Anzahl Spannungsstufen der LCD-Ansteuerung.

Ich habe mir das angeschaut habe aber bisschen Probleme zu verstehen was 
das ist und was das zeigt.

>BON Schaltet die Displayspannungserzeugung (bei 3,3V ein, bei 5V aus)

Was ist die Displayspannungserzeugung. Das Display hängt ja an einer 5V 
Quelle. Wozu brauche ich dann eine Displayspannungserzeugung.

Wozu ist das ION.

Auf der Seite 60...64 steht dass 540khz benützt werden. Auf einer 
anderen Skizze S43 steht aber dass 380khz benützt werden. Welches ist 
jetzt richtig?


@Peter Dannegger
Das Display ist ein DOGM-162. Spielt denn das eigentlich eine Rolle? 
Wichtig ist doch welcher Controller benützt wird und nicht welches 
Display.
Oder täusche ich mich da.

MfG

von avr (Gast)


Lesenswert?

Wenn man den Typ kennt, kann man auch was finden:

http://www.lcd-module.de/support.html

Hier gibt es SPI-Initialisierung in C (unter AVR C
für das DOG163 also 1 Zeile mehr).

Bin einfach mal den Links nach ;)


AVR

von spess53 (Gast)


Lesenswert?

Hi

>Initialisierung bezieht sich nur auf 8 Bit ich benütze aber SPI. Und
>ausführliche Hinweise für SPI habe ich nicht gefunden.

SPI sind 8-Bit.

>Wie wird der Kontrast eingestellt. Alles durchprobieren und schauen was
>am besten ist. Wie stellt ihr den Kontrast ein.

Einfach mit dem Datenblattwert anfangen. Wenn es nicht passt dann 
probieren.

>Was ist die Displayspannungserzeugung.

Das ist die Spannung, von der die Kontrastspannung (eigentlich 
Betriebsspannung) zur Ansteuerung des des LCDs (nicht Controller) 
abgeleitet wird.

> Das Display hängt ja an einer 5V
>Quelle. Wozu brauche ich dann eine Displayspannungserzeugung.

Bei 5V brauchst du den Booster auch nicht. Aber bei 3,3V muss VLCD auf 
die 5V erhöht werden.

>Wozu ist das ION.

ICON On. Allerdings habe ich auch nicht nicht ganz herausbekommen wozu 
das gut ist. Möglicherweise so etwas ähnliches wie die selbstdefinierten 
Zeichen.

>Auf der Seite 60...64 steht dass 540khz benützt werden. Auf einer
>anderen Skizze S43 steht aber dass 380khz benützt werden. Welches ist
>jetzt richtig?

540khz ist der interne Clock. Andere Frequenzen müssen extern angelegt 
werden.

MfG Spess

von Peter D. (peda)


Lesenswert?

lcd-ler schrieb:
> Das Display ist ein DOGM-162. Spielt denn das eigentlich eine Rolle?

Wenn man Beispielcode sucht, schon:

Beitrag "Re: Dog-M / ST7036 Routine für 1-Zeiliges Display SPI-Mode"


Peter

von iaoffline (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Es gibt nicht das Electronic Assembly Display,

es gibt gar keine Display von denen, das ist ein Händler der es darauf 
anlegt die Fehler in den zusammengestoppelten Datenblätter durch 
Unübersichtlichkeit zu übertreffen.

Es gibt meist bessere wenn man ein wenig sucht und günstiger sind die 
dann auch oft.

von spess53 (Gast)


Lesenswert?

Hi

>es gibt gar keine Display von denen, das ist ein Händler der es darauf
>anlegt die Fehler in den zusammengestoppelten Datenblätter durch
>Unübersichtlichkeit zu übertreffen.

Bisher hatte ich noch keine Probleme mit den Datenblättern von EA. Da 
gibt es zehnmal schlimmere. Und das Datenblatt vom Displaycontroller ist 
eh ein Muss.

MfG Spess

von iaoffline (Gast)


Lesenswert?

spess53 schrieb:
> Bisher hatte ich noch keine Probleme mit den Datenblättern von EA.

Ich nur, hab gerade 2 Wochen gebraucht bis den Herrschaften eingefallen 
ist das gewisse Sachen nur im 8 Bit Modus laufen. Das Datenblatt wurde 
dann stillschweigend um einen Satz aktualisiert. Errat sheets sind ja 
uach weas für Hersteller und nicht für Händler.

So was macht auch keiner der seine Display selber baut. Hab dann bei 
Digikey das gleiche gefunden, 30% günstiger und mit einem Datenblatt das 
stimmt und lesbar war und mit jeder Menge Funktionen die bei EA 
angeblich nicht vorhanden sind.

Das war bei weitem nicht das erste mal. Da anrufen ist reine Folter, so 
einen miesgelaunten Schuppen findet man kein zweites mal.

von spess53 (Gast)


Lesenswert?

Hi

>Ich nur, hab gerade 2 Wochen gebraucht bis den Herrschaften eingefallen
>ist das gewisse Sachen nur im 8 Bit Modus laufen. Das Datenblatt wurde
>dann stillschweigend um einen Satz aktualisiert. Errat sheets sind ja
>uach weas für Hersteller und nicht für Händler.

Welches Display? Und die Datenblätter können und sollen nicht das 
Datenblatt vom Displaycontroller ersetzen.

>Das war bei weitem nicht das erste mal. Da anrufen ist reine Folter, so
>einen miesgelaunten Schuppen findet man kein zweites mal.

Ich habe auch schon mit denen telefoniert. Waren eigentlich recht 
freundlich.

MfG Spess

von lcd-ler (Gast)


Lesenswert?

Danke für die Tipps.

Habt ihr vielleicht noch eine Idee was FON und Rab ist.

MfG

von spess53 (Gast)


Lesenswert?

HI

>Habt ihr vielleicht noch eine Idee was FON und Rab ist.

Siehe S.47...51

MfG Spess

von lcd-ler (Gast)


Lesenswert?

Das Datenblatt habe ich mir ja angeschaut nur so richtig nachvollziehen 
konnte ich es nicht.

Eine andere Frage:

Ich habe es versucht auf diese Art zu programmieren.

Hast du vielleicht einen Tipp wieso das Display schwarz ist.
1
void init_display()
2
{
3
  //Timer0 CTC Interrupt => 500ns
4
  TCCR0A |= (1<<WGM01);        //CTC Einstellung
5
  TCCR0B |= (1<<CS01) | (1<<CS00);   //Teiler 64
6
  TIMSK0 |= (1<<OCIE0A);         //Interrupt Enable
7
  OCR0A = 124;
8
  
9
    
10
11
  sei();
12
13
  //RS auf 0 schalten => Instruction Register 
14
  DDRB |= (1<<DDB1);
15
  PORTB &= ~(1<<PORTB1);
16
17
  //Chip select (CSB bzw. SS) deaktivieren => Low aktiv
18
  DDRB |= (1<<DDB2);
19
  PORTB |= (1<<PORTB2);
20
21
  //MOSI und SCK als Ausgang setzen
22
  DDRB |= (1<<DDB2) | (1<<DDB3);
23
24
  //SPI Einstellung
25
  SPCR |= (1<<SPIE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL) | (1<<SPR0);
26
27
28
  count = 0;
29
  while(count<100)
30
  ;
31
  
32
33
  //Chip select (CSB bzw. SS) aktivieren => Low aktiv
34
  PORTB &= ~(1<<PORTB2);
35
36
37
38
  //Daten per SPI ins Function set Register senden
39
  SPDR = 0x39;
40
  /* Wait for transmission complete */
41
  while(!(SPSR & (1<<SPIF)))
42
  ;
43
44
  count = 0;
45
  TCNT0 = 0;
46
  while(count<1)
47
  ;
48
49
  //Daten per SPI ins Bias Register senden
50
  SPDR = 0x1C;
51
  /* Wait for transmission complete */
52
  while(!(SPSR & (1<<SPIF)))
53
  ;
54
  
55
  count = 0;
56
  TCNT0 = 0;
57
  while(count<1)
58
  ;
59
60
  //Daten per SPI ins Power/ICON/Contrast Control Register senden
61
  SPDR = 0x55;
62
  /* Wait for transmission complete */
63
  while(!(SPSR & (1<<SPIF)))
64
  ;
65
66
  count = 0;
67
  TCNT0 = 0;
68
  while(count<1)
69
  ;
70
71
  //Daten per SPI ins Follower Control Register senden
72
  SPDR = 0x69;
73
  /* Wait for transmission complete */
74
  while(!(SPSR & (1<<SPIF)))
75
  ;
76
77
  count = 0;
78
  TCNT0 = 0;
79
  while(count<1)
80
  ;
81
82
  //Daten per SPI ins Contrast Set Register senden
83
  SPDR = 0x74;
84
  /* Wait for transmission complete */
85
  while(!(SPSR & (1<<SPIF)))
86
  ;
87
88
  count = 0;
89
  TCNT0 = 0;
90
  while(count<1)
91
  ;
92
93
  //Daten per SPI ins Function set Register senden
94
  SPDR = 0x38;
95
  /* Wait for transmission complete */
96
  while(!(SPSR & (1<<SPIF)))
97
  ;
98
99
  count = 0;
100
  TCNT0 = 0;
101
  while(count<500)
102
  ;
103
104
  //Daten per SPI ins Display ON/OFF control Register senden
105
  SPDR = 0x0F;
106
  /* Wait for transmission complete */
107
  while(!(SPSR & (1<<SPIF)))
108
  ;
109
110
  count = 0;
111
  TCNT0 = 0;
112
  while(count<1)
113
  ;
114
115
  //Daten per SPI ins Clear Display Register senden
116
  SPDR = 0x01;
117
  /* Wait for transmission complete */
118
  while(!(SPSR & (1<<SPIF)))
119
  ;
120
121
  count = 0;
122
  TCNT0 = 0;
123
  while(count<1)
124
  ;
125
126
  //Daten per SPI ins Entry Mode Register senden
127
  SPDR = 0x06;
128
  /* Wait for transmission complete */
129
  while(!(SPSR & (1<<SPIF)))
130
  ;
131
132
//******************************************************************************
133
134
  //RS auf 1 schalten => Data Register 
135
  PORTB |= (1<<PORTB1);
136
137
138
  count = 0;
139
  TCNT0 = 0;
140
  while(count<1)
141
  ;
142
143
  //Daten per SPI senden
144
  SPDR = 'A';
145
  /* Wait for transmission complete */
146
  while(!(SPSR & (1<<SPIF)))
147
  ;
148
149
150
  //Chip select (CSB bzw. SS) deaktivieren => Low aktiv
151
  PORTB |= (1<<PORTB2);
152
153
}
154
155
//------------------------------------------------------------------
156
157
ISR (TIMER0_COMPA_vect)
158
{
159
  count++;
160
}
161
162
//------------------------------------------------------------------

von holger (Gast)


Lesenswert?

count = 0;
  while(count<100)
  ;

Das wird für alle Zeiten in der Schleife hängen bleiben.
Lern C bevor du dich an Displays ran machst.

von lcd-ler (Gast)


Lesenswert?

Wieso bleibt das die ganze Zeit in der Schleife hängen. Per Interrupt 
wird count erhöht.

von holger (Gast)


Lesenswert?

>Wieso bleibt das die ganze Zeit in der Schleife hängen. Per Interrupt
>wird count erhöht.

Bist du da sicher? Ich seh nur unvollständige Codeschnipsel
auf die man besser gar keine Antwort gibt.

von lcd-ler (Gast)


Lesenswert?

Das Interrupt wird ausgeführt.

Das einzige was noch fehlt bzgl. Display ist.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
volatile int count=0;
5
6
int main (void)
7
{
8
  init_display();
9
10
  while(1)
11
  {
12
    
13
  }
14
15
}

von lcd-ler (Gast)


Lesenswert?

Muss nach jedem Byte welches gesendet wurde das CS auf High gesetzt 
werden oder wird der Takt auch generiert wenn das CS die ganze Zeit auf 
Low bleibt.

von lcd-ler (Gast)


Lesenswert?

Hat niemand einen Tipp?

von spess53 (Gast)


Lesenswert?

Hi

Was meinst du mit Takt? CS ist Chip Select.

MfG Spess

von lcd-ler (Gast)


Lesenswert?

Ich muss ja CS auf Low setzen damit man die Daten überhaupt übertragen 
kann. Dabei erzeugt ja SCK acht Takte damit die Daten übertragen werden.

Wenn ich wieder ein Byte übertragen will muss CS auf High und dann 
wieder auf Low gesetzt werden oder erzeugt SCK die acht Takte auch wenn 
CS die ganze Zeit auf Low bleibt.

Ich habe schon den SCK-Prescaler runtergesetzt. Das Display macht noch 
immer keinen Mucks

von spess53 (Gast)


Lesenswert?

Hi

>Ich muss ja CS auf Low setzen damit man die Daten überhaupt übertragen
>kann. Dabei erzeugt ja SCK acht Takte damit die Daten übertragen werden.

Das LCD erzeugt keinen Takt auf SCK. Das ist ein SPI-Slave. Der Takt 
kommt vom Controller. Wenn keine weiteren Slaves am SPI-Bus hängen, 
kannst du CS auch dauerhaft auf L legen.

MfG Spess

von lcd-ler (Gast)


Lesenswert?

Ich mein auch dass der Takt vom Controller (Master) kommt.

von Sam .. (sam1994)


Lesenswert?

Wenn du deinen Code ein wenig umschreibst, lassen sich auch Fehler 
leichter finden. Den Interrupt kann man sich sparen: Das SPIF-bit wird 
im SPSR nach der Übertragung gesetzt und eine Funktion, die ein Byte 
sendet reduziert den Code ungemein.

von lcd-ler (Gast)


Lesenswert?

Hier ist noch einmal der Code umgeschrieben.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
volatile int count=0;
6
7
8
void lcd_command(unsigned char command)
9
{
10
  //RS auf 0 schalten => Instruction Register 
11
  PORTB &= ~(1<<PORTB1);
12
13
  //command per SPI senden
14
  SPDR = command;
15
  /* Wait for transmission complete */
16
  while(!(SPSR & (1<<SPIF)))
17
  ;
18
}
19
20
void lcd_data(unsigned char data)
21
{
22
  //RS auf 1 schalten => Data Register 
23
  PORTB |= (1<<PORTB1);
24
25
  //Daten per SPI senden
26
  SPDR = data;
27
  /* Wait for transmission complete */
28
  while(!(SPSR & (1<<SPIF)))
29
  ;
30
}
31
32
//dauer = zeit * 500us
33
void pause(int zeit)
34
{
35
  count = 0;
36
  TCNT0 = 0;
37
  while(count<zeit)
38
  ;
39
}
40
41
42
//------------------------------------------------------------------
43
44
void init_display()
45
{
46
  //Timer0 CTC Interrupt => 0,5ms
47
  TCCR0A |= (1<<WGM01);        //CTC Einstellung
48
  TCCR0B |= (1<<CS01) | (1<<CS00);   //Teiler 64
49
  TIMSK0 |= (1<<OCIE0A);         //Interrupt Enable
50
  OCR0A = 124;
51
  
52
    
53
54
  sei();
55
56
  //RS auf 0 schalten => Instruction Register 
57
  DDRB |= (1<<DDB1);
58
  PORTB &= ~(1<<PORTB1);
59
60
  //Chip select (CSB bzw. SS) deaktivieren => Low aktiv
61
  DDRB |= (1<<DDB2);
62
  PORTB |= (1<<PORTB2);
63
64
  //MOSI und SCK als Ausgang setzen
65
  DDRB |= (1<<DDB3) | (1<<DDB5);
66
67
  //SPI Einstellung
68
  SPCR |= (1<<SPE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL) | (1<<SPR1);
69
70
71
  pause(100);
72
  
73
74
  //Chip select (CSB bzw. SS) aktivieren => Low aktiv
75
  PORTB &= ~(1<<PORTB2);
76
77
78
79
  //Daten per SPI ins Function set Register senden
80
  lcd_command(0x39);
81
82
  pause(1);
83
84
  //Daten per SPI ins Bias Register senden
85
  lcd_command(0x1C);
86
87
  pause(1);
88
89
  //Daten per SPI ins Power/ICON/Contrast Control Register senden
90
  lcd_command(0x55);
91
92
  pause(1);
93
94
  //Daten per SPI ins Follower Control Register senden
95
  lcd_command(0x69);
96
97
  pause(1);
98
99
  //Daten per SPI ins Contrast Set Register senden
100
  lcd_command(0x74);
101
102
  pause(1);
103
104
  //Daten per SPI ins Function set Register senden
105
  lcd_command(0x38);
106
107
  pause(500);
108
109
  //Daten per SPI ins Display ON/OFF control Register senden
110
  lcd_command(0x0F);
111
112
  pause(1);
113
114
  //Daten per SPI ins Clear Display Register senden
115
  lcd_command(0x01);
116
117
  pause(1);
118
119
  //Daten per SPI ins Entry Mode Register senden
120
  lcd_command(0x06);
121
122
  pause(1);
123
124
//******************************************************************************
125
126
  lcd_data('A');
127
128
  //Chip select (CSB bzw. SS) deaktivieren => Low aktiv
129
  PORTB |= (1<<PORTB2);
130
131
}
132
133
//------------------------------------------------------------------
134
135
ISR (TIMER0_COMPA_vect)
136
{
137
  count++;
138
}
139
140
//------------------------------------------------------------------
141
142
143
144
145
int main (void)
146
{
147
  init_display();
148
149
  while(1)
150
  {
151
152
  }
153
154
}

von Thilo M. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> lcd-ler schrieb:
>> Das Display ist ein DOGM-162. Spielt denn das eigentlich eine Rolle?
>
> Wenn man Beispielcode sucht, schon:
>
> Beitrag "Re: Dog-M / ST7036 Routine für 1-Zeiliges Display SPI-Mode"
>
>
> Peter

Wenn du dem Link von Peter folgst, findest du auch von mir einen 
Beispielcode. Der funktioniert auf jeden Fall.

Und denke daran: die Beleuchtung sollte AN sein, sonst kann es sein (je 
nach Modul), dass man überhaupt nichts sieht, obwohl das Display läuft. 
;-)

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.