PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Starthilfe bei 128x64 ansteuerung mit KS108



MelMan
18.11.2009, 19:24
Hallo zusammen,

Bin grad dabei mich von Bascom zu entfernen und endlich mal in C zu programmieren. Die ersten Versuche und Grundsachen klappen auch schon ganz gut :). Jetzt geht es aber dran ein 128x64 Display mit einem KS108 Contoller anzusteuern. Hardware ist schon komplett fertig aber an der Software haperts noch ein wenig. Unter Bascom war das ja alles einfach.
Nun zu C: Soweit ich das verstanden hab hab ich ja mein "main.c" von wo aus ich meinetwegen meine Displayausgabe ansteuer; also ks0108Puts ("Test"), wobei der Befehl ks0108Puts je nach ks108.c abhängig ist oder? In meiner ks108.h sind meine ganzen Ports definiert die ich zum Ansteuern des Display verwende, s. hier

// Ports

#define LCD_CMD_PORT PORTB // Command Output Register

#define LCD_CMD_DIR DDRB // Data Direction Register for Command Port



#define LCD_DATA_IN PIND // Data Input Register

#define LCD_DATA_OUT PORTD // Data Output Register

#define LCD_DATA_DIR DDRD // Data Direction Register for Data Port



// Command Port Bits

#define D_I 0x05 // D/I Bit Number

#define R_W 0x04 // R/W Bit Number

#define EN 0x00 // EN Bit Number

#define CSEL1 0x07 // CS1 Bit Number

#define CSEL2 0x06 // CS2 Bit Number



Was ich noch nicht ganz blicke ist welcher Port jetzt für die Daten und welcher für die Steuerung zuständig ist. Ich hab jetzt PORTB für die Steuerung genommen und PORTD für die Daten. Was ich aber noch vermisse ein #define RESET o.ä. für die Reset-Leitung oder braucht man das nicht zwingend? Ich hoffe meine Fragen sind nicht allzu unverständlich und ihr könnt mir ein wenig weiterhelfen 8-[ .

Jaecko
19.11.2009, 09:27
CMD ist Steuerung, DATA die Daten.
Den Reset-Pin hab ich bei meinem KS0108 zwar noch "dazudefiniert", aber er wird nicht verwendet.
Auch hab ich bei mir die Pins für die Steuerleitungen "zerlegt", so dass es z.B. nicht nur


#define LCD_CMD_PORT PORTB

heisst, sondern


#define LCD_CMD_DI_PORT PORTB
#define LCD_CMD_RW_PORT PORTB
#define LCD_CMD_EN_PORT PORTB
...


Machts später etwas einfacher, das Display an anderen Controllern zu betreiben, wo nicht unbedingt alle freien Pins an 1 Port sind.

MelMan
19.11.2009, 11:38
Ah alles klar schon mal gut zu wissen. Und die Befehle für die Ausgabe kann ich mir selber schreiben und dann z.B. in einer KS108.c speichern, wenn ich z.B. eine eigene Routine für ein anderes Display schreiben möchte richtig?

Jaecko
19.11.2009, 12:12
Wo du die Befehle speicherst, ist von der Funktion her eigentlich egal.
Nur macht es Sinn, alles was zum Display gehört, auch in die ks108.c reinzuwerfen, z.B. Basisfunktionen wie einzelne Punkte setzen.

Ob diese Routinen dann für andere Displays auch gehen, kommt auf die Ansteuerung an.

MelMan
19.11.2009, 14:48
Ah gut ok. Die Sachen hab ich soweit auch geändert, aber mein jetziges Problem ist dass ich nicht genau weiß wie ich was kompilieren muss :/.
Ich hab ja meine main.c, wo mein eigentlicher Ablauf drinsteht. Dort sind auch noch die Dateien festgelegt welche mit verwendet werden:

#include "ks0108.h"

#include "font12x16.h"

Wenn ich jetzt make(avr-gcc) ausführe bekomm ich immer folgende Fehlermeldung:

/home/malte/Documents/Programmierung/AVR in C/Test/main.c:29: undefined reference to `ks0108Init'
/home/malte/Documents/Programmierung/AVR in C/Test/main.c:32: undefined reference to `ks0108ReadFontData'
/home/malte/Documents/Programmierung/AVR in C/Test/main.c:32: undefined reference to `ks0108ReadFontData'
/home/malte/Documents/Programmierung/AVR in C/Test/main.c:32: undefined reference to `ks0108SelectFont'
/home/malte/Documents/Programmierung/AVR in C/Test/main.c:34: undefined reference to `ks0108GotoXY'
/home/malte/Documents/Programmierung/AVR in C/Test/main.c:36: undefined reference to `ks0108Puts_P'
/home/malte/Documents/Programmierung/AVR in C/Test/main.c:49: undefined reference to `ks0108FillRect

Ich bin mir aber nicht sicher ob ich alles richtig angegeben habe, sprich ob ich irgendwie im makefile noch Dateien include muss oder ähnliches. Compilieren mache ich wie gesagt mit make oder avr-gcc unter Linux. Oder gibts ne gute Seite wo man sich mal einlesen kann in das Thema wie man "externe" Dateien einfügt und mit compiliert oder was auch immer man mit denen machen muss?

Jaecko
19.11.2009, 15:17
in der ks0108.h müssen dann auch die Prototypen der Funktionen in der ks0108.c stehen. Sonst weiss die main.c ja nix von den anderen Funktionen.

Z.B. so:

ks0108.c:


#include "ks0108.h"

void ks0108Init(void)
{
// irgendwas
}


ks0108.h


#ifndef _KS0108_H_
#define _KS0108_H_

#includes was man halt so braucht etc.

void ks0108Init(void);

#endif

MelMan
19.11.2009, 16:47
Ah ok jetzt hats (glaub ich) geklappt, das kompilieren und übertragen funktioniert auf jeden fall schon mal. Nur das Display zeigt nix an, kann aber auch sein dass es kaputt ist, flog noch bei mir in der Schublade rum. Neues ist schon unterwegs. Schon mal vielen Dank für die Hilfe, wenn ich Fragen hab melde ich mich in ein paar Tagen wieder=)