XMEGA LCD Initialisieren

Gast #3128951
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
Angehängte Dateien:
Gast #3129028
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.
#3129924
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.
Gast #3130053
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

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