mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit LCD 4 Bit Initalisierung


Autor: Markus Meyer (erdi007)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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]);
  }
}

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void delay_ms(unsigned int anz_milisekunden);
void delay_100us(unsigned int anz);

Ich würde mal sagen der Fehler liegt in den Fkt. die du ja nicht 
gepostet hast...

Bzw. wie kompliert sowas überhaupt?

Autor: Markus Meyer (erdi007)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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
  }

}

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK das kann nicht funtionieren bzw ist Zufall...

guck mal hier nach _delay_ms aus den Libs bzw _delay_us..

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf den ersten Blick entdecke ich nichts, was auf einem ATMEGA32 laufen 
könnte, auf einem ATMEGA8 aber nicht. Du solltest noch einmal die 
Hardware checken, vielleicht sind irgendwelche Pins vertauscht.

Gruß, DetlevT

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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-Tu...

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.