Forum: Compiler & IDEs LCD ausgabe mit AVR Studio


von remote1 (Gast)


Lesenswert?

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)

von Danny (Gast)


Lesenswert?

Suche mal nach Peter Fleury hier im Forum (oder google). Er hat eine 
echt gute Lib für LCDs geschrieben, die erstklassig funktioniert.

von remote1 (Gast)


Lesenswert?

danke erst mal für die schnelle antwort, werd es morgen mal testen
bin für andere vorschläge trotzdem immer offen ;)

von Joe (Gast)


Lesenswert?

> 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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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).

von remote1 (Gast)


Lesenswert?

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)

von No.1 (Gast)


Lesenswert?

Stell mal dein Programm in den Anhang, dann kann man vieleicht was dazu 
sagen.

von remote1 (Gast)


Lesenswert?

is jetzt nichts weiter:

[c]
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <util/delay.h>

#include "lcd.h"

/*
** constant definitions
*/
static const PROGMEM unsigned char copyRightChar[] =
{
  0x07, 0x08, 0x13, 0x14, 0x14, 0x13, 0x08, 0x07,
  0x00, 0x10, 0x08, 0x08, 0x08, 0x08, 0x10, 0x00
};

void warte (uint16_t zeit)
{
   uint16_t i;
   for(i=0;i<zeit;i++) _delay_ms(1); //da für _delay_ms max 
Takt-abhängige Werte erlaubt
}

int main (void)
{
   lcd_init(LCD_DISP_ON);
   lcd_clrscr();
   /lcd_puts("LCD Test Line 1\n");
   lcd_puts("Line 2");

   return 0;
}

von No.1 (Gast)


Lesenswert?

#include "lcd.h"
Hast du in der Configuration vin WINAVR auch den Pfad für obiges include 
eingetragen?

von remote1 (Gast)


Lesenswert?

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

von No.1 (Gast)


Lesenswert?

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

von remote1 (Gast)


Lesenswert?

hab aber auch ne kopie im normalen lib verzeichnis (wo die anderen *.h 
liegen)

von remote1 (Gast)


Lesenswert?

wäre echt toll

von Karl H. (kbuchegg)


Lesenswert?

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.


von Karl H. (kbuchegg)


Lesenswert?

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

von remote1 (Gast)


Lesenswert?

hab alle fehlermeldungen weg bekommen un in der lib eigentlich nur die 
ports geändert, bekomme aber immer noch keine anzeige

von Karl H. (kbuchegg)


Lesenswert?

Zeig mal das komplette Projekt.

von remote1 (Gast)


Lesenswert?

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

von gast (Gast)


Lesenswert?

der R/W muss am PORT hängen ....

zumindest bei der lib vom peter fleury

von remote1 (Gast)


Lesenswert?

hab ich jetzt auch dran, funktioniert trotzdem noch nicht

von remote1 (Gast)


Lesenswert?

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...

von remote1 (Gast)


Lesenswert?

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

von saddevil (Gast)


Lesenswert?

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


von LCD Zerrstörer (Gast)


Lesenswert?

Funktioniert auf Anhieb!!!

von remote1 (Gast)


Lesenswert?

nur leider klappt bei mir nicht

von saddevil (Gast)


Lesenswert?

dann poste mal bitte

schaltplan

und die konfig  von der lcd.h

von Jan D. (keyman)


Lesenswert?

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 */
26
27
28
#define LCD_IO_MODE      1         /**< 0: memory mapped mode, 1: IO port mode */
29
#if LCD_IO_MODE
30
/**
31
 *  @name Definitions for 4-bit IO mode
32
 *  Change LCD_PORT if you want to use a different port for the LCD pins.
33
 *
34
 *  The four LCD data lines and the three control lines RS, RW, E can be on the 
35
 *  same port or on different ports. 
36
 *  Change LCD_RS_PORT, LCD_RW_PORT, LCD_E_PORT if you want the control lines on
37
 *  different ports. 
38
 *
39
 *  Normally the four data lines should be mapped to bit 0..3 on one port, but it
40
 *  is possible to connect these data lines in different order or even on different
41
 *  ports by adapting the LCD_DATAx_PORT and LCD_DATAx_PIN definitions.
42
 *  
43
 */
44
#define LCD_PORT         PORTC        /**< port for the LCD lines   */
45
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
46
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
47
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
48
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
49
#define LCD_DATA0_PIN    0            /**< pin for 4bit data bit 0  */
50
#define LCD_DATA1_PIN    1            /**< pin for 4bit data bit 1  */
51
#define LCD_DATA2_PIN    2            /**< pin for 4bit data bit 2  */
52
#define LCD_DATA3_PIN    3            /**< pin for 4bit data bit 3  */
53
#define LCD_RS_PORT      LCD_PORT     /**< port for RS line         */
54
#define LCD_RS_PIN       4            /**< pin  for RS line         */
55
#define LCD_RW_PORT      LCD_PORT     /**< port for RW line         */
56
#define LCD_RW_PIN       5            /**< pin  for RW line         */
57
#define LCD_E_PORT       PORTB     /**< port for Enable line     */
58
#define LCD_E_PIN        5            /**< pin  for Enable line     */

und mein testprogramm:
1
int main (void)
2
{
3
DDRB  = 0xFF;
4
DDRC = 0xFF;
5
6
wait(50000);
7
PORTB ^= (1<<PB0);    // LED
8
wait(50000);
9
PORTB ^= (1<<PB0);    // LED
10
wait(100000);
11
PORTB ^= (1<<PB0);    // LED
12
13
14
    lcd_init(LCD_DISP_ON);
15
    lcd_clrscr(); /* clear display and home cursor */
16
    lcd_puts("LCD Test Line 1\n");
17
wait(100000);
18
PORTB ^= (1<<PB0);    // LED
19
20
for(;;);
21
return 0;
22
}

von remote1 (Gast)


Lesenswert?

da war dann wohl jemand schneller

von Karl H. (kbuchegg)


Lesenswert?

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.


von Jan D. (keyman)


Lesenswert?

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

von saddevil (Gast)


Lesenswert?

gibt es einen schaltplan zu deinem aufbau ? ??
bei meinem mega8 hängt er auch verschiedenen ports

von Jan D. (keyman)


Lesenswert?

hallo.
also ich hab keinen plan gezeichnet :-)
aber so hab ichs: AVR --> LCD
___
| 28|------RW-----> 5
| 27|------RS-----> 4
| 26|------D3-----> 10
| 25|------D2-----> 9
| 24|------D1-----> 8
| 23|------D0-----> 7
|   |
|   |
|   |
|   |
| 18|------E-----> 6
|   |
|   |
|   |
|___|
ATmega8L

von Jan D. (keyman)


Lesenswert?

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

von Dirk F. (dirk-frerichs)


Lesenswert?

also 4bit modus ist eigentlich überall so  dokumentiert das
eben am LCD immer D4 bis D7 genutzt werden

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.