www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik myAVR 2x16 Display zeigt nur schwarze Kästchen an


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

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ích hab ein myAVR LCD v2.3 mit 2x16 Zeichen und einem ATmega8.
Da es ein fertiges Board ist gehe ich davon aus das alles richtig 
angeschlossen ist.
Mit AVR Studio hab ich aus der beiligenden Beschreibung ein Beispiel 
abgeschmiert nur um zu probieren das es auch funktioniert bevor ich mich 
damit befasse und mich immer wunder das nix geht.
Allerdings hab ich jetzt das Problem das das vorgelegte Programm nicht 
funktioniert.
Habe keine Tippfehler oder sowas.

Es erscheint immer die Meldung das die funktion lcd_write schon 
existiert. Die ist 3mal in dem Beispiel aufgeführt.
Wenn ich allerdings nur eines übriglasse und die beiden anderen Lösche 
sagt er mir er kennt sbi, cbi und _delay_loop_2 nicht.

Wenn ich euer AVR-GCC-Tutorial/LCD-Ansteuerung nehme bringt er mir 
zwar keinen Fehler aber das Display zeigt nur schwarze striche an also 
wird nicht korekt initialisiert.
Wo liegt der Fehler?
Programmiert wird richig da die anzeige leds neben dem USB anschluss 
leuchten wenn ich Programmiere.



Hier mal das Hauptprogramm:
int main(void)
{
  char d=0;
  wait_ms(200);
  lcd_init();
  while(1)
  {
    lcd_dimmer(d+=5);
    lcd_write("Hallo ");
    wait_ms(100);
  }
  return 0;
}


Die zweite Datei liegt im Anhang.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probiere es zuerst mal mit dem "Testprogramm zum myAVR LCD Add-On":

http://shop.myavr.de/index.php?sp=download.sp.php&...

Autor: Düsendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
displayer schrieb:

> Wenn ich allerdings nur eines übriglasse und die beiden anderen Lösche
> sagt er mir er kennt sbi, cbi und _delay_loop_2 nicht.

Das könnte man zwar alles relativ leicht beheben, lohnt aber nicht 
wirklich. Die Funktionen sind anscheinend himmelalt und sie sind so 
geschrieben, dass es zu einer Editierorgie ausartet, wenn man die 
Pinbelegung am µC ändert. Sprich: Die Funktionen mögen funktionieren 
oder auch nicht, sie sind jedoch wahnsinnig schlecht an eine vorhandene 
Hardware anzupassen.

> Wenn ich euer AVR-GCC-Tutorial/LCD-Ansteuerung nehme bringt er mir
> zwar keinen Fehler aber das Display zeigt nur schwarze striche an also
> wird nicht korekt initialisiert.
> Wo liegt der Fehler?

Die Anschlussbelegung des LCD an deinen µC hast du richtig eingestellt?

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
displayer schrieb:
> aber das Display zeigt nur schwarze striche an also
> wird nicht korekt initialisiert

Was denn nun? Schwarze Kästchen oder schwarze Striche? Wenn du an allen 
Stellen des Displays schwarze Kästchen hast, könnte es darauf hinweisen, 
dass der Kontrastpoti auf Maximum steht.

Autor: displayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Test funktioniert

Autor: displayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry sind schwarze kästchen hab mich verschrieben

Autor: Düsendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haste denn in AVR-GCC-Tutorial/LCD-Ansteuerung auch die Hardware und 
richtige Tachtfrequenz eingestellt ?

Autor: displayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja
Device = atmega8
Frequency = 3686400
Optimization = -0s

Wie initialisier ich denn das Teil jetzt richtig?

Autor: displayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok jetz geht mal die erste Zeile. Aber warum nicht die 2.?

resource.c
#define F_CPU  3686400
#define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
#define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))

#include <avr/io.h>
#include <util/delay.h>


