Forum: Mikrocontroller und Digitale Elektronik XMEGA LCD Initialisieren


von XMEGA LCD (Gast)


Angehängte Dateien:

Lesenswert?

Hey Leute,
ich weis ihr habt es sich 1000 mal gehört und gelesen aber ich komme 
seit 2 Tagen einfach nicht weiter. Ich versuche mit dem XMEGA128A1 das 
Display
http://www.reichelt.de/index.html?ACTION=3;ARTICLE=31653;SEARCH=lcd16
zu initialisieren.
Der Controller läuft mit 16MHz.

Ich hab schon viele Sachen aus dem Internet an mein Controller angepasst 
aber das LCD macht nicht weiter.

Ich bekomme das Display soweit initialisiert das es 2 Zeilen ganz in 
schwarz anzeigt.

Meine Initialisierung sieht zimlich wild und unübersichtlich aus. Aber 
mehr habe ich nicht und irgentwie weis ich auch nicht wo ich weiter 
ansetzen soll.

Hier mal Code und Pinbelegung

LCD_RS PORTB 0
LCD_RW PORTB 2
LCD_EN PORTB 4

DB0-DB7 PORTA

1
#define sbi(ADDRESS,BIT) ADDRESS |= (1<<BIT) // set Bit
2
#define cbi(ADDRESS,BIT) ADDRESS &= ~(1<<BIT) // clear Bit
3
4
void LCD_init(void)
5
{
6
  wait1ms(16);
7
  cbi(PORTB.OUT,0);
8
  cbi(PORTB.OUT,2);
9
  
10
  wait50us(2);        
11
  
12
  /*Interface auf 8-Bit setzen*/
13
  set_LCD_enable();
14
  wait50us(1);
15
  sbi(PORTA.OUT,4);
16
  sbi(PORTA.OUT,5);
17
  wait50us(1);
18
  clr_LCD_enable();
19
20
  wait1ms(5);
21
22
  cbi(PORTA.OUT,4);
23
  cbi(PORTA.OUT,5);
24
25
  /*Interface auf 8-Bit setzen*/
26
  wait10us(1);
27
  set_LCD_enable();
28
  wait50us(1);
29
  sbi(PORTA.OUT,4);
30
  sbi(PORTA.OUT,5);
31
  wait50us(1);
32
  clr_LCD_enable();
33
34
  wait50us(3);
35
36
  cbi(PORTA.OUT,4);
37
  cbi(PORTA.OUT,5);
38
39
  /*Interface auf 8-Bit setzen*/
40
  wait10us(1);
41
  set_LCD_enable();
42
  wait50us(1);
43
  sbi(PORTA.OUT,4);
44
  sbi(PORTA.OUT,5);
45
  wait50us(1);
46
  clr_LCD_enable();
47
48
  wait50us(1);
49
  
50
  cbi(PORTA.OUT,4);
51
  cbi(PORTA.OUT,5);
52
  
53
  wait10us(1);
54
  set_LCD_enable();
55
  wait50us(1);
56
  sbi(PORTA.OUT,4);
57
  sbi(PORTA.OUT,5);
58
  wait50us(1);
59
  clr_LCD_enable();
60
  
61
  wait50us(1);
62
  
63
  cbi(PORTA.OUT,4);
64
  cbi(PORTA.OUT,5);    
65
66
  /*Set Function*/
67
  wait10us(1);
68
  set_LCD_enable();
69
  wait50us(1);
70
  sbi(PORTA.OUT,3);  //5x7 dots
71
  sbi(PORTA.OUT,4);  //2 line display
72
  sbi(PORTA.OUT,5);  //8 bit interface
73
  wait50us(1);
74
  clr_LCD_enable();
75
  
76
  wait50us(1);
77
78
  cbi(PORTA.OUT,3);
79
  cbi(PORTA.OUT,4);
80
  cbi(PORTA.OUT,5);
81
  
82
  /*Display off*/
83
  wait10us(1);  
84
  set_LCD_enable();
85
  wait50us(1);
86
  sbi(PORTA.OUT,3);
87
  wait50us(1);
88
  clr_LCD_enable();
89
  
90
  wait1ms(2);
91
92
  cbi(PORTA.OUT,3);
93
94
  /*Display Clear*/
95
  wait10us(1);
96
  set_LCD_enable();
97
  wait50us(1);
98
  sbi(PORTA.OUT,0);
99
  wait50us(1);
100
  clr_LCD_enable();
101
102
  wait50us(1);
103
104
  cbi(PORTA.OUT,0);
105
106
  /*Entry Mode Set*/
107
  wait10us(1);
108
  set_LCD_enable();
109
  wait50us(1);
110
  sbi(PORTA.OUT,1);  //Set cursor move Increase
111
  sbi(PORTA.OUT,2);
112
  wait50us(1);
113
  clr_LCD_enable();
114
115
  wait50us(1);
116
117
  cbi(PORTA.OUT,1);
118
  cbi(PORTA.OUT,2);
119
120
  /*Display Ein*/
121
  wait10us(1);
122
  set_LCD_enable();
123
  wait50us(1);
124
  sbi(PORTA.OUT,3);  
125
  sbi(PORTA.OUT,2);  //Display ein
126
  sbi(PORTA.OUT,1);  //Cursor ein
127
  sbi(PORTA.OUT,0);  //Blinkender Cursor
128
  wait50us(1);
129
  clr_LCD_enable();
130
  
131
  wait50us(1);
132
133
  PORTB.OUT =0x00;
134
  PORTA.OUT =0x00;
135
136
137
}
138
139
void set_LCD_enable(void)
140
{
141
  sbi(PORTB.OUT,4);
142
}
143
144
void clr_LCD_enable(void)
145
{
146
  cbi(PORTB.OUT,4);
147
}

