Codefrage - And am Port?

Gast #47549
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
Gast #47550
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
Gast #47551
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
Gast #47552
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
Gast #47553
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ß.
Gast #47554
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.