Bei der Beschreibung lcd.c (h) der Funktion steht z.B. drin:
lcd_puts_p (const ..)
lcd_puts (const ...) z.B. "Wert"
lcd_putc (char ...)
lcd_command(uint8_t cmd);
lcd_data(uint8_t data);
Zu einigen habe ich ein paar verständliche Erklärungen gefunden. Andere
sind mir unklar. Da ich mich der eng. Erklärung streite, komme ich nicht
weiter. Habe ein Beispiel hinter geschrieben. Könnte es mir jemand an
Hand von Beispielen erläutern?
achim
Achim Seeger schrieb:> Bei der Beschreibung lcd.c (h) der Funktion steht z.B. drin:>> lcd_puts_p (const ..)> lcd_puts (const ...) z.B. "Wert"> lcd_putc (char ...)> lcd_command(uint8_t cmd);> lcd_data(uint8_t data);>> Zu einigen habe ich ein paar verständliche Erklärungen gefunden. Andere> sind mir unklar. Da ich mich der eng. Erklärung streite, komme ich nicht> weiter. Habe ein Beispiel hinter geschrieben. Könnte es mir jemand an> Hand von Beispielen erläutern?> achim
zuallererst mal gibt es so etwas wie eine 'Konvention' in der
AVR-Programmierung. NIcht alle halten sich daran, aber doch viele.
Endet ein Funktionsname auf '_p', dann bedeutet das, dass die
zugehörigen Daten (meistens Strings) nicht im SRAM vorliegen, sondern im
Flash. Da der Zugriff aufs Flash anders erfolgen muss, als wie wenn die
Daten im SRAM liegen, muss man diese beiden Fälle unterscheiden und
daher auch 2 verschiedene Funktionen haben.
Damit haben wir
* lcd_puts_p
das puts weißt darauf hin, dass es sich um eine Funktion handelt, die
einen String ausgibt. Das _p ist der Hinweis, dass dieser String im
Flash vorliegt. lcd_puts_p gibt als einen String aus, der im Flash liegt
* lcd_puts
das puts ist wieder der Hinweis darauf, dass es sich hier um eine String
ausgabe handelt. Da nichts weiter angegeben ist, liegt der String ganz
normal im SRAM
* lcd_putc
so wie das 's' in 'puts' das Kürzel für String ist, so ist das 'c' in
'putc' ein Kürzel, nämlich das für Character. Wie ja auch unschwer am
Datentyp des Arguments zu erkennen ist.
Diese Funktion gibt also ein einzelnes Zeichen aus.
Die Unterscheidung Flash-SRAM ist bei Charactern nicht wirklich
relevant, da einzelne Character sowieso direkt im Code auftauchen (wenn
es sich um Konstante Character handelt), bzw wenn man sie manipulieren
musste dann liegen sie sowieso im SRAM. Kurz und Gut: Da es keinen Sinn
macht, einzelne Character ins FLash zu legen, gibt es auch keine
korrespondierende lcd_putc_p Funktion
* lcd_command
na, der Funktionsname ist aber recht eindeutig. Hier wird ein Kommando
ans LCD geschickt. Zum Beispiel "LCD-löschen".
* lcd_data
das übergibt ein Daten-Byte ans LCD zur gefälligen Darstellung.
lcd_command und lcd_data sind so etwas wie die unterste Schicht in den
LCD-Funktionen, auf denen aufbauend dann der Rest gemacht wird. Bei der
Übergabe ans LCD muss zwischen darzustellenden Daten und Kommandos
unterschieden werden. lcd_command und lcd_data implementieren genau
diesen Unterschied.
Ich muss dich wieder fragen:
Du hast den Source Code der Funktionen vor dir! Du darfst dir die
Implementierung dieser Funktionen ansehen! Ganz im Gegenteil: Es ist
eine wichtige Fertigkeit eines Programmierers, dass man aus vorhandenem
Source Code rauslesen kann, was dieser Code macht und welche Eigenheiten
bzw. Besonderheiten es gibt. Warum tust du das nicht? Die Funktionen
lcd_putc, lcd_puts, lcd_puts_p sind allesamt nicht schwer zu verstehen.
Alleine die Funtkionsargumente zeigen dir schon den Weg und der
UNterschied zwischen lcd_puts und lcd_puts_p ist im Code mehr als
eindeutig zu sehen.
Disclaimer: Alle Angaben basierend auf den üblichen LCD Libraries, wie
sie hier immer wieder auftauchen.
Achim Seeger schrieb:> sind mir unklar. Da ich mich der eng. Erklärung streite, komme ich nicht> weiter.
Sorry. Aber diese Ausrede lass ich nicht mehr gelten.
Auch du wirst zur Kenntnis nehmen müssen, dass es ohne Englisch nicht
geht. Technisches Englisch ist ganz einfach gestrickt. Das sind keine
literarischen Meisterwerke. Wenn Chinesen und Japaner, deren
Muttersprache komplett anders funktioniert als Englisch, damit klar
kommen, dann wird man ja wohl von dir verlangen können, dass du mit
deinem Deutsch, das dem Englischen im Vergleich dazu sehr ähnlich ist,
die P.Fleury Doku, wie zb ...
1
void lcd_putc( char c )
2
3
Display character at current cursor position.
4
5
Parameters:
6
c character to be displayed
7
Returns:
8
none
... lesen kannst. Das ist nicht wirklich weiter schwer. Und zur Not gibt
es ja immer noch Online-Übersetzer.
'Display character' ... Aha, da ist von einem Character die Rede. Also
ein Einzelzeichen. Passend dazu ist das einzige Argument der Funktion
ein 'char'. Was wird mit diesem Character gemacht? Er wird 'display',
also angezeigt/ausgegeben.
Im übrigen liefert P.Fleury ein Testprogramm mit, das die meisten
Funktionen in Aktion zeigt. Auch von dir kann man verlangen, dass du
dieses Programm studierst.
Was in C ein einzelner Character ist, wirst du ja wohl wissen. Und auch
wie String-Verarbeitung in C funktioniert. Denn dieser Unterschied
'Einzelzeichen' versus 'String' ist ein fundamental Wichtiger in C. Wenn
du damit Schwierigkeiten hast, dass ein Einzelzeichen in einfachen
Anführungszeichen steht, wie zb 'A' oder 'B', während ein String in
doppelten Anführungszeichen steht, wie zb "Test", dann solltest du dir
schleunigst ein C-Buch besorgen und durcharbeiten. Denn dann fehlt es
massiv an den Grundlagen.
Hallo Karl Heinz
ganz so richtig geht es mit eng nicht. Kriegsfuss ist stak übertrieben.
Wenn ich den Online Übersetzer nehme kommen teilweise sehr komische
Sachen raus, ist aber immer ein Hinweis was es sein könnte, auf könnte
liegt aber die Betonung. Die Bedeutung war schon meistens klar. Das
Problem waren die Buchstaben daran. Ein Beispiel sind die lcd_command.
Damit kann ich Befehle schicken z.B. Display löschen. Das kann ich doch
mit lcd_clrscr machen. Ist das nicht das gleiche? Das mit dem Text ist
klar auch die Zeichen da vor und da hinter. Das Testprogramm - meinst du
das mit lcd.c oder ist es noch ein anderes? das genannte habe ich als
Grundlage für mich genommen, um verschiedene Sachen zu testen. Werde es
mit Beispielen alles testen. Danke
achim
Achim Seeger schrieb:> Problem waren die Buchstaben daran. Ein Beispiel sind die lcd_command.> Damit kann ich Befehle schicken z.B. Display löschen. Das kann ich doch> mit lcd_clrscr machen. Ist das nicht das gleiche?
Grrrrrrrrrrrr!
Schau dir mal die Funktion lcd_crlscr an.
Hier ist sie, frisch aus dem lcd.c, direkt vom P.Fleury geholt
Was sehen wir?
Die Funktion lcd_clrscr ist nichts anderes als eine Funktion, die
lcd_command benutzt und dieser Kommando Funktion das richtige Kommando
mitgibt, so dass das LCD die Anzeige löscht.
Anstelle dass du dir selbst die einzelnen Kommandos merken musst, hat
sich Peter eine Funktion drumm herum gebastelt, so dass er sich das eben
nicht merken muss.
Das alles KANN man sehen, wenn man sich die Funktionen in der
Implementierung ansieht. Da du dich aber weigerst, das zu tun, siehst du
es auch nicht.
> Das mit dem Text ist klar auch die Zeichen da vor und da hinter.> Das Testprogramm - meinst du das mit lcd.c oder ist es noch ein anderes?
Im Zip-File, welches man vom Peter bekommt ist enthalten:
1
lcd.c
2
lcd.h
3
test_lcd.c
4
makefile
5
ein HTML File
6
und 2 Files, die ein doxygen im Namen haben
Welches davon wird wohl das Demo-File sein, welches die Funktionen in
Aktion zeigt?
PS: Man kann, man darf, ja man soll sogar *.c und *.h Files mit einem
Texteditor mal aufmachen um zu sehen, was da drinnen steht. Die beissen
nicht.
Mir reicht es jetzt. Ich steig aus. Ich kann dir nur raten, massiv
selbständiger zu werden. Die Dinge liegen vor deiner Nase und du siehst
sie nicht. Manchmal hab ich das Gefühl, du willst sie gar nicht sehen.
Am liebsten wäre es dir, wenn dir jemand alles vorkaut und auf einem
Silbertablett präsentiert. Bloss nichts selber rausfinden. Bloss keine
Eigeninitiative. Da könnte man ja was dabei lernen.
Hallo Karl-Heinz
Die Datein habe ich meinem Proz. angepasst. Bis auf den Hinweis das
beide Datein im gleiche Ordner sein sollen, habe ich alles richtig
gemacht. Seit gesten habe ich eine Anzeige auf meinem Display. Jetzt
arbeite ich alles durch, auch die Datein von Peter als erstes. Es hat
nur ein kleiner Anstoss gefehlt. Danke dafür
achim