PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD: Wo muss der R/W hin?



PCMan
16.02.2007, 18:47
Hi,
ich habe folgendes ausprobiert: Das LCD ist an meinen Mega8 wie im Wiki nach dem Anschlussschema OHNE BUSY LEITUNG angeschlossen. Mit der fleury-Bibliothek kann ich das gerät "richtig" nur betrieben, wenn ich die R/W-Leitung ebenfalls verwende. Bei meinem Mega8 sind jetzt die Ports PC0-5 belegt, die R/W Leitung könnte ich jetzt nur noch an PC6 (RESET) anschließen. Frage: darf ich das überhaupt? PC6?
Viele Grüße,
Simon

Jon
16.02.2007, 18:58
Wenn du den als Ausgang verwendest eigentlich schon. Als Eingang aber auf keinen Fall. Du kannst auch bei den Fusebits einen anderen Pin als Reset-Pin auswählen.

jon

Hanni
16.02.2007, 19:02
Wenn du den als Ausgang verwendest eigentlich schon. Als Eingang aber auf keinen Fall. Du kannst auch bei den Fusebits einen anderen Pin als Reset-Pin auswählen.

Grundlegend falsch.

1. kann man den Resetpin des ATMega 8 nur dann verwenden, wenn man den Reset "wegfust"
2. kann man ihn anschließend nur noch parallel programmieren
3. kann man keinen anderen Pin als Reset definieren.

Das steht übrigens alles im Datenblatt.

Grüße,
Hanni

Jon
16.02.2007, 19:06
Grundlegend falsch.
Bei mir funzt es. Oder sieht es nur so aus, als würde es gehen?
Ich hatte noch keine Probleme. Verwende aber auch kein Reset.

sorry, dass ich so einen Mist erzählt habe ](*,) :-#

jon ](*,)

PCMan
16.02.2007, 19:10
Okay, dann gegenfrage: kann ich einen anderen Port verwenden außer PrtC, wenn alle anderen schon belegt sind?

vg Simon

P.S.: bei mir funktioniert das Anlöten von R/W an PC6 mit Standradrfusebits auch nicht
P.S.: Sorry für schlechtes Deutschm, muss geschwind aus dem Haus

SIGINT
17.02.2007, 09:39
@PCMan:
Erstmal eine blöde Frage: Was für ein Display hast du?! Meine HD44780 Displays haben nur ein Busy-Flag... keine Busy-Leitung.
Dann ist es ganz logisch, daß du das Display nur mit R/W betreiben kannst:
Die Fleury-Lib testet nämlich das Busy-Flag und dafür wird gerade die R/W-Leitung benötigt (lesender Zugriff aufs Display!).
Bei der LIB kannst du die Datenleitungen und die einzelnen Kontroll-Leitungen auf verschiedenen PORTS verteilen... dafür musst du aber ein paar Parameter in einer Header-Datei ändern..... steht aber alles in der Online-Dokumentation von P.Fleury!!!

@Jon:
Es geht sich nicht darum, ob du RESET verwendest oder nicht:
Wenn RESET weggefuset wurde kannst du den AVR nur noch im High-Voltage-Modus programmieren... ISP und Low-Voltage-Programming funktionieren dann nicht mehr. Für die meisten Hobbybastler ist dieser Chip erstmal unbrauchbar... bis man sich ein richtiges Programmiergerät bastelt.
Eine Möglichkeit gibts aber: Man kann vorher einen Bootloader im AVR ablegen, dann kann man RESET ohne bedenken wegfusen... Programme bekommt man dann ja per Bootloader ins Flash.

Gruß,
SIGINT

PCMan
17.02.2007, 10:22
@Sigint:
Sorry für die mangelnde Beschreibung: ja es handelt sich dabei um ein HD44780 Display (PLED aus Robotikhardware um genau zu sein). Den Source von P. Fleury habe ich schon etwas durchgearbeitet und diese Header-Definitionen habe ich auch verstanden. Mir ginge es prinzipiell nur darum zu wissen, ob sich die Ansteuerung auf EINEN Port beschränkt. Ich werde es jetzt aber mal einfach testen
Btw: Ich habe auch versucht das Display im "nur schreiben" Modus zu betreiben, d.h. R/W auf Masse zu legen. Dann hatte ich in der lcd.c die Routinen, die Leseabfragen verwenden mit delay() ersetzt. Das Display ließ sich aber auf diesen Weg nicht schön ansteuern, gab immer wieder Fehler. Und das ganze rumgefiesele isses mir jetzt dann doch nicht wert...
Vg und danke,
Simon

