Forum: Mikrocontroller und Digitale Elektronik LCD mit ATmega8 zeigt nichts an


von Winni (Gast)


Lesenswert?

Moin moin

ich verzweifele langsam. hab mir das AVR: LCD Tutorial durchgelesen und 
mir eigenen code für die ansteuerung geschrieben. Seltsamerweise wird 
aber nichts angezeigt, obwohl ich alles zig mal überprüft habe. weiss 
einfach nicht wo der fehler liegen soll. hier ist der code, vllt ist es 
ja etwas so offensichtliches und ich seh mal wieder dan wald vor lauter 
bäumen nicht:


#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 16000000

#define LCD_D0 PD0  //DB4
#define LCD_D1 PD1  //DB5
#define LCD_D2 PD2  //DB6
#define LCD_D3 PD3  //DB7
#define LCD_RS PD4
#define LCD_RW PD5
#define LCD_E PD6

void lcd_enable(void) {
  _delay_us(50);
  PORTD |= (1<<LCD_E);
  _delay_us(50);
  PORTD &= ~(1<<LCD_E);
}

void lcd_init(void) {
  _delay_ms(20);
  PORTD |= (1<<LCD_D0);
  PORTD |= (1<<LCD_D1);
  for(uint8_t i=0;i<3;i++){
    _delay_ms(5);
    lcd_enable();
  }
  PORTD &= ~(1<<LCD_D0);
  _delay_ms(5);
  lcd_enable();

}
void lcd_cmd(uint8_t cmd) {

  uint8_t nibble=0x00;
  nibble = (cmd>>4) & 0b00001111;  //oberes nibble
  PORTD = nibble;
  lcd_enable();
  nibble= cmd & 0b00001111; //unteres nibble
  PORTD = nibble;
  lcd_enable();
  _delay_us(50);

}

void lcd_data(uint8_t data){

  uint8_t nibble=0x00;
  nibble = (data>>4) & 0b00001111; //oberes nibble
  nibble |= (1<<LCD_RS);
  PORTD = nibble;
  lcd_enable();
  nibble= data & 0b00001111; //unteres nibble
  nibble |= (1<<LCD_RS);
  PORTD = nibble;
  lcd_enable();
  _delay_us(50);

}

void lcd_clear(void) {
  lcd_cmd(0b00000001);
}

int main(void)
{
  DDRD = 0xFF;  //PD0-PD7: Ausgänge Display
  PORTD = 0x00;

  lcd_init();
  lcd_cmd(0b00101000);  //4Bit  2 Zeilen  5x8
  lcd_cmd(0b00001100);  //Display ein  Cursor aus  kein Blinken
  lcd_cmd(0b00000110);  //inkrement / kein Scrollen


  lcd_clear();
  lcd_data('T');
  lcd_data('e');
  lcd_data('s');
  lcd_data('t');

    while(1)
    {
    _delay_ms(10);
    }
}

wäre über einen tipp echt dankbar!
gruß winni

von dfgh (Gast)


Lesenswert?

Siehst du schwarze balken? Kontrast richtig eingestellt (Poti!)?

von Winni (Gast)


Lesenswert?

danke für die fixe antwort!
ja den schwarzen balken seh ich, wenn ich die lcd funktionen entferne. 
hab kein poti, der kontrast-pin hängt direkt auf gnd.

von dfgh (Gast)


Lesenswert?

Alternativ kann es auch sein, das dein Display-Controller etwas mehr 
Zeit zum "Hochfahren" braucht, d.h. vor lcd_init() könnte noch eine 
längere Pause nützlich sein.

Oder aber du brauchst eine andere Initialisierungssequenz, das kommt 
auch schon mal vor (die Reichelt-Displays sind z.B. etwas eigen)

von dfgh (Gast)


Lesenswert?

Mach mal ein poti hin und dreh dran, es kann sein, dass deine Buchstaben 
komplett weg sind wegen einer falschen Kontrasteinstellung (ist der 
häufigste Fehler)

von Winnetou (Gast)


Lesenswert?

Und woher sollen wir wissen, welches LCD-Display Du verwendest? Da lohnt 
sich das Lesen Deines Codes noch nicht.

Für die gängigen LCD-Controller gibt es schon fertige libraries. Warum 
das Rad neu erfinden?

von Winni (Gast)


Lesenswert?

benutze das RT162-display mit dem controller HD44780. hab im grunde 
versucht den asm-code aus dem tutorial 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD) in c 
umzusetzten. eine lcd-library hab ich schon erfolgreich zum laufen 
gebracht, möchte aber meine eigenen erfahrungen damit machen. vllt ist 
ja etwas mit den bit-shift operationen falsch oder ich vertausche die 
oberen und unteren nibbles? mache es im prinzip aber genau so wie der 
asm code im tutorial.

von Winnetou (Gast)


Lesenswert?

Winni schrieb:
> eine lcd-library hab ich schon erfolgreich zum laufen
> gebracht,

Fein, dann funktioniert die Hardware also. Wenn Du was eigenes schreiben 
möchtest, dann würde ich nicht versuchen anhand eines asm-Codes das 
umzuschreiben. Ich würde hergehen und versuchen, jeden 
Initialisierungsschritt aus dem HS44780 Datenblatt umzusetzen.

von Wolfgang (Gast)


Lesenswert?

Winni schrieb:
> #include <util/delay.h>
> #define F_CPU 16000000

Wie soll der Compiler bei dieser Reihenfolge die Konstanten für die 
Delays richtig berechnen?

von Winni (Gast)


Lesenswert?

Wolfgang schrieb:
> Wie soll der Compiler bei dieser Reihenfolge die Konstanten für die
> Delays richtig berechnen?

das ist ein guter punkt, hatte ich beim posten des codes irgendwie 
vertauscht...daran lag es aber auch nicht :(

lese mich jetzt erstmal ins datenblatt des controllers ein...

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.