Forum: Mikrocontroller und Digitale Elektronik Display Init


von Heidi K. (little)


Angehängte Dateien:

Lesenswert?

Guten Tag an alle,

Ich habe ein Problem mit dem Display VGM256032A0M01. Ich bekomme es 
einfach nicht dazu irgend ein Pixel auszugeben. Benutze einen Mega8 und 
will es über den 8080 Bus ansteuern und hoffe nun es kann sich jemand 
mal die zeit nehmen mal kurz drüber zu schauen das wäre echt lieb. Ich 
komme einfach nicht weiter.

LG little

P.S. Code im Anhang

von Karl H. (kbuchegg)


Lesenswert?

Dein Code enthält mir viel zu viele Dinge, die mit dem unmittelbaren 
Problem einer Display Ansteuerung überhaupt nichts zu tun haben (zb 
Watchdog). Sowas ist unklug. Denn wenn man sich auf ein bestimmtes Thema 
konzentrieren will, will man sich auch noch um 300 Neben-Themenkreise 
kümmern müssen.

Deine Kommentierung ist ebenfalls nicht sehr hilfreich
1
up_W_D_Command:  SBI  PortD,4      ; E(RD)lesen ausschalten
2
    CBI  PortB,2      ; CS ausschalten (daten sind für Display)
3
    CBI  PortB,1      ; DC ausschalten (es wird ein Commando gesendet)
4
    CBI  PortD,5      ; WR ausschalten (schreiben einschalten)
5
    NOP        ; warten
6
    NOP        ; warten
7
;/////////////////////////////////////////////////////////////////////////////////////////
8
    MOV  AK_M_2,AK_M_1    ; rette date
9
    LSR  AK_M_1      ; schiebe nach rechts
10
    LSR  AK_M_1      ; schiebe nach rechts
11
    OUT  PortC,AK_M_1    ; schreibe in PortC
12
    SBRS  AK_M_2,0    ; wenn bit 0 gesetze
13
    SBI  PortB,5      ; setze b,5
14
    SBRC  AK_M_2,0    ; wenn bit 0 gelöscht
15
    CBI  PortB,5      ; claer b,5
16
    SBRS  AK_M_2,1    ; wenn bit 1 gesetze
17
    SBI  PortB,3      ; setze b,3
18
    SBRC  AK_M_2,1    ; wenn bit 1 gelöscht
19
    CBI  PortB,3      ; claer b,3
20
;/////////////////////////////////////////////////////////////////////////////////////////
21
    
22
    SBI  PortD,5      ; WR anschalten (schreiben ausführen)
23
    NOP        ;
24
    NOP        ;
25
    SBI  PortB,2      ; CS anschalten (daten sind für andere Geräte)
26
    RET
27
;------------------------------------------------------------------------------------------
Im Kommentar steht 1:1 genau dasselbe, was auch schon in den Anweisungen 
zu sehen ist. Was ich aber aus dem Kommentar nicht erfahre, was mich 
aber brennend interessieren würde, ist WARUM du gewissen Dinge machst. 
Das steht aber nicht im Code. Zb steht da gleich nach dem OUT die 
Kommentierung 'Wenn Bit 0 gesetzt ist, dann setze Bit 5 in Port B'. 
Schön. Das sehe ich auch im Code, das das gemacht wird. Aber warum wird 
es gemacht?
So ganz verstehe ich noch nicht, wie du dir das mit dem Write Puls 
vorstellst. Meinem naiven Verswtändnis nach, geht der Ablauf doch so:
Erst werden die Daten an den Bus angelegt und dann kommt der Write Puls. 
Zumindest erscheint mir das logisch. Bei dir ist das ineinander 
verzahnt.
1
    CBI  PortB,2      ; CS ausschalten (daten sind für Display)
2
    CBI  PortB,1      ; DC ausschalten (es wird ein Commando gesendet)
3
    CBI  PortD,5      ; WR ausschalten (schreiben einschalten)

Nein, eben nicht 'SChreiben einschalten'. Das hat mit ein-/ausschalten 
nichts zu tun. Eine 8080 legt die Adresse und die Daten auf den Bus und 
dann kommt ein Puls auf der WR Leitung (die active Low ist). Dieser Puls 
bedeutet: "Jetzt gilts. die Werte, die jetzt am Bus anliegen sind 
korrekt, jetzt übernehmen". Das hat nichts mit ein oder ausschalten zu 
tun. Das ist wie das Einstellen von Eingabewerten auf einer Maschine und 
wenn alles eingestellt ist, dann haut jemand auf einen Button um der 
Maschine anzuzeigen: alles eingestellt, jetzt bitte die Werte 
übernehmen.

