LCD-Ansteuerung funktioniert nicht

Gast #530622
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
Gast #530664
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
Gast #530698
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.
Gast #530719
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"

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