Ich hab grad AVR Studio + WinAVR installiert und frage mich, wie ich
eine Ausgabe auf mein Display in C-Programmierung bekomme.
Ich weiss, dass man bei BASCOM z.b. erst mal definieren muss, wo genau
die Datenleitungen des Display's sind und das R/W, E,...
Kann mir jemand sagen, wie das bei AVR Studio gemacht wird und wie ich
dann eine Ausgabe hinbekomme ???
Hab schoin gelesen, dass printf relativ Speicheraufwendig ist, also
lieber irgenswie anders.
Ach ja, ich hab einen ATMega32 und hab im Moment nur 4 der 8
Datenleitungen des Displays an Ports (PA4-PA) angeschlossen (in Bascom
fkt alles tadellos, möchte aber lieber C programmieren)
> möchte aber lieber C programmieren
Dann programmier doch in C und verwende nicht irgendeine LIB die fertig
ist. So kompliziert ist die Ansteuerung eines LCD nicht.
Wenn du nur eine LIB anpaßt dann lernst du nix.
printf hat nichts mit einem LCD zu tun. Du kannst aber die Ausgaben,
welche printf macht, an das Display umleiten.
Also, C schritt für schritt.
remote1 wrote:
> Ich hab grad AVR Studio + WinAVR installiert und frage mich, wie ich> eine Ausgabe auf mein Display in C-Programmierung bekomme.> Ich weiss, dass man bei BASCOM z.b. erst mal definieren muss, wo genau> die Datenleitungen des Display's sind und das R/W, E,...> Kann mir jemand sagen, wie das bei AVR Studio gemacht wird und wie ich> dann eine Ausgabe hinbekomme ???> Hab schoin gelesen, dass printf relativ Speicheraufwendig ist, also> lieber irgenswie anders.> Ach ja, ich hab einen ATMega32 und hab im Moment nur 4 der 8> Datenleitungen des Displays an Ports (PA4-PA) angeschlossen (in Bascom> fkt alles tadellos, möchte aber lieber C programmieren)
Nunja, du musst erstmal den Hintergrund verstehen. BASCOM ist eher
Baukasten-orientiert. Sprich: Alle Bibliotheken vorhanden, aber nicht
einsehbar. Dafür kann der Benutzer aber halt direkt Daten auf das
Display ausgeben.
In C läuft das anders. Du musst dir deinen eigenen "Treiber" bauen (in
Form einer Funktion, die an bestimmten Pins "wackelt" und bestimmte
Daten an den Datenport des Displays ausgibt).
Alternativ, wie schon genannt, nimmst du eine fertige Lib (zB von peter
fleury).
habs mit der lib nicht hinbekommen und im internet nur tutorials zu
assambler gefunden, jemand ne idee (ich hab das TC1602E-01 Pollin)
bekomme bei der lib immer nen fehler "undifined reference to ...", egal
welche fkt von der lib ich einbinde (lcd.h und co sind eingebunden)
is es bei c net so, das wenn ich #include "lcd.h" schreibe er direkt im
ordner sucht, wo auch der code liegt und bei #include <lcd.h> nur beim
angegebenen pfad in der winavr
So Feierabend für heute.
Werde in den Nächsten Tagen mal einen einfachen Code für die LCD
Ansteuerung
reinstellen wo funktioniert.
Damit kann man dann nach belieben herumspielen.
Es scheint das viele Leute trots der Lib. von Fleury große Probleme
damit haben ein LCD zum laufen zu bringen.
MFG
N0.1
No.1 wrote:
> So Feierabend für heute.> Werde in den Nächsten Tagen mal einen einfachen Code für die LCD> Ansteuerung> reinstellen wo funktioniert.> Damit kann man dann nach belieben herumspielen.> Es scheint das viele Leute trots der Lib. von Fleury große Probleme> damit haben ein LCD zum laufen zu bringen.
Das stimmt nicht ganz.
Die meisten Leute haben Probleme ein Projekt aufzusetzen,
dass aus mehr als 2 *.c Dateien bestehen.
Das hat nichts mit einem LCD und schon gar nicht mit
der Fleury Lib zu tun.
Also.
Öffne dein Projekt.
Dann klickst du mit der rechten Maustaste in das linke
Fenster in dem die Projektdateien die zu deinem Projekt
gehören liegen. Und zwar machst du das über dem Baumeintrag
der da lautet: Source Files.
Im aufklappenden Menü wählst du aus: "Add Existing Source File(s)"
Anschliessend zeigst du dem AVR-Studio die Datei lcd.c,
denn die gehört ja schliesslich auch zum Projekt mit dazu.
Compilieren, linken und wenn du bei der Anpassung der lcd.h
keinen Fehler gemacht hast: geht
ja, im prinzip wie oben halt nur noch die lcd.h abgeändert:
...
#define XTAL 16000000
...
#define LCD_LINES 2
#define LCD_DISP_LENGTH 16
...
#define LCD_PORT PORTA
#define LCD_DATA0_PORT LCD_PORT
#define LCD_DATA1_PORT LCD_PORT
#define LCD_DATA2_PORT LCD_PORT
#define LCD_DATA3_PORT LCD_PORT
#define LCD_DATA0_PIN 4
#define LCD_DATA1_PIN 5
#define LCD_DATA2_PIN 6
#define LCD_DATA3_PIN 7
#define LCD_RS_PORT LCD_PORT
#define LCD_RS_PIN 0
#define LCD_RW_PORT LCD_PORT //der hängt bei mir eigentlich aug
masse
#define LCD_RW_PIN 2
#define LCD_E_PORT LCD_PORT
#define LCD_E_PIN 1
ich hab das TC1602E-01 Pollin
und die Datenleitungen D4-D7 an PA4-PA7
RS is an PA0
R/W auf massse
E auf PA1
ach ja, ich benutze keine eigenenes makefile
ich hab soweit alles in avr studio eingestellt (µC, taktfrequenz,
optimierung)
die lcd.c ist auch mit eingebunden
hab leider nur ein datenblatt mit pinbelegung und nicht mit init...
hat denn keiner evtl das besagte Display (LCD-Modul TC1602E-01 von
pollin, Bild bei pollin stimmt nicht überein, also nicht wundern)
eventuell kann ja mal jemand der das Diyplay hat einen Beispielcode
inclusive lcd.h schicken/posten
Wie gesagt, bei BASCOM funktionierts einwandfrei
kann ja nur noch an der Initialisierung liegen, bei den PORTS bin ich
mir sicher, dass diese stimmen
Hab aber leider auch nur das Datenblatt von pollin (nur Pinbelegung),
bin also ziemlich aufgeschmissen
ich habe das blau beleuchtete von pollin
was so ähnlich aussieht
also meines funzt super..
es lief auch ganz einfach weil ich vorher noch nie mit AVR oder sowas zu
tun hatte
ich habe die lib von peter fleury genommen
lcd.c ( diese einbinden )
lcd.h ( diese einbinde und configurieren anhand deiner beschaltung)
dann einfach im MAIN eine
while(1)
{
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("..test..");
}
das lcd muss zumindest wenn es initialisiert wird kurz leer werden ...
wenn es das nicht tut .. liegt meist er verdrahtungsfehler /
konfigurationsfehler vor
ich hab mich auch oft vertan mit den ports
hi leute!
irgendwie "schäme" ich mich ja für meinen beitrag, aber ich stehe grade
irgendwie aufm schlauch. die verkabelung hab ich etwa 1000 mal gecheckt
;-) und das sollte stimmen
aber das lcd macht keinen mucks raus aus dem "testmode" (eben nachm
einschalten).
bitte mal kurz "drübersehen".
danke schonmal
jan
lcd.h:
1
/**
2
* @name Definitions for MCU Clock Frequency
3
* Adapt the MCU clock frequency in Hz to your target.
4
*/
5
#define XTAL 4000000 /**< clock frequency in Hz, used to calculate delay timer */
6
7
8
/**
9
* @name Definition for LCD controller type
10
* Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
11
*/
12
#define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
13
14
/**
15
* @name Definitions for Display Size
16
* Change these definitions to adapt setting to your display
17
*/
18
#define LCD_LINES 4 /**< number of visible lines of the display */
19
#define LCD_DISP_LENGTH 20 /**< visibles characters per line of the display */
20
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
21
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
22
#define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
23
#define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
24
#define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
25
#define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
Jan Dressler wrote:
> hi leute!> irgendwie "schäme" ich mich ja für meinen beitrag, aber ich stehe grade> irgendwie aufm schlauch. die verkabelung hab ich etwa 1000 mal gecheckt> ;-) und das sollte stimmen> aber das lcd macht keinen mucks raus aus dem "testmode" (eben nachm> einschalten).> bitte mal kurz "drübersehen".
Sicher.
> #define LCD_RW_PORT LCD_PORT /**< port for RW line */> #define LCD_RW_PIN 5 /**< pin for RW line */> #define LCD_E_PORT PORTB /**< port for Enable line */> #define LCD_E_PIN 5 /**< pin for Enable line */
Ich glaub dir nicht, dass sowohl R/W als auch E
an Pin 5 sitzen. Sowohl E als auch R/W müssen bei der
Fleury Lib angeschlossen werden! R/W einfach weglassen,
geht nicht.
> #define LCD_PORT PORTC /**< port for the LCD lines */
Welchen Prozessor hast du? Falls es ein Mega16 oder Mega32
ist: Das JTAG Interface ist abgeschaltet? Per Default ist
das bei diesen Prozessoren eingeschaltet und blockiert
den PORT C.
Hallo.
oh mist hab ich ganz vergessen dazu zu schreiben.
ich habe nen ATmega8L
und nach meiner meinung hängen E und R/W doch garnicht am gleichen port.
für das obere ist immer PORTC (R/W ist an port C pin 5)
und E hängt am port B pin 5.
jan
Hallo.
ok hab den fehler gefunden...
in der lib is da wohl nen doku-fehler unterlaufen, im 4bit modus nutzt
man die OBEREN 4 bit.
daher gings nicht.
also muss die belegung folgendermaßen sein (in meinem fall):
___AVR --> LCD
| 28|------RW-----> 5
| 27|------RS-----> 4
| 26|------D7-----> 14
| 25|------D6-----> 13
| 24|------D5-----> 12
| 23|------D4-----> 11
| 18|------E-----> 6
|___|
ATmega8L
andiestrinklatsch
naja sind halt unterschiedlich dokumentiert, habs zufällig irgendwo
grade gelesen...
danke allen die nachgedacht haben!
MfG
jan