Hoffe ihr könnt mir helfen.

Grüße

von Georg G. (df2au)


Lesenswert?

Das Display ist insofern gemein, dass es etwas längere Flachbandkabel 
zum Controller überhaupt nicht mag. Die 25ns Flanke am E-Signal ist 
kritisch. Ich hatte schon Fälle, in denen ein separater Treiber 
notwendig war.

von Peter D. (peda)


Lesenswert?

XMEGA LCD schrieb:
> Meine Initialisierung sieht zimlich wild und unübersichtlich aus.

Solche Copy&Paste Monster guckt sich keiner an, sie sind zu 
fehleranfällig.

Schreib eine einfache Nibble-Funktion und benutze sie.

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296

von XMEGA LCD (Gast)


Lesenswert?

Ich habe grade einmal zwischen den einzelnen Initzialisierungsschritten 
einfach mal zum Teseten 1s warte zeiten eingefügt um zu sehen was das 
Display nach den einzlnen Schritten anzeigt.
Und siehe da es Funktioniert aufeinmal.
Cursor Position änder Funktioniert auch jetzt muss ich nur noch die 
Ausgabe der zeichen hinbekommen.


Zum Kommentar von Peter Dannegger,
Du hast recht der Code sieht wirklich noch nicht schön aus ist aber auch 
nur erstmal zum Testen sobald alles Läuft wird der ganze Code noch in 
Funktionien geschrieben etc. damit es dan Kürtzer ist und besser 
aussieht.

von Peter D. (peda)


Lesenswert?

XMEGA LCD schrieb:
> nur erstmal zum Testen sobald alles Läuft wird der ganze Code noch in
> Funktionien geschrieben

Klingt wie: Ich klebe den Tisch erstmal aus abgebrannten Streichhölzern 
zusammen und wenn er fertig ist, nehme ich richtige Bretter.

Die Verwendung von Funktionen will Dir das Leben erleichtern, d.h. 
unnütze Schreibarbeit und viele Fehlerquellen ersparen.
Du mußt nur eine Funktion debuggen, anstatt hunderte Codezeilen.
Um das Aussehen gehts nicht.

von XMEGA LCD (Gast)


Lesenswert?

Danke für die Antwort.

Habe inzwischen alles sauber in Funktionen Untergebracht. =) und es 
läuft immer noch :D

Ich durchstöber grade das Datenblatt für die nächste Aufgabe. Ich such 
den Event Chanell für den Counter bzw die Eventchannel. Ma sehn wo das 
iost. Danke nochma für die Hilfe

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.