C Was ist ein Makefile?

Folienkondensator

Neues Mitglied
28. Mai 2012
89
0
0
Sprachen
  1. ANSI C
  2. Assembler
Hallo

Wie der Titel schon verrät hab ich zz Probleme mit dem "Makefile"
Ich hab mir vor kurzem ein LCD Display bei Pollin bestellt das ks0108 kompatibel ist.
Nun gibt es im Netz viele Downloads die das Ding ansteuern. Ich hab die h. Dateien schön sauber in der include Ordner gepackt und die ganzen c.files in ein Projekt kopiert um zu sehen ob sich was tut.
beim compillieren kommt undefined reference to main
Nach studenlangem googlen war ich mir sicher es muss am Makefile liegen das angeblich iwi übernommn werden soll. Nur wie?
Wenn ich das Makefile einfach gegen das dass AVRstudio6 automatisch generiert austausche überschreibt AVR Studio dieses wider und nichts geht.
Wie kann ich die im Anhang liegenden Dateien sinnvoll einsetzen? (mit Textdisplays war sowas bisher kein Problem. Kopieren und den C Code ins Projekt einfügen, Fertig! Wiso funktioniert das hier nicht? Und wie reihe ich die C Files aneinader damit was sinvolles raus kommt?
Das ganze soll auf einen ATmega 16 drauf.

Wäre um jede Hilfe dankbar :)
Gruß
 

Anhänge

  • glcd_ks0108_v11.zip
    14,6 KB · Aufrufe: 1
Hi,

das Makefile enthält alle dinge die dein Compiler braucht um dir aus dem Source ein Hex file zu generieren (infos welceh lib's verwendet werden sollen welche Optimizer Stufe, welche Files ....)

im Atmel Studio 6 kannst du unter Tools -> Extension Manager -> All -> Projects das Plugin "Create Project From Make File" Installieren, mit diesem müsstest du dein Makefile laden können, ist zwar schon etwas her als ich das mal gemacht hab aber müsste klappen.
Nach dem Installieren der Extension musst du das Studio neu Starten, nun hast du unter Tools einen neuen Punkt "Create Project From Makefile"

Du kannst natürlich auch ein Projekt anlegen nur musst du dann ein paar kleinigkeiten selbst vornehmen und die am bessten aus dem Makefile erst mal raus lesen.

Dann, "undefined reference to main" hier findet dein Compiler eben die main Funktion nicht (die im ks0108Test.c enthalten ist). entweder hast du die nicht deinem Projekt hinzugefügt oder hmm es ist sonst was schief gelaufen.

@edit: Habs grad nochmal ausprobiert mit deinem Projekt. Kanns Compilieren. Wichtig ist nur zu wissen, der Converter hat ein paar "bugs" z.b. geht er bei mir von einem Ordner aus "2ce6c7b1-8a93-4a85-aa43-6c61ae15f994130037061541952500" in dem das ganze liegt .. ich hab keine Ahnung wieso das so ist .. aber wenn du die Files in den Ordner Kopierst wo er sie erwartet geht es ;). Bei den Fonts (corsiva_12.h und arial_bold_14.h musst du noch ein "const" einfügen).

static const uint8_t Corsiva_12[] PROGMEM = {
static const uint8_t Arial_Bold_14[] PROGMEM = {

da sonst der Progmem vom avrgcc probleme hat. Aber joar :) dann geht das.



Gruß,
 

Anhänge

  • glcd_ks0108_test.zip
    65,8 KB · Aufrufe: 3
Danke für die antwort :)

Ich hab vorhin wider bisl rum probiert und den ganzen Code stück für Stück in ein neues Projekt kopiert und F7 gedrückt. und beim compilieren hab ich dan das "const char" geändert. das compilieren hat jetzt geklapt aber das Display gibt nichts aus. Jetzt hab ich den ganzen Code durchforstet und bemerkt dass nirgends eine Routine hinterlegt ist. Nichtmal der Tackt ist angegeben. hab ich da was übersehen? o_O
Gruß
 
Hi,

was für einen Takt erwartest du ?


wenn du die ks0108Test.c verwendest wird hier das Display Initialisiert und darauf geschrieben ... :)
Ich hab die Hardware leider nicht da somit kann ich es nicht Testen aber ich denk wenn die das Angeben sollte es auch klappen :) *hmmz*

hast mal mein Projekt probiert zu übertragen ob das klappt ? Laut Simulator sollte es zumindest irgendetwas machen :)
 
Hi

