www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung aus dem Tutorial!


Autor: Olli Polli (fuxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen.

Ich beginne gerade mich in die Welt der Mikrocontroller hineinzuwagen.
Ich arbeite gerade das Tutorial durch und hänge gerade bei der LCD 
Steuerung.

Vielleicht eine kleine Info:
Da ich noch beim Beginn bin, übernimmt das Überschreiben der Programme 
auf den Mirkocontroller mein Asuro. Danach stecke ich immer um. Bisher 
funktioniert das auch alles.


Beim Versuch die ".hex-Datei" zu erzeugen aus dem Beispiel erhalte ich 
immer die Fehlermeldung:

lcd-routines.c:60: undefined reference to `_delay_us',

obwohl ich die "Delay.h"-Datei im gleichen Ordner habe.

Kann mir vielleicht jemand helfen?

Wäre für Hilfe dankbar

Autor: 1.8T-Passat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte immer den Quellcode mitposten. Sonst kann man nur raten...

Autor: Olli Polli (fuxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh... Sorry...

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
//
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar

#include <io.h>
#include "lcd-routines.h"
#include "delay.h"

// 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

   temp1 = temp1 >> 4;
   temp1 = temp1 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp1;               // setzen
   lcd_enable();

   temp2 = temp2 & 0x0F;
   LCD_PORT &= 0xF0;
   LCD_PORT |= temp2;               // setzen
   lcd_enable();

   _delay_us(42);
}

// sendet einen Befehl an das LCD

void lcd_command(unsigned char temp1)
{
   unsigned char temp2 = temp1;

   LCD_PORT &= ~(1<<LCD_RS);        // RS auf 0 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_us(42);
}

// erzeugt den Enable-Puls
void lcd_enable(void)
{
   // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
einfügen
   // Beitrag "Re: Bitte helft mir. Schon wieder AtMega16"
   LCD_PORT |= (1<<LCD_EN);
    _delay_us(1);                   // kurze Pause
   // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
verlängern
   // Beitrag "LCD -> Probleme mit Optimierungsgrad"
   LCD_PORT &= ~(1<<LCD_EN);
}

// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.

void lcd_init(void)
{
   LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN);   // Port auf 
Ausgang schalten

   // muss 3mal 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(5);
   lcd_enable();

   _delay_ms(1);
   lcd_enable();
   _delay_ms(1);

   // 4 Bit Modus aktivieren
   LCD_PORT &= 0xF0;
   LCD_PORT |= 0x02;
   lcd_enable();
   _delay_ms(1);

   // 4Bit  2 Zeilen  5x7
   lcd_command(0x28);

   // Display ein  Cursor aus  kein Blinken
   lcd_command(0x0C);

   // inkrement / kein Scrollen
   lcd_command(0x06);

   lcd_clear();
}

// Sendet den Befehl zur Löschung des Displays

void lcd_clear(void)
{
   lcd_command(CLEAR_DISPLAY);
   _delay_ms(5);
}

// Sendet den Befehl: Cursor Home

void lcd_home(void)
{
   lcd_command(CURSOR_HOME);
   _delay_ms(5);
}

// setzt den Cursor in Zeile y (1..4) Spalte x (0..15)

void set_cursor(uint8_t x, uint8_t y)
{
  uint8_t tmp;

  switch (y) {
    case 1: tmp=0x80+0x00+x; break;    // 1. Zeile
    case 2: tmp=0x80+0x40+x; break;    // 2. Zeile
    case 3: tmp=0x80+0x10+x; break;    // 3. Zeile
    case 4: tmp=0x80+0x50+x; break;    // 4. Zeile
    default: return;                   // für den Fall einer falschen 
Zeile
  }
  lcd_command(tmp);
}

// Schreibt einen String auf das LCD

void lcd_string(char *data)
{
    while(*data) {
        lcd_data(*data);
        data++;
    }
}

-------------------------------------------------------------------

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
//

void lcd_data(unsigned char temp1);
void lcd_string(char *data);
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);

// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#define F_CPU 8000000

// LCD Befehle

#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME   0x02

// Pinbelegung für das LCD, an verwendete Pins anpassen

#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_RS        PD4
#define LCD_EN        PD5

------------------------------------------------------------

#include "asuro.h"
#include "io.h"
#include "iom8.h"
#include <stdlib.h>
#include <avr/io.h>
#include "lcd-routines.h"
#include "lcd-routines.c"
#include "delay.h"
//
// Anpassungen im makefile:
//    ATMega8 => MCU=atmega8 im makefile einstellen
//    lcd-routines.c in SRC = ... Zeile anhängen
//


int main(void)
{
    //lcd_init();
  // lcd_data('T');
    //lcd_data('e');
    //lcd_data('s');
    //lcd_data('t');



    lcd_string("Hello World!");

    while(1)
    {
    }

    return 0;
}

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch mal

#include <util/delay.h>

Autor: Olli Polli (fuxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab ich gerade getestet. ist leider immernoch das gleiche Problem :/

sollte ich vielleicht übergehen und erstmal einen richtigen "Programmer" 
bauen? Kann es daran liegen?

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Olli Polli schrieb:
> hab ich gerade getestet. ist leider immernoch das gleiche Problem :/

Ist WinAVR auch wirklich korrekt installiert?

> sollte ich vielleicht übergehen und erstmal einen richtigen "Programmer"
> bauen? Kann es daran liegen?

Nö, es scheitert ja am Kompilieren, nicht am Programmieren.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weder noch, es scheitert am Linken - "undefined reference"
kommt doch vom Linker, oder?

Autor: Olli Polli (fuxx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ja ich denke WinAVR ist richtig installiert. Hab die Version 20090313 
heruntergeladen und installiert!

Wie bekomm ich denn den fehlerhaften Link behoben?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe jetzt nicht alles gelesen, aber:

welcher Controller eigentlich?
Häng Deinen Projekt-Ordner mal als Archiv hier rein, so daß man es 
überhaupt compilieren könnte.

Die Code-Fragmente hier im Text tue ich mir jedenfalls nicht an, die 
fehlenden passenden Teile (lcd-routines.h als Beispiel) suche ich mir 
auch nicht zusammen...

So auf Anhieb:
#include <io.h>

Der Standardpfad ist <avr/io.h>
Bei _delay ähnlich:
#include <io.h>
ist #include <util/delay.h>

was macht der Inhalt von lcd-routines.c oben in Deinem Posting?
Das ist eine eigene .c Datei

Gruß aus Berlin
Michael

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.