PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : riesige LCD Probleme



Ineedhelp
18.05.2008, 01:07
Hi

ich bin jetzt seit 2 tagen dabei eins von meinen 2 LCD displays anzusteuern. Nix geschafft

ich habe (von Pollin):
LCD-Modul POWERTIP PC1602LRS-FSO-B-Y6
LCD-Modul HLM8070

so ich habe es mit einem Atmel Tiny 2313 versucht. Den habe ich nach diesem Tutorial programmiert und angeschlossen (4Bit)
Mikrokontroller.net (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#LCD-Ansteuerung)
das gab keine Probleme
dann habe ich es auf einem Steckbrett alles zusammengebaut und 5V angeschlossen
Auf dem Display war nichts zu sehen, dann habe ich alles durchgemessen ob an den erforderlichen Stellen Spannungen anliegt, was der Fall war.

Daraufhin habe ich das andere 2te Display genommen, selber effekt ->nix

Dann habe ich im Forum gesucht und dann jmd gefunden der meinte man muss die lcdlibary von Peter Fleury nehmen.
Den Code (4bit) damit neu gemacht (4-Bit Ansteuerung mit Busy(I/O Mode) aus dem RN Wiki), den Tiny geflasht neu zusammengesteckt, 5V drangehauen

aber nix passiert

weiter google bemüht und gelesen, dass das lcd display schon was anzeigt wenn man nur Vcc und GND anschliesst
ist aber bei mir auch nicht der Fall, da ist null/nix (bei beiden)

ich bin jetzt echt am boden zerstörrt
hoffe mir kann jemand helfen

Danke

Hubert.G
18.05.2008, 08:27
Du musst auch den Kontrast anschließen, mit einem Poti, wenn du daran drehst muss in der ersten Zeile ein schwarzer Balken sichtbar werden.

Ineedhelp
18.05.2008, 11:40
achso, ich dachte immer es kommt ein schwarzes kästchen, wenn der auf GND liegt

habe es auf jedenfall mit einem 4,7Mohm Poti gemacht
kann jetzt alle spannungen zwischen 0 und 5 V einstellen
allerdings hilft das nichts, ich sehe kein Kästchen oder sowas ->nix

Ineedhelp
18.05.2008, 12:29
habe gerade das zweite getestet (LCD-Modul HLM8070)
das funktioniert jetzt, ich sehe kästchen

so werde da jetzt mal meinem tiny anschliessen

Danke, hast mir sehr geholfen

werde mich melden, falls es wieder probleme gibt

Ineedhelp
20.05.2008, 11:46
so, habe meinen Text leider immernoch nicht dargestellt

so, eine weitere Frage

LCD-Pin Funktion

1 GND
2 VDD +5V
3 Kontrast
4 I/OC1
5 R/W
6 ex
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4
12 DB5
13 DB6
14 DB7
15 I/OC2

was macht der 15te LCD Pin? Aus dem Datenblatt habe ich, dass es ein control pin ist, er entscheidet ob auf das display geschrieben oder gelesen wird.

Aber was braucht der jetzt zum schreiben? eine 1 oder eine 0
und wieso gibt es I/OC 2 mal (auch pin 4)?

linux_80
20.05.2008, 14:29
Hallo,

Du hast aber beachtet, dass das HLM8070 einen anderen Controller drauf hat, und mit dem gleichen Programm wie für den HD44780 nicht laufen wird ?!

Bei Pollin kann man sich das DB dazu runterladen, da steht das wichtigste drin. Es ist sogar ein Beipsiel enthalten wie es gemacht wird. Sollte doch für den Anfang reichen.

Ineedhelp
20.05.2008, 14:48
oh stimmt, habe ich nicht beachtet
danke für den tipp
das DB ist zwar gut beschrieben, aber ein richtiges code beispiel kann ich nicht finden

allerdings arbeite ich gerade mit dem POWERTIP PC1602LRS-FSO-B-Y6
2 Fragen dazu
1. geht das überhaupt in 4 bit? kann dazu im DB nichts finden
2. in der header datei steht

// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#define F_CPU 8000000

// LCD Befehle

gilt das für meinen tiny2313 auch (ist immer von mega die rede) oder muss ich bei der portierung auf tiny noch was beachten?


achja mein code, habe den auf port B geändert

main.cpp

//
// Anpassungen im makefile:
// ATMega8 => MCU=atmega8 im makefile einstellen
// lcd-routines.c in SRC = ... Zeile anhängen
//
#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>

int main(void)
{
while(1)
{

lcd_init();

lcd_data('T');
lcd_data('e');
lcd_data('s');
lcd_data('t');

set_cursor(0,2);

lcd_string("Hello!");
_delay_ms(1000);

lcd_clear();
}

return 0;
}



lcd-routines.h

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
//
void lcd_data(unsigned char temp1);
void lcd_string(char *data);
void lcd_command(unsigned char temp1);
void lcd_enable(void);
void lcd_init(void);
void lcd_home(void);
void lcd_clear(void);
void set_cursor(uint8_t x, uint8_t y);

// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!

#define F_CPU 8000000

// LCD Befehle

#define CLEAR_DISPLAY 0x01
#define CURSOR_HOME 0x02

// Pinbelegung für das LCD, an verwendete Pins anpassen

#define LCD_PORT PORTB
#define LCD_DDR DDRB
#define LCD_RS PB4
#define LCD_EN PB5
// DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden


lcd-routines.cpp

// Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus
// http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
//
// Die Pinbelegung ist über defines in lcd-routines.h einstellbar

#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>

// sendet ein Datenbyte an das LCD

void lcd_data(unsigned char temp1)
{
unsigned char temp2 = temp1;

LCD_PORT |= (1<<LCD_RS); // RS auf 1 setzen

temp1 = temp1 >> 4;
temp1 = temp1 & 0x0F;
LCD_PORT &= 0xF0;
LCD_PORT |= temp1; // setzen
lcd_enable();

temp2 = temp2 & 0x0F;
LCD_PORT &= 0xF0;
LCD_PORT |= temp2; // setzen
lcd_enable();

_delay_us(42);
}

// sendet einen Befehl an das LCD

void lcd_command(unsigned char temp1)
{
unsigned char temp2 = temp1;

LCD_PORT &= ~(1<<LCD_RS); // RS auf 0 setzen

temp1 = temp1 >> 4; // oberes Nibble holen
temp1 = temp1 & 0x0F; // maskieren
LCD_PORT &= 0xF0;
LCD_PORT |= temp1; // setzen
lcd_enable();

temp2 = temp2 & 0x0F; // unteres Nibble holen und maskieren
LCD_PORT &= 0xF0;
LCD_PORT |= temp2; // setzen
lcd_enable();

_delay_us(42);
}

// erzeugt den Enable-Puls
void lcd_enable(void)
{
// Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers einfügen
// http://www.mikrocontroller.net/topic/81974#685882
LCD_PORT |= (1<<LCD_EN);
_delay_us(1); // kurze Pause
// Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers verlängern
// http://www.mikrocontroller.net/topic/80900
LCD_PORT &= ~(1<<LCD_EN);
}

// Initialisierung:
// Muss ganz am Anfang des Programms aufgerufen werden.

void lcd_init(void)
{
LCD_DDR = LCD_DDR | 0x0F | (1<<LCD_RS) | (1<<LCD_EN); // Port auf Ausgang schalten

// muss 3mal hintereinander gesendet werden zur Initialisierung

_delay_ms(15);
LCD_PORT &= 0xF0;
LCD_PORT |= 0x03;
LCD_PORT &= ~(1<<LCD_RS); // RS auf 0
lcd_enable();

_delay_ms(5);
lcd_enable();

_delay_ms(1);
lcd_enable();
_delay_ms(1);

// 4 Bit Modus aktivieren
LCD_PORT &= 0xF0;
LCD_PORT |= 0x02;
lcd_enable();
_delay_ms(1);

// 4Bit / 2 Zeilen / 5x7
lcd_command(0x28);

// Display ein / Cursor aus / kein Blinken
lcd_command(0x0C);

// inkrement / kein Scrollen
lcd_command(0x06);

lcd_clear();
}

// Sendet den Befehl zur Löschung des Displays

void lcd_clear(void)
{
lcd_command(CLEAR_DISPLAY);
_delay_ms(5);
}

// Sendet den Befehl: Cursor Home

void lcd_home(void)
{
lcd_command(CURSOR_HOME);
_delay_ms(5);
}

// setzt den Cursor in Zeile y (1..4) Spalte x (0..15)

void set_cursor(uint8_t x, uint8_t y)
{
uint8_t tmp;

switch (y) {
case 1: tmp=0x80+0x00+x; break; // 1. Zeile
case 2: tmp=0x80+0x40+x; break; // 2. Zeile
case 3: tmp=0x80+0x10+x; break; // 3. Zeile
case 4: tmp=0x80+0x50+x; break; // 4. Zeile
}
lcd_command(tmp);
}

// Schreibt einen String auf das LCD

void lcd_string(char *data)
{
while(*data) {
lcd_data(*data);
data++;
}
}

Danke an alle die mir helfen
versaut einem die ganze laune, wenn sowas nicht funktioniert :(

linux_80
20.05.2008, 16:36
Wegen dem Codebeispiel hab ich mich verguckt, den hab ich woanders her, irgendwo von hier:
http://www.mikrocontroller.net/topic/9903

Tiny und Mega sind Softwaremässig kompatibel, solange genug Ports da sind, sollte es auch auf dem Tiny laufen.

Das Powertip soll einen HD44780 haben, und der kann 4Bit, beim HLM steht auch was von 4 Bit dabei, musst nur ins DB gucken wie man den aktiviert.

Du verwendest als Dateiendung .cpp, willst du nun in C++ proggen oder nicht ? Ansonsten nimm lieber die .c, dann kommts zu keiner Verwirrung.

Ineedhelp
23.05.2008, 16:53
sry .c war gemeint
schreibe nur sonst immer cpp, daher der fehler

leider bekomme ich es nicht hin
kann mal jemand über den code schauen? glaube da liegt der fehler

habe gelesen, wenn ich nur in der ersten reihe schwarze balken habe (habe ich) ist die initialisierung nicht richtig