atmega8 mk2 und lcd keine ausgabe

OP #3134305
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
#3134344
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
}
Gast #3134348
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 ?
Gast #3134394
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.

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