www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Parität einer Variable errechnen


Autor: Martin Matysiak (kaktus621) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte mithilfe eines PICs eine "virtuelle Tastatur" bauen. Benutzen 
wollte ich dafür einen PIC 16F628A, da ich gerade einen davon zu Hause 
habe ;-) Jetzt muss man ja beim Senden des ScanCodes noch ein 
Paritätsbit senden. Mein Problem ist, wie kann ich in Assembler diese 
Parität errechnen?
Ich habe einen anderen Beitrag hier im Forum gefunden, wo auch ein 
asm-Code geschrieben wurde, allerdings habe ich ihn nicht so ganz 
durchblickt :

Beitrag "Re: Parity rechnen mit AVR"

Könnte mir jemand sagen, wo jetzt genau meine Variable (der ScanCode) 
hin muss, und nochmal erläutern, wie genau diese Prozedur funktioniert?

Vielen Dank.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin M. (kaktus621)

>Paritätsbit senden. Mein Problem ist, wie kann ich in Assembler diese
>Parität errechnen?

Einfach alles Bits eines Bytes XOR verknöpfen. Das geht im einfachsten 
Fall mit 7 mal shift right + xor.

Bitmanipulation

>Könnte mir jemand sagen, wo jetzt genau meine Variable (der ScanCode)
>hin muss, und nochmal erläutern, wie genau diese Prozedur funktioniert?

Der Link landet auf einer optimierten Version für den AVR.
        mov __tmp_reg__,r24    ; Daten kopieren 
        swap r24               ; Nibbles vertauschen
        eor r24,__tmp_reg__    ; XOR, erledigt 4 Bits auf einmal
        mov __tmp_reg__,r24    ; Daten kopieren 
        lsr r24                ; zweimal rechs schieben
        lsr r24
        eor r24,__tmp_reg__    ; XOR, erledigt 2 Bits auf einmal

        subi r24,lo8(-(1))     ; ???
        lsr r24                ; einmal links schieben
        andi r24,lo8(1)        ; alle Bits löschen, ausser das LSB


MFG
Falk

Autor: Martin Matysiak (kaktus621) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> Einfach alles Bits eines Bytes XOR verknöpfen. Das geht im einfachsten
> Fall mit 7 mal shift right + xor.

Okay, hab mal etwas geschrieben, ist das so in Ordnung?
  movlw  D'7'
  movwf  Loops
  movf  ScanCode, W
  movwf  PariTemp
  movf  ScanCode, W
ParityCheck
  rrf    PariTemp
  xorwf  PariTemp, W
  decfsz  Loops
  goto  ParityCheck
  
  movwf  PariTemp
  btfss  PariTemp, 0
  goto  ParitaetsBitIst0
  goto  ParitaetsBitIst1

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin M. (kaktus621)

>Okay, hab mal etwas geschrieben, ist das so in Ordnung?

Ich hab keine Ahnung von PIC-Assembler. Sieht gefährlich aus ;-)

>ParityCheck
>  rrf    PariTemp

ich nehme an das ist shift right

>  xorwf  PariTemp, W

und das XOR

>  decfsz  Loops

Zähler verringern, OK. Aber wo bleibt die Abbruchbedingung?

>  goto  ParityCheck

Uhhh, GOTO. JEtzt weiss ich, warum ich AVR-Fan bin ;-)

>  movwf  PariTemp
>  bcfss  PariTemp, 0

was macht das?

>  goto  ParitaetsBitIst0
>  goto  ParitaetsBitIst1

???

MFG
Falk

Autor: Martin Matysiak (kaktus621) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
>>  decfsz  Loops
>
> Zähler verringern, OK. Aber wo bleibt die Abbruchbedingung?

Die Abbruchbedingung steckt im "sz" von decfsz == Skip if Zero. Wenn 
also die Variable 0 ist, wird das Goto übersprungen und unter dem 
weitergemacht

>>  goto  ParityCheck
>
> Uhhh, GOTO. JEtzt weiss ich, warum ich AVR-Fan bin ;-)
>
>>  movwf  PariTemp
>>  bcfss  PariTemp, 0
>
> was macht das?

movwf Legt das Ergebnis aus den ganzen Xor's, dass ja in W lag, nun in 
die Variable PariTemp ab.
bcfss Übeprüft, ob Bit 0 (das ge-'xor'-te) dieser Variable high oder Low 
ist und springt dann eben je nachdem zu einer der beiden Labels.

>>  goto  ParitaetsBitIst0
>>  goto  ParitaetsBitIst1
>
> ???

Ist Bit 0 low, geh zum Label ParitaetsBitIst0, ansonsten überspringe den 
Befehl und gehe somit zu Label ParitaetsBitIst1

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, dann sollte das passen

Autor: Martin Matysiak (kaktus621) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, vielen Dank.
Ich habe meinen Programmcode nun soweit fertig, aber noch eine ganz 
kleine Frage, für die es sich nicht lohnt, einen neuen Thread 
aufzumachen.

Man betrachte diese Grafik :

http://www.marjorie.de/ps2/ps2.jpg

Was sollen diese Dreiecke bei den EingangsPorts am µC darstellen? Ganz 
einfache Dioden?

Und Pin A und B müssten im Programm als Eingänge (CLK IN & DATA IN), Pin 
C und D als Ausgänge (CLK OUT & DATA OUT) deklariert werden, richtig?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,

auf "www.marjorie.de/ps2/ps2.jpg" ist erklärt, dass es alleine mit 2 
Portpins funktioniert, wenn es nur geschickt programmiert ist (interne 
Pull-up's).

Gruss Otto

Autor: Martin Matysiak (kaktus621) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jaa ich weiß, aber ich habs jetzt schon ungeschickt Programmiert ;) und 
möchte das mit 4 Port Pins machen, der 16F628A hat sowieso genug davon

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
war nicht böse gemeint.....

Otto

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin M. (kaktus621)

>http://www.marjorie.de/ps2/ps2.jpg

>Was sollen diese Dreiecke bei den EingangsPorts am µC darstellen? Ganz
>einfache Dioden?

Ich denke eher das sollen nichtinvertierende Eingangspuffer darstellen. 
Die sind aber praktisch schon im PIC drin.

>Und Pin A und B müssten im Programm als Eingänge (CLK IN & DATA IN), Pin
>C und D als Ausgänge (CLK OUT & DATA OUT) deklariert werden, richtig?

Ja.
Wobei C und D  sowie die Transistoren (wo der Basiswiderstand fehlt) 
überflüssig sind. Man kann das mit einer einfachen Richtungsumschaltung 
mit zwei Pins machen, so wie I2C.

MfG
Falk

P.S. Das mit den internen Pull-Ups geht nicht unbedingt, die sind da 
wahrscheinlkich zu hochohmig. Besser externe verwenden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.