Forum: Mikrocontroller und Digitale Elektronik EA DIP204-4 Datenblatt verständnis


von Dennis G. (hans_angemeldet)


Lesenswert?

Guten Tag,

Ich betreibe zur Zeit an einem ATmga32 dieses Display:

http://www.avrcard.com/Documents/datasheets/dip204-4.pdf

Jetzt hab ich alles fertig gelötet, und als ich dann das Display soweit 
initialisieren wollte klappte das auch ganz gut, jedoch versteh ich 
einige Sachen aus dem Datenblatt nicht so ganz :(

1. Das RE Bit, was ist das genau, ist das EN der Steuerleitungen?

2. Das kleine Sternchen was bei den Befehlen drin steht (nur manchmal) 
was hat das zu sagen, wie muss ich dann den Pin beschalten?

Würd mir echt weiterhelfen wenn die Fragen mir keine Hindernisse mehr 
darstellen;)

Besten Danke schonmal,

euer Hans

von spess53 (Gast)


Lesenswert?

Hi

Das RE-Bit findest du im 'Function Set'-Befehl. Sternchen bedeuten 
'egal'.

MfG Spess

von Dennis G. (hans_angemeldet)


Lesenswert?

spess53 schrieb:

> Das RE-Bit findest du im 'Function Set'-Befehl.


Jo schon klar, aber was muss ich da genau setzen? Ich steh grad aufem 
Schlauch, :D

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Schau dir mal den Function Set Befehl an:

0 0 1 DL N RE DH REV

Wenn du diesen Befehl an das Display sendest und dabei RE auf 1 stellst, 
wird ab diesen Moment das Bit RE auf 1 sein. Damit gelten dann nur noch 
die Zeilen in der Tabell wo in der 1. Spalte RE=1 steht. Wenn du nun 
einen Befehl senden willst wo in der 1. Spalte für RE ein 0 steht musst 
du das RE Bit erst wieder mit obigen Befehl auf Null schalten. Bsp. Du 
möchtest gerne den Kursor auf invertiert schalten. Das geht mit dem 
Befehl

extended Function Set 0 0 0 0 1 FW BW NW

wo du das BW-Bit auf 1 setzen musst. Nun funtioniert dieser Befehl aber 
nur bei gesetztem RE-Bit. Du musst also vorher mit dem Befehl

Function Set 0 0 1 DL N RE DH REV

das RE Bit erst auf 1 setzen. Danach kannst du das BW-Bit setzen und 
dann solltest du das RE-Bit wieder zurück schalten, damit die anderen 
Befehle wieder richtig klappen.

Hab damals auch eine Weile gebraucht, vor allem da ich ein 4-zeiliges 
Display benutzte, wo man das NW-Bit im extended Function Set umschalten 
muss.

Gruß
Sven

von Dennis G. (hans_angemeldet)


Lesenswert?

Ahh okay, weil ich hab die Routine von nem anderen Thread und die 
meinten wenn man alles umgestelt hat, dann geht das bei denen, aber bei 
meinem Display zeigt der bei jedem Neu-Einschalten von der 
Betriebsspannung etwas anderes auf dem Display an und immer so 
kryptische Zeihen, hab jetzt gedacht, dass es an der Initialisierung 
liegen kann, aber bei denen geht ja alles.

PS.: Meins ist auch vier-zeilig :D

Grüße Dennis

von Dennis G. (hans_angemeldet)


Lesenswert?

kann mir denn niemand die Initialisierung und die Funktion für nen Text 
asgeben schildern? Ich komm da irgendwie net so drauf.

Grüße

von spess53 (Gast)


Lesenswert?

Hi

>kann mir denn niemand die Initialisierung und die Funktion für nen Text
>asgeben schildern? Ich komm da irgendwie net so drauf.

Dann zeig doch mal, was du schon hast. Außerdem weiss niemand hier, ob 
du 8Bit-, 4Bit- oder SPI-Interface benutzt. Die Initialisierung für 8Bit 
steht übrigens im Datenblatt.

MfG Spess

von Dennis G. (hans_angemeldet)


Lesenswert?