PCMan
17.02.2007, 10:52
Hm also irgendwo muss ich noch einen Denkfehler haben.
Folgendes Anschlussschemata (am mega8, keinen externen Oszillator oder ähnliches; Intern 1MHz)

LCD-PIN........Bezeichnung..........Anschluss
1..................Gnd.......................Gnd
2..................Vcc........................Vcc
3..................Vee.......................Vee (am Poti)
4..................RS.........................PC4
5..................R/W.......................PD0 (RXD)
6..................Enable....................PC5
7.
8.
9.
10.
11................DB4.......................PC0
12................DB5.......................PC1
13................DB6.......................PC2
14................DB7.......................PC4

main.c



#include <stdlib.h>
#include <avr/io.h>

#include "lcd.c"



int main(void)
{
lcd_init(LCD_DISP_ON);
lcd_clrscr();
for (;;){
lcd_puts("Test");
}
return 0;
}


lcd.h

#ifndef LCD_H
#define LCD_H
/************************************************** ***********************
Title : C include file for the HD44780U LCD library (lcd.c)
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: lcd.h,v 1.13.2.2 2006/01/30 19:51:33 peter Exp $
Software: AVR-GCC 3.3
Hardware: any AVR device, memory mapped mode only for AT90S4414/8515/Mega
************************************************** *************************/

/**
@defgroup pfleury_lcd LCD library
@code #include <lcd.h> @endcode

@brief Basic routines for interfacing a HD44780U-based text LCD display

Originally based on Volker Oth's LCD library,
changed lcd_init(), added additional constants for lcd_command(),
added 4-bit I/O mode, improved and optimized code.

Library can be operated in memory mapped mode (LCD_IO_MODE=0) or in
4-bit IO port mode (LCD_IO_MODE=1). 8-bit IO port mode not supported.

Memory mapped mode compatible with Kanda STK200, but supports also
generation of R/W signal through A8 address line.

@author Peter Fleury pfleury@gmx.ch http://jump.to/fleury

@see The chapter Interfacing a HD44780 Based LCD to an AVR (http://homepage.sunrise.ch/mysunrise/peterfleury/avr-lcd44780.html)
on my home page.

*/

/*@{*/

#if (__GNUC__ * 100 + __GNUC_MINOR__) < 303
#error "This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !"
#endif

#include <inttypes.h>
#include <avr/pgmspace.h>

/**
* @name Definitions for MCU Clock Frequency
* Adapt the MCU clock frequency in Hz to your target.
*/
#define XTAL 8000000 /**< clock frequency in Hz, used to calculate delay timer */

/**
* @name Definition for LCD controller type
* Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
*/
#define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */

/**
* @name Definitions for Display Size
* Change these definitions to adapt setting to your display
*/
#define LCD_LINES 2 /**< number of visible lines of the display */
#define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
#define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
#define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
#define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
#define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */


#define LCD_IO_MODE 1 /**< 0: memory mapped mode, 1: IO port mode */
#if LCD_IO_MODE
/**
* @name Definitions for 4-bit IO mode
* Change LCD_PORT if you want to use a different port for the LCD pins.
*
* The four LCD data lines and the three control lines RS, RW, E can be on the
* same port or on different ports.
* Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on
* different ports.
*
* Normally the four data lines should be mapped to bit 0..3 on one port, but it
* is possible to connect these data lines in different order or even on different
* ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions.
*
*/
#define LCD_PORT PORTC /**< port for the LCD lines */
#define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
#define LCD_RS_PIN 4 /**< pin for RS line */
#define LCD_RW_PORT PORTD /**< port for RW line */
#define LCD_RW_PIN 0 /**< pin for RW line */
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
#define LCD_E_PIN 5 /**< pin for Enable line */

