Forum: Mikrocontroller und Digitale Elektronik LCD Anzeige macht Probleme


von anzeige (Gast)


Lesenswert?

Hallo,

ich habe dieses 
(http://www.reichelt.de/?;ACTION=3;LA=0;GROUPID=3005;ARTICLE=31653;APE=0;SID=31dmHv86wQAR8AAAOeeEo31c9a0fc77def4657a3a3e06e3a57f37) 
display, und möchte es im 4-Bit-Modus ansteuern. Dazu ahbe ich hier im 
Forum ein Beispielprogramm in C gefunden. Jedoch zeigt das Display nach 
dem Anschließen an einen Port in der unteren Reihe nur schwarze Balken 
an. Egal welcher Port, egal ob ein Programm auf dem µC ist oder nicht. 
Woran kann das ligen?

von ??? (Gast)


Lesenswert?

>Woran kann das ligen?
keine Ahnung, meine Glaskugel ist gerade in Reparatur

Einfach so fällt mir ein:
stimmt der Kontrast?

sonst:
-alles durchmessen
-Code+Schaltplan zeigen

ein bisschen lesen wird nicht dir nicht Schaden:
http://sprut.de/electronic/lcd/index.htm
http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

von Ralf (Gast)


Lesenswert?

> Woran kann das liegen?
Nach der Aussage:

>Jedoch zeigt das Display nach dem Anschließen an einen Port in der
> unteren Reihe nur schwarze Balken an. Egal_ _welcher Port, egal ob ein
> Programm auf dem µC ist oder nicht.
...liegt es daran, dass du nicht weisst, was du tust, oder?

- Schaltplan
- Programm

Das ist das mindeste, was du uns zur Verfügung stellen solltest. Dann 
können wir dir auch helfen.

Ralf

von anzeige (Gast)


Lesenswert?

Hier die Dateien:

C-Datei:
1
/*
2
LCD4b.c
3
---------------------------------------------------------------------------------------
4
                 LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
5
---------------------------------------------------------------------------------------
6
*/
7
8
#include <avr/io.h>
9
#include "lcd4b.h"
10
#include <avr/delay.h>
11
12
13
int main(void)
14
{
15
  DDRD |=  0b11111100;      //Pins 2-7 als Ausgänge 
16
  
17
  DDRC = 0xff;
18
  _delay_ms(2000);
19
  PORTC=0x00;
20
  _delay_ms(500);
21
  PORTC=0xff;
22
23
  lcd_linit();        //LCD Initialisieren
24
  lcd_clear();        //Display löschen
25
  lcd_out("Hallo Welt");      //Text ausgeben
26
  lcd_command(line2);      //2. Zeile
27
  lcd_out("!!!");        //Text ausgeben
28
29
  while(1);
30
}
31
32
33
// sendet ein Datenbyte an das LCD
34
void lcd_data(char byte)
35
{
36
  char sich_byte;
37
  sich_byte = byte;
38
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
39
  byte |= (1<<lcd_rs);      //RS setzen
40
  PORT = byte;          //oberes Nibbel Ausgeben
41
  lcd_enable();
42
43
  byte = sich_byte;
44
  byte = byte<<4;          //Nibbles vertauschen
45
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
46
  byte |= (1<<lcd_rs);      //RS setzen
47
  PORT = byte;          //unteres Nibbel Ausgeben
48
  lcd_enable();
49
50
  kpause();
51
}
52
53
//sendet einen Befehl an das LCD
54
void lcd_command(char byte)
55
{                              //wie lcd_data, nur ohne RS zu setzen
56
  char sich_byte;
57
  sich_byte = byte;
58
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
59
  PORT = byte;          //oberes Nibbel Ausgeben
60
  lcd_enable();
61
62
  byte = sich_byte;
63
  byte = byte<<4;          //Nibbles vertauschen
64
  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
65
  PORT = byte;          //unteres Nibbel Ausgeben
66
  lcd_enable();
67
68
  kpause();
69
}
70
71
//erzeugt den Enable-Puls
72
void lcd_enable(void)
73
{
74
  PORT |= (1<<lcd_e);          //Enable auf High
75
  kpause();              //kurze pause
76
  PORT &= ~(1<<lcd_e);           //Enable auf Low
77
}                 
78
79
//Pause nach jeder Übertragung
80
void kpause(void)
81
{
82
  _delay_us(48);            //48us Pause
83
}
84
85
86
//Längere Pause für manche Befehle
87
void lpause(void) 
88
{
89
  _delay_ms(5);            //5ms Pause
90
}
91
92
//Initialisierung
93
void lcd_linit(void)          //Wenn der Display gleich nachdem er mit Spannung versorgt wurde
94
{                    //in Betrieb genommen werden soll
95
  unsigned char i;
96
  for(i=0;i<10;i++)
97
  {
98
    _delay_ms(10);
99
  }
100
  lcd_init();
101
}
102
103
//Initialisierung
104
void lcd_init(void)
105
{
106
  PORT = 0b00100000;        //Interface auf 4-Bit setzen
107
108
  lcd_enable();
109
  lpause();
110
111
  
112
  lcd_command(0b00101000);    // 2-zeilig, 5x8-Punkt-Matrix
113
  lcd_command(0b00001100);    // Display ein
114
  lcd_command(0b00000110);    // Kursor nach rechts wandernd, kein Display shift
115
}
116
117
//Sendet den Befehl zur Löschung des Displays
118
void lcd_clear(void)
119
{
120
    lcd_command(0x01);
121
  lpause();
122
}
123
124
//gibt einen Text aus
125
void lcd_out(char *s)
126
{
127
    while (*s)            //so lange *s != '\0' also ungleich dem "String-Endezeichen"
128
    {
129
        lcd_data(*s);        //Zeichen ausgeben
130
        s++;
131
    }
132
}
133
/*
134
-----------------------------------------------------------------------------------------------
135
LCD4b developed by Johannes K.
136
-----------------------------------------------------------------------------------------------
137
*/

und die Headerdatei:
1
/*
2
LCD4b.h
3
---------------------------------------------------------------------------------------
4
                 LCD-Routine für KS0070 und HD44780 im 4Bit Modus v1.1
5
---------------------------------------------------------------------------------------
6
Für die Ansteuerung des Displays werden 6 Pins benötigt.
7
8
Pinbelegung:            
9
PORT Pin lcd_rs    RS
10
PORT Pin lcd_e    E
11
PORT Pin 4        Datenbit 4
12
PORT Pin 5         Datenbit 5
13
PORT Pin 6         Datenbit 6
14
PORT Pin 7          Datenbit 7
15
               R/W und Datenbits 0-3 auf GND
16
               
17
PORT, lcd_rs, lcd_e können frei gewählt werden
18
19
Software:  
20
  AVR-GCC 3.3
21
  AVR Libc 1.2.3 
22
  
23
Hardware:  
24
  AVR-uController
25
*/
26
#ifndef F_CPU
27
#define F_CPU 1000000UL     //Prozessor Frequenz in Hz
28
#endif
29
30
#define lcd_e 3              //E Pinnummer
31
#define lcd_rs 2             //RS Pinnummer
32
#define PORT PORTD           //Portname
33
34
#define line1 0b10000000     //Adresse im Speicher des LCD-Controllers für die 1. Zeile
35
#define line2 0b11000000     //Adresse im Speicher des LCD-Controllers für die 2. Zeile
36
37
extern void lcd_data(char byte);
38
extern void lcd_command(char byte);
39
extern void lcd_enable(void);
40
extern void kpause(void);
41
extern void lpause(void);
42
extern void lcd_linit(void);
43
extern void lcd_init(void);
44
extern void lcd_clear(void);
45
extern void lcd_out(char *s);
46
/*
47
-----------------------------------------------------------------------------------------------
48
LCD4b developed by Johannes K.
49
-----------------------------------------------------------------------------------------------
50
*/

Belegung:

Pins (LCD) 1, 3, 5 und 7-10 an Masse
Pins (LCD) 11-14 an PORTD 4-7
E wie beschrieben an 3
und rs an 2

von anzeige (Gast)


Lesenswert?

Mir ist selber noch ein möglicher Fehler eingefallen.

DB4 soll ja an Pin4. Ist Pin4 von 0 oder 1 an gezählt?

von Carsten S. (dg3ycs)


Lesenswert?

anzeige schrieb:
> Mir ist selber noch ein möglicher Fehler eingefallen.
>
> DB4 soll ja an Pin4. Ist Pin4 von 0 oder 1 an gezählt?

Hi,

ich würde sagen da solltest du mal ins Datenblatt des Display schauen 
wie der Hersteller es benennt! Möglich ist beides...

Gruß
Carsten

von anzeige (Gast)


Lesenswert?

ich meinte auf dem STK500

von Herr M. (herrmueller)


Lesenswert?

Beim STK500 ist Pin4 der, neben dem Px4 (x=A oder B oder C oder D) 
steht.

von anzeige (Gast)


Lesenswert?

Gut, dann wird das vielleicht mein Fehler sein.

Ich habe E und RS dann auf die STK500-Pins 1 und 2 gelegt, und die Bits 
4-7 auf die STK500-Pins 3-6.

Wie kann ich in der Software das jetzt wieder "gradebiegen"? E und RS 
kann ich einfach im Header ändern. Wie geht das für die Datenbits?

von Bazi .. (baziizab)


Lesenswert?

Pins (LCD) 11-14 müssen auf die STK500-Pins 4-7 des entsprechenden Ports 
(bei deinem geposteten Code PortD). Ist doch viel einfacher als die 
Software umzuschreiben?

von anzeige (Gast)


Lesenswert?

Das würde ich eben wissen, was man machen muss, um die 4 Bits um ein Pin 
zu verschieben. Bei E und RS war es ja ganz einfach.

von spess53 (Gast)


Lesenswert?

Hi

>Das würde ich eben wissen, was man machen muss, um die 4 Bits um ein Pin
>zu verschieben. Bei E und RS war es ja ganz einfach.

Dann musst du aber noch die Software umschreiben.

Das
>  char sich_byte;
>  sich_byte = byte;
>  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
>  byte |= (1<<lcd_rs);      //RS setzen
>  PORT = byte;          //oberes Nibbel Ausgeben
>  lcd_enable();

>  byte = sich_byte;
>  byte = byte<<4;          //Nibbles vertauschen
>  byte &= ~0x0f;          //Bit 0-3 auf 0 setzen
>  byte |= (1<<lcd_rs);      //RS setzen
>  PORT = byte;          //unteres Nibbel Ausgeben
>  lcd_enable();

basiert darauf, das Bit4..7 an Port4..7 hängen. Reichen deine 
C-Kenntnisse aus, das anzupassen?

MfG Spess

von anzeige (Gast)


Lesenswert?

Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links 
geschoben werden. Wie weiß ich aber nicht.

von spess53 (Gast)


Lesenswert?

Hi

>Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links
>geschoben werden. Wie weiß ich aber nicht.

Meine C-Kenntnisse sind nur rudimentär, aber wie wäre es mit '>>'?

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Nachtrag:

>Ich denke mal, der Inhalt des Bytes ab Bit4 mus eien Stelle nach links
>geschoben werden. Wie weiß ich aber nicht.

Nicht links, sondern rechts.

MfG Spess

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.