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.
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
ik heb daar een leuke macro voor geschreven.
volgende functies:
=0
<>0
=
<
<=
>
>=
Ga naar Pic Tutorial (oefening 8) op
http://home.versatel.nl/edithenwilliam/william.htm
Oefening 8: http://home.versatel.nl/edithenwilliam/william/pictut.htm#_Toc11027345…
Macro: http://home.versatel.nl/edithenwilliam/william/pictut/if_then.inc
succes