Hallo allerseits,
ich muss für mein studium ein kleines projekt mit dem s12x machen. da
ich noch ein display(TG12864B-13) rumliegen hatte, dachte ich mir des
bau ich da mal dran.
soweit so gut, jetzt versuch ich schon eine weile das ding zum laufen zu
bekommen. also die signale kommen soweit am display an es wird aber nix
angezeigt. ich wollte einfach mal nur ein pixel anzeigen lassen.
hier erstmal mein code:
1
ORG $1000
2
MOVB #$FF,2 ;Port A auf Ausgang setzen DB0-DB7
3
MOVB #$1F,3 ;Port B auf Ausgang setzen D/I,R/W,E,CS1,CS2
4
MOVB #$08,1 ;Driver1 an Port B, Instruction-Write
5
MOVB #$3F,0 ;Display Driver 1 einschalten
6
JSR ena ;Befehl ausführen
7
MOVB #$10,1 ;Driver2 an Port B, Instruction-Write
8
MOVB #$3F,0 ;Display Driver 2 einschalten
9
JSR ena ;Befehl ausführen
10
MOVB #$08,1 ;Driver 1
11
MOVB #$C0,0 ;Startlinie auf 0 setzen
12
JSR ena
13
MOVB #$10,1 ;Driver 2
14
MOVB #$C0,0 ;Startlinie auf 0 setzen
15
JSR ena
16
MOVB #$08,1
17
MOVB #$5E,0 ;X-Adresse setzen 0x40 + 30d ????
18
JSR ena
19
MOVB #$08,1
20
MOVB #$BC,0 ;Page auf 4 setzen 0xB8 + 4d ????
21
JSR ena
22
MOVB #$09,1 ;Driver 1, Data-Write
23
MOVB #$01,0 ;Daten in Page schreiben ????
24
JSR ena
25
JMP $F000 ;BeSy
26
ena MOVB #$04,1 ;Enable auf 1 setzen
27
NOP
28
NOP
29
NOP
30
NOP
31
MOVB #$00,1 ;Enable auf 0 setzen
32
NOP
33
NOP
34
NOP
35
NOP
36
RTS
und noch die portbelegung
pa0->db0
pa1->db1
...
pa7->db7
pb0->D/I
pb1->R/W
pb2->E
pb3->CS1
pb4->CS2
hier ist noch eine kleine übersicht was für was steht
Beitrag "TG12864B - Anschluss?" beitrag)
ich habe mir von http://www.roboternetz.de/phpBB2/viewtopic.php?p=401701
mal die c dateien geholt und versucht das ganze auf den s12x
umzuschreiben. bei den fragezeichen bin ich mir nicht sicher ob ich das
richtig gemacht habe. vielleicht hab ich da irgendwas übersehen.
wäre top wenn mir jemand helfen könnte. wenn noch fragen zum code sind
oder sonst was einfach fragen.
mfg
björn
> JSR ena
Das sieht für mich wie ein Jump aus.
> RTS
Das wie ein Return. Für Jumps gibt es aber keine Returns.
Das geht nur mit Calls. Wie schnell ist dein Prozessor?
Evtl. kommst du mit vier NOPs nicht aus. Der KS0108 ist
grottig langsam.
danke für die antwort!
beim s12x ist das der prozeduraufruf jsr(mann könnte auch call
verwenden) heisst jump subroutine und rts ist dann entsprechend der
rücksprung.
ich bin inzwischen soweit das ich das gute stück angeschaltet bekomme
und irgendwas auf dem display ausgeben kann.
jetzt wäre es nicht schlecht zu wissen wie ich bei dem display genau
pixel bestimmen kann also ich denke da wo ich überall den fragezeichen
hintendran hab läuft noch was verkehrt.
mfg björn
Kennt dein Assembler keine EQU?
PORTA equ 0
PORTB equ 1
Das ganze ist ohne recht unübersichtlich. Sowas:
MOVB #$08,PORTB ;Driver1 an Port B, Instruction-Write
MOVB #$3F,PORTA ;Display Driver 1 einschalten
Sieht doch viel besser aus;)
Oder:
KS_DATA equ 0
KS_CTRL equ 1
MOVB #$08,KS_CTRL ;Driver1 an Port B, Instruction-Write
MOVB #$3F,KS_DATA ;Display Driver 1 einschalten
Und wenn MOVB Move Byte heisst, dann setzt du die CS Leitungen
in ena auf Null wenn Enable gesetzt/gelöscht wird.
ena MOVB #$04,KS_CTRL ;Enable auf 1 setzen
hab gerade festgestellt er kann equ(bin noch ziemlich neu auf dem gebiet
:)). danke für den tip
hast recht cs hab ich immer auf null gesetzt kann ja dann nicht
funktionieren. anzeigen tut er aber immer noch nicht wirklich was(man
sieht aber das es an geht). ich habs nochmal etwas umgeschrieben
ich denk etwas übersichtlicher
1
ORG $1000
2
PORTA EQU 0
3
PORTB EQU 1
4
MOVB #$FF,2 ;Port A auf Ausgang setzen DB0-DB7
5
MOVB #$1F,3 ;Port B auf Ausgang setzen D/I,R/W,E,CS1,CS2
6
MOVB #$00,PORTB ;Init
7
MOVB #$1C,PORTB ;CS1=1,CS2=1,E=1,D/I=0,R/W=0
8
MOVB #$3F,PORTA ;Display einschalten
9
MOVB #$18,PORTB ;CS1=1,CS2=1,E=0,D/I=0,R/W=0
10
JSR warte
11
12
MOVB #$1C,PORTB ;CS1=1,CS2=1,E=1,D/I=0,R/W=0
13
MOVB #$C2,PORTA ;Auf Zeile 2 setzen
14
MOVB #$18,PORTB ;CS1=1,CS2=1,E=0,D/I=0,R/W=0
15
JSR warte
16
17
MOVB #$1C,PORTB ;CS1=1,CS2=1,E=1,D/I=0,R/W=0
18
MOVB #$5E,PORTA ;x=30
19
MOVB #$18,PORTB ;CS1=1,CS2=1,E=0,D/I=0,R/W=0
20
JSR warte
21
22
MOVB #$1C,PORTB ;CS1=1,CS2=1,E=1,D/I=0,R/W=0
23
MOVB #$B9,PORTA ;page=1
24
MOVB #$18,PORTB ;CS1=1,CS2=1,E=0,D/I=0,R/W=0
25
JSR warte
26
27
MOVB #$1D,PORTB ;CS1=1,CS2=1,E=1,D/I=1,R/W=0
28
MOVB #$00,PORTA ;Pixel auf 0 setzen
29
MOVB #$19,PORTB ;CS1=1,CS2=1,E=0,D/I=1,R/W=0
30
JSR warte
31
JMP $F000
32
33
warte NOP
34
NOP
35
NOP
36
NOP
37
RTS
ich denke aber ich hab noch irgendwo ein fehler bei den
flankenübergangen, da ich das programm mehrmals nacheinander ausführen
muss damit er was anzeigt.
mfg
björn
Willst du wirklich beide CS auf 1 setzen?
Na gut, dann gehen die Daten auf beide Displayhälften.
MOVB #$00,PORTA ;Pixel auf 0 setzen
MOVB #$1D,PORTB ;CS1=1,CS2=1,E=1,D/I=1,R/W=0
JSR warte
MOVB #$19,PORTB ;CS1=1,CS2=1,E=0,D/I=1,R/W=0
JSR warte
Shit Erklärung vergessen:(
Erst Daten anlegen dann Enable High/Low. Und du musst bei High
und bei Low warten.
Such mal nach Bitsetzbefehlen in deinem Assembler. So wie du es
machst haut man sich ständig Fehler rein.
Und auch für die Pins kannst du EQU nehmen:
CS1 equ $08
usw.
wooohoooo habs hinbekommen endlich :) vielen vielen dank. jetzt läufts
so wie es soll. hier noch der code falls ihn noch jemand brauchen kann
1
ORG $1000
2
PORTA EQU 0
3
PORTB EQU 1
4
INITPB EQU $1F
5
INITPA EQU $FF
6
DI EQU $01
7
RW EQU $02
8
EN EQU $04
9
CS1 EQU $08
10
CS2 EQU $10
11
DISPON EQU $3F
12
DISPOFF EQU $3E
13
SETX EQU $40
14
SETPAGE EQU $B8
15
STARTLI EQU $C0
16
17
MOVB #$FF,2 ;Port A auf Ausgang setzen DB0-DB7
18
MOVB #$1F,3 ;Port B auf Ausgang setzen D/I,R/W,E,CS1,CS2
19
20
BCLR PORTA,INITPA ;Beide Ports auf 0 setzen
21
BCLR PORTB,INITPB
22
BSET PORTB,CS1 ;Controller 1 setzen
23
BSET PORTB,CS2 ;Controller 2 setzen
24
BSET PORTA,DISPON ;Display anschalten
25
BSET PORTB,EN ;Befehl ausführen
26
JSR warte
27
BCLR PORTB,EN
28
JSR warte
29
30
BCLR PORTA,INITPA ;Port A zurücksetzen
31
BSET PORTA,STARTLI ;Auf erste zeile setzen
32
BSET PORTB,EN ;Befehl ausführen
33
JSR warte
34
BCLR PORTB,EN
35
JSR warte
36
37
BCLR PORTA,INITPA ;Port A zurücksetzen
38
BSET PORTA,SETX ;X-Koordinate
39
BSET PORTA,$0F ;Wert für X
40
BSET PORTB,EN ;Befehl ausführen
41
JSR warte
42
BCLR PORTB,EN
43
JSR warte
44
45
BCLR PORTA,INITPA ;Port A zurücksetzen
46
BSET PORTA,SETPAGE ;Page setzen
47
BSET PORTA,#$02 ;Wert für Page
48
BSET PORTB,EN ;Befehl ausführen
49
JSR warte
50
BCLR PORTB,EN
51
JSR warte
52
53
BCLR PORTA,INITPA ;Port A zurücksetzen
54
BSET PORTA,FE ;Ein Pixel in Page setzen
55
BSET PORTB,DI ;Daten schreiben
56
BSET PORTB,EN ;Befehl ausführen
57
JSR warte
58
BCLR PORTB,EN
59
JSR warte
60
61
JMP $F000
62
63
warte NOP
64
NOP
65
NOP
66
NOP
67
RTS
der code sieht jetzt auch um einiges besser aus(verbesserungsvorschläge
natürlich weiterhin erwünscht).
vielen dank nochmal holger(ich schulde dir en bier oder zwei ;)).
mfg
björn
hallo allerseits,
da bin ich schon wieder. hab noch folgendes problem, wenn ich verusche
das display auszulesen hab ich an allesn datenports low liegen also
entweder mach ich wider was verkehrt oder der ausgang funktioniert
nicht!?
einzelne pixel setzen funktioniert eigentlich wunderbar, aber ich will
ja in einer page mehrere pixel setzen können und dazu muss ich das
display auslesen.
hier mal noch ein codeschnipsel wie ich es auslese
1
...
2
MOVB #$00,2 ;Port A auf Eingang setzen DB0-DB7
3
4
BSET PORTB,DI ;Data / Read setzen
5
BSET PORTB,RW ;Data / Read setzen
6
BSET PORTB,EN
7
JSR warte
8
LDAA PORTA ;Anliegende Daten in Akku speichern
9
BCLR PORTB,EN
10
JSR warte
11
BCLR PORTB,DI ;Data / Read rücksetzen
12
BCLR PORTB,RW ;Data / Read rücksetzen
13
MOVB #$FF,2 ;Port A auf Ausgang setzen DB0-DB7
14
...
also display ist an und es sind auch beide controller ausgewählt.
ich hoffe mir kann jemand helfen!
mfg
björn