Naja, Zumindest müsste doch irgendwo "#define F_CPU 16000000" oder sowas stehen. man kann doch ein Display nicht initialisieren ohne Wartezeiten. und drauf schreiben auch nicht. (außer das Display ist um einiges Schneller als der Chip selbst) o_O
ich habs übertragen, aber es tut sich überhaupt nichts.
Aber ich denk mal dass es daran liegt dass ich keinen Plan hab wie ich die ganzen Dateien sinnvoll zusammen stückeln soll. vorallem weil manche als .h Datei UND als .c vorhanden sind. dann werden in den .c Dateien wider irgendwelche anderen Dateien geladen die in der "Main.c" bereits geladen werden. muss man die ganzen .c Dateien zusammen in eine C Datei kopieren oder was soll das alles? ^^

gibt es da eine Regel oder nen Leitfaden wie man mit solchen Bibliotheken aus dem Netz umgehen soll?

Gruß
 
Hi,

also das Testprogramm das da dabei ist benötigt keine delay.h (ist bei gcc Projekten normal die welche für delays verwendet wird) somit brauchst du die FCPU auch nicht.

dieser Code verwendet eigene "delays"
z.b.
Code:
    for(volatile uint8_t i=0; i<8; i++);            // a little delay loop (faster than reading the busy flag)

oder
Code:
    asm volatile("nop\n\t"
                 "nop\n\t"
                 "nop\n\t"
                 ::);

Ja das mit *.c und *.h ist für nicht "C" user immer etwas verwirrend ...

grob (sehr grob) gesagt .. in *.c files liegen Funktionen / Variablen , in *.h files liegen prototypen / defines ... (wie gesagt das ist nur SEHR grob umschrieben).

das File "ks0108.c" benötigt z.b. die "avr/io.h" die wird auch in der "ks0108Test.c" verwendet ... header werden fast immer in mehreren Files verwendet ... da hiermit auch die Funktionen von einem anderen File aus sichtbar werden.


Du wirst wenn du C Libs verwenden möchtest nicht drum rum kommen dich mit C etwas auseinander zu setzen.

Probier mal einfach das Projekt das ich hochgeladen hab in meinem ersten Post ... dort musst du nur in der ks0108.h deine Pins / Ports anpassen auf deine Hardware, aber danach sollte irgendwas angezeigt werden auf deinem Display wenn du alles richtig gemacht hast :).


soo und jetzt gehts bei mir ins bett ;)

gn8
 
Hi

Also ich hab den Code jetzt mal auf den Chip geladen. Es tut sich immer noch nix. Ich hab mal eine LED an die Ports gehalten um zu sehen ob sich überhaupt was tut. und da tut sich tatsächlich einiges. jetzt stellt sich die Frage ob ich die PORTS im Code richtig intrpretiert hab und dem Code entsprechend angeschlossen hab. hier mal der Code und meine belegten PORTS.

Code:
#include <inttypes.h>
#include <avr/pgmspace.h>

#ifndef	KS0108_H
#define KS0108_H

// Ports
#define LCD_CMD_PORT		PORTD		// Command Output Register
#define LCD_CMD_DIR			DDRD		// Data Direction Register for Command Port

#define LCD_DATA_IN			PINA		// Data Input Register
#define LCD_DATA_OUT		PORTA		// Data Output Register
#define LCD_DATA_DIR		DDRA		// Data Direction Register for Data Port

// Command Port Bits
#define D_I					0x00		// D/I Bit Number
#define R_W					0x01		// R/W Bit Number
#define EN					0x02		// EN Bit Number
#define CSEL1				0x03		// CS1 Bit Number
#define CSEL2				0x04		// CS2 Bit Number

// Chips
#define CHIP1				0x00
#define CHIP2				0x01

// Commands
#define LCD_ON				0x3F
#define LCD_OFF				0x3E
#define LCD_SET_ADD			0x40
#define LCD_SET_PAGE		0xB8
#define LCD_DISP_START		0xC0

// Colors
#define BLACK				0xFF
#define WHITE				0x00

// Font Indices
#define FONT_LENGTH			0
#define FONT_FIXED_WIDTH	2
#define FONT_HEIGHT			3
#define FONT_FIRST_CHAR		4
#define FONT_CHAR_COUNT		5
#define FONT_WIDTH_TABLE	6

PORTA,0 = D/I
PORTA,1 = R/W
PORTA,2 = E
PORTA,3 = CS1
PORTA,4 = CS2

PORTD,0 - D,7 = DB0 - DB7

