www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Nach dem Flashen des ersten Programms keine Anzeige im LCD


Autor: Patrick Leier (masterkennie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
auch ich bin nun dabei mich in die µC-Programmierung einzuarbeiten. 
Nachdem ich heute meinen ersten Test mit dem myAVR-Board und dem 
LCD-AddOn durchführen wollte hab ich ein eher enttäuschendes Ergebnis 
damit erzielt.

Nach dem erstellen des Hex-Files (fehlerfrei) und dem Brennen des 
Hexfiles wird im LCD nix angezeigt außer dem schwarzen Balken. Ein Test 
per myAVR-Quickprog verlief jedoch erfolgreich.

Meine Frage ist jetzt natürlich, woran kann das liegen? Wo muss ich den 
Fehler suchen?

Meine main.c
#include <avr/io.h>
#include "lcd-routines.h"


int main(void){
  
  lcd_init();
  
  lcd_clear();
  
  lcd_home();
  
  lcd_string("Test");


  while(1){
  
  }
  return 0;
}


Die lcd-routines.c
/*Testdatei aus dem AVR-Tutorial*/

//Pinbelegung über defines einstellbar
#include <avr/io.h>
#include <util/delay.h>
#include "lcd-routines.h"

//LCD-Befehle
#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME 0x02

//Pinbelegung für das LCD
#define LCD_PORT  PORTD
#define LCD_DDR   DDRD
#define LCD_RS    4
#define LCD_EN    5


//Sendet ein Datenbyte an das LCD

void lcd_data(unsigned char temp1){

  unsigned char temp2 = temp1;
  
  LCD_PORT |= (1<<LCD_RS);  //RS auf 1 setzen Operator |= sagt: Das Ergebnis des Ausdruckes auf der 
                //                  rechten Seite nach links schieben
                //                  |= ist ein Zuweisungsoperator!
  temp1 = temp1 >> 4;
  temp1 = temp1 & 0x0F;    // &= AND
  LCD_PORT &= 0XF0;
  LCD_PORT |= temp1;
  lcd_enable();
  
  temp2 = temp2 & 0x0F;
  LCD_PORT &= 0xF0;
  LCD_PORT |= temp2;
  lcd_enable();
  
  _delay_ms(42);
}

//sendet einen Befehl an das LCD

void lcd_command(unsigned char temp1){

  unsigned char temp2 = temp1;
  
  LCD_PORT &= ~ (1 << LCD_RS);   //RS Setzen
  temp1 = temp1 >> 4;        //oberes Nibble holen
  temp1 = temp1 & 0x0F;      //maskieren
  LCD_PORT &= 0xF0;
  LCD_PORT |= temp1;        //setzen
  lcd_enable();
  
  temp2 = temp2 & 0x0F;      //unteres Nibble holen und maskieren
  LCD_PORT &= 0xF0;
  LCD_PORT |= temp2;        //setzen
  lcd_enable();
  
  _delay_ms(42);

}

//Den enable Puls erzeugen

void lcd_enable(void){

  LCD_PORT |= (1<<LCD_EN);
  _delay_ms(10);          //kurze Pause machen
  LCD_PORT &= ~ (1<<LCD_EN);
  
}


//Initialisierung
//Die Initialisierung muss am Anfang jedes LCD-Porgramms stattfinden

void lcd_init(void){

  LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN); //Port auf Ausgang schalten
  
  //muss 3 mal hintereinander gesendet werden zur Initialisierung
  
  _delay_ms(15);
  LCD_PORT &= 0xF0;
  LCD_PORT |= 0x03;
  LCD_PORT &= ~ (1<<LCD_RS);   //RS auf 0
  lcd_enable();
  
  _delay_ms(20);
  lcd_enable();
  
  _delay_ms(10);
  lcd_enable();
  
  //4-Bit Modus aktivieren
  LCD_PORT &= 0xF0;
  LCD_PORT |= 0x02;
  lcd_enable();
  
  //Der Befehlssatz kann im Datenblatt des LCD nachgelesen werden
  //4-Bit / 2 Zeilen / 5x7
  lcd_command(0x28);
  
  //Display ein / Cursor aus / kein Blinken
  lcd_command(0x0C);
  
  //inkrement / kein scrollen
  lcd_command(0x06);
  
  //alle bisherigen Zeichen vom LCD löschen
  lcd_clear();
  
}

//Sendet den Befehl zur Löschung des Displays

