mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MyAVR Board LCD-Programmierung


Autor: Dany (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich lese hier immmer mal wieder, wenn ich nach Lösungen für µC 
Programmierung suche und bin dankbar für jede Antwort.

Programmiersprache: C
µC: ATmega8
Mein Problem: Ich wollte mithilfe des Lehrheftes "LCD-Programmierung" 
ein Programm schreiben, welches einen einfachen Text auf meinem Display 
anzeigen soll. Dies funktioniert leider noch nicht, weil alle LCD 
Befehle nicht Definiert sind. Laut Lehrheft müsste es Funktionieren, 
doch in der Praxis leider noch nicht. Bibliotheken sind eingebunden, 
fürs LCD gibts keine extra Biliothek.

Quellcode:
//----------------------------------------------------------------------
#define   F_CPU 3686400  // Taktferquenz des myAVR-Boards
#include  <avr\io.h>  // AVR Register und Konstantendefinitionen
#include   <util\delay.h>  // Bibliothek mit Warteroutinen
//----------------------------------------------------------------------
int main (void)        // Hauptprogramm, startet bei Power ON und Reset
{  
  char  x;
  x=0;
  _delay_ms(200);
  lcd_init();
  while (1)
    {
    x=x^1;
    lcd_light(x&1);    //Hintergrundbeleuchtung On/Off
    lcd_write("hallo");
    //damit text nicht fortlaufend angehängt wird
    lcd_clear();
    lcd_home();
    _delay_ms(100);  
    }
  return 0;
}

Danke schonmal im Vorraus
Gruß Dany

Autor: Dany (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also mein AVR-Studio zeigt folgende errors an (siehe anhang)

Autor: Nils B. (nordlicht_nils)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dany,

die Funktionen, die Du für die LCD-Ansteuerung nutzt, sind Deinem 
Compiler nicht bekannt. Hast Du vergessen, einen Header einzubinden, 
indem diese definiert sind? Oder hast Du sie aus dem Buch nicht mit 
abgetippt?

Gruß, Nils

Autor: Murmel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier es mal hiermit.
#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;
}
//---------------------------------------------------------------------------


Autor: dummbord (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der letzte code schmeisst doch nichts als fehlermeldungen raus... bin 
ich zu blöd oder liegts am code?

Autor: dummbord (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier mal der anhang

helft mir mal bitte ich beiss mir schon seit 3 stunden die zähne aus.. 
habs erst mit dem code ausm gcc tutorial funktioniert.. da krieg ichs 
auch nicht ans laufen..

Autor: Dany (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo  Murmel,
bei diesem Quelltext ist nur das problem, dass das "sbi", "clr" und "rs" 
usw nicht declariert sind. --> lösung eventuell?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach dir Makros für die fehlenden Ausdrücke:

#define sbi(PORT,BIT) PORT |= 1<<(BIT)
#define cbi(PORT,BIT) PORT &= ~(1<<(BIT))

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
http://www.mikrocontroller.net/articles/Bitmanipulation

Ansonsten sind deine Fehlerbilder witzlos, wenn man den Quelltext nicht 
hat. Man müsste spekulieren, was in den angemoserten Zeilen in der 
Source stehen könnte. Das mache ich nicht.

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.