#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || defined(__AVR_ATmega64__) || \
defined(__AVR_ATmega8515__)|| defined(__AVR_ATmega103__) || defined(__AVR_ATmega128__) || \
defined(__AVR_ATmega161__) || defined(__AVR_ATmega162__)
/*
* memory mapped mode is only supported when the device has an external data memory interface
*/
#define LCD_IO_DATA 0xC000 /* A15=E=1, A14=RS=1 */
#define LCD_IO_FUNCTION 0x8000 /* A15=E=1, A14=RS=0 */
#define LCD_IO_READ 0x0100 /* A8 =R/W=1 (R/W: 1=Read, 0=Write */
#else
#error "external data memory interface not available for this device, use 4-bit IO port mode"

#endif
...
REST Unverändert gelassen


Müsste doch so eigentlich funktionieren oder? Ich habe selbst in der Makefile einmal F_CPU auf 1000000 und auch XTAL auf 1000000 (aus der lcd.h) gesetzt (müsste es eigentlich nicht 1000000UL heißen?), hat aber keinen Effekt - das Display bleibt schwarz.
Viele Grüße,
Simon

PCMan
17.02.2007, 11:33
Noch eine andere Frage: Das Fusebit JTAG wird mir weder im Pony-Prog noch in BASCOM angezeigt. Wie kommt das?

Hanni
17.02.2007, 12:25
Noch eine andere Frage: Das Fusebit JTAG wird mir weder im Pony-Prog noch in BASCOM angezeigt. Wie kommt das?

daher, das der ATmega 8 kein JTAG unterstützt ....

SIGINT
17.02.2007, 14:31
Hi PCMan,
du kannst bei Fleurys LIB nicht die R/W-Leitung weglassen, da die Funktion lcd_waitbusy() die Adresse des Adresscounters des Displays returnt. Und diese Adresse wird hier weiter verwendet:


int lcd_getxy(void)
{
return lcd_waitbusy();
}


Du müsstes also etwas mehr modifizieren, um die LIB ohne R/W-Leitung nutzen zu können.

Gruß,
SIGINT

PCMan
17.02.2007, 14:36
Hi SIGINT.
Ja, das habe ich soweit verstanden. Ich habe mich jetzt auch dazu entschlossen, die R/W-Leitung doch herzunehmen. Ich habe wie oben beschrieben mit dem Controller vedrahtet (R/W auf PD0) und in der Header eingetragen. Ich bekomme das Display aber nicht zum laufen. Es initialisiert garnicht erst. Ich verstehe das nicht, muss ich die Verdrahtung so wie im Wiki vornehmen? Das muss doch im Prinzip egal sein, wenn ich die Header richtig modifiziere.
VG Simon

P.S.: vielleicht hilft ein kleiner Hinweis: wenn ich illegalerweise kurzzeitig eine Brücke zwischen PD0 (oder R/W am LCD) und GND herstelle, springt das Display an. Was soll das?

SIGINT
17.02.2007, 15:09
Hmmm,
die RS232 nutzt du nicht, oder? Ansonsten würde RXD ja ein Eingang sein und R/W floaten. Ansonsten würde ich deine main() auch etwas ändern:


int main(void)
{
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("Test"); // Ausgabe ist im RAM des Displays gespeichert!
for (;;){}
return 0;
}


Ich würde mir auch mal das Datenblatt vom Display anschauen... vielleicht ist das nicht 100% kompatibel zum HD44780
Die Fleury LIB hat bei mir eigentlich direkt ohne Probleme funktioniert...

Gruß,
SIGINT

PCMan
17.02.2007, 17:24
Hi SIGINT. Danke für die nette Antwort.
Nein, RS232 benutze ich nicht. An dem mega8 hängt nihcts bis auf das Display.
Ich frage mal ganz dämlich: welchen Port würdest du dann beim mega8 nehmen? Es sind eigentlich alle anderen noch frei (bis auf die PC0-5 und die, die für ISP Programming benötigt werden).
Ich werde mir auch das Display Datenblatt morgen mal ansehen. Laut Robotikhardware ist esa aber genauso wie ein HD44780 ansteuerbar...
Noch was anderes: mein Programm kompiliere und linke ich mit make.
Die Übertragung in den Chip vollstrecke ich mit dem Befehl "avrdude -c stk200 -P lpt3 -p atmega8 -U flash:w:main.hex" (WinXP). Ich hatte ab und zu das Gefühl der µC sei "verwirrt", weil zum Teil noch alte Texte auf dem Display zu sehen waren, wenn ich mit BASCOM versucht habe ihn zu überschreiben um das Display auf seine Funktionalität zu testen. (Bascom: betrieb ohne busy-line. R/W mit Klemmen auf Masse gezogen. Display hat so funktioniert. Aber das ist ja nicht wichtig)
VG Simon

