PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD an STK500



Rosenthal
03.06.2005, 13:33
Hallo, ich bin absoluter Anfänger. Bis jetzt habe ich es geschaft, die LEDs am STK500 zum Leuchten zu bringen. Jetzt muss ich ein LCD ansteuern, welches bestimmte Daten anzeigen soll. Zum ersten Test reicht mir auch die Anzeige einfacher Zeichen. Gibt es irgendwo eine gut verständliche Anleitung, wie man so ein C-Programm schreiben kann? Oder gibt es vielleicht schon ein kurzes Programm, welches z.B. nur ein Wort ins Display schreibt?
Ich habe mir schon mal den Code von Peter Fleury angesehen, nur blicke ich da nicht so richtig durch.

Ich verwende winavr mit gnu99 einen atmega163 und ein 4*16 Display mit 44780 Chip

Vielen Dank schon mal

Rosenthal
03.06.2005, 14:15
ups, habe gerade mc-projekt entdeckt. Werde mal versuchen mit der Anleitung das Display zum Leben zu erwecken. Falls noch es noch weitere Beispiele/Erklärungen gibt, bitte trotzdem Posten. Danke

michaelb
03.06.2005, 20:45
Hi Rosenthal,
warum willst du dich plagen und nicht die LCD Lib benutzten? Viele machen weniger Fehler und bekommen es zum laufen wenn sie die lib benutzen! Die funktioniert ganz einfach wenn du willst schick ich dir mal ein paar Quelltexte! Und erklär es dir!
Gruß Michi

Rosenthal
05.06.2005, 10:24
@michaelb

LCD Lib? Würde gerne mehr darüber erfahren. Wäre echt super, wenn Du mir etwas darüber schicken könntest.

Danke schon mal im Voraus

michaelb
08.06.2005, 18:03
Hab dir schon was geschickt darauf musst du mir aber noch antworten!
Gruß Michi

Rosenthal
09.06.2005, 07:25
@michaelb

Sorry, habe die Nachricht erst jetzt gelesen. Nun zu Deinen Fragen. Ich möchte den Controller in C programmieren (null Ahnung von BASCOM).
Mit Bibliotheksfunktionen habe ich bis jetzt auch noch keine Erfahrung.
Habe aber gestern das Display mit Hilfe von Peter Fleury zum laufen gebracht. Dabei war mein Problem, dass ich die test_lcd.c übersehen habe #-o . Hatte als versucht in lcd.c etwas ins Display zu schreiben. :-$

Jetzt habe ich ein weiteres kleines Problem. Wie kann ich mir mit dieser Lib eine Gleitpunktvariable (z.B. 15,5 oder 15,2 usw.) anzeigen lassen?
Ich möchte das Display dazu benutzen, mir den Strom und die Spannung anzeigen zu lassen. Momentan zeigt das Display folgendes an:
Strom: 15
Spannung: 13
Temperatur: 23
Dabei sind die Werte vordefinierte Zahlenwerte (int a=15;). Diese Int-Werte sollen die Messwerte enthalten. Allerdings nicht als Integer, sondern als Float. Die Messwerte liegen im ASCII-Format vor. Also, wie bekomme ich diese im ASCII-Format vorliegenden Daten ins Display? Habe schon in test_lcd mit float 15.5 versucht, bekomme aber nur 15 angezeigt. Dabei sind die 15.5 nur als ein Test zu sehen.

Rubi
09.06.2005, 12:50
Hier kannst Du einmal sehen wie man ein LCD an das STK500 anschließen kann. Ich hoffe das hilft Dir weiter.
http://www.avr-asm-tutorial.net/avr_de/lcd4_500.html

LG
Rubi

Rubi
09.06.2005, 12:53
@michaelb


Dabei sind die Werte vordefinierte Zahlenwerte (int a=15;). Diese Int-Werte sollen die Messwerte enthalten. Allerdings nicht als Integer, sondern als Float. Die Messwerte liegen im ASCII-Format vor. Also, wie bekomme ich diese im ASCII-Format vorliegenden Daten ins Display? Habe schon in test_lcd mit float 15.5 versucht, bekomme aber nur 15 angezeigt. Dabei sind die 15.5 nur als ein Test zu sehen.

Mittels des Befehls sprintf kannst Du eine oder mehrer Zahle in einen String konvertieren. Mit ftoa geht das auch, sprintf ist mir aber lieber und kann auch mehr.

Hier mögliche Werte für die Typangabe bei sprintf()
Einer Typ-Angabe welche den Typ enthält, als der das Argument angesehen werden soll. Mögliche Angaben sind:

...
f - das Argument wird als float angesehen und eine Fließkomma-Zahl ausgegeben.
...

Also z.B.:

char buffer[20];
float f_z=15,5;
sprintf(buffer,"Wert = %f",f_z);



LG
Rubi

Rosenthal
09.06.2005, 14:27
Danke für die Antwort. Ich habe mal meinen Code eingefügt.
Wenn ich jetzt statt itoa(a,buffer,10) Deinen Code sprintf(buffer,"=%f",f_z) einfüge, bekomme ich an dieser Stelle nur =? angezeigt.

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"


