Forum: Compiler & IDEs LCD-8bit Ansteuerung


von Till H. (Gast)


Lesenswert?

Hallo zusammen, ich weiß es ist ein leidiges thema...aber auch ich habe
probleme mein lcd zum laufen zu bekommen! habe das tutorial schon
betrachtet! denkmal ich seh den wald vor lauter bäumen einfach nicht!
1
#include <util/delay.h>
2
#include <avr/io.h> 
3
#include "LCD.h"
4
5
#define LCD_PORT       PORTC
6
#define LCD_DDR        DDRC
7
#define LCD_RW         PD1
8
#define LCD_EN         PD2
9
#define LCD_IO1        PD0
10
#define LCD_IO2        PD3
11
12
#define CLEAR    0x01
13
#define HOME    0x02            
14
15
  // PORTC = DB0-7
16
  // PORTD0 = I/OC1
17
  // PORTD1 = RW
18
  // PORTD2 = E
19
  // PORTD3 = I/OC2
20
21
void lcd_init(void)
22
{
23
  LCD_DDR  = 0xff;
24
  DDRD |= (1<<DDD0) |  (1<<DDD1) |(1<<DDD2) |(1<<DDD3);
25
26
  _delay_ms(1000); //LCD Zeit für den eigenen Reset geben
27
28
  write_command(0b11111000);//Set funktion mode instruction[SF] 8bit modus, font 5x8 dot, 4lines x 64words
29
  write_command(0b01010000);//Set entry mode[SE] curser is incr after writing data
30
  lcd_clear();
31
  write_command(0b00111000);//Set display mode instruction[SD] all Display on, curser display on  
32
}
33
34
void lcd_enable(void)
35
{
36
   PORTD |= (1<<LCD_EN);
37
    _delay_us(1);                   // kurze Pause
38
   PORTD &= ~(1<<LCD_EN);
39
}
40
void write_data(unsigned char data)
41
{
42
  // Write RAM data[WD]
43
44
  PORTD &= ~(1<<LCD_IO1) & ~(1<<LCD_RW);
45
  PORTD |= (1<<LCD_IO2);
46
  LCD_PORT = data;
47
  lcd_enable();
48
  _delay_us(20);
49
}
50
51
void write_command(unsigned char command)
52
{
53
  PORTD &= ~(1<<LCD_IO1) & ~(1<<LCD_IO2) & ~(1<<LCD_RW);
54
  LCD_PORT =  command; 
55
  lcd_enable();
56
  _delay_us(20);
57
}
58
59
void lcd_clear(void)
60
{
61
   write_command(CLEAR);
62
   _delay_ms(2);
63
}
64
 
65
 
66
void lcd_home(void)
67
{
68
   write_command(HOME);
69
   _delay_ms(5);
70
}
timings sind alle eingehalten, hardware hab auch auch überprüft :(
Benutze einen Atmega32, int.8mhz ! lcd50530 von pollin!

was hab ich falsch gemacht !?

von Mike (Gast)


Lesenswert?

Die Funktion *int main (void)* ist nicht vorhanden. Denn aus dieser 
können erst die anderen Funktionen aufgerufen werden.

Im AVR-GCC Tutorial unter Kapitel 5 Einführungsbeispiel findest Du 
weitere Informationen.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Einf.C3.BChrungsbeispiel

von Till H. (mohman)


Lesenswert?

hmm sorry, das hab ich vergessen zu schreiben!
die gibt es natürlich und da rufe ich auch die funktion write_data auf!

ich bin davon ausgegangen, das ich hier nen fehler hab! in der main 
steht sonst auch nicht viel ^^
jemand ne idee !?

von Lowtzow .. (lowtzow)


Lesenswert?

eventuell brauchen die pollin lcd eine negative kontrastspannung!?
hab von denen auch welche daheim die eine negative brauchen würde mich 
nicht wundern wenn es bei deinen auch so wäre.

hast du ein anderes kcd zuj testen da?

von Gast (Gast)


Lesenswert?

Der LCD-Controller M50530 ist nicht 44780-kompatibel, vielleicht liegt 
dort das Problem. Kann die Bibliothek lcd.h mit diesem Controller 
umgehen? Da ich mit einer anderen Plattform arbeite, kann ich dazu 
nichts sagen, aber oftmals unterstützen solche Libs nur die 44780er.

von Benedikt K. (benedikt)


Lesenswert?

Der M50530 benötigt eine positive Displayspannung, die das Pollin 
Display aber selbst erzeugt.
Die Initsequenz sieht auch gut aus. Damit sollte zumindest das LCD an 
gehen.

von Till.H (Gast)


Lesenswert?

hallo zusammen,
das display initialisiert sich jetz und zeig mir auch was an!
es lag an der kontrastspannung! der poti war hin...naja ich hoffe aus 
dieser dummheit lerne ich :(

hab jetzt ein weiters kleines problem! ich kann die cursor adresse 
schreiben und der cursor springt auch fröhlich dorthin!

zb. WC = 0x05

schieb ich ein data byte hinterher zb.WD = 'A', springt der cursor auf 
adresse 0x02 und zeig nichts an!

lass ich das schreiben der cursor adresse und sende einfach ein clear 
und dann das data byte, wir es mir angezeigt! wie zu erwarten auf 
adresse 0x00, da der clear befehl ja die cursor und display_start 
adresse auf 0x00 schreibt!


jemand ne idee ?

von Matthias L. (Gast)


Lesenswert?

>jemand ne idee ?

Erstmal ein Grammatikkurs. Was schreibe ich groß, wo kommen Kommas und 
Punkte hin.

>schieb ich ein data byte hinterher zb.WD = 'A', springt der cursor auf
>adresse 0x02 und zeig nichts an!

Natürlich. Du hast auf Cursoradresse, oder besser Position ein 'A' 
geschrieben. Der Cursor rückt automatisch eins weiter. Das macht wohl 
jedes LCD so. Kann aber meineswissens bei der Intitalisierung gesperrt 
werden.

Ich würde sagen: Datenblatt des LCD-Controllers befragen.

von Till.H (Gast)


Lesenswert?

hallo, danke für die schnelle antwort;) das mit den kommata sehe ich 
ein!
aber groß-und kleinschreibung hätte man schon lange abschaffen sollen^^
funktioniert ja auch im englischen ganz gut ohne ;)

ich initialisiere das display mit cursor inrement!... :(
ich gehe davon aus, dass das display sich richtig initalisiert, da die 
auflöung und die anzahl der zeilen stimmt!

es zeigt ja auch was an, wenn ich ihm nur daten gebe und er 
incrementiert auch fröhlich weiter! (schreibt dann das ganze display 
voll)

nur halt nicht, wenn ich die cursor adresse und display start adresse 
vorher verändere! :(

von Till.H (Gast)


Lesenswert?

smoin zusammen!
das probl hat sich erledigt! war noch ein kleiner fehler auf meinen 
versuchsboard! eine der "guten" steckbrücken von co**** hat mal wieder 
versagt! :(

danke euch und noch ein schönes we :)

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.