PCMan
18.02.2007, 16:05
Hallo Kollegen, ich komme wirklich nicht mehr weiter. Das Datenblatt (indem finde ich übrigens keine Angaben zum Chip)
http://www.robotikhardware.de/download/1602M03%20PLED_.pdf hilft mir nicht weiter, ich habe noch die Ports PB0 und PB1 probiert und die Delay-Zeiten ensprechend dem Datenblatt etwas verlängert (was eigentlich kein Unterschied machen sollte, weil die Zeiten schon entsprechend groß gewählt sind). Auch die DB-Lines habe ich mal umkonfiguriert, aber ich komme einfach zu keinem Ergebnis - es hängt vorallem vom Zufall ab, ob das Display mal anspringt oder nicht, und wenn, dann steht da nichts sinnvolles drauf ](*,) Sobald ich den Saft abziehe und neu anstöpsle bleibt das Display wie gewohnt schwarz. Ich verstehe nur noch Bahnhof.
In Bascom kann ich es initialisieren (sofern R/W) auf Masse - aber was macht Bascom da denn anders? Und ich will nicht Bascom verwenden, sondern C.
Als Anfänger hab' ich mir wirklich viel Gedanken gemacht, stoße jetzt aber wirklich an meine Grenzen :(
VG Simon

PCMan
21.02.2007, 16:47
Okay, ich habe letzte Änderungen vorgenommen:
PC1-3 sind jetzt Steuerleitungen
PD0-3 sind Datenbusleitungen.
Display initialisiert unter BASCOM im "nicht Busy Modus" - es funktioniert also.
Display funktioniert nicht mit der Library von P. Fleury. Es lässt sich nicht initialisieren (nichts zu erkennen). Ich habe die Initialisierungsroutinen aus der Lib studiert und mit dem Datenblatt verglichen. Ich kann da keine wirklichen Abweichungen erkennen. Ich finde aber nirgends eine konkrete Beschreibung dieser Funktion. Weiß da jemand mehr? Ach genau: wer lesen kann ist klar im Vorteil: Controller am PLED: PTC6880 1x, Driver PTC6880 1x
Es sind auf dem PLED 2 Chips zu erkennen, sind davon jetzt beide PTC6880? Ich finde übrigens nichts genaueres zu diesen Controllern.

Wisst ihr wirklich nicht weiter?
Viele Grüße,
Simon

/* EDIT: sollte nicht so frustriert sein ;) */

PCMan
25.02.2007, 18:44
Hallo Forum,
es hat sich heute nach ewigen rumtüftlereien herausgestellt, dass weder
der Controller, das Display oder die Konfiguration in P. Fleuries Lib
das Problem war, sondern die Stromversorgung: ich hatte irgendwie das
komische Gefühl, dass mit dem Netzteil was nicht stimmte, und habe daher
ein anderes angeschlossen (12V) und einen ordentlichen Spannungsregler
dazwischen geschleift.
Jetzt funktioniert das Display auch unter C einwandfrei. Mir ist bis
jetzt aber en Rätsel, warum BASCOM mit dem anderen Netzteil ausgekommen
ist.

Als Tipp in Zukunft für andere Anwender vielleicht sinnvoll: wenns überhaupt nicht geht, mal gucken ob die Stromversorgung OK ist ;)

VG Simon

Banzai
05.03.2007, 10:19
Hallo Leutz,

ich hätte da mal 'ne Frage:

Im Datenblatt zum Samsung KS0073 wird ständig ein IE Low/High angesprochen. Ausserdem noch ein RE und BE.

Ist damit immer die E-Leitung am Port gemeint (je nach Zusammenhang halt I-/R- oder BE)?

Bestimmt die E-Leitung als IE dann auch die Instruction Sets?

Ausserdem ist mir aufgefallen, dass in vielen Initialisierungsroutinen diese E-Leitung öfters mal ge'toggel'd wird. Hängt das mit dem Bild 18 S. 49 des Datenblatts http://www.andilcd.de/de/download/controller/andilcd_conchar_sheet_de_s6a0073_ks0073.pdf
zusammen, in dem die E-Leitung 2x High geschaltet wird, bevor die nächste Intruktion läuft?

