HD44780 LCD @4-Bit-Modus + Atmega16 Problemchen

Gast #2776514
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
Gast #2776531
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..
Gast #2776735
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);
}
Gast #2776747
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 ;)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.