Jo schon, kann ich dann die einzelnen Pins immer High oder Low setzen, 
und nach ner Zeile dann immer 2-3 ms warten oder? und dann wieder alle 
so umstellen und wieder warten?

Dann nehm ich die 8-Bit Methode und wie kann ich dann genau dem Display 
die einzelnen Buchstaben senden?

Grüße Dennis

von Dennis G. (hans_angemeldet)


Lesenswert?

Guten Abend wieder einmal ;)
also ich hab jetzt die Initialisierung genau nach dem Datenblatt 
gemacht, also wie es in der 8-Bit Variante steht, jedoch macht mein LCD 
gar nichts, ich hab immer 3 ms Pause zwischen jedem Byte. Hab die Pins 
genau so High oder Low gesetzt, wie es d abeschrieben ist :(

Hoff jemand hat ähnliche Erfahrungen oder Probleme und kann mir helfen.

von spess53 (Gast)


Lesenswert?

Hi

>also ich hab jetzt die Initialisierung genau nach dem Datenblatt
>gemacht,...

Wie? Wenn du dich weiterhin so sperrst, mal deinen Code zu zeigen, 
kannst du kaum auf Hilfe hoffen.

MfG Spess

von Dennis G. (hans_angemeldet)


Lesenswert?

Okay Tshculdigung, hab halt immer die PINS high oder Low gesetz, und 
dann 5 ms abgewartet ;)
1
#include <avr/io.h>
2
#define F_CPU 1000000UL
3
#include <util/delay.h>
4
5
//Wait Funktion
6
//
7
void wait(unsigned int ms)
8
{
9
   for(unsigned int temp=0;temp != ms;temp++)
10
      _delay_ms(1);
11
}
12
13
void wait_us(unsigned int us)
14
{
15
   for(unsigned int temp=0;temp != us;temp++)
16
      _delay_us(1);
17
}
18
19
void LCD_INIT(void)
20
{
21
   DDRB=0b11111111;     //Port B auf Ausgang
22
   DDRD=0b11111111;     //Port D auf Ausgang
23
24
25
   //00 00110100
26
   PORTD &= ~(1<<PD7);
27
   PORTD &= ~(1<<PD6);
28
29
   PORTB &= ~(1<<PB4);
30
   PORTB &= ~(1<<PB3);
31
   PORTB |= (1<<PB2);
32
   PORTD |= (1<<PD0);
33
   PORTD &= ~(1<<PD1);
34
   PORTD |= (1<<PD2);
35
   PORTD &= ~(1<<PD3);
36
   PORTD &= ~(1<<PD3);
37
   wait(5);
38
39
40
   ///00 00001001
41
   PORTD &= ~(1<<PD7);
42
   PORTD &= ~(1<<PD6);
43
44
   PORTB &= ~(1<<PB4);
45
   PORTB &= ~(1<<PB3);
46
   PORTB &= ~(1<<PB2);
47
   PORTD &= ~(1<<PD0);
48
   PORTD |= (1<<PD1);
49
   PORTD &= ~(1<<PD2);
50
   PORTD &= ~(1<<PD3);
51
   PORTD |= (1<<PD3);
52
   wait(5);
53
54
55
   //00 00110000
56
   PORTD &= ~(1<<PD7);
57
   PORTD &= ~(1<<PD6);
58
59
   PORTB &= ~(1<<PB4);
60
   PORTB &= ~(1<<PB3);
61
   PORTB |= (1<<PB2);
62
   PORTD |= (1<<PD0);
63
   PORTD &= ~(1<<PD1);
64
   PORTD &= ~(1<<PD2);
65
   PORTD &= ~(1<<PD3);
66
   PORTD &= ~(1<<PD3);
67
   wait(5);
68
69
70
   //00 00001111
71
   PORTD &= ~(1<<PD7);
72
   PORTD &= ~(1<<PD6);
73
74
   PORTB &= ~(1<<PB4);
75
   PORTB &= ~(1<<PB3);
76
   PORTB &= ~(1<<PB2);
77
   PORTD &= ~(1<<PD0);
78
   PORTD |= (1<<PD1);
79
   PORTD |= (1<<PD2);
80
   PORTD |= (1<<PD3);
81
   PORTD |= (1<<PD3);
82
   wait(5);
83
84
85
   //00 00000001
86
   PORTD &= ~(1<<PD7);
87
   PORTD &= ~(1<<PD6);
88
89
   PORTB &= ~(1<<PB4);
90
   PORTB &= ~(1<<PB3);
91
   PORTB &= ~(1<<PB2);
92
   PORTD &= ~(1<<PD0);
93
   PORTD &= ~(1<<PD1);
94
   PORTD &= ~(1<<PD2);
95
   PORTD &= ~(1<<PD3);
96
   PORTD |= (1<<PD3);
97
   wait(5);
98
99
100
   //00 00000110
101
   PORTD &= ~(1<<PD7);
102
   PORTD &= ~(1<<PD6);
103
104
   PORTB &= ~(1<<PB4);
105
   PORTB &= ~(1<<PB3);
106
   PORTB &= ~(1<<PB2);
107
   PORTD &= ~(1<<PD0);
108
   PORTD &= ~(1<<PD1);
109
   PORTD |= (1<<PD2);
110
   PORTD |= (1<<PD3);
111
   PORTD &= ~(1<<PD3);
112
   wait(5);
113
}
114
115
//Main-Funktion
116
//
117
int main(void)
118
{
119
   LCD_INIT();   
120
121
   while(1)
122
   {
123
124
   }
125
126
   return 1;
127
}