Masse und Spannung für Hintergrundbeleuchtung und Display Chip ist dran.
Jetzt gibz nur noch 3 nicht belegte Pins. VO (Kontrast) mit dem Kann ich machen was ich will, der Kontrast ändert sich nicht (nicht so wie bei einem normaln Textdisplay das entweder leer ist oder Vierecke bekommt)
Der RST Pin hängt auch nur so rum (ich hab mal im Netz gelesen dass man den einfach auf 5V hängen kann) so wie bei nem AVR denk ich.
Und wiso es den Vout Pin gibt versteh ich nicht. da iat anscheinend einfach 5V drauf und das wars o_O -> hängt bei mir einfach so rum (nicht angeschlossen)

Ist hier ein gravierender Fehler erkennbar?

Gruß
Folinkondensator :hello:


Edit:

Fehler gefunden!
Der "Nutzlose Vout Pin" ist garnicht sooo nutzlos. der muss über ein Poti an VO angeschlossen werden. dann siht man auch was auf dem Display. Wiso aber die Kontrastspannung vom Display selbst kommen muss und nicht über die normale Speißung funktioniert weis ich nicht :/
Ich probier jetzt mal etwas rum und gebe dann paar Infos raus (Wenn ich welche hab) ^^

Und herzlichen dank an Bluelight_Electronic für die Nerven ;)
Gruß
 
heyhey :)

das liest sich ja Super,


ja wie gesagt kenn das Display leider nicht aber du hast es ja gefunden top :).

Nichts zu Danken, dafür sind Foren ja da :)

Gruß,
 
Hi

Wie angekündigt ein paar Erfahrungsberichte zu dem Display mit dem KS0108 Treiber.
Die C Dateien die oben gepostet wurde hab ich leider nicht so zum laufen gebracht wie es eigentlich sein sollte. daher hab ich sie einfach über die Mainschleife platziert. siht zwar nicht besonders schön aus, tut aber seinen Dienst.

Die .h Dateien werden einfach in die "include Libary" vom AVR Studio mit eingefügt. Ich hab zusätzlich zu den bereits vorhandenen Schriftwarten noch eine weitere funktionierende aufgabeln können. Ich würde gerne alle Dateien in den Anhang hinzufügen, aber leider sperrt die Webseite das Format und mein Windows blockt ma wider meine Zugriffsrechte auf sämtliche Zip Ordner o_O Deswegen gibz nur die .c Datei. die .h Dateien einfach aus den oberen Beiträgen entnehmen. -> Die Schriftart muss in der main Schleife noch auf "arial_bold_14.h" umgestellt werden. dann funktionierts ;)

Also die .c Datei einfach ins AVR Studio einfügen und die .h Dateien in die include libary kopieren. fertig.
Verwendet wird ein ATmga 16 oder ATmega 32. Ich hab gerade den internen Tackt (1Mhz) da siht man ganz schön wie das Display arbeitet ;)

Viel Glück!

Pinnbelegung:
Code:
// Ports
#define LCD_CMD_PORT		PORTA		// Command Port
#define LCD_CMD_DIR			DDRA		// Data Direction Register for Command Port

#define LCD_DATA_IN			PINC		// Data Input Register
#define LCD_DATA_OUT		PORTC		// Data Output Register (D0-D7 auf PC0-PC7)
#define LCD_DATA_DIR		DDRC		// Data Direction Register for Data Port

// Command Port Bits
#define D_I					0x00		// D/I Bit Number
#define R_W					0x01		// R/W Bit Number
#define EN					0x02		// EN Bit Number
#define CSEL1				0x03		// CS1 Bit Number
#define CSEL2				0x04		// CS2 Bit Number
 

Anhänge

  • ks0108.c
    15,1 KB · Aufrufe: 1
Soo, und nun da das Display endlich läuft hab ich eine grundlegende Frage zu den Schriftarten. Ich hab unten mal den Code rein gechrieben in dem die Schriftart "arial8" verpackt ist.

Mein vorhaben, Ich würde die einzelnen Schriftzeichen verändern. dafür müssten die Schriftzeichen etwas breiter werden. sobald man aber etwas an der breite verändert funktioniert die Schrift nichtmehr. Nach einigen Tagen probieren und vergleichen hab ich rausgefunden dass es nicht reicht die "char widths" und die allgemeinen breiteangaben und parmeter zu ändern. sondern es muss auch der Parameter "0x0B, 0x36, // size " verändert werden. der ansheinend berechnet wird. (steht auch im Internet beschrieben) da heißt es immer "width * hight" oder "die Schriftgröße in Bit" Die höhe und breite der Array ist es auf jeden Fall nicht. das hab ich schon probiert. es ist auch keine Summenzahl aus allen Schrift Bits. An dem Punkt komm ich einfach nicht weiter. hat jemand eine Ahnung wie man die breite verändern kann? oder wie man diesen Parameter korrekt anpasst?

