LCD mit AVR ansteuern

OP (Firma: Technikerschule) #3941625
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
#3941661
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.
OP (Firma: Technikerschule) #3941681
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?
#3941688
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.
#3941727
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..

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