Forum: Compiler & IDEs Librarys einbinden - glcd (Ks0108) Test


von Philipp L. (viech)


Angehängte Dateien:

Lesenswert?

Hallo,

ich würde gern mittels eines Testprojektes und Library mit der 
Ansteuerung von glcd`s anfangen (Ja, Nicht der 1 Thread).

Verwendetes System:
AtmelStudio7
Atmega8
C

ich habe bisher "fast" keine Erfahrung im Einbinden vom Lib`s:
Bisher habe ich nur die sbit.h in ein Projekt eingebunden, wozu ich 
diese einfach in den Unterordner /util kopiert habe.
Danach konnte ich diese mit #include <util/sbit.h> nutzen.
Dies Ablegen in /util ist aber wohl nur für allgemeine Libs zu 
empfehlen?

ich habe für dieses Projekt die Lib von Thiele gefunden:
https://www.mikrocontroller.net/articles/KS0108_Library

Meine Vorgehensweise war bisher wie folgt:
- Zip von Thiele entpackt und in Ordner abgelegt
- Neues Projekt mit mega8 in AtmelStudio erstellt
- Code aus "ks0108Test.c" in main.c kopiert
- die 3 genannten .h Datein in den Projektordner kopiert
- Im rechten Fenster unter Librarys/Add diese ausgewählt (siehe 
Screenshot)
- in der ks0108.h die Ports angepasst

Beim compilieren werden mir nun 2 Fehler angezeigt:
-recipe for target 'main.o' failed
-ks0108.h: No such file or directory


Hier nochmal der kopierte Code (jetzt in main.c):

/*
 * Copyright:      Fabian Maximilian Thiele  mailto:me@apetech.de
 * Author:         Fabian Maximilian Thiele
 * Remarks:        this Copyright must be included
 * known Problems: none
 * Version:        1.1
 * Description:    KS0108 Library Demo Program
 *
 */

#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

#include "ks0108.h"
#include "arial_bold_14.h"
#include "corsiva_12.h"

int main(void) {

  // Wait a little while the display starts up
  for(volatile uint16_t i=0; i<15000; i++);

  // Initialize the LCD
  ks0108Init(0);

  // Select a font
  ks0108SelectFont(Arial_Bold_14, ks0108ReadFontData, BLACK);
  // Set a position
  ks0108GotoXY(15,10);
  // Print some text
  ks0108Puts_P(PSTR("KS0108-Treiber"));
  // a nice little round rect
  ks0108DrawRoundRect(5, 5, 117, 20, 8, BLACK);

  // Once again :)
  // Select a font
  ks0108SelectFont(Corsiva_12, ks0108ReadFontData, BLACK);
  // Set a position
  ks0108GotoXY(5,30);
  // Print some text
  ks0108Puts_P(PSTR("http://www.apetech.de\nmailto:me@apetech.de";));

  while(1);
}



Fragen:
1:include
Wie muss der #include Befehl aussehen?
Hier steht bei mir noch: #include "ks0108.h"
Reciht das "ks0108.h" , wenn ich die Lib eingebunden habe?

2:makefile
diese ist bei der zip von thiele enthalten, wird diese benötigt?
Wenn ja, was mache ich damit?

3:sonstiges
Was habe ich bei den genannten Schritten noch nicht beachtet oder was 
habe ich falsch gemacht?


Danke für eure Hilfe!

: Verschoben durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

*.h-Dateien sind keine Libraries und gehören deswegen im "Solution 
Explorer" nicht unter "Libraries" eingebunden.

Es genügt, die Dateien in das gleiche Verzeichnis zu kopieren, in dem 
auch Deine Quelltextdatei main.c liegt.

Zu Deinem Projekt musst Du allerdings noch die ks108.c hinzufügen - das 
sollte mit einem Rechtsklick auf "Displayansteuerung-V1" und "Add 
existing Files to Project" funktionieren.

Ich gehe davon aus, daß auch die ks108.c im gleiche Verzeichnis wie 
Deine Quelltextdatei liegt.

von Philipp L. (viech)


Lesenswert?

Ich dachte, dass ich den Code aus ks108.c ODER ks0108Test.c verwenden 
kann und der Code aus der ks0108Test.c einfach eine Art minimalcode zum 
ersten Test darstellt?

Deshalb habe ich den Code aus ks0108Test.c in die Main.c kopiert.
Habe ich da etwas falsch verstanden?

Wo wird denn die ks108.c im Code verwendet?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Philipp L. schrieb:
> Wo wird denn die ks108.c im Code verwendet?

Die enthält die Funktionen, die Du verwenden willst.

In ks108.h sind nur die Funktionsprototypen dieser Funktionen enthalten.

ks108test.c ist ein Beispielprogramm, wie man die Funktionen verwenden 
kann.

Das steht da sogar im Klartext ("ks108 library demo program") drin; hast 
Du Dir das beim Raus-und-Rumkopieren nicht angesehen?

von Peter D. (peda)


Lesenswert?

Philipp L. schrieb:
> Atmega8

Vergiß es.
Für Grafik brauchst Du einen MC mit ordentlich Flash (Font Tabellen) und 
SRAM (Bildspeicher).
Der ATmega1284 sollte gehen.

von Philipp L. (viech)


Lesenswert?

Rufus Τ. F. schrieb:
> ks108test.c ist ein Beispielprogramm, wie man die Funktionen verwenden
> kann.

Ja, deshalb habe ich den Code ja auch in meine Main.c kopiert.

Rufus Τ. F. schrieb:
> *.h-Dateien sind keine Libraries und gehören deswegen im "Solution
> Explorer" nicht unter "Libraries" eingebunden.

welche Dateien sind denn Libraries und müssen dort hinein (ich fürchte 
schon die Antworten :-) ..)

Peter D. schrieb:
> Für Grafik brauchst Du einen MC mit ordentlich Flash (Font Tabellen) und
> SRAM (Bildspeicher).

Schon klar, ist ja auch nur ein Test.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Philipp L. schrieb:
> welche Dateien sind denn Libraries und müssen dort hinein

Da ist keine einzige Library im Spiel, auch wenn der Mensch, der das 
Zeug geschrieben hat, es so nennt.

Tatsächlich hast Du die Kombination aus einer Headerdatei (*.h) und 
Quelltext (*.c).

In der Headerdatei ks108.h steht im übertragenen Sinne drin, daß es 
anderswo Funktionen gibt, die so und so heißen und diese und jene 
Parameter sehen wollen.

Das nennt man Funktionsprototyp.

Die Funktionen selbst befinden sich in der Quelltextdatei ks108.c.

Damit Du die Funktionen nutzen kannst, musst Du diese Quelltextdatei zu 
Deinem Projekt hinzufügen.

Da das keine Library ist, sondern einfach nur eine Quelltextdatei, 
geschieht dies auf genau die gleiche Art und Weise, wie Du auch andere, 
von Dir geschriebene Quelltextdateien zu Deinem Projekt hinzufügt.

Im "Solution Explorer" machst Du einen Rechsklick auf das 
(fettgeschriebene) Projekt und benutzt "Add existing file(s) to project" 
aus, um "ks108.c" auszuwählen.

Damit sollte in der Liste der Dateien, in der auch Dein main.c steht, 
auch "ks108.c" auftauchen.

--

Die Diskussion, was eine Library ist und was nicht, tauchte hier in 
letzter Zeit häufiger auf -- dieser Thread ist ein gutes Beispiel dafür, 
warum die laxe Bezeichnung von Quelltext oder Headerdateien als 
"Library" sehr, sehr ungünstig ist. Das Entwicklungssystem hat ganz 
eindeutige Vorstellungen davon, was eine Library ist, nämlich eine 
Binärdatei, die aus bereits compiliertem Code besteht.

von Philipp L. (viech)


Angehängte Dateien:

Lesenswert?

Leider funktioniert die Vorgehensweise noch nicht (siehe Anhang).

- Ich habe die Dateien aus dem Solution-Explorer aus Libraries gelöscht
- die drei .h Dateien + ks108.c liegen nun im Projektordner

Woran kann es liegen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nun, Du solltest Dir die Fehlermeldungen des Compilers auch ansehen.

Fang mit der ersten an, die weiteren können Folgefehler sein.

von Philipp L. (viech)


Angehängte Dateien:

Lesenswert?

Ja,

Ich habe daraufhin in der corsiva_12.h und arial_bold_14.h die 
Variablentypen von int zu const (wie in der Fehlerbeschreibung 
gefordert) geändert:
const uint8_t Corsiva_12[] PROGMEM = {

Jetzt sind die Fehler zwar weg ("nur" noch Warnings vorhanden), es 
scheint aber irgendetwas generelles nicht zu stimmen?
Er findet mit den pointer Targets der Schriftartenauswahl etwas nicht.

Ich kann mit dem Fehler leider nichts anfangen.
Weiterhin erscheint es mit komisch, dass ich die Datentypen ändern muss 
(int=const).

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Die Lib ist schon älter. Aktueller Compiler meckern jetzt sehr vieles 
an, was die damaligen Versionen klaglos hingenommen haben.

Warnings sind keine Fehler in dem Sinne, daß da was nicht gefunden wird, 
sondern weisen darauf hin, daß da etwas ungewöhnlich und eventuell nicht 
das tut, was du erwartest. Compiliert wird das Programm aber 
vollständig.

Wenn du Warnings nicht verstehst, kannst du den Comiler auch dazu 
bringen, deutsche Fehlermeldungen auszugeben. Google hilft dabei weiter.

Oliver

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Philipp L. schrieb:
> die Variablentypen von int zu const

Nö. Von static zu const.

von Philipp L. (viech)


Lesenswert?

Okay, prinzipiell funktioniert die Ansteuerung nun (trotz dieser 
Warnings).
Auch die verschiedenen Schriftarten kann ich auswählen und der 
Fontgenerator geht auch.

Aber:
Das ganze ist SUPER LAANNGGGSAAMMMM..... -> eingeschlafen :-)

Bei 1Mhz kann ich allein schon bei der Funktion "ClearScreen" zusehen, 
wie die einzelnen "Zeichen je Reihe" gelöscht werden.
Bei 8Mhz etwas schneller, aber man kann beim schreiben der Zeichen 
zusehen.

Ist das bei diesem Code normal?
Ich möchte mich eigentlich gern mit den Einzelfunktionen eines 
"guten/schnellen" Codes näher vertraut machen.

Ich habe in der ks0108.c schon viel von ReadData gelesen.
Kann es sein, dass dieser Code viel "verifiziert" und vom Display 
zurückliest?

Gibt es da evtl. eine bessere/schnellere "fertige" Ansteuerung

Gruß,
philipp

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?

Philipp L. schrieb:
> Gibt es da evtl. eine bessere/schnellere "fertige" Ansteuerung

Klar gibt es die.
Bis zu 100 Vollbilder/s sind mit dem Display auch auf einem ATMega 
machbar.

Bringt dir aber gar nix, wenn man dir das auf dem Silbertablett 
serviert.

Schau dir den Code und das Datenblatt des Display an, und mach dir 
selber mal ein paar Gedanken wie das schneller gehen könnte.

Das ist dann ein sehr guter Weg um Programmieren zu lernen.

von Philipp L. (viech)


Lesenswert?

Harry L. schrieb:
> Bringt dir aber gar nix, wenn man dir das auf dem Silbertablett
> serviert.

Jein, das stimmt nur bedingt.

Generell:
Alles was man sich selbst erarbeitet, bleibt hängen.
Daher sollte man möglichst immer Versuchen ein Problem selbst zu lösen.
Wenn dies bei einem Problem als z.B. als Anfänger noch nicht gelingt, 
muss man sich ein Beispiel suchen und dies durcharbeiten/verstehen.

Hier kommt dann die Motivation ins Spiel:

Wobei macht es mehr Spaß, sich in die Programmstruktur, Befehle und 
Lösungsansätze anhand eines bestehenden Projektes einzuarbeiten:
- In ein langsames Programm (Erster Eindruck "schlecht")
- In ein schnelles Programm (Erster Eindruck "gut")

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Eine 16Mhz Quarz solltest du dir allerdings schon zulegen, und die die 
Optimierung -Os beim Compilieren einschalten. Dann die Wartezyklen an 
dein Display anpassen.

Damit wird es zwar schneller, aber richtig schnell geht halt mit dem 
Display und dem bufferlosen Ansatz der lib nicht.

Die Textausgabe ist bei der lib und dem Display von der Fontgröße und 
der Position abhängig. Ein 8-Bit großer Font auf einer Displayzeile geht 
viel schneller, als einer, der über mehrere Displayzeilen geschrieben 
wird.

Oliver

von Oliver S. (oliverso)


Lesenswert?

Philipp L. schrieb:
> Ich habe in der ks0108.c schon viel von ReadData gelesen.
> Kann es sein, dass dieser Code viel "verifiziert" und vom Display
> zurückliest?

Da wird zwar nichts „verifiziert“, aber grundsätzlich wird der Speicher 
vom Display ausgelesen, modifiziert, und wieder geschrieben. Das dauert 
halt...

Viel schneller ginge es mit einem internen Displaybuffer im RAM. Das 
scheitert allerdings am Prozessor, der dafür zu klein ist.

Oliver

von Philipp L. (viech)


Lesenswert?

Ich habe jetzt hier im Forum die mylcd "Lib" gefunden.
Diese hat zwar ach einige warnings, aber diese funktioniert sehr gut und 
superschnell.
Auch das Einbinden von Grafiken funktioniert.

Ich hätte diese jetzt als Basis zum Verständnis der der Abläufe 
verwendet.

Gibt es von euerer Seite allgemeine Hinweise zu den Unterschieden der 
beiden Programmstrukturen, welche mir vorher helfen würden oder zu 
beachten Sind?

Beispiel:
Glcd: Daten werden vom Display eingelesen und modifiziert (so lese ich 
das aus der letzten Antwort)
Mylcd: Es werden nur neue Pixel hinzugeschrieben, bis zum nächsten 
clearscreen.

"Ob dies so Ist, weiss ich noch nicht. Sollte nur ein Beispiel sein, was 
mit meiner Strukturfrage gemeint ist"

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.