-> Wenn ich nur die einzelnen HEX Zahlen für die Schriftzeichen abändere funktioniert die Abänderung einwandfrei. sobald was an er breite verändert wird funktioniert es nicht.

Ich hab den Problempunkt mit "HIER LIEGT DAS PROBLEM" im Code gekennzeichnet.

Gruß


Code:
/*
 *
 * arial8
 *
 * created with FontCreator
 * written by F. Maximilian Thiele
 *
 * http://www.apetech.de/fontCreator
 * me@apetech.de
 *
 * File Name           : arial8.h
 * Date                : 23.12.2007
 * Font size in bytes  : 2870
 * Font width          : 10
 * Font height         : 8
 * Font first char     : 32
 * Font last char      : 128
 * Font used chars     : 96
 *
 * The font data are defined as
 *
 * struct _FONT_ {
 *     uint16_t   font_Size_in_Bytes_over_all_included_Size_it_self;
 *     uint8_t    font_Width_in_Pixel_for_fixed_drawing;
 *     uint8_t    font_Height_in_Pixel_for_all_characters;
 *     unit8_t    font_First_Char;
 *     uint8_t    font_Char_Count;
 *
 *     uint8_t    font_Char_Widths[font_Last_Char - font_First_Char +1];
 *                  // for each character the separate width in pixels,
 *                  // characters < 128 have an implicit virtual right empty row
 *
 *     uint8_t    font_data[];
 *                  // bit field of all characters
 */

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

#ifndef ARIAL8_H
#define ARIAL8_H

#define ARIAL8_WIDTH 10
#define ARIAL8_HEIGHT 8

