Forum: Mikrocontroller und Digitale Elektronik LCD mit AVR ansteuern


von Ulrich B. (Firma: Technikerschule) (ulli11)


Lesenswert?

Hallo Zusammen,

Ich hab nahezu alle Einträge zu diesem Thema gelesen, komme aber 
trotzdem nicht weiter.


Ich versuche ein einfaches LCD mit dem ATmega 8 515l anzusteuern (auf 
dem STK 500).

Wo fange ich an. Ich habe einige Tutorials versucht jedoch ohne Erfolg.

Ich denke mal ich muss mit einer Include Datei beginnen?

Das ist die Datei. Diese Habe ich eins zu eins aus dem Tutorial hier 
genommen.
1
#ifndef LCD_ROUTINES_H
2
#define LCD_ROUTINES_H
3
4
#ifndef F_CPU
5
#define F_CPU 8000000
6
#endif
7
8
9
#define LCD_PORT PORTD
10
#define LCD_DDR       DDRD
11
#define LCD_DB        PD0
12
13
#define LCD_RS        PD4
14
15
#define LCD_EN        PD5
16
17
#define LCD_BOOTUP_MS           15
18
#define LCD_ENABLE_US           20
19
#define LCD_WRITEDATA_US        46
20
#define LCD_COMMAND_US          42
21
22
#define LCD_SOFT_RESET_MS1      5
23
#define LCD_SOFT_RESET_MS2      1
24
#define LCD_SOFT_RESET_MS3      1
25
#define LCD_SET_4BITMODE_MS     5
26
27
#define LCD_CLEAR_DISPLAY_MS    2
28
#define LCD_CURSOR_HOME_MS      2
29
30
#define LCD_DDADR_LINE1         0x00
31
#define LCD_DDADR_LINE2         0x40
32
#define LCD_DDADR_LINE3         0x10
33
#define LCD_DDADR_LINE4         0x50
34
35
void lcd_init( void );
36
37
void lcd_clear( void );
38
39
void lcd_home( void );
40
41
void lcd_setcursor( uint8_t spalte, uint8_t zeile );
42
43
void lcd_data( uint8_t data );
44
45
void lcd_string( const char *data );
46
47
void lcd_generatechar( uint8_t code, const uint8_t *data );
48
49
void lcd_command( uint8_t data );
50
51
52
#define LCD_CLEAR_DISPLAY       0x01
53
54
55
#define LCD_CURSOR_HOME         0x02
56
57
58
#define LCD_SET_ENTRY           0x04
59
60
#define LCD_ENTRY_DECREASE      0x00
61
#define LCD_ENTRY_INCREASE      0x02
62
#define LCD_ENTRY_NOSHIFT       0x00
63
#define LCD_ENTRY_SHIFT         0x01
64
65
66
#define LCD_SET_DISPLAY         0x08
67
68
#define LCD_DISPLAY_OFF         0x00
69
#define LCD_DISPLAY_ON          0x04
70
#define LCD_CURSOR_OFF          0x00
71
#define LCD_CURSOR_ON           0x02
72
#define LCD_BLINKING_OFF        0x00
73
#define LCD_BLINKING_ON         0x01
74
75
76
#define LCD_SET_SHIFT           0x10
77
78
#define LCD_CURSOR_MOVE         0x00
79
#define LCD_DISPLAY_SHIFT       0x08
80
#define LCD_SHIFT_LEFT          0x00
81
#define LCD_SHIFT_RIGHT         0x04
82
83
84
#define LCD_SET_FUNCTION        0x20
85
86
#define LCD_FUNCTION_4BIT       0x00
87
#define LCD_FUNCTION_8BIT       0x10
88
#define LCD_FUNCTION_1LINE      0x00
89
#define LCD_FUNCTION_2LINE      0x08
90
#define LCD_FUNCTION_5X7        0x00
91
#define LCD_FUNCTION_5X10       0x04
92
93
#define LCD_SOFT_RESET          0x30
94
95
96
#define LCD_SET_CGADR           0x40
97
98
#define LCD_GC_CHAR0            0
99
#define LCD_GC_CHAR1            1
100
#define LCD_GC_CHAR2            2
101
#define LCD_GC_CHAR3            3
102
#define LCD_GC_CHAR4            4
103
#define LCD_GC_CHAR5            5
104
#define LCD_GC_CHAR6            6
105
#define LCD_GC_CHAR7            7
106
107
#define LCD_SET_DDADR           0x80
108
109
#endif /* LCD-ROUTINES_H_ */


Genauso, wie das Programm:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
4
int main(void)
5
{
6
 
7
  lcd_init();
8
 
9
 
10
  lcd_data( 'T' );
11
  lcd_data( 'e' );
12
  lcd_data( 's' );
13
  lcd_data( 't' );
14
 
15
 
16
  lcd_setcursor( 0, 2 );
17
 
18
19
  lcd_string("Hello World!");
20
 
21
  while(1)
22
  {
23
  }
24
 
25
  return 0;
26
}


