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.