Forum: Mikrocontroller und Digitale Elektronik Unterschied bei lcd_put


von Achim S. (achims)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Achim S. (achims)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
1
/*************************************************************************
2
Clear display and set cursor to home position
3
*************************************************************************/
4
void lcd_clrscr(void)
5
{
6
    lcd_command(1<<LCD_CLR);
7
}

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.

: Bearbeitet durch User
von Achim S. (achims)


Lesenswert?

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

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.