Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung funktioniert nicht


von Tim (Gast)


Lesenswert?

Hallo,

da ich gerne Lernen mochte Microprozessoren zu Programmieren habe ich 
anhand einer Anleitung eine Ansteuerung für ein LCD Diplay programmiert. 
Leider kommt es beim Brennen zu Fehlern, die ich aber nicht finde. Vllt 
kann mir ja jemand helfen der sich damit auskennt.

Ich benutze einen ATmega8 und das passende LCD-Display v2.2 von MyAVR.

Hier die Fehlermeldungen:
1
Hinweis: Es wird die im Quelltext angegebene Einstellung des Prozessors verwendet: ATmega8
2
compilieren ...  In file included  from Displayansteuerung.cc:17:  
3
 
4
delay.h:36  36:2: warning: #warning "This file has been moved to ." 
5
Displayansteuerung.cc  In function `void lcd_init()': 
6
Displayansteuerung.cc:48  48: error: `lcd_cmd' was not declared in this scope 
7
Displayansteuerung.cc:49  49: error: `lcd_off' was not declared in this scope 
8
Displayansteuerung.cc:50  50: error: `lcd_clear' was not declared in this scope 
9
Displayansteuerung.cc:54  54: error: `lcd_on' was not declared in this scope 
10
Displayansteuerung.cc  In function `void lcd_cmd()': 
11
Displayansteuerung.cc:93  93: error: `cmd' was not declared in this scope 
12
Displayansteuerung.cc  In function `void lcd_clear()': 
13
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
14
Displayansteuerung.cc:99  99: error: at this point in file 
15
Displayansteuerung.cc  In function `void lcd_home()': 
16
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
17
Displayansteuerung.cc:106  106: error: at this point in file 
18
Displayansteuerung.cc  In function `void lcd_on()': 
19
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
20
Displayansteuerung.cc:113  113: error: at this point in file 
21
Displayansteuerung.cc  In function `void lcd_on()': 
22
Displayansteuerung.cc:118  118: error: redefinition of `void lcd_on()' 
23
Displayansteuerung.cc:112  112: error: `void lcd_on()' previously defined here 
24
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
25
Displayansteuerung.cc:119  119: error: at this point in file 
26
Displayansteuerung.cc  In function `void lcd_goto(int, int)': 
27
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
28
Displayansteuerung.cc:134  134: error: at this point in file 
29
Displayansteuerung.cc  In function `void lcd_write(char*)': 
30
Displayansteuerung.cc:184  184: error: `lcd_wirte' was not declared in this scope 
31
yansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
32
Displayanst


