Parität einer Variable errechnen

OP Persönliche Seite #736067
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.
#736088
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.
1
        mov __tmp_reg__,r24    ; Daten kopieren 
2
        swap r24               ; Nibbles vertauschen
3
        eor r24,__tmp_reg__    ; XOR, erledigt 4 Bits auf einmal
4
        mov __tmp_reg__,r24    ; Daten kopieren 
5
        lsr r24                ; zweimal rechs schieben
6
        lsr r24
7
        eor r24,__tmp_reg__    ; XOR, erledigt 2 Bits auf einmal
8

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


MFG
Falk
OP Persönliche Seite #736113
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?
1
  movlw  D'7'
2
  movwf  Loops
3
  movf  ScanCode, W
4
  movwf  PariTemp
5
  movf  ScanCode, W
6
ParityCheck
7
  rrf    PariTemp
8
  xorwf  PariTemp, W
9
  decfsz  Loops
10
  goto  ParityCheck
11
  
12
  movwf  PariTemp
13
  btfss  PariTemp, 0
14
  goto  ParitaetsBitIst0
15
  goto  ParitaetsBitIst1
#736126
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
OP Persönliche Seite #736134
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
OP Persönliche Seite #736264
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?
#736341
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren