Forum: Mikrocontroller und Digitale Elektronik MyAVR Board LCD-Programmierung


von Dany (Gast)


Lesenswert?

Hallo zusammen,

Ich lese hier immmer mal wieder, wenn ich nach Lösungen für µC 
Programmierung suche und bin dankbar für jede Antwort.

Programmiersprache: C
µC: ATmega8
Mein Problem: Ich wollte mithilfe des Lehrheftes "LCD-Programmierung" 
ein Programm schreiben, welches einen einfachen Text auf meinem Display 
anzeigen soll. Dies funktioniert leider noch nicht, weil alle LCD 
Befehle nicht Definiert sind. Laut Lehrheft müsste es Funktionieren, 
doch in der Praxis leider noch nicht. Bibliotheken sind eingebunden, 
fürs LCD gibts keine extra Biliothek.

Quellcode:
1
//----------------------------------------------------------------------
2
#define   F_CPU 3686400  // Taktferquenz des myAVR-Boards
3
#include  <avr\io.h>  // AVR Register und Konstantendefinitionen
4
#include   <util\delay.h>  // Bibliothek mit Warteroutinen
5
//----------------------------------------------------------------------
6
int main (void)        // Hauptprogramm, startet bei Power ON und Reset
7
{  
8
  char  x;
9
  x=0;
10
  _delay_ms(200);
11
  lcd_init();
12
  while (1)
13
    {
14
    x=x^1;
15
    lcd_light(x&1);    //Hintergrundbeleuchtung On/Off
16
    lcd_write("hallo");
17
    //damit text nicht fortlaufend angehängt wird
18
    lcd_clear();
19
    lcd_home();
20
    _delay_ms(100);  
21
    }
22
  return 0;
23
}

Danke schonmal im Vorraus
Gruß Dany

von Dany (Gast)


Angehängte Dateien:

Lesenswert?

Also mein AVR-Studio zeigt folgende errors an (siehe anhang)

von Nils B. (nordlicht_nils)


Lesenswert?

Hallo Dany,

die Funktionen, die Du für die LCD-Ansteuerung nutzt, sind Deinem 
Compiler nicht bekannt. Hast Du vergessen, einen Header einzubinden, 
indem diese definiert sind? Oder hast Du sie aus dem Buch nicht mit 
abgetippt?

Gruß, Nils

von Murmel (Gast)


Lesenswert?

probier es mal hiermit.
1
#define   F_CPU 3686400
2
#include  <avr\io.h>
3
#include  <util\delay.h>
4
5
6
7
/////////////////////////////////////////////////////////////////////////////
8
// allgemeine-Funktionen
9
//---------------------------------------------------------------------------
10
//  wait_ms(..) - Wartet einige Millisekunden
11
//  Die Dauer ist nicht kalibriert.
12
//  PE:  miliSec=Anzahl der zu wartenden Millisekunden
13
//---------------------------------------------------------------------------
14
void wait_ms(int miliSec)
15
{
16
  _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec);  // 4 Zyklen warteschleife
17
}
18
void wait_us(int mikroSec)
19
{
20
  _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec);  // 4 Zyklen warteschleife
