mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TG12864B-13 und MC9S12XD


Autor: Birn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  ORG $1000
  MOVB #$FF,2  ;Port A auf Ausgang setzen DB0-DB7
  MOVB #$1F,3  ;Port B auf Ausgang setzen D/I,R/W,E,CS1,CS2
  MOVB #$08,1  ;Driver1 an Port B, Instruction-Write
  MOVB #$3F,0  ;Display Driver 1 einschalten
  JSR ena    ;Befehl ausführen
  MOVB #$10,1  ;Driver2 an Port B, Instruction-Write
  MOVB #$3F,0  ;Display Driver 2 einschalten
  JSR ena    ;Befehl ausführen
  MOVB #$08,1  ;Driver 1
  MOVB #$C0,0  ;Startlinie auf 0 setzen
  JSR ena
  MOVB #$10,1  ;Driver 2
  MOVB #$C0,0  ;Startlinie auf 0 setzen
  JSR ena
  MOVB #$08,1
  MOVB #$5E,0  ;X-Adresse setzen 0x40 + 30d ????
  JSR ena
  MOVB #$08,1
  MOVB #$BC,0  ;Page auf 4 setzen 0xB8 + 4d ????
  JSR ena
  MOVB #$09,1  ;Driver 1, Data-Write
  MOVB #$01,0  ;Daten in Page schreiben ????
  JSR ena
  JMP $F000    ;BeSy
ena  MOVB #$04,1  ;Enable auf 1 setzen
  NOP
  NOP
  NOP
  NOP
  MOVB #$00,1  ;Enable auf 0 setzen
  NOP
  NOP
  NOP
  NOP
  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

Autor: Birn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Birn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Birn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  ORG $1000
PORTA  EQU 0
PORTB  EQU 1
  MOVB #$FF,2  ;Port A auf Ausgang setzen DB0-DB7
  MOVB #$1F,3  ;Port B auf Ausgang setzen D/I,R/W,E,CS1,CS2
  MOVB #$00,PORTB  ;Init
  MOVB #$1C,PORTB  ;CS1=1,CS2=1,E=1,D/I=0,R/W=0
  MOVB #$3F,PORTA  ;Display einschalten
  MOVB #$18,PORTB  ;CS1=1,CS2=1,E=0,D/I=0,R/W=0
        JSR warte

  MOVB #$1C,PORTB  ;CS1=1,CS2=1,E=1,D/I=0,R/W=0
  MOVB #$C2,PORTA  ;Auf Zeile 2 setzen
  MOVB #$18,PORTB  ;CS1=1,CS2=1,E=0,D/I=0,R/W=0
  JSR warte

  MOVB #$1C,PORTB  ;CS1=1,CS2=1,E=1,D/I=0,R/W=0
  MOVB #$5E,PORTA  ;x=30
  MOVB #$18,PORTB  ;CS1=1,CS2=1,E=0,D/I=0,R/W=0
  JSR warte

  MOVB #$1C,PORTB  ;CS1=1,CS2=1,E=1,D/I=0,R/W=0
  MOVB #$B9,PORTA  ;page=1
  MOVB #$18,PORTB  ;CS1=1,CS2=1,E=0,D/I=0,R/W=0
  JSR warte

  MOVB #$1D,PORTB  ;CS1=1,CS2=1,E=1,D/I=1,R/W=0
  MOVB #$00,PORTA  ;Pixel auf 0 setzen
  MOVB #$19,PORTB  ;CS1=1,CS2=1,E=0,D/I=1,R/W=0
  JSR warte
  JMP $F000

warte  NOP
  NOP
  NOP
  NOP
  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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Birn (Gast)
Datum:

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

vielen dank schonmal für deine hilfe

mfg
björn

Autor: Birn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  ORG $1000
PORTA  EQU 0
PORTB  EQU 1
INITPB  EQU $1F
INITPA  EQU $FF
DI  EQU $01
RW  EQU $02
EN  EQU $04
CS1  EQU $08
CS2  EQU $10
DISPON  EQU $3F
DISPOFF  EQU $3E
SETX  EQU $40
SETPAGE  EQU $B8
STARTLI  EQU $C0
  
  MOVB #$FF,2  ;Port A auf Ausgang setzen DB0-DB7
  MOVB #$1F,3  ;Port B auf Ausgang setzen D/I,R/W,E,CS1,CS2

  BCLR PORTA,INITPA  ;Beide Ports auf 0 setzen
  BCLR PORTB,INITPB
  BSET PORTB,CS1    ;Controller 1 setzen
  BSET PORTB,CS2    ;Controller 2 setzen
  BSET PORTA,DISPON  ;Display anschalten
  BSET PORTB,EN    ;Befehl ausführen
  JSR warte
  BCLR PORTB,EN
  JSR warte

  BCLR PORTA,INITPA  ;Port A zurücksetzen
  BSET PORTA,STARTLI  ;Auf erste zeile setzen
  BSET PORTB,EN    ;Befehl ausführen
  JSR warte
  BCLR PORTB,EN
  JSR warte

  BCLR PORTA,INITPA  ;Port A zurücksetzen
  BSET PORTA,SETX    ;X-Koordinate
  BSET PORTA,$0F    ;Wert für X
  BSET PORTB,EN    ;Befehl ausführen
  JSR warte
  BCLR PORTB,EN
  JSR warte

  BCLR PORTA,INITPA  ;Port A zurücksetzen
  BSET PORTA,SETPAGE  ;Page setzen
  BSET PORTA,#$02    ;Wert für Page
  BSET PORTB,EN    ;Befehl ausführen
  JSR warte
  BCLR PORTB,EN
  JSR warte

  BCLR PORTA,INITPA  ;Port A zurücksetzen
  BSET PORTA,FE    ;Ein Pixel in Page setzen
  BSET PORTB,DI    ;Daten schreiben 
  BSET PORTB,EN    ;Befehl ausführen
  JSR warte
  BCLR PORTB,EN
  JSR warte

  JMP $F000

warte  NOP
  NOP
  NOP
  NOP
  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

Autor: Birn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
...
  MOVB #$00,2    ;Port A auf Eingang setzen DB0-DB7

  BSET PORTB,DI    ;Data / Read setzen
  BSET PORTB,RW    ;Data / Read setzen
  BSET PORTB,EN
  JSR warte
  LDAA PORTA    ;Anliegende Daten in Akku speichern
  BCLR PORTB,EN
  JSR warte
  BCLR PORTB,DI    ;Data / Read rücksetzen
  BCLR PORTB,RW    ;Data / Read rücksetzen
  MOVB #$FF,2    ;Port A auf Ausgang setzen DB0-DB7
...


also display ist an und es sind auch beide controller ausgewählt.
ich hoffe mir kann jemand helfen!

mfg
björn

Autor: holger (Gast)
Datum:

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

Autor: Birn (Gast)
Datum:

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

nochmal vielen dank

mfg
björn

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.