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)
Suche mal nach Peter Fleury hier im Forum (oder google). Er hat eine echt gute Lib für LCDs geschrieben, die erstklassig funktioniert.
danke erst mal für die schnelle antwort, werd es morgen mal testen bin für andere vorschläge trotzdem immer offen ;)
> 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)
Stell mal dein Programm in den Anhang, dann kann man vieleicht was dazu sagen.
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; }
#include "lcd.h" Hast du in der Configuration vin WINAVR auch den Pfad für obiges include eingetragen?
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
hab aber auch ne kopie im normalen lib verzeichnis (wo die anderen *.h liegen)
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
hab alle fehlermeldungen weg bekommen un in der lib eigentlich nur die ports geändert, bekomme aber immer noch keine anzeige
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
der R/W muss am PORT hängen .... zumindest bei der lib vom peter fleury
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 */ |
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 | }
|
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
gibt es einen schaltplan zu deinem aufbau ? ?? bei meinem mega8 hängt er auch verschiedenen ports
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.