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
*.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?
Nun, Du solltest Dir die Fehlermeldungen des Compilers auch ansehen. Fang mit der ersten an, die weiteren können Folgefehler sein.
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
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
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
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")
:
Bearbeitet durch User
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"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.