Forum: Mikrocontroller und Digitale Elektronik TG12864B-13 und MC9S12XD


von Birn (Gast)


Lesenswert?

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

von Birn (Gast)


Lesenswert?

hab noch die datenblätter vergessen
http://www.pollin.de/shop/downloads/D120424D.PDF für die pinbelegung
und der controller http://www.lcd-module.de/eng/pdf/zubehoer/ks0108b.pdf

mfg
björn

von holger (Gast)


Lesenswert?

>  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.

von Birn (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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

von Birn (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

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.

von Birn (Gast)


Lesenswert?

bin grad nicht zuhause, werde es nachher mal versuchen und dann bescheid 
geben.

vielen dank schonmal für deine hilfe

mfg
björn

von Birn (Gast)


Lesenswert?

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

von Birn (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

Du musst das Display ZWEIMAL lesen. Steht auch so im Datenblatt.
Den ersten Wert kannste wegwerfen.

von Birn (Gast)


Lesenswert?

yeah vielen dank! habe ich gar nicht gesehen im datenblatt. naja jetzt 
gehts!

nochmal vielen dank

mfg
björn

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
Noch kein Account? Hier anmelden.