void wait_ms( int milliSec )
{
  _delay_loop_2( 1* ( F_CPU / ( 1000 / 4 ) ) * milliSec );
}

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 );
}

void lcd_cmd( char cmd )
{
  //RS löschen = Komando folgt
  cbi( PORTD,2 );
  //senden
  lcd_send( cmd );
}

void lcd_clear()
{
  lcd_cmd( 0x01 );
  wait_ms( 2 );
}

void lcd_home()
{
  lcd_cmd( 0x02 );
  wait_ms( 2 );
}

void lcd_on()
{
  lcd_cmd( 0x0E );
}

void lcd_off()
{
  lcd_cmd( 0x08 );
}

void lcd_goto( int row, int col )
{
    uint8_t tmp = 0x00;

    switch (row) 
    {
        case 1: tmp=0x80+0x00+col; break;    // 1. Zeile
        case 2: tmp=0x80+0x40+col; break;    // 2. Zeile
        case 3: tmp=0x80+0x10+col; break;    // 3. Zeile
        case 4: tmp=0x80+0x50+col; break;    // 4. Zeile
    }
  lcd_cmd( tmp );
}

void lcd_init()
{
  //Port D = Ausgang
  DDRD = 0x0ff;
  PORTD = 0;
  //warten bis LCD-Controller 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
  //Funktion-Set: 2 Zeilen, 5x7 Matrix, 4bit
  lcd_cmd(0x28);
  lcd_off();
  lcd_clear();
  //Entry Mode
  lcd_cmd(0x06);
  lcd_on();
}

void lcd_write(char text)
{
  //RS setzen = Daten
  sbi(PORTD,2);
  //senden
  lcd_send(text);
}

void lcd_writeText(char* pText)
{
  while(pText[0]!=0)
  {
    lcd_write(pText[0]);
    pText++;
  }
}

display.c
#include "MyAvrLCD.h"

int main( void )
{
  wait_ms( 200 );
  lcd_init();
  
  lcd_writeText("Juhu es geht");
  lcd_goto(2,0);
  lcd_writeText("Und Zeile 2??");
  return 0;
}

MyAvrLCD.h
#ifndef MYAVRLCD
#define MYAVRLCD
extern void wait_ms( int milliSec );
extern void lcd_send( char data );
extern void lcd_cmd( char cmd );
extern void lcd_clear();
extern void lcd_home();
extern void lcd_on();
extern void lcd_off();
extern void lcd_goto( int row, int col );
extern void lcd_init();
extern void lcd_write( char text );
extern void lcd_writeText( char* pText );
#endif

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier hat jemand seine (offenbar funktionierende) LCD Bibliothek 
gepostet:

Beitrag "MyAvr LCD Quellcode in C"

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
displayer schrieb:
> Ok jetz geht mal die erste Zeile. Aber warum nicht die 2.?
>

Höchst wahrscheinlich stimmen hier
void lcd_goto( int row, int col )
{
    uint8_t tmp = 0x00;

    switch (row) 
    {
        case 1: tmp=0x80+0x00+col; break;    // 1. Zeile
        case 2: tmp=0x80+0x40+col; break;    // 2. Zeile
        case 3: tmp=0x80+0x10+col; break;    // 3. Zeile
        case 4: tmp=0x80+0x50+col; break;    // 4. Zeile
    }
  lcd_cmd( tmp );
}

die Offsets (0x00, 0x40, 0x10, 0x50) nicht mit denen überein, die dein 
LCD benutzt.

Gib einfach mal einen langen String ab Position 0,0 aus
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
(das sollte reichen)

bei irgendeinem Buchstaben wird das LCD anfangen, die zweite Zeile zu 
beschreiben. Den Buchstaben merkst du dir und zählst ab, der wievielte 
das in deinem String war. Das ist der Offset.

Autor: displayer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat ein Kaltstart initialisiert. Mit Warmstart gehts...
bzw wenn ich bei kaltstart den stecker zieh und das Display dann wieder 
anschließe.

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.