Bin absoluter Newbie in Sachen Datenblätter, Elektronik und anderes an Magie grenzendes Zeug =P~

Nächste Frage (die jetzt nix direkt mit dem Display zu tun hat ):
Kann es sein, dass die delay.h falsch läuft? Selbst mit F_CPU 16000000 bei ATMega32/16MHz läuft dieser Code-Abschnitt keine 5 Sek.

// bei der MAX_MS_DELAY-Zahl kann ich mich täuschen. Soll halt das maximale Delay lt. _delay_ms sein. Hab's bloss gerade nicht zur Hand
#define MAX_MS_DELAY 262.14
:
delay_s( 5 );
:
:
void delay_s( double s ) // Sekunden
{
double ms = s * 1000; // Sekunden zu Millisekunden

while( ms > MAX_MS_DELAY )
{
_delay_ms( MAX_MS_DELAY );
ms -= MAX_MS_DELAY;
}
// was übrig bleibt auch noch abwarten
_delay_ms( ms );
}

Das mit delay ist halt bei den LCD-Initialisierungen wichtig, dass die Wartepausen stimmen.

Thx 4 Answer

Banzai

SIGINT
05.03.2007, 10:53
Hallo Banzai,
du bringst da einiges durcheinander:
Der PIN IE wählt einen von zwei verfügbaren Instruction Sets aus. Das ist wahrscheinlich eine "Krücke" um einerseits HD44780-kompatibilität zu gewährleisten und andererseits mehr Befehle anbieten zu können.
RE und BE sind Bits in einem Register die du ändern kannst.
RE dient dazu einen zusätzlichen, erweiterten Registersatz anzubieten um mehr Funktionen unterzubringen.
BE scheint zwischen zwei Zeichensätzen umzuschalten zu können (CGRAM, SEGRAM) ... genau hab ich mir das aber nicht angeschaut.

Die E"nable" leitung hat nichts mit IE zu tun, sondern dient als Clock Signal für die Daten.

Mein Tipp: Such mal im Netz nach fertigen Programmen für das Display oder besorg dir ein echtes HD44780-Display... dafür gibts tonnenweise Software.

Gruß,
SIGINT

Banzai
05.03.2007, 11:43
thx SIGINT für die schnelle Antwort!

OK, das mit dem IE ist dann mal geklärt (auch wenn ich jetzt nicht explizit weiss, ob der High oder Low geschaltet ist. Ich benutze den Display-Adapter von robotikhardware .http://www.robotikhardware.de/download/rn_LCD_adapter.pdf... keinen Schimmer wo das vermerkt ist. Habe die Datenblätter und Infos schon zig mal angeschaut.... wäre da auch für Hilfe dankbar.)

HA! RE und BE hab ich jetzt auch gefunden ](*,)
BE ist ja nur ein BIT bei einem Kommando. RE zwar auch, aber das ist irgendwie nicht 'beschaltet'?!? OK, find ich noch raus....

Dein Tipp ist zwar gut gemeint, aber ich möchte verstehen, was ich da in einem Datenblatt lese, wird ja nicht mein Einzigstes bleiben. Aus fertigen Quellcodes sehe ich nur: Das wird halt so gemacht, aber WARUM das so gemacht wird möchte ich verstehen...

Ich weiss, viele Anforderungen....

Trotzdem danke nochmal...

Banzai

SIGINT
05.03.2007, 15:05
Hi Banzai,
ich sehe jetzt spontan keinen Unterschied in den Befehlssätzen 1 und 2... also dürfte IE für dich erstmal egal sein. Wahrscheinlich kannst du das sowieso nicht ändern. Der Adapter hat ja ein Pinout was bei allen HD44780 Displays zu finden ist: E,RS,RW,Data
Mit RE und BE würde ich mich auch nicht rumschlagen... lass einfach die Hände davon. Mit RE kannst du wie gesagt noch auf einen weitern Registersatz zugreifen, der weitere Funktionen anbietet. Die wirst du am Anfang aber nicht benötigen.

Ab Seite 58 findest du den Ablauf der Initialisierung für das Display... die scheint vom HD44780 abzuweichen und muss von dir per Hand, oder mit einer passenden LIB durchgeführt werden.
Danach sollte das Display wie jedes HD44780-Display funktionieren.

Gruß,
SIGINT