void lcd_clear(void){

  lcd_command(CLEAR_DISPLAY);
  _delay_ms(20);
  
}


//Sendet den Befehl Cursor auf Homeposition

void lcd_home(void){

  lcd_command(CURSOR_HOME);
  _delay_us(20);

}


//Setzt den Cursor in Zeile y 1...4 Spalte 0...15

void set_cursor(uint8_t x , uint8_t y){

  switch (y){
    case 1: lcd_command(0x80 + 0x00 + x);  //1.Zeile
    case 2: lcd_command(0x80 + 0x40 + x);  //2.Zeile
    case 3: lcd_command(0x80 + 0x10 + x);  //3.Zeile
    case 4: lcd_command(0x80 + 0x50 + x);  //4.Zeile
  }
  
}


//Schreibt einen String aufs Display

void lcd_string(char *data){

  while(*data){
  
    lcd_data(*data);
    data++;
  
  }

}


Und die lcd-routines.h
/*Testdatei aus dem AVR-Tutorial*/

  void lcd_data(unsigned char temp1);
  void lcd_command(unsigned char temp1);
  void lcd_enable(void);
  void lcd_init(void);
  void lcd_home(void);
  void lcd_clear(void);
  void set_cursor(uint8_t x, uint8_t y);


Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Pause ist aber ein bischen sehr "kurz":
_delay_ms(10);          //kurze Pause machen

Kann es sein, dass dir der Unterschied zwischen Mikro- und Millisekunden 
nicht geläufig ist?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ein Test per myAVR-Quickprog verlief jedoch erfolgreich.

Da hat das Display was angezeigt ?

>Meine Frage ist jetzt natürlich, woran kann das liegen? Wo muss ich den
>Fehler suchen?

Beim Anschluss des Displays. Vieleicht ist es nicht wie im Tutorial
angeschlossen.

Autor: Patrick Leier (masterkennie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Diese Pause ist aber ein bischen sehr "kurz":
> _delay_ms(10);          //kurze Pause machen
>
> Kann es sein, dass dir der Unterschied zwischen Mikro- und Millisekunden
> nicht geläufig ist?

Hallo,
doch sicher ist mir der Unterschied zwischen µ und m bekannt. Ich hab 
jedoch keinerlei Erfahrungen was die delays angeht und mich daher auf 
die im Tutorial angegebenen Zeiten verlassen (sie z.T. sogar um 10-15ms 
erhöht).

Was den Anschluss des LCD angeht, daran hatte ich auch schon gedacht und 
daher die Pinangaben mit den Pins auf dem Board verglichen. RS geht an 
PD2 des Controllers (Pin4) und EN geht an PD3 des Controllers (Pin5).

Mit der myAVR-Testsoftware hat das Display den Test-Text fehlerfrei 
angezeigt.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick Leier wrote:

> doch sicher ist mir der Unterschied zwischen µ und m bekannt.

Sicher? Auch dann wenn der C Zeichensatz kein µ mag und daher gerne "u" 
verwendet wird?

> die im Tutorial angegebenen Zeiten verlassen (sie z.T. sogar um 10-15ms
> erhöht).

Nur steht im Tutorial _delay_us(1) drin [1 Mikrosekunde], bei dir 
_delay_ms(10) [10 Millisekunden]. Was schon ziemlich viel mehr ist.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Datenleitungen am AVR sind bei deinem Display anders
angeschlossen als im Tutorial. Das musst du in der
Software korrigieren.

Autor: Patrick Leier (masterkennie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
hmm, dann steh ich da jetzt etwas auf dem Schlauch. Denn die vier 
Datenleitungen des LCD (Pin11-14) sind am PORTD des Controllers 
angeschlossen, so wie auch in der lcd-routines.c definiert, oder versteh 
ich da jetzt was komplett verkehrt?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tutorial:

Pin #-LCD  Bezeichnung-LCD  Pin-µC
4  RS  PD4 am AVR
6  E  PD5 am AVR
11  DB4  PD0 am AVR
12  DB5  PD1 am AVR
13  DB6  PD2 am AVR
14  DB7  PD3 am AVR


Dein Board:

4  RS  PD2 am AVR
6  E  PD3 am AVR
11  DB4  PD4 am AVR
12  DB5  PD5 am AVR
13  DB6  PD6 am AVR
14  DB7  PD7 am AVR

Autor: Patrick Leier (masterkennie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohh,
danke dir. die Details hab ich zu so später Stunde dann doch übersehen, 
danke nochmals.

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.