Ich weiß jetzt nicht mehr auswendig, wie das spezifiziert ist. Ob die 
Peripherie die Daten bei der fallenden oder bei der steigenden Flanke 
übernehmen muss. Spielt im Grunde aber auch keine große Rolle. Halte ich 
mich an den Ablauf
1
    Busleitungen einstellen
2
    WR auf Low
3
    WR auf High
dann ist mir das völlig wurscht, ob es die fallende oder die steigende 
Flanke ist. Zuerst stelle ich alles ein und dann kommt der 
Übernahmepuls.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

1
    CBI  PortB,2      ; CS ausschalten (daten sind für Display)

Du bist hoffentlich mit dir selber im reinen, wie du die Begriffe 
'einschalten' bzw. 'ausschalten' benutzt.

Diese Leitungen sind active Low. D.h. von einer logischen Perspektive 
aus gesehen, wird dem Gerät mit einem 0-Pegel signalisiert, aktiv zu 
werden - sich einzuschalten.
Wenn du hier das 'ausschalten' darauf beziehst, dass du den Pin auf 0 
setzt, dann muss ich dir sagen: Kommentierung nicht verstanden. Dass der 
Pin auf 0 geht, seh ich im Code das brauchst du nicht kommentieren. Als 
Assemblerprogrammierer muss ich schliesslich wissen was ein CBI macht.
Wenn du allerdings das 'ausschalten' darauf beziehst, was dieses 
0-setzen des Pins beim Gerät bewirkt, dann ist das ganz klar falsch. 
Denn der Chip Select wird ja gerade durch das 0 Setzen des Pins aktiv. 
Den Pin auf 0 zu setzen, schaltet also das Gerät eigentlich 'ein' und 
nicht aus.
Fazit: der Begriff 'ausschalten' ist hier missverständlich. Benutze ihn 
nicht.

von Heidi K. (little)


Lesenswert?

Guten Tag Karl Heinz,

Danke erst mal das du dir die mühe gemacht hast:-). Ja ich weiß meine 
Kommentare lassen ein bisschen zu wünschen übrig...:-(. Mir ist das mit 
dem ein und ausschalten schon klar ich hatte nur versuch das Projekt in 
C zu schreiben und da ich da nicht ganz so geübt bin wie in Assembler 
habe ich mir dahinter geschrieben was ich mit dem Befehl wirklich 
mach.... das ist also noch son bischen Altlast Sorry. Das mit dem WR PIN 
mache ich so weil es im Datenblatt so steht:

void Write_Command(uchar command)
{
CS=0;
DC=0;
WR=0;
_nop_();_nop_();
P0=command;
WR=1;
_nop_();_nop_();
CS=1;
}


So nächste Frage war über den Abschnitt

    MOV  AK_M_2,AK_M_1    ; (zusendende Date zwischenspeichern)
    LSR  AK_M_1      ; (schiebe 2 mal rechts)
    LSR  AK_M_1      ;  (Da D2=PortC,0 D3=PortC1 ...D7=PortC,5)
    OUT  PortC,AK_M_1  ; C6=Reset (nicht als Port genutzt) C7=---
    SBRS  AK_M_2,0    ; wenn Datenbit 0 gesetzt
    SBI  PortB,5      ; setze b,5 (entspricht Ausgang für D0)
    SBRC  AK_M_2,0    ; wenn Bit 0 gelöscht
    CBI  PortB,5      ; claer b,5 (entspricht Ausgang für D0)
    SBRS  AK_M_2,1    ; wenn Bit 1 gesetzt
    SBI  PortB,3      ; setze b,3 (entspricht Ausgang für D1)
    SBRC  AK_M_2,1    ; wenn Bit 1 gelöscht
    CBI  PortB,3      ; claer b,3 (entspricht Ausgang für D1)

So hoffe die Kommentare helfen um für Klarheit zu sorgen

LG Heidi

PS: WR will eine Hi-flanke zum schreiben so seht es im Datenblatt

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.