int a=15;
int b=12;
int c=23;
int d=90;
int i=0;
char buffer[10];
float f_z=15.5;

void lcd_display(void)
{
lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts("Laststrom:\n");
lcd_puts("Spannung:\n");
lcd_puts("Temperatur:\n");
lcd_puts("Kapazitaet:\n");
while(i<=3)
{
lcd_gotoxy(12,i);
if(i==0)
sprintf(buffer,"=%f",f_z);
//itoa(a,buffer,10);
else if(i==1)
itoa(b,buffer,10);
else if(i==2)
itoa(c,buffer,10);
else
itoa(d,buffer,10);
lcd_puts(buffer);
i++;
}
}

int main(void)
{
lcd_display();
}

Rubi
09.06.2005, 16:09
Hallo

probiere bitte mal ftoa(f_z,buffer,10);

ansonsten fällt mir nur ein das sprintf zu stdio.h gehört und du das nicht includiert hat.

Wenn es mit ftoa funzt, dann ist erst einmal dein Problem gelöst und wenn
Du möchtest können wir dann weitersuchen was mit dem sprtinf los ist.

LG
Rubi

Rosenthal
09.06.2005, 19:27
@Rubi
Vielen Dank, werde es morgen früh ausprobieren.

Rosenthal
10.06.2005, 09:02
Guten Morgen an alle!

Habe jetzt die stdio.h included. Bekomme dann nur die Meldung, dass ein double format vorliegt, aber ein float verwendet wird. Das ist ja weiter nicht schlimm. Ansonsten wird der Befehl sprintf... vom Compiler erkannt.

#include <stdlib.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "lcd.h"
#include <stdio.h>

float f_z=15.5;
char buffer[20];

void lcd_display(void)
{lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_gotoxy(0,0);
sprintf(buffer,"=%f",f_z);
lcd_puts(buffer);
}
int main...

Ich bekomme immer noch nur "=?" angezeigt. Kann es sein, das die Funktion lcd_puts(buffer) keine Float-Werte weitergeben kann? Ich habe mal die Lib mit angefügt, wo dieser Befehl declariert wurde. Wenn ich sprintf(buffer,"=%d",f_z); verwende bekomme ich "=-13107". Bei int a=5 und sprintf(buffer,"=%d",a) bekomme ich "=5" angezeigt.

Der Befehl ftio(f_z,buffer,10) wird gar nicht erkannt. Fehlermeldung "implicit declaration". Habe ich irgendeine Header-Datei vergessen?

Rubi
10.06.2005, 09:52
also dann gibt es folgende möglichkeiten, du kannst vorher auf float casten,
sollte aber nicht notwendig sein und vielleicht solltest du vorher explicit die vor und nachkommastellen angeben:
sprintf(buffer,"%-2.2f",(float)f_z);
Das bedeutet 2 Vorkommastellen und 2 Nachkommastellen.

Wenn Du es Heute nicht hinbekommst, schaue ich es mir mit meinem STK an. Wäre ja gelacht wennn wir das nicht hinbekommen.

LG
Rubi

Rosenthal
10.06.2005, 10:16
?- bekomme ich dann immernoch angezeigt. Was meinst du mit "auf float casten"?
Wieso zeigt er mir eigentlich ein Fragezeichen an? Müste das Prog eigentlich gar nichts anzeigen, wenn die Werte auserhalb eines Bereiches liegen?
Man, so viele ?-Zeichen habe ich noch nie in einem Test verwendet.

Rubi
10.06.2005, 11:54
Guten Morgen an alle!


Der Befehl ftio(f_z,buffer,10) wird gar nicht erkannt. Fehlermeldung "implicit declaration". Habe ich irgendeine Header-Datei vergessen?

Sorry nicht
ftio(f_z,buffer,10)
sondern:
ftoa(f_z,buffer,10);

Binmir jetzt aber nicht sicher ob das in ANSI C unterstützt wird.
Im Internet habe ich gerade gelesen das anstelle von ftoa gcvt verwendet wird.
d.h.:
gcvt(f_z,4,buffer);

Die 4 bedeutet die Anzahl der Ziffernd die Übersetzt werden sollen.
Ohne es selbst zu compilieren ist das ein wenig wie im trüben zu fischen.

Das sprintf nicht bei Dir funktioniert ist seltsam.
Das mit dem Fragezeichen auch.
Hast Du anstelle des , schon einen . als commaseparator probiert?

Casten bedeutet einen Typ in einen anderen zu konvertieren.
Das wird häufig dann verwendet wenn du eine Funktion aufrufst die einen anderen Datentyp verlangt als den mit dem Du zur Zeit arbeitest.
Meißtens geht es zwar auch ohne, aber so wird man die Warnungen los,...
Ein sauberer Code sollte keine Warnungen produzieren.

Nein mit der Library sollte es nichts zu tun haben.
Für die Library wird deine Zahl ja in einen String umgewandelt.

LG
Rubi

Rubi
10.06.2005, 11:55
Probier mal

float f_z = 15,5;

