elmowww
PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling
Ik ben nu druk bezig met "een" interface voor de RS232 poort, en wil daar pariteitscontrole bij inbouwen.
De code die ik nu heb, heb ik in basic, neemt teveel tijd.
Parity = Baud.3 ; Baud.3 gives ODD or EVEN parity
For MP_varX = 0 To 7
If GetBit Rcv_Byte, MP_varX = 1 Then
Parity = ~Parity
EndIf
Next
If Parity Not RX9 Then GoTo Not_Save ; Data not ok
Tijdens het herschrijven in ASM was ik op zoek om zo snel mogelijk een bit te inverteren (parity in dit geval), daarvoor is dé methode lijkt me om een gehele byte te misbruiken voor enkel 1 bit (zonde, ik weet het
), en daar de nibbles van te swappen, met als startwaarde van nibble0 bit0 = 0 en nibble1 bit0 = 1, zodoende wordt bit0 van de byte geinverteerd.
Met de loop weggewerkt kom ik op ongeveer dit uit:
Iemand een manier om nog sneller te checken voor de pariteit? Misschien zie ik een of andere optie over het hoofd 
MOVLW 0b00010000 ;Start met nibble 2 bit 0 = 1
MOVWF Parity ;Plaats in Parity
BTFSC Baud, 3 ;Test baud.3 voor ODD of EVEN parity
SWAPF Parity, 1 ;Plaats startwaarde in Parity
BTFSC rcv_byte, 0 ;Test bit.0
SWAPF Parity, 1 ;Swap invert Parity.0 indien nodig
BTFSC rcv_byte, 1
SWAPF Parity, 1
BTFSC rcv_byte, 2
SWAPF Parity, 1
BTFSC rcv_byte, 3
SWAPF Parity, 1
BTFSC rcv_byte, 4
SWAPF Parity, 1
BTFSC rcv_byte, 5
SWAPF Parity, 1
BTFSC rcv_byte, 6
SWAPF Parity, 1
BTFSC rcv_byte, 7
SWAPF Parity, 1
Ik heb even geen voorbeeld code... maar een bit in een byte inverteren kun met xor doen.
Parity kun je ook door de ontvangen byte 8x naar rechts te shiften door de carry en in elke stap de carry bij een tijdelijke waarde optellen. Bit 0 geeft dan even (bij een '0') of oneven '1' aan.
Eh... Hebben die pic-dingen geen parity-check in hardware???? Hoef je alleen bij het ophalen van de byte te kijken of de PE (of hoe dat in zo'n pic-ding ook heten mag) gezet is...
LaStei
carpe cerevisi
Nee, die hebben ze voor zover ik weet niet.. Een ander mogelijkheid is te spelen met de Carry, acht keer roteren, en elke keer de carry checken of-ie gezet wordt of niet. daarop een bit zetten. Je zou daar het DC bit in het status register voor kunnen "mis"bruiken. Of checken by het roteren of het laagste bit "1" en als dat zo is, een temp register met 1 verhogen. Het laagste bit van de temp register na de operatie is dan je paritiets bit.
De snelste oplossing is het gebruik van een table lookup. Is denk ik minimaal 2X zo snel, maar kost wel veel meer code.