21
}
22
//////////////////////////////////////////////////////////////////////////////
23
//  LCD-Funktionen für myAVR-Board + myAVR-LCD
24
//  4-BitModus an PortD Bit 4-7
25
//  PortD Bit 2 = RS, high=Daten, low=Kommando
26
//  PortD Bit 3 = E, high-Impuls für gültige Daten
27
//---------------------------------------------------------------------------
28
//  lcd_send(..) - sendet ein Byte an LCD im 4-Bit-Modus
29
//  RS muss vorher richtig gesetzt sein
30
//  PE:  data=zu sendendes Byte
31
//---------------------------------------------------------------------------
32
void lcd_send(char data)
33
{
34
  // aktuelles RS ermitteln
35
  char rs=PORTD;
36
  rs&=4;
37
  // High-Teil senden
38
  char tmp=data;
39
  tmp&=0xf0;
40
  tmp|=rs;
41
  PORTD=tmp;
42
  // Schreibsignal
43
  sbi(PORTD,3);
44
  cbi(PORTD,3);
45
  // Low-Teil senden
46
  tmp=data;
47
  tmp&=0x0f;
48
  tmp*=16;
49
  tmp|=rs;
50
  PORTD=tmp;
51
  // Schreibsignal
52
  sbi(PORTD,3);
53
  cbi(PORTD,3);
54
  // verarbeiten lassen
55
  wait_ms(1);
56
}
57
//---------------------------------------------------------------------------
58
//  lcd_cmd(..) - sendet ein Kommando an LCD
59
//  PE:  cmd=Kommando-Byte
60
//---------------------------------------------------------------------------
61
void lcd_cmd(char cmd)
62
{
63
  cbi(PORTD,2);    // RS löschen = Kommando
64
  lcd_send(cmd);    // senden
65
}
66
//---------------------------------------------------------------------------
67
//  lcd_write(..) - sendet ein Zeichen (Daten) an LCD
68
//  PE:  text=Zeichen
69
//---------------------------------------------------------------------------
70
void lcd_write(char text)
71
{
72
  sbi(PORTD,2);    // RS setzen = Daten
73
  lcd_send(text);    // senden
74
}
75
//---------------------------------------------------------------------------
76
//  lcd_write(..) - sendet eine Zeichenkette an LCD
77
//  Die Zeichenkette muss mit 0x00 abgeschlossen sein
78
//  PE:  pText=Zeiger auf Zeichenkette
79
//---------------------------------------------------------------------------
80
void lcd_write(char* pText)
81
{
82
  while(pText[0]!=0)
83
  {
84
    lcd_write(pText[0]);
85
    pText++;
86
  }
87
}
88
//---------------------------------------------------------------------------
89
//  lcd_write(..) - sendet eine Zeichenkette an LCD
90
//  PE:  pText=Zeiger auf Zeichenkette
91
//    count=Anzahl der zu sendenden Zeichen
92
//---------------------------------------------------------------------------
93
void lcd_write(char* pText, int count)
94
{
95
  while(count!=0)
96
  {
97
    lcd_write(pText[0]);
98
    pText++;
99
    count--;
100
  }
101
}
102
//---------------------------------------------------------------------------
103
//  lcd_home(..) - Cursor auf Position 1,1
104
//---------------------------------------------------------------------------
105
void lcd_home()
106
{
107
  lcd_cmd(0x02);
108
  wait_ms(2);      // warten
109
}
110
//---------------------------------------------------------------------------
111
//  lcd_clear(..) - löscht die Anzeige im LCD
112
//---------------------------------------------------------------------------
113
void lcd_clear()
114
{
115
  lcd_cmd(0x01);
116
  wait_ms(2);      // warten
117
}
118
//---------------------------------------------------------------------------
119
//  lcd_on(..) - schaltet das LCD an
120
//---------------------------------------------------------------------------
121
void lcd_on()
122
{
123
  lcd_cmd(0x0E);
124
}
125
//---------------------------------------------------------------------------
126
//  lcd_off(..) - schaltet das LCD aus
127
//---------------------------------------------------------------------------
128
void lcd_off()
129
{
130
  lcd_cmd(0x08);
131
}
132
//---------------------------------------------------------------------------
133
//  lcd_goto(..) - setzt die Cursorposition
134
//   PE:  row = Zeile 1..2
135
//    col = Spalte 1..16
136
//---------------------------------------------------------------------------
137
void lcd_goto(int row, int col)
138
{
139
  row--;        // Null-basierend
140
  row&=0x01;      // sicherheitshalber
141
  row*=0x40;      // Zeile nach Bit 6 bringen
142
  col--;        // Null-basierend
143
  col&=0x0f;      // sicherheitshalber
144
  char tmp=row|col;
145
  tmp|=0x80;      // Cursor setzen
146
  lcd_cmd(tmp);    // senden
147
}
148
//---------------------------------------------------------------------------
149
//  lcd_init(..) - Schaltet die Ports und Initialisiert das LCD
150
//---------------------------------------------------------------------------
151
void lcd_init()
152
{
153
  // Port D = Ausgang
154
  DDRD=0xff;
155
  PORTD=0;
156
  // warten bist LCD-Controller gebootet
157
  wait_ms(50);    
158
  // SOFT-RESET
159
  PORTD = 0x30;  //0b00110000;
160
  sbi(PORTD,3);
161
  cbi(PORTD,3);
162
  wait_ms(5);
163
  PORTD = 0x30;  //0b00110000;
164
  sbi(PORTD,3);
165
  cbi(PORTD,3);
166
  wait_us(100);
167
  PORTD = 0x30;  //0b00110000;
168
  sbi(PORTD,3);
169
  cbi(PORTD,3);
170
  wait_ms(5);
171
  
172
  // 4-BitModus einschalten
173
  PORTD=0x20;      
174
  // Schreibsignal
175
  sbi(PORTD,3);
176
  cbi(PORTD,3);
177
  wait_ms(5);
178
  
179
  // ab hier im 4-Bit-Modus
180
  lcd_cmd(0x28);    // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
181
  //lcd_off();
182
  lcd_cmd(0x06);    // Entry Mode
183
  lcd_on();
184
  lcd_clear();
185
}
186
//---------------------------------------------------------------------------
187
// Main-Funktion
188
//---------------------------------------------------------------------------
189
int main (void)
190
{
191
  wait_ms(200);
192
  lcd_init();
193
  lcd_goto(1,1);
194
  lcd_write("Hallo LCD");
195
  lcd_goto(2,1);
196
  lcd_write("12345678");
197
  while (1) {  } // Mainloop
198
return 0;
199
}
200
//---------------------------------------------------------------------------

von dummbord (Gast)


Lesenswert?

der letzte code schmeisst doch nichts als fehlermeldungen raus... bin 
ich zu blöd oder liegts am code?

von dummbord (Gast)


Angehängte Dateien:

Lesenswert?

hier mal der anhang

helft mir mal bitte ich beiss mir schon seit 3 stunden die zähne aus.. 
habs erst mit dem code ausm gcc tutorial funktioniert.. da krieg ichs 
auch nicht ans laufen..

von Dany (Gast)


Lesenswert?

Hallo  Murmel,
bei diesem Quelltext ist nur das problem, dass das "sbi", "clr" und "rs" 
usw nicht declariert sind. --> lösung eventuell?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Mach dir Makros für die fehlenden Ausdrücke:
1
#define sbi(PORT,BIT) PORT |= 1<<(BIT)
2
#define cbi(PORT,BIT) PORT &= ~(1<<(BIT))

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Schreiben_von_Bits
http://www.mikrocontroller.net/articles/Bitmanipulation

Ansonsten sind deine Fehlerbilder witzlos, wenn man den Quelltext nicht 
hat. Man müsste spekulieren, was in den angemoserten Zeilen in der 
Source stehen könnte. Das mache ich nicht.

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.