PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD an PORTC DB7->PORTC0



Barthimaeus
11.12.2008, 19:11
Hi,

wie ich bereits an anderer Stelle erwähnt habe ist es mir doch tatsächlich gelungen ein LCD nicht zu zerschiessen! Jetzt würde ich gerne das BASCOM Testprogramm, das ich geschrieben hatte durch ein C Programm ersetzen. Da ich das Rad nicht neu erfinden möchte, dachte ich mir, ich könnte entweder die LCDLib von Peter Fleury oder die im gcc Tutorial von mikrocontroller.net bereitgestellte LCDlib verwenden. Leider gibt es dabei einige Probleme.

PfleuryLib möchte, das der AVR mit DB0-3 und nicht mit DB4-7 des LCDs verbunden wird. Ich habe allerdings DB4-7 an ein Flachbandkabel gelötet, wie es im Wiki beschrieben wird.
Außerdem möchte die Lib, dass man einen Portpin für RW angibt. RW liegt bei mir aber permanent auf Masse (weil ich sowieso nur schreiben möchte).

Die mikrocontroller.net Variante benötigt zwar keinen RS Pin und möchte auch DB4-7 verwenden, jedoch kann man dort nicht konfigurieren, welcher DB mit welchem PORTC verbunden werden soll. Er macht immer DB4->PC0, usw.
Mein Aufbau sieht jedoch DB7->PC0, DB6->PC1, DB5->PC2, DB4->PC3, Enable -> PC4, RS->PC5 vor.

Wie kann ich eine der beiden Libs für meinen Aufbau konfigurieren? In Bascom gings ja ganz einfach ^^, aber C ist halt nicht Bascom.

Hubert.G
11.12.2008, 19:35
Ich verwende auch die Lib von Fleury, da stellt man in der lcd*.h ein wie man die Pin belegt. Es ist nicht notwendig alle an einen Port zu legen.
Das R/W ist nicht nur für lesen gedacht, sondern auch für die Abfrage des Busy-Bit. Die Schreibzyklen werden dadurch schneller.
Ich verwende es allerdings fast immer ohne R/W.

Barthimaeus
11.12.2008, 19:45
Danke schonmal

Wie vermittele, das ich kein BusyBit möchte?
Wo stelle ich ein, dass ich DB4-7 und nicht DB0-3 verwenden möchte?

zerush
11.12.2008, 19:56
In der lcd.h:



#define LCD_PORT PORTD /**< 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 3 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 2 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 1 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 0 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
#define LCD_RS_PIN 7 /**< pin for RS line */
#define LCD_RW_PORT LCD_PORT /**< port for RW line */
#define LCD_RW_PIN 6 /**< pin for RW line */
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
#define LCD_E_PIN 5 /**< pin for Enable line */


Das mit dem Busy-Bit weiß ich gar nicht, ob man das in der Fleury-Bib abstellen kann...
Du könntest aber einfach die lcd_waitbusy() umschreiben.

Hubert.G
11.12.2008, 19:58
Hier ist meine lcd-lib. In der lcd_new.h stellst du das Port und die Pin ein und ob du mit oder ohne R/W willst.
Unter #define lcd_busy_time 1000 kannst du die Wartezeit einstellen. Hier sind 1000µsec eingestellt, es geht meist kürzer, ist jedoch individuell einzustellen wenn man es sehr kurz haben will.

Barthimaeus
11.12.2008, 20:09
#define LCD_DATA0_PIN 3 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 2 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 1 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 0 /**< pin for 4bit data bit 3 */

Aber mein LCD wird nicht über DB0-3 sondern über DB4-7 angesteuert. Wo kann ich einstellen, dass ich 4-7 verwenden möchte?

thx

zerush
11.12.2008, 20:15
Ja genau da!
Du musst halt nur die zahlen für alle Pins ändern...

EDIT: oh Moment, ich glaube ich habe dich falsch verstanden!
Also die aufgelisteten Pins beziehen sich auf DB4-7. Also was dort mit 0 bezeichnet ist, bezieht sich auf DB4, die 1 auf DB5, usw.

Hubert.G
11.12.2008, 20:25
Das du vom LCD her die Leitungen DB4-7 verwendest ist bei 4bit Steuerung ohnehin klar.

oberallgeier
11.12.2008, 23:00
Hi, Barthimaeus,

noch munter? Bei meiner Fleury-lib gibts ne lcd_2x24.h dazu (natürlich auch die lcd_2x24.c). Da steht so etwa ab Zeile 81 für den 4-Bit-Modus ein bemerkenswerter Satz - und danach kommt die Port-/bzw. Pindefinition.


* 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....... in different order or even on different ports ...


#define LCD_PORT PORTA /**< 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 LCD_PORT /**< port for RW line */
#define LCD_RW_PIN 5 /**< pin for RW line */
#define LCD_E_PORT LCD_PORT /**< port for Enable line */
#define LCD_E_PIN 6 /**< pin for Enable line */
Da hatte ich eingetragen, was für mich sinnig war - und schon liefs.

Barthimaeus
12.12.2008, 14:19
Habe es jetzt mit Hubters Überarbetung von PFleury probiert und folgender Konfiguration:

#ifndef F_CPU
#define F_CPU 8000000L /**< clock frequency in Hz, used to calculate delay timer */
#endif

