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.
@ 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
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 |
@ 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
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
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?
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
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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.