Forum: Mikrocontroller und Digitale Elektronik HD44780 LCD @4-Bit-Modus + Atmega16 Problemchen


von NickNack (Gast)


Lesenswert?

Hallo zusammen!

Ich schlage mich seit nun 2 Stunden mit der Initialisierung eines 
HD44780 LCD (2 x 16 Zeichen!) herum und stehe kurz vor der Verzweiflung.

Das LCD soll im 4-Bit Modus betrieben werden und ist wie folgt 
angeschlossen:

LCD-DB7: PORTB 7
LCD-DB6: PORTB 6
LCD-DB5: PORTB 5
LCD-DB4: PORTB 4
LCD-DB3: OFFEN
LCD-DB2: OFFEN
LCD-DB1: OFFEN
LCD-DB0: OFFEN
LCD-RW:  GND
LCD-RS:  PORTA 1
LCD-EN:  PORTA 0

Der Test-Code sieht so aus:
1
#define  F_CPU 3686400UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
6
void  LcdClock  (void)
7
{
8
  PORTA |= 0b00000001;  //HIGH
9
  _delay_us(2);      //WAIT
10
  PORTA &= 0b11111110;  //LOW
11
  //_delay_us(2);      //WAIT
12
}
13
14
void  LcdOut  (char nibble)
15
{
16
  //PORTB &= 0b00001000;  //PWM-Sig2
17
  PORTB = nibble & 0xF0; 
18
  LcdClock();
19
}
20
21
void  LcdData  (char data)
22
{
23
  PORTA |= 0b00000010;  //RS = 1
24
  LcdOut(data << 4);
25
  LcdOut(data);
26
  _delay_ms(2);
27
}
28
29
void  LcdCmd  (char data)
30
{
31
  PORTA &= 0b11111101;  //RS = 0
32
  LcdOut(data << 4);
33
  LcdOut(data);
34
  _delay_ms(4);
35
}
36
37
void  LcdInit  (void)
38
{
39
  //DDR-Setup
40
  DDRA |= 0b00000011; //Steuerleitungen
41
  DDRB |= 0b11110000;  //Datenleitungen
42
  PORTA = 0;
43
  PORTB = 0;
44
45
  //8-Bit-Modus
46
  _delay_ms(20);
47
  PORTB = 0b00110000;
48
  LcdClock();
49
  
50
  //8-Bit-Modus
51
  _delay_ms(6);
52
  PORTB = 0b00110000;
53
  LcdClock();
54
  
55
  //8-Bit-Modus
56
  _delay_ms(1);
57
  PORTB = 0b00110000;
58
  LcdClock();
59
  
60
  //4-Bit-Modus
61
  PORTB = 0b00100000;
62
  LcdClock();
63
  
64
  //2-zeilig, 5x8-Punkt-Matrix 
65
  LcdCmd(0b00111000);
66
67
  //Display aus 
68
  LcdCmd(0b00001000);
69
70
  //Display löschen 
71
  LcdCmd(0b00000001);
72
73
  //Kursor nach rechts wandernd, kein Display shift 
74
  LcdCmd(0b00000110);
75
76
  //Display ein
77
  LcdCmd(0b00001100);
78
}
79
80
81
int main(void)
82
{
83
  LcdInit();
84
  LcdData('H');
85
  LcdData('A');
86
  LcdData('L');
87
  LcdData('L');
88
  LcdData('O');
89
    while(1)
90
    {
91
        
92
    }
93
}

Kriege damit nur beide(!) Zeilen mit weißen balken ausgefüllt -.-

Danke schonmal für eure Hilfe

von holger (Gast)


Lesenswert?

>  //2-zeilig, 5x8-Punkt-Matrix
>  LcdCmd(0b00111000);

  LcdCmd(0b00101000);

von Hans (Gast)


Lesenswert?

Wieso haßt du das EN Signal? Du schaltest es dir ja mit deinem etwas 
komischen Lcd_Clock wieder aus/um. Greif bitte mittels Bit-Manipulations 
Makros direkt auf die Pins zu(ohne Funktionen). Und gewöhne dir an, mit 
Oscis und LA zu arbeiten..

von NickNack (Gast)


Lesenswert?

@ holger
Bringt leider keine Veränderung

@ Hans
Werde ich mir noch aneignen ;)
EN -> ENABLE -> LCD-CLOCK
Leider hilft mir dein Beitrag im Moment nicht weiter...

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Nur mal zum testen der Hardware den Anhang reinbrennen.

von NickNack (Gast)


Lesenswert?

@ holger
Und womit kann ich die jetzt aufspielen? Benutze AVR JTAGICE MKII

von spess53 (Gast)


Lesenswert?

Hi

>Und womit kann ich die jetzt aufspielen? Benutze AVR JTAGICE MKII

Wie machst du es denn bis jetzt?

MfG Spess

von Klaus (Gast)


Lesenswert?

NickNack schrieb:
> Das LCD soll im 4-Bit Modus betrieben werden und ist wie folgt

Soviel ich weiss sendet man das high und low nibble.
Bei dir sehe ich das nicht in deinen Routinen.
Wobei zuerst das Highnibble und dann Lownibble gesendet wird.

Oder anders ausgedrückt:

void  LcdData  (char data)
{
  PORTA |= 0b00000010;  //RS = 1
  LcdOut(data << 4);
  LcdOut(data);
  _delay_ms(2);
}

müsste eigentlich so sein

void  LcdData  (char data)
{
  PORTA |= 0b00000010;  //RS = 1
  LcdOut(data);
  LcdOut(data << 4);

  _delay_ms(2);
}

von NickNack (Gast)


Lesenswert?

@ Klaus
Genau das war der Fehler, wobohl ich schwören könnte das ich bei meinen 
Versuchen genau das auch schon umgestellt hatte :D
Irgendwann "sieht man den Wald vor lauter Bäumen nicht mehr".
Danke für eure Hilfe und bis zum nächsten mal (mit einem hoffentlich 
nicht so peinlichem Fehler ;))

Edit:
@ holger
Dein Programm  hat funktioniert :)
Benutze Atmel Studio 6 --> WAR zu blöd die "Device-Programming" Funktion 
zu finden ;)

@ spess53
siehe oben ;)

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.