von Sven S. (stepp64) Benutzerseite


Lesenswert?

Das ist zwar jetzt PIC-Assembler, aber Anhand der gesetzten Bits und der 
einzuhaltenden Wartezeiten, solltest du das auch in AVR-C übernehmen 
können. Ich hatte damals genau das selbe Display (4x20 Zeichen) und mit 
dieser Init ging es auf Anhieb.
1
;LCD initialisieren in 9 Schritten 
2
3
  call  Wait250    ; 250 ms Pause nach dem Einschalten
4
5
  movlw  B'00110000'  ; 1  8-Bit Mode
6
  movwf  LcdPort
7
  bsf    LcdE
8
  nop  
9
  bcf    LcdE
10
  
11
  movlw  D'50'    ; 50 ms Pause
12
  movwf  loops
13
  call  WAIT
14
  
15
  movlw  B'00110000'  ; 2 8-Bit Mode
16
  call  Control8Bit
17
  movlw  B'00110000'  ; 3 8-Bit Mode
18
  call   Control8Bit
19
  movlw  B'00100000'  ; 4 4-Bit Mode
20
  call   Control8Bit
21
22
  movlw  B'00101100'  ; 4a 4-Bit Mode; RE-Bit ein
23
  call  OutLcdControl
24
  movlw  B'00001001'  ; 4b 4-Zeilenmodus, 5x7
25
  call  OutLcdControl
26
  movlw  B'00101000'  ; 4c 4-Bit Mode; RE-Bit aus
27
  call  OutLcdControl
28
  movlw  B'00000001'  ; 5 löschen und cursor home
29
  call  OutLcdControl  
30
  movlw  B'00001000'  ; 6 display off
31
  call  OutLcdControl
32
  movlw  B'00000110'  ; 7 entry mode, increment, disable display-shift
33
  call  OutLcdControl
34
  movlw  B'00000011'  ; 8 cursor home, cursor home
35
  call  OutLcdControl
36
  movlw  B'00001100'  ; 9 display on, cursor off, blink off
37
  call  OutLcdControl

Eventuell nützt es dir ja was.
Sven

von Dennis G. (hans_angemeldet)


Lesenswert?

Da war doch auch mal was mit dreimal hintereinander senden oder? weil 
mitder Init vom Datnblatt, gehts auf jeden Fall net oder machte ich was 
falsch?

In Assembler bin ich jetzt net gut, drum verstehich da auch nix, aber 
der ungefäre Ablauf deiner Init würde mir helfen.

Guten Abend noch

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>Okay Tshculdigung, hab halt immer die PINS high oder Low gesetz, und
>dann 5 ms abgewartet ;)