Weiß jemand was falsch ist. Oder kennt jemand ein gutes Tutorial? Eins 
für Anfänger?

Danke und Grüße

von g457 (Gast)


Lesenswert?

> Wo fange ich an.

Vorzugsweise mit der Hardware - was für ein Display ist es ∗genau∗ und 
wie hast Du es ∗genau∗ angeschlossen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ulrich B. schrieb:
> Weiß jemand was falsch ist.

Du zeigst Deine Schaltung nicht.

Du beschreibst nicht, was nicht funktioniert.

Du erwähnst nicht, ob Dein Compiler Fehlermeldungen ausgibt.

von M. P. (phpmysqlfreak)


Lesenswert?

Ulrich B. schrieb:
> Oder kennt jemand ein gutes Tutorial? Eins
> für Anfänger?

AVR-GCC-Tutorial schon gefunden?

von Ulrich B. (Firma: Technikerschule) (ulli11)


Angehängte Dateien:

Lesenswert?

Ich dachte es ist einfacher banaler Fehler.

Aber ok.

Beim LCD handelt es sich um das LCD Modul "1602".

Schaltplan und Fehlermeldungen sind im Anhang.

von M. P. (phpmysqlfreak)


Lesenswert?

> Fehler.png
> 189 KB, 7 Downloads

Bei über 80% weiß und unnötiger Bildgröße. - Die Meldungen lassen sich 
mit der rechten Maustaste auch kopieren, soweit ich weiß. Nagut..


Hast du die "lcd-routines.c" auch im Ordner?

Im Projekt selbst ist sie nicht aufgeführt, weshalb sie nicht
übersetzt werden kann - dann gibts am Ende auch kein
Programm für den µC.

Edit:
Ulrich B. schrieb:
> Ich versuche ein einfaches LCD mit dem ATmega 8 515l anzusteuern (auf
> dem STK 500).

Im Atmel Studio Projekt ist außerdem der ATmega16 eingestellt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ulrich B. schrieb:
> Ich dachte es ist einfacher banaler Fehler.

Ist es auch.

"undefined reference". Klassische Linker-Fehlermeldung.

von Ulrich B. (Firma: Technikerschule) (ulli11)


Lesenswert?

Sorry ich bin neu hier und kenne mich noch nicht wirklich aus.

Nein diese Datei habe ich nicht im Ordner.

So habe die Datei hinzugefügt. Jetzt werden mir keine Fehler mehr 
angezeigt und ich kann das Programm übertragen. Jedoch zeigt mir mein 
Display nur schwarze Felder.


Ah ok jetzt Funktionier es. Vielen Dank.


Wenn ich jetzt irgendwas auf dem Display ausgeben will muss ich das in 
meinem Hauptprogramm machen?

Die beiden Dateien lcd-routins.h und lcd-routins.c lass ich so stehen?

von M. P. (phpmysqlfreak)


Lesenswert?

Die nächste Baustelle könnte der Takt sein, davon ausgegangen, dass der 
Schaltplan so stimmt. Läuft der µC mit dem vorgesehenen Takt?
=> Bitte einmal die Fuses auslesen!

Ulrich B. schrieb:
> #ifndef F_CPU
> #define F_CPU 8000000
> #endif


Eine weitere Sache ist meine Anmerkung von vorher:

Marcel Papst schrieb:
> Edit:
> Ulrich B. schrieb:
>> Ich versuche ein einfaches LCD mit dem ATmega 8 515l anzusteuern (auf
>> dem STK 500).
>
> Im Atmel Studio Projekt ist außerdem der ATmega16 eingestellt.

µC ist nicht gleich µC - auch wenn es die gleiche Familie ist.


//Edit:
Da hat sich wohl was überschnitten zwischen Lesen und Antworten, ich 
lasse es einfach mal so stehen.

von Ulrich B. (Firma: Technikerschule) (ulli11)


Lesenswert?

Ja ich glaube beim Takt muss ich noch was machen.

Wenn ich jetzt die Ausgabe in die while Schleife packe flackert das 
Bild.

Kann ich da noch irgendwas machen?

Oder packt man die Ausgabe gewöhnlich nicht in die Schleife?

Danke und Grüße

von M. P. (phpmysqlfreak)


Lesenswert?

Ulrich B. schrieb:
> Oder packt man die Ausgabe gewöhnlich nicht in die Schleife?

Statischen Text eigentlich nicht.


Sich ändernde Daten Zeigt man an, wenn man µC-Zeit dafür hat bei 
größeren Sachen oder es erfolgt eine Aktualisierung in 0,5 bis 0,7 
Sekunden Schritten.
Das kommt teilweise auf die Anforderungen oder den persönlichen 
Geschmack an.

Ich persönliche lasse das Display mittlerweile meist im Timer-Interrupt 
beschreiben. Alle 10ms ein Zeichen aus dem Puffer, gleichzeitig 
entprellen, Zeiten zählen, wenn notwendig, etc..

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.