Problem mit LCD 4 Bit Initalisierung

OP #1749493
Hallo
ich habe folgendes Problem. Die 4 Bit Initalisierung funktioniert mit 
einem Atmega 32 problemlos. Auf einem Atmega 8 werden nur undefinierte 
Zeichen ausgegeben.

#include <avr/io.h>
#include <stdio.h>

void delay_ms(unsigned int anz_milisekunden);
void delay_100us(unsigned int anz);
void init_ports(void);
void lcd_init_4bit(void);
void lcd_write_data(unsigned char data);
void lcd_write_command(unsigned char command);
void lcd_enable(void);

void lcd_write_text(char * textstring);


//////////////////////////////////////////////////////////////////////// 
/////////////////////
//////////////////////////////////////////////////////////////////////// 
/////////////////////
void init_ports(void)
{
DDRC=DDRC | 0b00001111;  //Ausgabe
DDRB=0b11111111;  //Bits 5,4 und 3 auf Ausgabe

PORTC=0x00;
PORTB=0x00;
}


//////////////////////////////////////////////////////////////////////// 
////////////////////
//////////////////////////////////////////////////////////////////////// 
/////////////////////
void lcd_enable(void)
{
int p;
PORTB = PORTB | 0b00000001;
delay_ms(6);
PORTB = PORTB & 0b11111110;
delay_ms(6);
return;
}



//////////////////////////////////////////////////////////////////////// 
////////////////////
//////////////////////////////////////////////////////////////////////// 
/////////////////////
void lcd_write_data(unsigned char data)
{
int p;
unsigned char nibble_h, nibble_l;

PORTB = PORTB & 0b11111101; //  R/W auf 0 für Write
PORTB = PORTB | 0b00000100; //  RS  auf 1 für Datenregister

nibble_h =   (data >> 4)  & 0b00001111;
nibble_l =   data & 0b00001111;


PORTC = nibble_h;
lcd_enable();
delay_ms(6);

PORTC = nibble_l;
lcd_enable();

delay_ms(6);        // Viel Sicherheit: Manche brauchen 40 us, andere 
1,6ms

}



//////////////////////////////////////////////////////////////////////// 
////////////////////
//////////////////////////////////////////////////////////////////////// 
/////////////////////
void lcd_write_command(unsigned char command)
{
int p;
unsigned char nibble_h, nibble_l;


PORTB = PORTB & 0b11111101; // R/W auf 0 für Write
PORTB = PORTB & 0b11111011; // RS  auf 0 für Befehlsregister

nibble_h =   (command >> 4) & 0b00001111;
nibble_l =    command   & 0b00001111;


PORTC = nibble_h;
lcd_enable();
delay_ms(6);

PORTC = nibble_l;
lcd_enable();

delay_ms(6);        // Viel Sicherheit: Manche brauchen 40 us, andere 
1,6ms

}


//////////////////////////////////////////////////////////////////////// 
////////////////////
//////////////////////////////////////////////////////////////////////// 
/////////////////////
void lcd_write_command8(unsigned char command)
{
PORTB = PORTB & 0b11111101; // R/W auf 0 für Write
PORTB = PORTB & 0b11111011; // RS  auf 0 für Befehlsregister
PORTC = command;
lcd_enable();
delay_ms(6);        // Viel Sicherheit: Manche brauchen 40 us, andere 
1,6ms

}





//////////////////////////////////////////////////////////////////////// 
////////////////////
//////////////////////////////////////////////////////////////////////// 
/////////////////////
void lcd_init_4bit(void)
{
delay_ms(20);
lcd_write_command8(0b00110000); //Reset
delay_ms(8);
lcd_write_command8(0b00110000); //s.o.
lcd_write_command8(0b00110000); //s.o.

lcd_write_command8(0b00101000); //Auf 4-Bit-Interface !

//Ab hier mit der 4-Bit-Routine Schreiben!!!

lcd_write_command(0b00101000); //4-Bit-Interface, 2-zeilig, 5*7-Font

lcd_write_command(0b00001100); //Display ein, Cursor aus, blinken aus

lcd_write_command(0b00000001); //Display löschen, Cursor auf 
Home-Position

lcd_write_command(0b00000110); //Cursor Auto-Increment
}




//////////////////////////////////////////////////////////////////////// 
////////////////////
//////////////////////////////////////////////////////////////////////// 
/////////////////////
void lcd_write_text(char * textstring)
{
int i;

for (i=0; (textstring[i] != 0) && (i<8) ; i=i+1)
    {
  lcd_write_data(textstring[i]);
  }
}
Angehängte Dateien:
OP
Moin
hier die delay

#include <avr/io.h>

void delay_ms(unsigned int anz_milisekunden)
{
unsigned int i,k,l;

for(i=0;i<anz_milisekunden; i=i+1)
  {
  for(k=0;k<39; k=k+1)
    {
    l=0xff; //Irgendeine sinnlose Anweisung zur Zeitverschwendung
    }
    l=l+1;    //s.o.
  l=11;    //s.o.
  }

}



void delay_100us(unsigned int anz)
{
unsigned int i,l;

l=l+1;    //sinnlos
l=l+1;    //sinnlos
l=l+1;    //sinnlos
l=l+1;    //sinnlos
for(i=1;i<anz; i=i+1)
  {
    l=l+1;    //sinnlos
  l=l+1;    //sinnlos
  l=l+1;    //sinnlos
  l=l+1;    //sinnlos
  l=l+1;    //sinnlos
  l=l+1;    //sinnlos
  }

}
Angehängte Dateien:
Auch die Takteinstellung noch einmal überprüfen.

Aber als erstes: wirf deine eigenen delay Funktionen raus und ersetze 
sie mit _delay_ms() aus delay.h

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

Je nach Compiler Einstellung werden die nämlich wegoptimiert (und AVR 
Studio hat per Default den Optimizer eingeschaltet. Für delay.h ist das 
gut, für deinen Code aber schlecht)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 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.