Forum: Compiler & IDEs LCD Ansteuerung in C AVR Studio 4 Problem


von Skywalker1981 (Gast)


Lesenswert?

Hallo Freaks....

wenn ich das C Programm "LCD2 Beispiel Ausgabe" im AVR Studio 
compeiliere und Linke bekomme ich folgende Fehlermeldungen.
Im AVR Workpad funktioniert es, aber ich möchte undbedingt das AVR 
Studio zum programieren nehmen.

Bitte dringend um Hilfe....


Build started 27.2.2008 at 13:20:55
avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP 
-MT display.o -MF dep/display.o.d  -c  ../display.c
../display.c: In function 'lcd_send':
../display.c:43: warning: implicit declaration of function 'sbi'
../display.c:44: warning: implicit declaration of function 'cbi'
../display.c: At top level:
../display.c:81: error: conflicting types for 'lcd_write'
../display.c:71: error: previous definition of 'lcd_write' was here
../display.c: In function 'lcd_write':
../display.c:84: warning: passing argument 1 of 'lcd_write' makes 
pointer from integer without a cast
../display.c: At top level:
../display.c:94: error: conflicting types for 'lcd_write'
../display.c:71: error: previous definition of 'lcd_write' was here
../display.c: In function 'lcd_write':
../display.c:97: warning: passing argument 1 of 'lcd_write' makes 
pointer from integer without a cast
../display.c:97: error: too few arguments to function 'lcd_write'
../display.c: In function 'main':
../display.c:194: error: too few arguments to function 'lcd_write'
../display.c:196: error: too few arguments to function 'lcd_write'
make: *** [display.o] Error 1
Build failed with 7 errors and 4 warnings...


Hier das Programm:

#define   F_CPU 3686400
#include  <avr\io.h>
#include  <util\delay.h>



//////////////////////////////////////////////////////////////////////// 
/////
// allgemeine-Funktionen
//---------------------------------------------------------------------- 
-----
//  wait_ms(..) - Wartet einige Millisekunden
//  Die Dauer ist nicht kalibriert.
//  PE:  miliSec=Anzahl der zu wartenden Millisekunden
//---------------------------------------------------------------------- 
-----
void wait_ms(int miliSec)
{
  _delay_loop_2( 1*(F_CPU/(1000/4)) * miliSec);  // 4 Zyklen 
warteschleife
}
void wait_us(int mikroSec)
{
  _delay_loop_2( 1*(F_CPU/(1000000/4)) * mikroSec);  // 4 Zyklen 
warteschleife
}
//////////////////////////////////////////////////////////////////////// 
//////
//  LCD-Funktionen für myAVR-Board + myAVR-LCD
//  4-BitModus an PortD Bit 4-7
//  PortD Bit 2 = RS, high=Daten, low=Kommando
//  PortD Bit 3 = E, high-Impuls für gültige Daten
//---------------------------------------------------------------------- 
-----
//  lcd_send(..) - sendet ein Byte an LCD im 4-Bit-Modus
//  RS muss vorher richtig gesetzt sein
//  PE:  data=zu sendendes Byte
//---------------------------------------------------------------------- 
-----
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);
}
//---------------------------------------------------------------------- 
-----
//  lcd_cmd(..) - sendet ein Kommando an LCD
//  PE:  cmd=Kommando-Byte
//---------------------------------------------------------------------- 
-----
void lcd_cmd(char cmd)
{
  cbi(PORTD,2);    // RS löschen = Kommando
  lcd_send(cmd);    // senden
}
//---------------------------------------------------------------------- 
-----
//  lcd_write(..) - sendet ein Zeichen (Daten) an LCD
//  PE:  text=Zeichen
//---------------------------------------------------------------------- 
-----
void lcd_write(char text)
{
  sbi(PORTD,2);    // RS setzen = Daten
  lcd_send(text);    // senden
}
//---------------------------------------------------------------------- 
-----
//  lcd_write(..) - sendet eine Zeichenkette an LCD
//  Die Zeichenkette muss mit 0x00 abgeschlossen sein
//  PE:  pText=Zeiger auf Zeichenkette
//---------------------------------------------------------------------- 
-----
void lcd_write(char* pText)
{
  while(pText[0]!=0)
  {
    lcd_write(pText[0]);
    pText++;
  }
}
//---------------------------------------------------------------------- 
-----
//  lcd_write(..) - sendet eine Zeichenkette an LCD
//  PE:  pText=Zeiger auf Zeichenkette
//    count=Anzahl der zu sendenden Zeichen
//---------------------------------------------------------------------- 
-----
void lcd_write(char* pText, int count)
{
  while(count!=0)
  {
    lcd_write(pText[0]);
    pText++;
    count--;
  }
}
//---------------------------------------------------------------------- 
-----
//  lcd_home(..) - Cursor auf Position 1,1
//---------------------------------------------------------------------- 
-----
void lcd_home()
{
  lcd_cmd(0x02);
  wait_ms(2);      // warten
}
//---------------------------------------------------------------------- 
-----
//  lcd_clear(..) - löscht die Anzeige im LCD
//---------------------------------------------------------------------- 
-----
void lcd_clear()
{
  lcd_cmd(0x01);
  wait_ms(2);      // warten
}
//---------------------------------------------------------------------- 
-----
//  lcd_on(..) - schaltet das LCD an
//---------------------------------------------------------------------- 
-----
void lcd_on()
{
  lcd_cmd(0x0E);
}
//---------------------------------------------------------------------- 
-----
//  lcd_off(..) - schaltet das LCD aus
//---------------------------------------------------------------------- 
-----
void lcd_off()
{
  lcd_cmd(0x08);
}
//---------------------------------------------------------------------- 
-----
//  lcd_goto(..) - setzt die Cursorposition
//   PE:  row = Zeile 1..2
//    col = Spalte 1..16
//---------------------------------------------------------------------- 
-----
void lcd_goto(int row, int col)
{
  row--;        // Null-basierend
  row&=0x01;      // sicherheitshalber
  row*=0x40;      // Zeile nach Bit 6 bringen
  col--;        // Null-basierend
  col&=0x0f;      // sicherheitshalber
  char tmp=row|col;
  tmp|=0x80;      // Cursor setzen
  lcd_cmd(tmp);    // senden
}
//---------------------------------------------------------------------- 
-----
//  lcd_init(..) - Schaltet die Ports und Initialisiert das LCD
//---------------------------------------------------------------------- 
-----
void lcd_init()
{
  // Port D = Ausgang
  DDRD=0xff;
  PORTD=0;
  // warten bist LCD-Controller gebootet
  wait_ms(50);
  // SOFT-RESET
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  wait_ms(5);
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  wait_us(100);
  PORTD = 0x30;  //0b00110000;
  sbi(PORTD,3);
  cbi(PORTD,3);
  wait_ms(5);

  // 4-BitModus einschalten
  PORTD=0x20;
  // Schreibsignal
  sbi(PORTD,3);
  cbi(PORTD,3);
  wait_ms(5);

  // ab hier im 4-Bit-Modus
  lcd_cmd(0x28);    // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit
  //lcd_off();
  lcd_cmd(0x06);    // Entry Mode
  lcd_on();
  lcd_clear();
}
//---------------------------------------------------------------------- 
-----
// Main-Funktion
//---------------------------------------------------------------------- 
-----
int main (void)
{
  wait_ms(200);
  lcd_init();
  lcd_goto(1,1);
  lcd_write("Hallo LCD");
  lcd_goto(2,1);
  lcd_write("12345678");
  while (1) {  } // Mainloop
return 0;
}
//---------------------------------------------------------------------- 
-----