Und hier der Sourcecode:
1
//----------------------------------------------------------------------
2
// Titel     : LCD-Ansteuerung
3
//----------------------------------------------------------------------
4
// Funktion  : LCD-Ausgaben
5
// Schaltung : MyAVR USB 2.0 Board + LCD Display 2.2
6
//----------------------------------------------------------------------
7
// Prozessor : ATmega8
8
// Takt     : 3.6864 MHz
9
// Sprache   : C
10
// Datum     : 02.12.2005
11
// Version   : 1.3
12
// Autor     : Tim Ullmqann
13
//----------------------------------------------------------------------
14
#define   F_CPU 3686400  // Taktferquenz des myAVR-Boards
15
#include  <avr\io.h>    // AVR Register und Konstantendefinitionen
16
#define   CLOCK 3686400
17
#include  <avr\delay.h>
18
19
//Funktion für Warteschleife 
20
void wait_ms(int miliSec)
21
{
22
  // 4 Zyklen Warteschleife
23
  _delay_loop_2( 1*(CLOCK/(1000/4)) * miliSec);
24
}
25
26
//Funktion zum LCD-Display Initialisieren
27
void lcd_init()
28
{
29
  //Port D = Ausgang
30
  DDRD=0x0Fff;
31
  PORTD= 0;
32
33
  //warten bis LCD-Display gebootet hat
34
  wait_ms(50);
35
36
  //4-BitModus einschalten
37
  PORTD=0x20;
38
39
  //Schreibsignal Enable-Impuls
40
  sbi(PORTD,3);
41
  cbi(PORTD,3);
42
43
  //Zeit zum Umschalten lassen
44
  wait_ms(5);
45
46
  //ab hier im 4 Bit-Modus
47
  //Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
48
  lcd_cmd(0x28);
49
  lcd_off();
50
  lcd_clear;
51
52
  //Entry Mode
53
  lcd_cmd(0x06);
54
  lcd_on();
55
}
56
57
//LCD-Ansteuerung
58
void lcd_send(char data)
59
{
60
  //Aktuelles RS ermitteln
61
  char rs=PORTD;
62
  rs&=4;
63
64
  //High-Teil senden
65
  char tmp=data;
66
  tmp&=0xf0;
67
  tmp|=rs;
68
  PORTD=tmp;
69
70
  //Schreibsignal
71
  sbi(PORTD,3);
72
  cbi(PORTD,3);
73
74
  //Low-Teil senden
75
  tmp=data;
76
  tmp&=0x0f;
77
  tmp*=16;
78
  tmp|=rs;
79
  PORTD=tmp;
80
81
  //Schreibsignal
82
  sbi(PORTD,3);
83
  cbi(PORTD,3);
84
85
  //Verarbeiten lassen
86
  wait_ms(1);  
87
}
88
89
//Funktion zum senden von Kommandos an das LCD-Display
90
void lcd_cmd()
91
{
92
  cbi(PORTD,2); //RS löschen = Kommando folgt
93
  lcd_send(cmd);       
94
}
95
96
//Funktion zur löschen der LCD-Anzeige
97
void lcd_clear()
98
{
99
  lcd_cmd(0x01);
100
  wait_ms(2);     
101
}
102
103
//Funktion zum setzen des LCD-Cursors auf Position 1,1
104
void lcd_home()
105
{
106
  lcd_cmd(0x02);
107
  wait_ms(2);     
108
}
109
110
//Funktion zum einschalten des LCD-Displays
111
void lcd_on()
112
{
113
  lcd_cmd(0x0E);      
114
}
115
116
//Funktion zum ausschalten des LCD-Displays
117
void lcd_on()
118
{
119
  lcd_cmd(0x08);      
120
}
121
122
//Funktion zum setzen des Cursors an eine beliebige Stelle
123
//row = Zeile 1/2
124
//col = Spalte 1..16
125
void lcd_goto(int row, int col)
126
{
127
  row--;          
128
  row&=0x01;        
129
  row*=40;
130
  col--;
131
  col&=0x0f;
132
  char tmp=row|col;
133
  tmp|=0x80;
134
  lcd_cmd(tmp);
135
}
136
137
//Backlight Funktion
138
bool lcd_dimmer_is_init=false;
139
void lcd_light(bool on_off)
140
{
141
  //wenn dimmer an, dann PWM deinit
142
  if (lcd_dimmer_is_init)
143
  {
144
    TCCR1A=0;
145
    lcd_dimmer_is_init=false;
146
  }
147
148
  sbi(DDRB,1); // Port B1 als Ausgang definieren
149
  if(on_off)
150
    sbi(PORTB,1); //AN
151
  else
152
    cbi(PORTB,1); //Aus
153
}
154
155
//Dimmfunktion für LCD-Display
156
void lcd_dimmer(char light)
157
{
158
  //init
159
  if(!lcd_dimmer_is_init)
160
  {
161
    sbi(DDRB,1); //PORRB1 als Ausgang definieren
162
    TCCR1A=0x81; //PWM Mode 1, Channel A
163
    TCCR1A=0x82; //PWM Frequenz CLK/8
164
    lcd_dimmer_is_init=true;
165
  }
166
  OCR1A=light;
167
}
168
169
//Funktion zum Senden eines Zeichens an das LCD-Display
170
//text = Zeichen
171
void lcd_write(char text)
172
{
173
  sbi(PORTB,2);
174
  lcd_send(text);
175
}
176
177
//Funktion zum Senden einer Zeichenkette an das LCD-Display
178
//Zeichenkette muss mit 0x00 abgeschlossen sein
179
//pText = Zeiger auf Zeichenkette
180
void lcd_write(char* pText)
181
{
182
  while(pText[0]!=0)
183
  {
184
    lcd_wirte(pText[0]);
185
    pText++;
186
  }
187
}
188
189
//Funktion zum Senden der gesamten Zeichenkette
190
//count =  Anzahl der zu sendenden Zeichen
191
void lcd_write(char* pText, int count)
192
{
193
  while(count!=0)
194
  {
195
    lcd_write(pText[0]);
196
    pText++;
197
    count--;
198
  }
199
}
200
//----------------------------------------------------------------------
201
main (void)            // Hauptprogramm, startet bei Power ON und Reset
202
{
203
  char d=0;
204
  wait_ms(200);
205
  lcd_init();
206
207
  while(1)
208
  {
209
    lcd_dimmer(d+=5);
210
    lcd_write("Hallo ");
211
    wait_ms(100);
212
  }
213
  return 0;
214
}
215
//----------------------------------------------------------------------

