Forum: Mikrocontroller und Digitale Elektronik atmega8 mk2 und lcd keine ausgabe


von steffan v. (programos)


Lesenswert?

Hallo, wollte ein Programm zur Ansteuerung eines LCD Displays. Habe mir 
dazu was abgetippt, bekom aber keine gescheite ausgabe ins display. 
vielleicht kann wer helfen würd mich freuen.
Hier mein Code in c:

#define F_CPU 3686400
#include <avr\io.h>
#include <util\delay.h>

void wait_ms (int miliSec)
{
  _delay_loop_2(1*(F_CPU/(1000/4))*miliSec);
  }

void wait_us (int mikroSec)
{
  _delay_loop_2(1*(F_CPU/(1000000/4))*mikroSec);
  }


void lcd_init()
{
  DDRD=0x0ff;
  PORTD=0;

  wait_ms(50);

  PORTD=0x30;

  PORTD|=(1<<3);
  PORTD&=~(1<<3);

  wait_ms(5);


  PORTD=0x30;

  PORTD|=(1<<3);
  PORTD&=~(1<<3);

  for (int i=0;i<100;i++);

  PORTD=0x30;

  PORTD|=(1<<3);
  PORTD&=~(1<<3);

  wait_ms(5);


  PORTD=0x20;

  PORTD|=(1<<3);
  PORTD&=~(1<<3);

  wait_ms(5);

  lcd_cmd(0x28);
  lcd_off();
  lcd_clear();

  lcd_cmd(0x06);
  lcd_on();
}


void lcd_send(char data)
{
  char rs=PORTD;
  rs&=4;

  char tmp=data;
  tmp&=0xf0;
  tmp|=rs;
  PORTD=tmp;

  PORTD|=(1<<3);
  PORTD&=~(1<<3);

  tmp=data;
  tmp&=0x0f;
  tmp*=16;
  tmp|=rs;
  PORTD=tmp;

  PORTD|=(1<<3);
  PORTD&=~(1<<3);

  wait_ms(2);
}

void lcd_cmd(char cmd)
{
  PORTD&=~(1<<2);
  lcd_send(cmd);
}

void lcd_clear()
{
  lcd_cmd(0x01);
  wait_ms(2);
}

void lcd_home()
{
  lcd_cmd(0x02);
  wait_ms(2);
}

void lcd_on()
{
  lcd_cmd(0x0E);
}

void lcd_off()

{
  lcd_cmd(0x08);
}

void lcd_goto(int row, int col)
{
  row--;
  row&=0x01;
  row*=40;
  col--;
  col&=0x0f;
  char tmp=row|col;
  tmp|=0x08;
  lcd_cmd(tmp);
}

void lcd_write(char text)
{
  PORTD|=(1<<2);
  lcd_send(text);
}


int main (void)
{


  wait_ms(200);
  lcd_init();
  wait_ms(100);

  while(1)
  {
  lcd_write("hallo");
  wait_ms(100);
  //lcd_clear();
  //lcd_home();
  }
  return 0;}

danke

von Timmo H. (masterfx)


Lesenswert?

Achsooo, DAS DISPLAY. Ja dann ist die ganze Initialisierung natürlich 
falsch! Tut mir leid.
Und so wie deine Beschaltung aussieht, passt das auch alles nicht.


Mehr Infos mensch. Wie soll man dir so helfen?

von steffan v. (programos)


Lesenswert?

Die Initialisierung geht soweit. Doch als Ausgabe schreibt mir das LCD 
Display nur ein Komma. Bin totaler Anfänger bitte nachsicht.
Hab den Code aus dem AVR Lernheft LCD.

von Timmo H. (masterfx)


Lesenswert?

Naja was mir so gleich auffällt ist dass du "lcd_write("hallo");" eine 
Zeichenkette an eine Funktion sendest, die einen char erwartet welche 
wiederum nichts anderes macht als den "char" in irgendeiner Form an das 
Display sendet.

Ohne mir jetzt genau alles angesehen zu haben müsste meiner Meinung nach 
deine lcd_write routine eher so aussehen
1
void lcd_write(char *text)
2
{
3
  PORTD|=(1<<2);
4
  while(*text){
5
    lcd_send(*text);
6
    text++;
7
  }
8
}

von Quarz (Gast)


Lesenswert?

Bin nun auch kein Profi, meine aber das void wait_ms (int miliSec) und 
void wait_us (int mikroSec) nicht richtig funktionieren.
Was hast du denn für einen Quarz an deinem Atmega8 und was für Fuses 
sind gesetzt ?

void lcd_write(char text) erwartet ein Char Zeichen ('a')  , keinen 
String("string").

Woher weißt du das die Initialisierung funktioniert ?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wozu eine eigene delay() Funktion, wenn es die delay.h gibt?

von steffan v. (programos)


Lesenswert?

vielen dank an masterfix deine Antwort funst mercie.

von Quarz (Gast)


Lesenswert?

Ist bei mir, jedem? am Anfang durchaus auch vorgekommen.
Wenn man nur mit einem Lernheft arbeitet, ist das auch nachvollziehbar.
Die Befehle lauten :
_delay_ms()
_delay_us()
Die delay.h ist ja bereits eingebunden.

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.