LG
Rubi

Rosenthal
10.06.2005, 12:13
Hatte im Code ftoa(f_z,buffer,10) stehen gehabt, war nur oben ein Schreibfehler.
Er bricht aber die Compilierung mit der Meldung "implicit declaration of funktion 'ftoa'" ab. Obwohl bei itoa... keine Meldung erscheint.

Die selbe Fehlermeldung erscheint mit gcvt(f_z,4,buffer).

Bei 15,5 anstatt 15.5 bricht der Compiler ebenfalls ab."parse error before numeric constant"

Falls es noch weitere Vorschläge gibt, bitte schreiben.

Rubi
10.06.2005, 12:28
Bitte probier noch dieses:

ftoa (f_z, buffer, 2, 2);

LG
Rubi

Rosenthal
10.06.2005, 12:31
Wie immer "test_lcd.c c:29: warning: implicit declaration of funktion 'ftoa'
Dann bricht der Compiler ab.

Rubi
10.06.2005, 13:02
Hm

Ich werde es zu hause selbst einmal probieren.

LG
Rubi

Rosenthal
10.06.2005, 13:10
Vielen Dank aber schon mal für die bisherige Hilfe.

Gruß
Rosenthal

Rosenthal
10.06.2005, 13:17
Welche <*.h> Datei muss ich den eigentlich für den Befehl ftoa() einbinden? Komisch ist ja, dass itoa() funktioniert, nicht aber ftoa().

Rubi
10.06.2005, 13:25
Das Problem ist, das itoa und ftoa nicht in Ansi C definiert sind.
Wenn es implementiert ist sollte

stdlib.h ausreichen.
Du kannst aber einmal ein find in files mit der suche nach ftoa starten, in dem folder wo die headerfiles von Gcc gespeichert sind.
Dann weist Du ob es implementiert ist und welches header file includiert werden muß.

LG
Rubi

Rubi
10.06.2005, 13:34
Am gescheitesten wäre es wahrscheinlich , sich schnell selbst eine Funktion zur Umwandlung von float Zahlen in einem String zu schreiben

LG
Rubi

Rosenthal
10.06.2005, 13:42
Also, ich habe nach *ftoa* in allen Dateien von e:\winavr gesucht. Wurde nicht gefunden.

Rubi
10.06.2005, 13:45
Also ganz scheuslich und schnell gehackt könnte das so aussehen:

#include <string.h>

int z;
char temp[10];

itoa((int)f_z,buffer,10);
z= atoi(buffer);
f_z -= z;
f_z *=100;
itoa((int)f_z,temp,10);
strcat(buffer,",");
strcat(buffer,temp);

Sollte ich mich jetzt nicht grob verhaut haben, ist immer möglich wenn man seinen Code nicht compiliert und gleich selber ausprobiert,...
dann müßte das jetzt funktionieren.
f_z wird aber dabei verändert.
Wenn Du es später noch einmal benötigst, solltest Du den Wert in eine zweite Variable kopieren.

LG
Rubi

Rubi
10.06.2005, 13:45
Also, ich habe nach *ftoa* in allen Dateien von e:\winavr gesucht. Wurde nicht gefunden.

Somit fällt die Umwandlung mit ftoa also mit GCC flach,...

LG
Rubi

Rosenthal
10.06.2005, 14:18
Es geschehen doch noch Wunder. Also bis jetzt (3 Tests) zeigt er die Float-Zahl richtig an (mit deinem geschriebenen Code). Vielen, vielen Dank für Deine Hilfe.

Gruß
Rosenthal

P.S.: Schönes Wochenende trotz sch... Wetter an alle

Rubi
10.06.2005, 14:24
Hallo

Das freut mich.
Wenn Du den Code verbessern möchtest oder sonst noch Fragen hast, kein Problem. Kannst mir auch gerne eine PM senden, wenn Du das Problem nicht öffentlich diskutieren möchtest.

LG, schönes Wochenende
Rubi

Rosenthal
13.06.2005, 13:43
Wer suchet, der findet (irgendwann auch mal ein Korn :-& ). Also der Befehl um double in einen string umzuwandeln lautet bei dem Compiler dtostrf(double _val, char _width,_char _prec, char *_s).

Rubi
13.06.2005, 14:20
Hallo

Das ist ja fein ;-)
Es ist immer besser bibliotheken zu verwenden,
als Funktionen selbst zu schreiben.
Danke für die Info!

LG
Rubi

Rosenthal
13.06.2005, 14:35
Trotzdem danke für Deine Hilfe. Habe bis jetzt auch deinen Code verwendet. Habe diesen Befehl auch nur bei der Suche nach der Headerdatei von delay() gefunden.

Was geschieht eigentlich, wenn man ein anderes c-Prog verwendet? Muss man dann die Headerdateien "mitexportieren", oder wie wird das gemacht?

Rubi
13.06.2005, 17:41
Ich nehme an, Du meinst einen anderen Compiler?
Die Ansi C funktionen, sind unabhängig vom Compilerhersteller,
in den selben Header Dateien definiert.

LG
Rubi