mikrocontroller.net

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


Autor: Stiefei (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...
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
 #include <avr/interrupt.h>          // für sei(), cli() und ISR()
#include <avr/iom8515.h>
#include <stdlib.h>              
#include <util/delay.h>      
#include "LCD.h"


#define BAUD 9600UL 
#define F_CPU 1000000UL


int main(void)
{
//EINGÄNGE
DDRA = 0x00;      //Die PINA's sind Eingänge
PORTA = 0xff;      //PULLUP AKTIV --> zum schalten wird ein 
            //Low_signal benötigt
//AUSGÄNGE         
DDRB = 0xff;      //DATENRICHTUNGSREGISTER AUF AUSGANG    
PORTB = 0xff;      //SCHALTE AUSGÄNGE LOW; STANDARTFALL: HIGHPEGEL


//**************************** INITIALIESIERUNG LCD *******************************

////////////////////////////////////////////////////////////////////////////////
// Erzeugt einen Enable-Puls
void lcd_enable( void )
{
    LCD_PORT |= (1<<LCD_EN);     // Enable auf 1 setzen
    _delay_us( LCD_ENABLE_US );  // kurze Pause
    LCD_PORT &= ~(1<<LCD_EN);    // Enable auf 0 setzen

}

////////////////////////////////////////////////////////////////////////////////
// Sendet eine 4-bit Ausgabeoperation an das LCD
void lcd_out( uint8_t data )
{
    data &= 0xF0;                       // obere 4 Bit maskieren
 
    LCD_PORT &= ~(0xF0>>(4-LCD_DB));    // Maske löschen
    LCD_PORT |= (data>>(4-LCD_DB));     // Bits setzen
    lcd_enable();
}

////////////////////////////////////////////////////////////////////////////////
// Sendet einen Befehl an das LCD
void lcd_command( uint8_t data )
{
    LCD_PORT &= ~(1<<LCD_RS);    // RS auf 0 setzen
 
    lcd_out( data );             // zuerst die oberen, 
    lcd_out( data<<4 );           // dann die unteren 4 Bit senden
 
    _delay_us( LCD_COMMAND_US );
}


/////////////////////////////////////////////////////////////////////////////////
//Löschen des Displays
void lcd_clear( void )
{
    lcd_command( LCD_CLEAR_DISPLAY );
    _delay_ms( LCD_CLEAR_DISPLAY_MS );
}


////////////////////////////////////////////////////////////////////////////////
// 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
                   (1<<LCD_EN);                 // Enable Leitung
    LCD_DDR |= pins;
 
    // initial alle Ausgänge auf Null
    LCD_PORT &= ~pins;


   // warten auf die Bereitschaft des LCD
    _delay_ms( LCD_BOOTUP_MS );
    
    // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung
    lcd_out( LCD_SOFT_RESET );
    _delay_ms( LCD_SOFT_RESET_MS1 );
 
    lcd_enable();
    _delay_ms( LCD_SOFT_RESET_MS2 );
 
    lcd_enable();
    _delay_ms( LCD_SOFT_RESET_MS3 );
 
    // 4-bit Modus aktivieren 
    lcd_out( LCD_SET_FUNCTION |
             LCD_FUNCTION_4BIT );
    _delay_ms( LCD_SET_4BITMODE_MS );
 
    // 4-bit Modus / 2 Zeilen / 5x7
    lcd_command( LCD_SET_FUNCTION |
                 LCD_FUNCTION_4BIT |
                 LCD_FUNCTION_2LINE |
                 LCD_FUNCTION_5X7 );
 
    // Display ein / Cursor aus / Blinken aus
    lcd_command( LCD_SET_DISPLAY |
                 LCD_DISPLAY_ON |
                 LCD_CURSOR_OFF |
                 LCD_BLINKING_OFF); 
 
    // Cursor inkrement / kein Scrollen
    lcd_command( LCD_SET_ENTRY |
                 LCD_ENTRY_INCREASE |
                 LCD_ENTRY_NOSHIFT );
 
    lcd_clear();

  
////////////////////////////////////////////////////////////////////////////////







//*******************************HAUPTPROGRAMM**************************************

while(1)      //MAINSCHLEIFE
{
    PORTB |= (1<<PINB); 
        _delay_ms(1000);
    PORTB &= ~(1<<PINB);
        _delay_ms(1000);
}



return(0);        //Nichts zurückmelden
}            //Ende main

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stiefei (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.