mikrocontroller.net

Forum: Compiler & IDEs LCD ausgabe mit AVR Studio


Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Danny (Gast)
Datum:

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

Autor: remote1 (Gast)
Datum:

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

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: No.1 (Gast)
Datum:

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

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: No.1 (Gast)
Datum:

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

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: No.1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: remote1 (Gast)
Datum:

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

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wäre echt toll

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: remote1 (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeig mal das komplette Projekt.

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der R/W muss am PORT hängen ....

zumindest bei der lib vom peter fleury

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab ich jetzt auch dran, funktioniert trotzdem noch nicht

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: saddevil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: LCD Zerrstörer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert auf Anhieb!!!

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nur leider klappt bei mir nicht

Autor: saddevil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann poste mal bitte

schaltplan

und die konfig  von der lcd.h

Autor: Jan Dressler (keyman)
Datum:

Bewertung
0 lesenswert
nicht 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:
/** 
 *  @name  Definitions for MCU Clock Frequency
 *  Adapt the MCU clock frequency in Hz to your target. 
 */
#define XTAL 4000000              /**< 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           4     /**< number of visible lines of the display */
#define LCD_DISP_LENGTH    20     /**< 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      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     */

und mein testprogramm:
int main (void)
{
DDRB  = 0xFF;
DDRC = 0xFF;

wait(50000);
PORTB ^= (1<<PB0);    // LED
wait(50000);
PORTB ^= (1<<PB0);    // LED
wait(100000);
PORTB ^= (1<<PB0);    // LED


    lcd_init(LCD_DISP_ON);
    lcd_clrscr(); /* clear display and home cursor */
    lcd_puts("LCD Test Line 1\n");
wait(100000);
PORTB ^= (1<<PB0);    // LED

for(;;);
return 0;
}

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da war dann wohl jemand schneller

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Jan Dressler (keyman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: saddevil (Gast)
Datum:

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

Autor: Jan Dressler (keyman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan Dressler (keyman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dirk Frerichs (dirk-frerichs)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.