Hallo

Ik ben bezig met een pic16f877a te proggen.
Nu zou ik moeten een binnengelezen waarde gaan vergelijken.

Als deze inkomende waarde groter of gelijk is aan decimaal 128 dan mag bit 0 op poort B aan('1') gaan. Als de inkomende waarde kleiner is dan 128 dan meot deze op 'o' blijven.

Wie kan me helpen?

Greets


        movlw d'128'
        sublw waarde
        btfsc status,z(zero)
        goto groter
        goto gelijk
groter  btfss status,b(borrow)
        goto kleiner
        goto gelijk
kleiner bcf shadowb,0


gelijk  bsf  shadowb,0

borrow is 1 als 128 - waarde kleiner is dan 0
Zero is 1 als 128 - waarde 0 is

Omdat het zo'n mooi getal is (128) kun je ook gewoon kijken of bit 7 gezet is. Is die gezet, dan is het getal gelijk aan of groter dan 128, anders kleiner.

Dus iets als:


          BTFSS waarde, 7
          GOTO  kleiner
          ... ; Doe wat je doen moet als-ie groter
              ; of gelijk is
          GOTO  einde
kleiner   ... ; Doe wat je doen moet als-ie kleiner is
         
einde     ...

Ok, bedankt hoor, dit is goed gelukt met het laatste voorbeeld.

Nu zou ik echt wille vergelijken dat een waarde tussen 0 en 3 is en dan tussen 4 en 7 enzovoort.

Hoe kan je dit dan doen.

Als tussen 0 en 3 is, dan bit 0 van portB hoog
als tussen 4 en 7 is, dan bit 1 van portB hoog
als tussen 8 en 11 is, dan bit 2 van portB hoog

enzovoorts .....

greets

Ok, even ervanuit gaande dat de oorspronkelijke waarde kleiner is dan 32 (want meer dan 8 bits heeft PORT B niet):

Eerst tweemaal naar rechts schuiven om bit 0 en 1 kwijt te raken. Dit levert voor de waarden 0..3 de nieuwe waarde 0 op, voor 4..7 1, 8..1 2 etc.

Vervolgens moet je aan de hand van die nieuwe waarde weer de juiste bit van PORT B zetten. Dat kan weer met een beetje schuiven en een tellertje, maar een lookup-table is makkelijker:


        bcf STATUS, C ; clear carry
        rrf waarde, f
        bcf STATUS, C ; clear carry
        rrf waarde, w ; 
        call get_bit
        movwf PORTB
        ....

get_bit addwf PCL, f
        retlw 0x01
        retlw 0x02
        retlw 0x04
        retlw 0x08
        retlw 0x10
        retlw 0x20
        retlw 0x40
        retlw 0x80

De waarde in 'waarde' is hierna wel veranderd - heb je die later nog nodig, dan moet je hem eerst even in een ander register zetten.

En nu ik zo kijk is een shift-loopje in plaats van de lookup table eigenlijk toch wel eleganter.