Ups. So geht das überhaupt nicht.

Das Display hat 3 Steuerleitungen:

RS- Gibt an, ob es sich um Daten oder Befehle handelt.
RW- Entscheidet über Lesen oder Schreiben
E - Mit der fallenden Flanke werden die an D0-D7 anliegenden 
Daten/Befehle übernommen

Um z.B. den Befehl 'Function Set' lt. Datenblatt an das Display zu 
übergeben must du folgendes machen:

E auf H setzen
RS auf L setzen
RW auf L setzen
an D7-D0 $34 anlegen
E auf L setzen
kurz warten
E auf H setzen.

Ich habe dir mal das Datenblatt von dem Kontroller angehängt, der in 
deinem Display ist. Auf S.49 sind die Signale dargestellt.

Meine C-Kenntnisse sind etwas rudimentär, aber muss man dein 'Programm' 
so interpretieren, das die Datenleitungen an verschiedenen Ports hängen?

MfG Spess

von Dennis G. (hans_angemeldet)


Lesenswert?

Cool danke man, du hast des echt super erzählt, hätt sowas nie aus dem 
Datenblatt herausgelesen, weil da war ja eins dabei, aber ich denk das 
ist beim ersten mal normal oder? ;) Werd mich nacher mal dran setzen ;)

DANKE schonmal, denk jetzt wirds auch gehen ;)

von Dennis G. (hans_angemeldet)


Lesenswert?

Kann es sein, dass die Init vom Datenblatt nicht geht? weil da steht ds 
so:

00 00110100
00 00001001
00 00110000
00 00001111
00 00000001
00 00000110

und dann hab ich den Code so geschrieen wie oben beschrieben:
1
void LCD_INIT(void)
2
{
3
   DDRB=0b11111111;     //Port C auf Ausgang
4
   DDRD=0b11111111;     //Port D auf Ausgang
5
6
7
   //00 00110100
8
   //
9
   PORTD |= (1<<PD5);  
10
   PORTD &= ~(1<<PD7);
11
   PORTD &= ~(1<<PD6);
12
13
   PORTB &= ~(1<<PB4);
14
   PORTB &= ~(1<<PB3);
15
   PORTB |= (1<<PB2);
16
   PORTD |= (1<<PD0);
17
   PORTD &= ~(1<<PD1);
18
   PORTD |= (1<<PD2);
19
   PORTD &= ~(1<<PD3);
20
   PORTD &= ~(1<<PD3);
21
22
   PORTD &= ~(1<<PD5);
23
   wait(50);
24
   PORTD |= (1<<PD5);
25
26
   //00 00001001
27
   //
28
   PORTD &= ~(1<<PD7);
29
   PORTD &= ~(1<<PD6);
30
31
   PORTB &= ~(1<<PB4);
32
   PORTB &= ~(1<<PB3);
33
   PORTB &= ~(1<<PB2);
34
   PORTD &= ~(1<<PD0);
35
   PORTD |= (1<<PD1);
36
   PORTD &= ~(1<<PD2);
37
   PORTD &= ~(1<<PD3);
38
   PORTD |= (1<<PD3);
39
40
   PORTD &= ~(1<<PD5);
41
   wait(50);
42
   PORTD |= (1<<PD5);
43
44
   //00 00110000
45
   //
46
   PORTD &= ~(1<<PD7);
47
   PORTD &= ~(1<<PD6);
48
49
   PORTB &= ~(1<<PB4);
50
   PORTB &= ~(1<<PB3);
51
   PORTB |= (1<<PB2);
52
   PORTD |= (1<<PD0);
53
   PORTD &= ~(1<<PD1);
54
   PORTD &= ~(1<<PD2);
55
   PORTD &= ~(1<<PD3);
56
   PORTD &= ~(1<<PD3);
57
58
   PORTD &= ~(1<<PD5);
59
   wait(50);
60
   PORTD |= (1<<PD5);
61
62
   //00 00001111
63
   //
64
   PORTD &= ~(1<<PD7);
65
   PORTD &= ~(1<<PD6);
66
67
   PORTB &= ~(1<<PB4);
68
   PORTB &= ~(1<<PB3);
69
   PORTB &= ~(1<<PB2);
70
   PORTD &= ~(1<<PD0);
71
   PORTD |= ~(1<<PD1);
72
   PORTD |= (1<<PD2);
73
   PORTD |= (1<<PD3);
74
   PORTD |= (1<<PD3);
75
76
   PORTD &= ~(1<<PD5);
77
   wait(50);
78
   PORTD |= (1<<PD5);
79
80
   //00 00000001
81
   //
82
   PORTD &= ~(1<<PD7);
83
   PORTD &= ~(1<<PD6);
84
85
   PORTB &= ~(1<<PB4);
86
   PORTB &= ~(1<<PB3);
87
   PORTB &= ~(1<<PB2);
88
   PORTD &= ~(1<<PD0);
89
   PORTD &= ~(1<<PD1);
90
   PORTD &= ~(1<<PD2);
91
   PORTD &= ~(1<<PD3);
92
   PORTD |= (1<<PD3);
93
94
   PORTD &= ~(1<<PD5);
95
   wait(50);
96
   PORTD |= (1<<PD5);
97
98
   //00 00000110
99
   //
100
   PORTD &= ~(1<<PD7);
101
   PORTD &= ~(1<<PD6);
102
103
   PORTB &= ~(1<<PB4);
104
   PORTB &= ~(1<<PB3);
105
   PORTB &= ~(1<<PB2);
106
   PORTD &= ~(1<<PD0);
107
   PORTD &= ~(1<<PD1);
108
   PORTD |= (1<<PD2);
109
   PORTD |= (1<<PD3);
110
   PORTD &= ~(1<<PD3);
111
112
   PORTD &= ~(1<<PD5);
113
   wait(50);
114
   PORTD |= (1<<PD5);
115
   
116
}

