EA DIP204-4 Datenblatt verständnis

#1297145
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
Persönliche Seite #1297631
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
#1297640
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
#1303923
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.
#1304076
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
}
Persönliche Seite #1304123
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
Gast #1304183
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
Angehängte Dateien:
#1305081
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
}
#1306211
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.
Gast #1306245
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
#1306255
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 ;)
#1306339
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.
#1307136
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren