Forum: Mikrocontroller und Digitale Elektronik Codefrage - And am Port?


von Binnesmann (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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

von Binnesmann (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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

von Binnesmann (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.