von holger (Gast)


Lesenswert?

Mach doch endlich mal eine Funktion aus deinem
Einzelbitspaghetticode. Sowas schaut sich doch niemand
länger als 10s an.

Dann passiert dir sowas auch nicht:

   PORTD &= ~(1<<PD3);
   PORTD &= ~(1<<PD3);

Zweimal hintereinander macht die Null auch nicht besser.

von Dennis G. (hans_angemeldet)


Lesenswert?

Jo THX aber ausschlaggebend war das nicht, also eig schon, aber hatte 
noch ein Tippfehler, jetzt ist das teil initialisiert, und jetzt kommt 
die zweite hürde, aber ich denk das grig ich hin THX!

von Dennis G. (hans_angemeldet)


Lesenswert?

Hey jetzt ab ich ja alles mal erreicht, also die Init geht jetzt erfekt, 
und ein Befehl, dass der Cursor nach Links und rechts rutscht hab ich 
auch geschrieben.
Was mir jetzt noch fehlt ist der Text, ich weiß, dass der Text in zwei 
Nibbles gesendet wird, aber wie sag ich meiner 8-Bit Init, dass ich 
jetzt eine nText i der Zeile schreiben will?
Ich versteh das Grundprinzip vom senden, High-Nibble senden enablen 
Low-Nibble senden enablen und warten.
Doch wie schreib ich das jetzt in meinem Code?

Hoff jemand kann mir ne Stütze sein.

von spess53 (Gast)


Lesenswert?

Hi

Erst mal vorneweg: Was hat dich geritten, D0..D7 auf zwei Ports zu 
splitten?

>Was mir jetzt noch fehlt ist der Text, ich weiß, dass der Text in zwei
>Nibbles gesendet wird,

Nein, wird genau wie ein Befehl gesendet, nur das RS=H ist. Du bist im 
8-Bit-Mode.

Ich muss mich Holger anschliessen: Was du als erstes brauchst, ist eine 
Funktion, die einen 8-Bit-Wert auf deine Pins verteilt. Oder willst du 
jedes ASCII-Zeichen bitweise verteilen?

MfG Spess

von Dennis G. (hans_angemeldet)


Lesenswert?

