LCD mit ATmega8 zeigt nichts an

Gast #2617759
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
Gast #2617788
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)
Gast #2617793
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?
Gast #2617804
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.
Gast #2617815
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.
Gast #2617838
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren