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!
*.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.
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?
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?
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.
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.
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.
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?
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).
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
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
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.
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")
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
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
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"