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


von Martin M. (kaktus621) Benutzerseite Flattr this


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.

von Falk B. (falk)


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

von Martin M. (kaktus621) Benutzerseite Flattr this


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

von Falk B. (falk)


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

von Martin M. (kaktus621) Benutzerseite Flattr this


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

von Falk B. (falk)


Lesenswert?

OK, dann sollte das passen

von Martin M. (kaktus621) Benutzerseite Flattr this


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?

von Otto (Gast)


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

von Martin M. (kaktus621) Benutzerseite Flattr this


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

von Otto (Gast)


Lesenswert?

war nicht böse gemeint.....

Otto

von Falk B. (falk)


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.

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.