Forum: Compiler & IDEs Bekomme DISPLAY HD44780 nicht zum laufen!


von Stiefei (Gast)


Lesenswert?

Hallo,

Ich bekomm mein Display einfach nicht zum laufen. :( Es zeigt einen 
Schwarzen Balken an, das zumindestens. Ich steuer es im 4 Bit Modus an. 
Verwendet hab ich dabei den C code vom GCC Tutorial, um zu sehen ob sich 
überhaupt etwas tut. Leider bin ich noch nicht so erfahren mit C.

gcc Tutorial:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
von dort hab ich die Komplette Header-Datei und teilweise den C code!

Das Display:
http://www.mikrocontroller.net/articles/HD44780
Board:
STK500
Chip:
Atmega 8515L
Programm:
AVRSTUDIO Optimierung Os-

Ich wäre einem göttlich dankbar der mir hilft, häng schon ne Zeit lang 
fest! Es kommen leider keine Fehlermeldungen!

LG Stiefei
1
 #include <avr/interrupt.h>          // für sei(), cli() und ISR()
2
#include <avr/iom8515.h>
3
#include <stdlib.h>              
4
#include <util/delay.h>      
5
#include "LCD.h"
6
7
8
#define BAUD 9600UL 
9
#define F_CPU 1000000UL
10
11
12
int main(void)
13
{
14
//EINGÄNGE
15
DDRA = 0x00;      //Die PINA's sind Eingänge
16
PORTA = 0xff;      //PULLUP AKTIV --> zum schalten wird ein 
17
            //Low_signal benötigt
18
//AUSGÄNGE         
19
DDRB = 0xff;      //DATENRICHTUNGSREGISTER AUF AUSGANG    
20
PORTB = 0xff;      //SCHALTE AUSGÄNGE LOW; STANDARTFALL: HIGHPEGEL
21
22
23
//**************************** INITIALIESIERUNG LCD *******************************
24
25
////////////////////////////////////////////////////////////////////////////////
26
// Erzeugt einen Enable-Puls
27
void lcd_enable( void )
28
{
29
    LCD_PORT |= (1<<LCD_EN);     // Enable auf 1 setzen
30
    _delay_us( LCD_ENABLE_US );  // kurze Pause
31
    LCD_PORT &= ~(1<<LCD_EN);    // Enable auf 0 setzen
32
33
}
34
35
////////////////////////////////////////////////////////////////////////////////
36
// Sendet eine 4-bit Ausgabeoperation an das LCD
37
void lcd_out( uint8_t data )
38
{
39
    data &= 0xF0;                       // obere 4 Bit maskieren
40
 
41
    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
42
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
43
    lcd_enable();
44
}
45
46
////////////////////////////////////////////////////////////////////////////////
47
// Sendet einen Befehl an das LCD
48
void lcd_command( uint8_t data )
49
{
50
    LCD_PORT &= ~(1<<LCD_RS);    // RS auf 0 setzen
51
 
52
    lcd_out( data );             // zuerst die oberen, 
53
    lcd_out( data<<4 );           // dann die unteren 4 Bit senden
54
 
55
    _delay_us( LCD_COMMAND_US );
56
}
57
58
59
/////////////////////////////////////////////////////////////////////////////////
60
//Löschen des Displays
61
void lcd_clear( void )
62
{
63
    lcd_command( LCD_CLEAR_DISPLAY );
64
    _delay_ms( LCD_CLEAR_DISPLAY_MS );
65
}
66
67
68
////////////////////////////////////////////////////////////////////////////////
69
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
70
71
 
72
     // verwendete Pins auf Ausgang schalten
73
    uint8_t pins = (0x0F << LCD_DB) |           // 4 Datenleitungen
74
                   (1<<LCD_RS) |                // R/S Leitung
75
                   (1<<LCD_EN);                 // Enable Leitung
76
    LCD_DDR |= pins;
77
 
78
    // initial alle Ausgänge auf Null
79
    LCD_PORT &= ~pins;
80
81
82
   // warten auf die Bereitschaft des LCD
83
    _delay_ms( LCD_BOOTUP_MS );
84
    
85
    // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung
86
    lcd_out( LCD_SOFT_RESET );
87
    _delay_ms( LCD_SOFT_RESET_MS1 );
88
 
89
    lcd_enable();
90
    _delay_ms( LCD_SOFT_RESET_MS2 );
91
 
92
    lcd_enable();
93
    _delay_ms( LCD_SOFT_RESET_MS3 );
94
 
95
    // 4-bit Modus aktivieren 
96
    lcd_out( LCD_SET_FUNCTION |
97
             LCD_FUNCTION_4BIT );
98
    _delay_ms( LCD_SET_4BITMODE_MS );
99
 
100
    // 4-bit Modus / 2 Zeilen / 5x7
101
    lcd_command( LCD_SET_FUNCTION |
102
                 LCD_FUNCTION_4BIT |
103
                 LCD_FUNCTION_2LINE |
104
                 LCD_FUNCTION_5X7 );
105
 
106
    // Display ein / Cursor aus / Blinken aus
107
    lcd_command( LCD_SET_DISPLAY |
108
                 LCD_DISPLAY_ON |
109
                 LCD_CURSOR_OFF |
110
                 LCD_BLINKING_OFF); 
111
 
112
    // Cursor inkrement / kein Scrollen
113
    lcd_command( LCD_SET_ENTRY |
114
                 LCD_ENTRY_INCREASE |
115
                 LCD_ENTRY_NOSHIFT );
116
 
117
    lcd_clear();
118
119
  
120
////////////////////////////////////////////////////////////////////////////////
121
122
123
124
125
126
127
128
//*******************************HAUPTPROGRAMM**************************************
129
130
while(1)      //MAINSCHLEIFE
131
{
132
    PORTB |= (1<<PINB); 
133
        _delay_ms(1000);
134
    PORTB &= ~(1<<PINB);
135
        _delay_ms(1000);
136
}
137
138
139
140
return(0);        //Nichts zurückmelden
141
}            //Ende main

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Ich bekomm mein Display einfach nicht zum laufen. :(

Welches genau? Gibt es ein Datenblatt?

> Es zeigt einen
> Schwarzen Balken an, das zumindestens.

d.h. die Initialisierung per Software funktioniert nicht.

Im folgenden Code fehlt der Funktionsheader so wie er im Tutorial 
steht!

>/////////////////////////////////////////////////////////////////////// /////////
>// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
>
>
>     // verwendete Pins auf Ausgang schalten
>    uint8_t pins = (0x0F << LCD_DB) |           // 4 Datenleitungen
>                   (1<<LCD_RS) |                // R/S Leitung

Der Rest vom Code aus dem Tutorial wurde mit Schuhen und Strümpfen in 
den Funktionskörper von main() gepackt. So schreibt man keine 
C-Programme. Wie die Funktionen benutzt werden zeigt doch schön das 
Tutorial bei dem LCD-Beispiel 1 und beim LCD Beispiel 2.

> Ich steuer es im 4 Bit Modus an.
> Verwendet hab ich dabei den C code vom GCC Tutorial, um zu sehen ob sich
> überhaupt etwas tut. Leider bin ich noch nicht so erfahren mit C.

Wenn du irgendwas im Code änderst, bitte kennzeichnen. Der Code aus dem 
Tuttorial funktioniert und Fehler schleichen sich am ehesten durch 
Änderungen rein.

Wie ist die Pinzuordnung zwischen Atmega 8515L über STK500 zum Display? 
Ist das dann auch passend in der LCD.h definiert? Eine Skizze von diesem 
Schaltplanausschnitt und der Inhalt deiner LCD.h (Anhang!) wären 
sinnvoll.

> #define F_CPU 1000000UL
Stimmt das, läuft dein AVR wirklich mit 1 MHz?
Wenn diese Definition hier gemacht wird und nicht in AVR Studio, muss 
die Zeile vor dem Include von util/delay.h stehen. Steht sie nur 
danach müsste beim Kompilieren eine Warnmeldung erscheinen. Hattest du 
Warnmeldungen?

>     PORTB |= (1<<PINB);
Ist seltsam, denn PINB ist ein kompletter Eingangsport. Die Konstanten 
zur lesbareren Schreibweise der Pins haben Ziffern 0-7 am Ende.

von Stiefei (Gast)


Lesenswert?

hey,

so jezt läufts, ich sag Danke! Hab alle deine Sachen berücksichtig und 
siehe da es läuft!
Habs jezt auch zerlegt und nicht alles in eine große Datei gepackt!


LG

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.