mfG Tim

von Schlaubi Schlumpf (Gast)


Lesenswert?

Hallo
Mit welchem Compiler arbeitest du?

Das  main (void) sollte so sein int main (void).
Oder ist deine IDE anderst?

von Marcel (Gast)


Lesenswert?

Hallo,

schreibe mal anstatt:

void lcd_init()

void lcd_init(void)

du willst ja keine Variable übergeben!

Gruß
Marcel

von ARM-Fan (Gast)


Lesenswert?

Was mir beim schnellen Überfliegen so auffällt:

- Es fehlen die Prototypen der aufgerufenen Unterfunktionen
- lcd_cmd erwartet keinen Parameter, bekommt aber ständig welche 
übergeben

von Tim (Gast)


Lesenswert?

Also ich arbeite mit AVR Workpad.
void lcd_init(void) habe ich abgeändert.
Wegen lcd_cmd habe ich nochmal in dem Buch nachgeschaut also da ist das 
auch so gemacht.

mfG

von holger (Gast)


Lesenswert?

Dann ist das ein Druckfehler !

void lcd_cmd(char cmd)


von Tim (Gast)


Lesenswert?

So habe es mal abgändert jetzt bekomme ich aber folgendes raus:
1
Hinweis: Es wird die im Quelltext angegebene Einstellung des Prozessors verwendet: ATmega8
2
compilieren ...  In file included  from Displayansteuerung.cc:17:  
3
 
4
delay.h:36  36:2: warning: #warning "This file has been moved to ." 
5
Displayansteuerung.cc  In function `void lcd_init()': 
6
Displayansteuerung.cc:91  91: error: `lcd_off' was not declared in this scope 
7
Displayansteuerung.cc:92  92: error: `lcd_clear' was not declared in this scope 
8
Displayansteuerung.cc:96  96: error: `lcd_on' was not declared in this scope 
9
Displayansteuerung.cc  In function `void lcd_on()': 
10
Displayansteuerung.cc:122  122: error: redefinition of `void lcd_on()' 
11
Displayansteuerung.cc:116  116: error: `void lcd_on()' previously defined here 
12
Displayansteuerung.cc  In function `void lcd_write(char*)': 
13
Displayansteuerung.cc:188  188: error: `lcd_wirte' was not declared in this scope

von ARM-Fan (Gast)


Lesenswert?

Wie bereits gesagt: Die Funktionsprototypen fehlen, wo "...not 
declared..." gemeldet wird. Der Compiler kennt die Funktionen an 
dieser Stelle im Programm einfach nicht!

Erstelle also entweder ein Headerfile, in dem du die Funktionsprototypen 
deklarierst und binde dieses mit include ein. Oder schreibe die paar 
Prototypen direkt ganz oben in dein C-File mit rein.

Der Fehler mit "lcd_on" rührt daher, dass du ZWEI mal eine Funktion 
hast, die lcd_on heißt. Sollte wohl eine davon lcd_off sein...

Eigentlich sagen einem die Compiler ziemlich genau, was Sache ist.
Man muß es einfach nur mal durchlesen und beherzigen und sich nicht von
einer langen Fehlerliste erschlagen lassen. Vieles löst sich nach
Korrektur eines Fehlers gleich mit auf.

von holger (Gast)


Lesenswert?

Oder er schiebt lcd_init() kurz vor main().
Dann sind alle benutzten Funktionen für lcd_init() bekannt.

Dann fehlt nur noch der Schreibfehler den die letzte
Fehlermeldung moniert.

von ARM-Fan (Gast)


Lesenswert?

>Dann fehlt nur noch der Schreibfehler den die letzte
>Fehlermeldung moniert.

Ich wollte ja nicht gleich alles verraten ;-)
Aber genau das meinte ich unter anderem mit "Fehlermeldungen genau 
lesen"

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.