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


von displayer (Gast)


Angehängte Dateien:

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:
1
int main(void)
2
{
3
  char d=0;
4
  wait_ms(200);
5
  lcd_init();
6
  while(1)
7
  {
8
    lcd_dimmer(d+=5);
9
    lcd_write("Hallo ");
10
    wait_ms(100);
11
  }
12
  return 0;
13
}


Die zweite Datei liegt im Anhang.

von Dirk (Gast)


Lesenswert?

Probiere es zuerst mal mit dem "Testprogramm zum myAVR LCD Add-On":

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

von Düsendieb (Gast)


Lesenswert?


von Karl H. (kbuchegg)


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?

von Lord Z. (lordziu)


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.

von displayer (Gast)


Lesenswert?

Test funktioniert

von displayer (Gast)


Lesenswert?

Sorry sind schwarze kästchen hab mich verschrieben

von Düsendieb (Gast)


Lesenswert?

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

von displayer (Gast)


Lesenswert?

Ja
Device = atmega8
Frequency = 3686400
Optimization = -0s

Wie initialisier ich denn das Teil jetzt richtig?

von displayer (Gast)


Lesenswert?

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

resource.c
1
#define F_CPU  3686400
2
#define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
3
#define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))
4
5
#include <avr/io.h>
6
#include <util/delay.h>
7
8
9
void wait_ms( int milliSec )
10
{
11
  _delay_loop_2( 1* ( F_CPU / ( 1000 / 4 ) ) * milliSec );
12
}
13
14
void lcd_send( char data )
15
{
16
  //aktuelles RS ermitteln
17
  char rs = PORTD;
18
  rs &= 4;
19
  //High-Teil senden
20
  char tmp = data;
21
  tmp &= 0xf0;
22
  tmp |= rs;
23
  PORTD = tmp;
24
  //Schreibsignal
25
  sbi( PORTD,3 );
26
  cbi( PORTD,3 );
27
  //Low-Teil senden
28
  tmp = data;
29
  tmp &= 0x0f;
30
  tmp *= 16;
31
  tmp |= rs;
32
  PORTD = tmp;
33
  //Schreibsignal
34
  sbi( PORTD,3 );
35
  cbi( PORTD,3 );
36
  //verarbeiten lassen
37
  wait_ms( 1 );
38
}
39
40
void lcd_cmd( char cmd )
41
{
42
  //RS löschen = Komando folgt
43
  cbi( PORTD,2 );
44
  //senden
45
  lcd_send( cmd );
46
}
47
48
void lcd_clear()
49
{
50
  lcd_cmd( 0x01 );
51
  wait_ms( 2 );
52
}
53
54
void lcd_home()
55
{
56
  lcd_cmd( 0x02 );
57
  wait_ms( 2 );
58
}
59
60
void lcd_on()
61
{
62
  lcd_cmd( 0x0E );
63
}
64
65
void lcd_off()
66
{
67
  lcd_cmd( 0x08 );
68
}
69
70
void lcd_goto( int row, int col )
71
{
72
    uint8_t tmp = 0x00;
73
74
    switch (row) 
75
    {
76
        case 1: tmp=0x80+0x00+col; break;    // 1. Zeile
77
        case 2: tmp=0x80+0x40+col; break;    // 2. Zeile
78
        case 3: tmp=0x80+0x10+col; break;    // 3. Zeile
79
        case 4: tmp=0x80+0x50+col; break;    // 4. Zeile
80
    }
81
  lcd_cmd( tmp );
82
}
83
84
void lcd_init()
85
{
86
  //Port D = Ausgang
87
  DDRD = 0x0ff;
88
  PORTD = 0;
89
  //warten bis LCD-Controller gebootet hat
90
  wait_ms(50);
91
  //4-bitModus einschalten
92
  PORTD=0x20;
93
  //Schreibsignal Enable-Impuls
94
  sbi(PORTD,3);
95
  cbi(PORTD,3);
96
  //Zeit zum Umschalten lassen
97
  wait_ms(5);
98
  //ab hier im 4-bit-Modus
99
  //Funktion-Set: 2 Zeilen, 5x7 Matrix, 4bit
100
  lcd_cmd(0x28);
101
  lcd_off();
102
  lcd_clear();
103
  //Entry Mode
104
  lcd_cmd(0x06);
105
  lcd_on();
106
}
107
108
void lcd_write(char text)
109
{
110
  //RS setzen = Daten
111
  sbi(PORTD,2);
112
  //senden
113
  lcd_send(text);
114
}
115
116
void lcd_writeText(char* pText)
117
{
118
  while(pText[0]!=0)
119
  {
120
    lcd_write(pText[0]);
121
    pText++;
122
  }
123
}

display.c
1
#include "MyAvrLCD.h"
2
3
int main( void )
4
{
5
  wait_ms( 200 );
6
  lcd_init();
7
  
8
  lcd_writeText("Juhu es geht");
9
  lcd_goto(2,0);
10
  lcd_writeText("Und Zeile 2??");
11
  return 0;
12
}

MyAvrLCD.h
1
#ifndef MYAVRLCD
2
#define MYAVRLCD
3
extern void wait_ms( int milliSec );
4
extern void lcd_send( char data );
5
extern void lcd_cmd( char cmd );
6
extern void lcd_clear();
7
extern void lcd_home();
8
extern void lcd_on();
9
extern void lcd_off();
10
extern void lcd_goto( int row, int col );
11
extern void lcd_init();
12
extern void lcd_write( char text );
13
extern void lcd_writeText( char* pText );
14
#endif

von Dirk (Gast)


Lesenswert?

Hier hat jemand seine (offenbar funktionierende) LCD Bibliothek 
gepostet:

Beitrag "MyAvr LCD Quellcode in C"

von Karl H. (kbuchegg)


Lesenswert?

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

Höchst wahrscheinlich stimmen hier
1
void lcd_goto( int row, int col )
2
{
3
    uint8_t tmp = 0x00;
4
5
    switch (row) 
6
    {
7
        case 1: tmp=0x80+0x00+col; break;    // 1. Zeile
8
        case 2: tmp=0x80+0x40+col; break;    // 2. Zeile
9
        case 3: tmp=0x80+0x10+col; break;    // 3. Zeile
10
        case 4: tmp=0x80+0x50+col; break;    // 4. Zeile
11
    }
12
  lcd_cmd( tmp );
13
}

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.

von displayer (Gast)


Lesenswert?

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

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.