static uint8_t const arial8[] PROGMEM = {
    0x0B, 0x36, // size       <---------------------------HIER LIEGT DAS PROBLEM
    0x0A, // width
    0x08, // height
    0x20, // first char
    0x60, // char count
    
    // char widths
    0x03, 0x01, 0x03, 0x05, 0x04, 0x07, 0x05, 0x03, 0x02, 0x02, 
    0x05, 0x03, 0x01, 0x03, 0x01, 0x03, 0x04, 0x02, 0x04, 0x04, 
    0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x01, 0x01, 0x04, 0x04, 
    0x04, 0x04, 0x08, 0x05, 0x04, 0x05, 0x04, 0x04, 0x04, 0x06, 
    0x04, 0x01, 0x03, 0x04, 0x03, 0x05, 0x04, 0x06, 0x04, 0x06, 
    0x04, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x02, 
    0x03, 0x02, 0x03, 0x04, 0x01, 0x04, 0x03, 0x04, 0x04, 0x04, 
    0x02, 0x04, 0x03, 0x01, 0x02, 0x03, 0x02, 0x05, 0x03, 0x04, 
    0x03, 0x04, 0x02, 0x04, 0x03, 0x03, 0x04, 0x05, 0x04, 0x04, 
    0x04, 0x02, 0x01, 0x02, 0x04, 0x04, 
    
    // font data
    0x00, 0x00, 0x00, // 32
    0xBF, // 33
    0x03, 0x00, 0x03, // 34
    0x24, 0x7E, 0x24, 0x7E, 0x24, // 35
    0x39, 0x44, 0x44, 0x39, // 36
    0x82, 0x45, 0x32, 0x0C, 0x12, 0x29, 0x10, // 37
    0x30, 0x4A, 0x55, 0x2A, 0x50, // 38
    0x02, 0x05, 0x02, // 39
    0x7E, 0x81, // 40
    0x81, 0x7E, // 41
    0x22, 0x14, 0x3E, 0x14, 0x22, // 42
    0x08, 0x3E, 0x08, // 43
    0xE0, // 44
    0x08, 0x08, 0x08, // 45
    0x20, // 46
    0x70, 0x0C, 0x07, // 47
    0x3E, 0x41, 0x41, 0x3E, // 48
    0x02, 0x7F, // 49
    0x62, 0x51, 0x49, 0x46, // 50
    0x22, 0x49, 0x49, 0x36, // 51
    0x18, 0x14, 0x7F, 0x10, // 52
    0x27, 0x49, 0x49, 0x31, // 53
    0x3E, 0x49, 0x49, 0x30, // 54
    0x01, 0x71, 0x0D, 0x03, // 55
    0x36, 0x49, 0x49, 0x36, // 56
    0x06, 0x49, 0x49, 0x3E, // 57
    0x24, // 58
    0x64, // 59
    0x08, 0x14, 0x22, 0x22, // 60
    0x14, 0x14, 0x14, 0x14, // 61
    0x22, 0x22, 0x14, 0x08, // 62
    0x02, 0x01, 0x59, 0x06, // 63
    0x3C, 0x42, 0xBE, 0xA5, 0xA5, 0xBD, 0x22, 0x1C, // 64
    0x78, 0x16, 0x11, 0x16, 0x78, // 65
    0x7F, 0x49, 0x49, 0x36, // 66
    0x3E, 0x41, 0x41, 0x41, 0x22, // 67
    0x7F, 0x41, 0x41, 0x3E, // 68
    0x7F, 0x49, 0x49, 0x41, // 69
    0x7F, 0x09, 0x01, 0x01, // 70
    0x3C, 0x42, 0x41, 0x49, 0x49, 0x3A, // 71
    0x7F, 0x08, 0x08, 0x7F, // 72
    0x7F, // 73
    0x30, 0x40, 0x7F, // 74
    0x7F, 0x0C, 0x12, 0x61, // 75
    0x7F, 0x40, 0x40, // 76
    0x7F, 0x02, 0x1C, 0x02, 0x7F, // 77
    0x7F, 0x06, 0x18, 0x7F, // 78
    0x1C, 0x22, 0x41, 0x41, 0x22, 0x1C, // 79
    0x7F, 0x09, 0x09, 0x06, // 80
    0x1C, 0x22, 0x49, 0x51, 0x22, 0x5C, // 81
    0x7F, 0x09, 0x09, 0x76, // 82
    0x32, 0x45, 0x49, 0x49, 0x32, // 83
    0x01, 0x01, 0x7F, 0x01, 0x01, // 84
    0x7F, 0x40, 0x40, 0x7F, // 85
    0x03, 0x1C, 0x60, 0x1C, 0x03, // 86
    0x7F, 0x60, 0x38, 0x60, 0x7F, // 87
    0x61, 0x12, 0x0C, 0x12, 0x61, // 88
    0x01, 0x06, 0x78, 0x06, 0x01, // 89
    0x61, 0x51, 0x4D, 0x43, 0x41, // 90
    0xFF, 0x81, // 91
    0x02, 0x05, 0x02, // 92
    0x81, 0xFF, // 93
    0x06, 0x01, 0x06, // 94
    0x80, 0x80, 0x80, 0x80, // 95
    0x01, // 96
    0x34, 0x54, 0x54, 0x7C, // 97
    0x7F, 0x44, 0x7C, // 98
    0x38, 0x44, 0x44, 0x44, // 99
    0x38, 0x44, 0x44, 0x7F, // 100
    0x38, 0x54, 0x54, 0x4C, // 101
    0x7E, 0x09, // 102
    0x1C, 0x52, 0x52, 0x7E, // 103
    0x7F, 0x04, 0x7C, // 104
    0x79, // 105
    0x40, 0x3C, // 106
    0x7E, 0x18, 0x24, // 107
    0x3F, 0x40, // 108
    0x7C, 0x04, 0x7C, 0x04, 0x7C, // 109
    0x7C, 0x04, 0x7C, // 110
    0x38, 0x44, 0x44, 0x38, // 111
    0x7C, 0x24, 0x3C, // 112
    0x18, 0x24, 0x24, 0x7C, // 113
    0x7C, 0x04, // 114
    0x08, 0x54, 0x54, 0x20, // 115
    0x04, 0x7E, 0x04, // 116
    0x7C, 0x40, 0x7C, // 117
    0x1C, 0x60, 0x60, 0x1C, // 118
    0x1C, 0x30, 0x08, 0x30, 0x1C, // 119
    0x24, 0x18, 0x18, 0x24, // 120
    0x0C, 0x50, 0x50, 0x7C, // 121
    0x64, 0x54, 0x4C, 0x44, // 122
    0x08, 0xF7, // 123
    0xFF, // 124
    0x81, 0x7E, // 125
    0x08, 0x08, 0x08, 0x08, // 126
    0x3E, 0x22, 0x22, 0x3E // 127
    
};

#endif
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)