www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD-Ansteuerung funktioniert nicht


Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

da ich gerne Lernen mochte Microprozessoren zu Programmieren habe ich 
anhand einer Anleitung eine Ansteuerung für ein LCD Diplay programmiert. 
Leider kommt es beim Brennen zu Fehlern, die ich aber nicht finde. Vllt 
kann mir ja jemand helfen der sich damit auskennt.

Ich benutze einen ATmega8 und das passende LCD-Display v2.2 von MyAVR.

Hier die Fehlermeldungen:
Hinweis: Es wird die im Quelltext angegebene Einstellung des Prozessors verwendet: ATmega8
compilieren ...  In file included  from Displayansteuerung.cc:17:  
 
delay.h:36  36:2: warning: #warning "This file has been moved to ." 
Displayansteuerung.cc  In function `void lcd_init()': 
Displayansteuerung.cc:48  48: error: `lcd_cmd' was not declared in this scope 
Displayansteuerung.cc:49  49: error: `lcd_off' was not declared in this scope 
Displayansteuerung.cc:50  50: error: `lcd_clear' was not declared in this scope 
Displayansteuerung.cc:54  54: error: `lcd_on' was not declared in this scope 
Displayansteuerung.cc  In function `void lcd_cmd()': 
Displayansteuerung.cc:93  93: error: `cmd' was not declared in this scope 
Displayansteuerung.cc  In function `void lcd_clear()': 
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
Displayansteuerung.cc:99  99: error: at this point in file 
Displayansteuerung.cc  In function `void lcd_home()': 
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
Displayansteuerung.cc:106  106: error: at this point in file 
Displayansteuerung.cc  In function `void lcd_on()': 
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
Displayansteuerung.cc:113  113: error: at this point in file 
Displayansteuerung.cc  In function `void lcd_on()': 
Displayansteuerung.cc:118  118: error: redefinition of `void lcd_on()' 
Displayansteuerung.cc:112  112: error: `void lcd_on()' previously defined here 
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
Displayansteuerung.cc:119  119: error: at this point in file 
Displayansteuerung.cc  In function `void lcd_goto(int, int)': 
Displayansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
Displayansteuerung.cc:134  134: error: at this point in file 
Displayansteuerung.cc  In function `void lcd_write(char*)': 
Displayansteuerung.cc:184  184: error: `lcd_wirte' was not declared in this scope 
yansteuerung.cc:91  91: error: too many arguments to function `void lcd_cmd()' 
Displayanst 


Und hier der Sourcecode:
//----------------------------------------------------------------------
// Titel     : LCD-Ansteuerung
//----------------------------------------------------------------------
// Funktion  : LCD-Ausgaben
// Schaltung : MyAVR USB 2.0 Board + LCD Display 2.2
//----------------------------------------------------------------------
// Prozessor : ATmega8
// Takt     : 3.6864 MHz
// Sprache   : C
// Datum     : 02.12.2005
// Version   : 1.3
// Autor     : Tim Ullmqann
//----------------------------------------------------------------------
#define   F_CPU 3686400  // Taktferquenz des myAVR-Boards
#include  <avr\io.h>    // AVR Register und Konstantendefinitionen
#define   CLOCK 3686400
#include  <avr\delay.h>

//Funktion für Warteschleife 
void wait_ms(int miliSec)
{
  // 4 Zyklen Warteschleife
  _delay_loop_2( 1*(CLOCK/(1000/4)) * miliSec);
}

//Funktion zum LCD-Display Initialisieren
void lcd_init()
{
  //Port D = Ausgang
  DDRD=0x0Fff;
  PORTD= 0;

  //warten bis LCD-Display gebootet hat
  wait_ms(50);

  //4-BitModus einschalten
  PORTD=0x20;

  //Schreibsignal Enable-Impuls
  sbi(PORTD,3);
  cbi(PORTD,3);

  //Zeit zum Umschalten lassen
  wait_ms(5);

  //ab hier im 4 Bit-Modus
  //Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
  lcd_cmd(0x28);
  lcd_off();
  lcd_clear;

  //Entry Mode
  lcd_cmd(0x06);
  lcd_on();
}

//LCD-Ansteuerung
void lcd_send(char data)
{
  //Aktuelles RS ermitteln
  char rs=PORTD;
  rs&=4;

  //High-Teil senden
  char tmp=data;
  tmp&=0xf0;
  tmp|=rs;
  PORTD=tmp;

  //Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);

  //Low-Teil senden
  tmp=data;
  tmp&=0x0f;
  tmp*=16;
  tmp|=rs;
  PORTD=tmp;

  //Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);

  //Verarbeiten lassen
  wait_ms(1);  
}

//Funktion zum senden von Kommandos an das LCD-Display
void lcd_cmd()
{
  cbi(PORTD,2); //RS löschen = Kommando folgt
  lcd_send(cmd);       
}

//Funktion zur löschen der LCD-Anzeige
void lcd_clear()
{
  lcd_cmd(0x01);
  wait_ms(2);     
}

//Funktion zum setzen des LCD-Cursors auf Position 1,1
void lcd_home()
{
  lcd_cmd(0x02);
  wait_ms(2);     
}

//Funktion zum einschalten des LCD-Displays
void lcd_on()
{
  lcd_cmd(0x0E);      
}

//Funktion zum ausschalten des LCD-Displays
void lcd_on()
{
  lcd_cmd(0x08);      
}

//Funktion zum setzen des Cursors an eine beliebige Stelle
//row = Zeile 1/2
//col = Spalte 1..16
void lcd_goto(int row, int col)
{
  row--;          
  row&=0x01;        
  row*=40;
  col--;
  col&=0x0f;
  char tmp=row|col;
  tmp|=0x80;
  lcd_cmd(tmp);
}

//Backlight Funktion
bool lcd_dimmer_is_init=false;
void lcd_light(bool on_off)
{
  //wenn dimmer an, dann PWM deinit
  if (lcd_dimmer_is_init)
  {
    TCCR1A=0;
    lcd_dimmer_is_init=false;
  }

  sbi(DDRB,1); // Port B1 als Ausgang definieren
  if(on_off)
    sbi(PORTB,1); //AN
  else
    cbi(PORTB,1); //Aus
}

//Dimmfunktion für LCD-Display
void lcd_dimmer(char light)
{
  //init
  if(!lcd_dimmer_is_init)
  {
    sbi(DDRB,1); //PORRB1 als Ausgang definieren
    TCCR1A=0x81; //PWM Mode 1, Channel A
    TCCR1A=0x82; //PWM Frequenz CLK/8
    lcd_dimmer_is_init=true;
  }
  OCR1A=light;
}

//Funktion zum Senden eines Zeichens an das LCD-Display
//text = Zeichen
void lcd_write(char text)
{
  sbi(PORTB,2);
  lcd_send(text);
}

//Funktion zum Senden einer Zeichenkette an das LCD-Display
//Zeichenkette muss mit 0x00 abgeschlossen sein
//pText = Zeiger auf Zeichenkette
void lcd_write(char* pText)
{
  while(pText[0]!=0)
  {
    lcd_wirte(pText[0]);
    pText++;
  }
}

//Funktion zum Senden der gesamten Zeichenkette
//count =  Anzahl der zu sendenden Zeichen
void lcd_write(char* pText, int count)
{
  while(count!=0)
  {
    lcd_write(pText[0]);
    pText++;
    count--;
  }
}
//----------------------------------------------------------------------
main (void)            // Hauptprogramm, startet bei Power ON und Reset
{
  char d=0;
  wait_ms(200);
  lcd_init();

  while(1)
  {
    lcd_dimmer(d+=5);
    lcd_write("Hallo ");
    wait_ms(100);
  }
  return 0;
}
//----------------------------------------------------------------------



mfG Tim

Autor: Schlaubi Schlumpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Mit welchem Compiler arbeitest du?

Das  main (void) sollte so sein int main (void).
Oder ist deine IDE anderst?

Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schreibe mal anstatt:

void lcd_init()

void lcd_init(void)

du willst ja keine Variable übergeben!

Gruß
Marcel

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir beim schnellen Überfliegen so auffällt:

- Es fehlen die Prototypen der aufgerufenen Unterfunktionen
- lcd_cmd erwartet keinen Parameter, bekommt aber ständig welche 
übergeben

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich arbeite mit AVR Workpad.
void lcd_init(void) habe ich abgeändert.
Wegen lcd_cmd habe ich nochmal in dem Buch nachgeschaut also da ist das 
auch so gemacht.

mfG

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann ist das ein Druckfehler !

void lcd_cmd(char cmd)


Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe es mal abgändert jetzt bekomme ich aber folgendes raus:
Hinweis: Es wird die im Quelltext angegebene Einstellung des Prozessors verwendet: ATmega8
compilieren ...  In file included  from Displayansteuerung.cc:17:  
 
delay.h:36  36:2: warning: #warning "This file has been moved to ." 
Displayansteuerung.cc  In function `void lcd_init()': 
Displayansteuerung.cc:91  91: error: `lcd_off' was not declared in this scope 
Displayansteuerung.cc:92  92: error: `lcd_clear' was not declared in this scope 
Displayansteuerung.cc:96  96: error: `lcd_on' was not declared in this scope 
Displayansteuerung.cc  In function `void lcd_on()': 
Displayansteuerung.cc:122  122: error: redefinition of `void lcd_on()' 
Displayansteuerung.cc:116  116: error: `void lcd_on()' previously defined here 
Displayansteuerung.cc  In function `void lcd_write(char*)': 
Displayansteuerung.cc:188  188: error: `lcd_wirte' was not declared in this scope 


Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie bereits gesagt: Die Funktionsprototypen fehlen, wo "...not 
declared..." gemeldet wird. Der Compiler kennt die Funktionen an 
dieser Stelle im Programm einfach nicht!

Erstelle also entweder ein Headerfile, in dem du die Funktionsprototypen 
deklarierst und binde dieses mit include ein. Oder schreibe die paar 
Prototypen direkt ganz oben in dein C-File mit rein.

Der Fehler mit "lcd_on" rührt daher, dass du ZWEI mal eine Funktion 
hast, die lcd_on heißt. Sollte wohl eine davon lcd_off sein...

Eigentlich sagen einem die Compiler ziemlich genau, was Sache ist.
Man muß es einfach nur mal durchlesen und beherzigen und sich nicht von
einer langen Fehlerliste erschlagen lassen. Vieles löst sich nach
Korrektur eines Fehlers gleich mit auf.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder er schiebt lcd_init() kurz vor main().
Dann sind alle benutzten Funktionen für lcd_init() bekannt.

Dann fehlt nur noch der Schreibfehler den die letzte
Fehlermeldung moniert.

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dann fehlt nur noch der Schreibfehler den die letzte
>Fehlermeldung moniert.

Ich wollte ja nicht gleich alles verraten ;-)
Aber genau das meinte ich unter anderem mit "Fehlermeldungen genau 
lesen"

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.