/**
* @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_READ_REQUIRED 0 /* 1: R/W aktiv, 0: R/W nicht aktiv,
* alle Funktionen die "lcd_read" benötigen sind inaktiv */
#if LCD_READ_REQUIRED == 0
#define lcd_busy_time 1000 /* busy_time 5000µsec */
#endif

#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 3 /**< pin for 4bit data bit 0 */
#define LCD_DATA1_PIN 2 /**< pin for 4bit data bit 1 */
#define LCD_DATA2_PIN 1 /**< pin for 4bit data bit 2 */
#define LCD_DATA3_PIN 0 /**< pin for 4bit data bit 3 */
#define LCD_RS_PORT LCD_PORT /**< port for RS line */
#define LCD_RS_PIN 5 /**< pin for RS line */

#if LCD_READ_REQUIRED
#define LCD_RW_PORT LCD_PORT /**< port for RW line */
#define LCD_RW_PIN 6 /**< pin for RW line */
#endif

#define LCD_E_PORT LCD_PORT /**< port for Enable line */
#define LCD_E_PIN 4 /**< pin for Enable line */

und diesem Testprogramm:


************************************************** ***********************
Title: testing output to a HD44780 based LCD display.
Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury
File: $Id: test_lcd.c,v 1.6 2004/12/10 13:53:59 peter Exp $
Software: AVR-GCC 3.3
Hardware: HD44780 compatible LCD text display
ATS90S8515/ATmega if memory-mapped LCD interface is used
any AVR with 7 free I/O pins if 4-bit IO port mode is used
************************************************** ************************/
#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd_new.h"



int main(void)
{

lcd_init(LCD_DISP_ON);

for (;;) { /* loop forever */
lcd_puts("LCD Test Line 1");


}
}


Der Bildschirm bleibt leer...

oberallgeier
12.12.2008, 15:30
Hallo Barthimaeus,

schon klar, PF´s lib hatte ich für (m)ein bestimmtes LCDisplay so umbenannt. Eigentlich heisst die lcd.h - und der zitierte Text ist auch ab Zeile 81 *ggggg*.
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

Wieweit das zu Deinem Controller passt, kann ich nicht beurteilen. Meine Erfahrung bezieht sich auf GENAU 1 LCDisplay. Das ist etwas dünn. Blos - gelaufen ist das sofort.

Barthimaeus
12.12.2008, 16:03
Dein LCD ist aber auch mit 5 und nich 4 Ports des µC verbunden, oder?

oberallgeier
12.12.2008, 16:22
Ich habe diese Stromversorgung (https://www.roboternetz.de/wissen/index.php/Bascom_und_LCD%27s#Anschluss) und den Anschluss mit 7 (SIEBEN ! ! *schluchz*) Ports. (https://www.roboternetz.de/wissen/index.php/LCD-Modul_am_AVR#4-Bit_Ansteuerung_mit_Busy.28I.2FO_Mode.29) Hier ein Auszug aus meinen Notizen. (http://oberallgeier.ob.funpic.de/LCD-21okt08.jpg)

Hubert.G
12.12.2008, 16:43
Wenn du am Kontrastregler drehst siehst du aber schon den schwarzen Balken.

Barthimaeus
12.12.2008, 16:48
Jep. Und ich habe natürlich auch 6 µC Ports belegt. 4DBs und 2 Steuerpins.

Sind denn Programm und Konfiguration für deine libversion ok?

oberallgeier
12.12.2008, 17:18
... Sind denn Programm und Konfiguration für deine libversion ok?Na ja, was soll ich sagen: Wenn ich die Zeichen an die richtige Stelle ausgebe - dann sind die auch da. SEHR schnell - viel schneller als mit seriellem Port an PC/Terminal. (".. richtige Stelle.." meint : da gibt es Fallstricke mit Zeilen- und Spaltennummerung ...). Mein Display hat 2x24 Zeichen.

Hubert.G
12.12.2008, 17:53
Ich habe die LCD-lib genau so in Verwendung wie ich sie dir geschickt habe.
Mach nach dem init noch ein lcd_clrscr, und vergrößere diesen Wert in der lcd*.h #define lcd_busy_time 1000 auf 5000. Wenn es funktioniert kannst du ihn ja wieder kleiner machen.

Barthimaeus
12.12.2008, 18:30
#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 */

Muss daran denn etwas verändert werden? Wie muss für ein 16x2 Display aussehen? Wie komme ich darauf?

Hubert.G
12.12.2008, 19:22
Du bist da um eine Zeile zu tief.
#define LCD_LINES 2 /**< number of visible lines of the display */
#define LCD_DISP_LENGTH 24 /**< visibles characters per line of the display */
Statt 24 gehört bei dir 16 rein.

Barthimaeus
13.12.2008, 09:45
Das hatte ich ja schon. Wissen wollte ich nur, ob an den oben geposteten Zeilen ÜBERHAUPT etwas verändert werden muss.

danke trotzdem - wir kommen bestimmt noch drauf

Hubert.G
13.12.2008, 09:54
Nein, in diesen Zeilen wird nichts geändert.

Barthimaeus
13.12.2008, 10:21
Gute Neuigkeiten ! Es klappt jetzt! Ich weiss zwar nicht warum, aber das sist mir jetzt auch egal ;)

Vielen dank für eure Hilfe!