Also wenn ich das richtig verstehe dann muss ich nur Nibbles einzeln 
senden, wenn ich einen 4-Bit Mode hab oder?
ja das ist jetzt natürlich doof, weil ich kann ja das nicht so einfach 
mit dem gesplitteten Port macen oder?
Naja das ist mein erstes Display, ich mach noch nicht lang mit den uC, 
drum immer die Fragen;) also wenn ich jetzt einzelne Variablen erstel, 
und denen dann immer die 1 oder die 0 zuweiß, dann geht es ja aber 
sicher nicht mehr in einer Binär Zahl?
Aber ich muss doch noch mehr machen als nur die "Upper Bits" und die 
"Lower Bits" (Kann mir einer sagen was damit gemeint ist?) zu übertragen 
oder?

Danke für das Verständnis ;)

von spess53 (Gast)


Lesenswert?

Hi

Am einfachsten wäre es, wenn du mal mitteilst, wie dein ATMega32 jetzt 
beschaltest ist. Unter Umständen wäre es einfacher, noch mal den 
Lötkolben zu benutzen, als hier irgendwelche Softwareklimmzüge zu 
machen.

MfG Spess

von Dennis G. (hans_angemeldet)


Lesenswert?

PB4
PB3
PB2
PD0

PD1
PD2
PD3
PD3


so ist er zur zeit beschaltet, wobei ich hier jetzt einen jumper hab, um 
den dann auf 4-Bit umzustellen, also PD0 wird dann zu PB1, also 4 Bit 
dann, weiß nicht ob das was bringt, Initialisieren kann ich das auch. 
Aber hier muss ich ja dann auf zwei mal senden oder?

von spess53 (Gast)


Lesenswert?

Hi

>PB4
>PB3
>PB2
>PD0

>PD1
>PD2
>PD3
>PD3
>so ist er zur zeit beschaltet

Und wo gehen die hin?

MfG Spess

von Dennis G. (hans_angemeldet)


Lesenswert?

PB4   7
PB3   6
PB2   5
PB1   4   (oder im 8-Bit Modus PD0)
PD1   3
PD2   2
PD3   1
PD4   0

Meinste so?
Wenn man da eine Funktion schreiben könnte, die auch mit den gemischten 
Ports auskommt macht das ja kein Problem das ist halt alles auf 
Lochraster, drum ist ein zweites Löten nicht allzu gut.
Und dann muss ich einfach nur RS auf Data setzen, das Byte schreiben? 
Wie adressier ich das dann alles? Am besten ist nacher einfach eine 
Funktion, in der ich Das Wort, und den Spalten und Zeilenbeginn übergeb.

von Dennis G. (hans_angemeldet)


Lesenswert?

Also wie wäre dann der genaue Ablauf wenn ich eine Funktion schreiben 
will, welche einen Text an einer besimme Stelle am LCD schreibt? Ich 
verstehe das mit der Adressierung nicht so richtig, die Funktion mit den 
Parametern ist nacher kein Problem mehr. Also mir fehlt nur der Ablauf 
wie oben schon mit dem enable beschrieben wurde.

von Dennis G. (hans_angemeldet)


Lesenswert?

Hat mir denn keiner den Grundsätzlichen Ablauf, wenn ich etwas auf 
diesem Display anzeigen will? Ich brauch nur den Grundsatz, damit ich 
eine Funktion schreiben kann. Hab sonst nix gefunden.

Hoff irgendjemand kennt sich mit dem aus ;)

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

im C File des Anhangs kannst Du solche Abläufe mal sehen.

Servus Wolfgang

von Wolfgang (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

und damit die Bezeichnung der Sonderzeichen leichter fällt .. noch ein 
kleiner header für diesen Controller.

Wolfgang

von Gast (Gast)


Lesenswert?

Hallo,

ich hab die Routine von hier genutzt; funktioniert einwandfrei.

Beitrag "LCD EA DIP204-4 Initialisieren"

Entgegen der Andeutung im Schaltplan den Reset Pin des Displays aber 
keinesfalls auf Ground, sondern per 10kOhm gegen +5V oder einfach 
unbeschaltet lassen.

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.