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