Hallo,
verzweifel gerade ein wenig. Ich habe ein 2x40 Zeilen Display an meinen
16C84 angeschlossen. Ich betreibe es im 4 Bit Modus. Bislang habe ich
die Daten einfach als 8Bit auf den Port B geschickt. Da ich aber die
Interrupts des oberen Nibble nutzen möchte und der obere Nibble als
Eingang konfiguriert ist, möchte ich nun folgenden Code realisieren:
and rb,#0f0h
mov w,Daten
and w,#0fh
and rb,DivRet
dann kommt das Enable gezippel
swap Daten
and rb,#0f0h
mov w,Daten
and w,#0fh
and rb,DivRet
und nochmal das gezuppel.
Aber es kommen immer die falschen Daten auf dem Bus raus, und immer
sind es die gleichen Bitfolgen. Wo ist mein Denkfehler? Proggen tu ich
mit PASMX.
Gruß
Binnesmann
Ist zwar schon lange her, das ich mit PASMX gearbeitet habe aber ich
erkenne irgendwie nicht den Sinn deines Quelltextes.
and rb,#0f0h ; setzt das untere Nibble von PortB auf 0000
mov w,Daten ; Läd w mit Daten ?
and w,#0fh ; setzt oberes Nibble von PortB auf 000 ?
and rb,DivRet ; ???? Glaskugel ist leider kaputt
dann kommt das Enable gezippel
swap Daten
and rb,#0f0h
mov w,Daten
and w,#0fh
and rb,DivRet
In richtigen Microchip-ASM sollte es so funktionieren:
movf Daten,w ; Daten in w laden
movwf rb ; unteres Nibble ausgeben, oberes wird ignoriert
; da als Eingänge definiert
; so, hier Daten mit Enable ins Display
swapf Daten,w ; Daten geswapt in w
movwf rb ; Ausgabe
; nochmal Daten mit Enable übernehmen
Vier Befehle. Mehr ist es nicht. Du kannst PortB ruhig mit dem Ganzen
Wert laden. Die Pins, die als Eingang deklariert sind stört das nicht.
Die Paralax Macros würde ich nicht verwenden. Dein Code oben erzeugt so
ca. 20 Byte an Code (ohne Gewähr, bin zu faul nachzusehen).
Steffen
Sorry, also nachfolgend meine Erklärungen:
Einsprung mit dem Datenwort was ich verschicken will in Daten.
and rb,#0f0h ; Löschen des unteren Nibbles
mov w,Daten ; Das Datenbyte wird nach W geschickt
and w,#0fh ; oberes Nibble von w löschen
and rb,w ; w wird dann mit dem Port "ver-und-et"
So wie Du das geschrieben hast, habe ich das auch. Da funktionierts.
Jetzt habe ich nur Phänomäne mit den Tasten die am oberen Nibble
hängen. Da scheint es aus welchen Gründen auch immer Probleme zu
geben.
Im übrigen geben die Makros von Parallax in diesem Bereich die gleichen
Assemblerbefehle aus.
Gruß Binnesmann
OK, bis auf and rb,DivRet (wenn DivRet=w, dann ist es wirklich das
gleiche) sind es ein Byte Befehle. Bei manchen Sachen erzeugen die
Makros aber doch etwas viel Code. Daher habe ich auch nie diesen Syntax
verwendet.
Bei der zweiten Sache könntest Du auch Recht haben. Der On-Change
Interupt wird glaube ich auch ausgelöst, wenn das Daten in das
Ausgangs-Latch geschrieben werden. Ein praktisches Beispiel in der
Richtung hatte ich bisher noch nicht.
Nochmal zum Problem:
and rb,#0f0h ; Löschen des unteren Nibbles
; rb=xxxx0000
mov w,Daten ; Das Datenbyte wird nach W geschickt
and w,#0fh ; oberes Nibble von w löschen
; w=0000yyyy
and rb,w ; w wird dann mit dem Port "ver-und-et"
; rb=xxxx0000 and 0000yyyy = 00000000
Als letzte Zeile or rb,w sollte funktionieren.
; rb=xxxx0000 or 0000yyyy = xxxxyyyy
Wenn ich da jetzt nicht einen Denkfehler drin habe.
Steffen
DDDDAAAAAANNNNNNKKKKEEEEEE!!!!!!! Aber so ist das, da schreibt man "mal eben" etwas um und baut sich dabei einen Riesen Bug rein wo man dann 2 Tage dran rum sucht. Vielen Dank Binnesmann PS: Finde das mit den Makros garnicht so schlecht. Geht etwas schneller als wenn man wirklich alles über w schieben muß.
Das ging mir auch schon oft so. Irgendwann sieht man den Wald vor lauter Bäumen nicht mehr. Was die Makros anbetrifft: Verkehrt ist das schon nicht aber den PASM(X) gibt es ja soweit ich weiß nur für die 16C5x-,16C(F)84- und 16C71-Serie. Wenn man andere Prozessoren programmieren will und den Microchip MPASM verwenden muss, dann fängt man bei fertigen Routinen dann damit an alles wieder umzuschreiben. Oder man programmiert sich de Makros für MPASM. Das währe mir aber zu umständlich. MfG Steffen
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.