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 :P), 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 :P


    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...

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.