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

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.

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.