von Falk B. (falk)


Lesenswert?


von Stefan B. (stefan) Benutzerseite


Lesenswert?

> ../display.c:43: warning: implicit declaration of function 'sbi'
> ../display.c:44: warning: implicit declaration of function 'cbi'

Das ist ein Zeichen fdafür, dass deine Sourcen ziemlich alt sind. Diese 
Funktionen oder Makros (bin zu strack um nachzusehen) sind schon lange 
aus der avr-libc (Bibliothek mit den Standard C Funktionen für AVRs) 
verschwunden. Bei der Doku der avr-libc und im Netz und bei 
Bitmanipulation ist aber beschrieben, wie man diese Hürde beseitigt.

Schwieriger wird es hier:

//-------------------------------------------------
//  lcd_write(..) - sendet ein Zeichen (Daten) an LCD
//  PE:  text=Zeichen
//-------------------------------------------------
void lcd_write(char text)
{
...
}

//-------------------------------------------------
//  lcd_write(..) - sendet eine Zeichenkette an LCD
//  Die Zeichenkette muss mit 0x00 abgeschlossen sein
//  PE:  pText=Zeiger auf Zeichenkette
//-------------------------------------------------
void lcd_write(char* pText)
{
...
}

//-------------------------------------------------
//  lcd_write(..) - sendet eine Zeichenkette an LCD
//  PE:  pText=Zeiger auf Zeichenkette
//    count=Anzahl der zu sendenden Zeichen
//-_-----------------------------------------------
void lcd_write(char* pText, int count)
{
...
}

Du hast also drei Funktionen, die mit unterschiedlichen Argumenten 
aufgerufen werden und die jeweils was unterschiedliches machen aber *den 
gleichen Namen* haben. Das ist eine Programmierdenke die man von C++ 
kennt.

Um das auf C umzumodeln, muss man die ganze Source durchgehen, versuchen 
den Sinn hinter jedem Aufruf zu sehen und dann einheitliche Namen 
schaffen. Möglicherweise sind auch andere Funktionen davon betroffen. 
Machbar ist das, die Source ist ja nicht so lang.

Vielleicht hilft es auch das Beispiel so zu lassen und als C++ Projekt 
zu kompilieren. Der Kompiler macht dann aus dem Funktionsnamen und den 
Argumenttypen unterscheidbare Namen (stichwort Namemangling). Ich habe 
aber noch nie C++ mit AVRs eingesetzt, so dass ich dir hierbei nicht 
weiterhelfen kann.

von Steffen (Gast)


Lesenswert?

Hi,
schon etwas älter der Thread. Aber,...hast du, bzw. irgendjemand das 
hier schon hinbekommen?
Bin auch gerade dabei, bekomme aber im AVR Studio kein Zeichen aufs 
Display. Fehler im obigen Code wurden alle beseitigt. Bzw. die der 
Compiler moniert hat.

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.