Sida 1 av 1

Jämföra tal med PIC12F675. ASM.

Postat: 12 juni 2007, 12:31:38
av JimmyAndersson
Inte helt träffande rubrik, men såhär är det:


En PIC12F675 får matningspänningen 3,2V.
Jag vill kolla ifall spänningen på en analog ingång är "nära 1V" (över 0,8V) eller "nära 0V" (under 0,4V).

Ungefär såhär alltså:

Om ADRESL = 255 och ADRESH >= 0 så ska jag skicka ut en 1a på GPIO.2
Om ADRESL <= 127 och ADRESH = 0 så ska jag skicka ut en 0a på GPIO.2

Jag är medveten om "fladdret" som kan bli på AD-omvandlaren. De två raderna ovan är bara för att illustrera.


Tyvärr (i detta fallet) så är det en PIC12F675 som sagt, annars kunde jag ha använt cpfsgt och liknande. Men nu står det stilla. Hur löser man detta? Har redan provat med både datablad och en promenad. :)

Postat: 12 juni 2007, 13:21:35
av sodjan
Med någon av SUB instruktioner och kolla C flaggan (d.v.s om resultatet
av SUB blev < 0).

> Om ADRESL = 255 och ADRESH >= 0 så ska jag skicka ut en 1a på GPIO.2

(ADRESH är *alltid* >= 0, så det behöver inte testas...)

INCFSZ ADRESL, W
GOTO not_255

BSF GPIO, 2

not_255
...
...


> Om ADRESL <= 127 och ADRESH = 0 så ska jag skicka ut en 0a på GPIO.2

MOVLW d'128'
SUBWF ADRESL, W
BTFSS status, C
goto gt_127

MOVF ADRESH, F
BTFSS STATUS, Z
GOTO not_0

BCF GPIO, 2

gt_127
not_0

...
...

Otestat! Du får verifiera själv...

Postat: 12 juni 2007, 13:26:23
av Icecap
Jag brukar göra det så att jag först jämför MSB, detta gör man oftast vid att subtrahera dom från varandra:

W = A - B
Carry-flaggan betyder A < B
Zero flaggan betyder A = B
Ingendera betyder A > B

Om man då kör MSB först och är de olika är det ju inget att fundera på men är de lika får man kolla MSB på samma sätt och då får man svaret.

Alltså först MSB, där använder man antingen '>' eller '<' och sedan är det klart. Om man få 'lika med' får man kolla LSB också och då kan man få '>', '<' och '='.

Postat: 12 juni 2007, 20:54:19
av JimmyAndersson
Tack för tipsen! Mycket lärorikt! :)


(ADRESH är *alltid* >= 0, så det behöver inte testas...)

Sant. Det skulle inte ha varit ett likamed-tecken där. :) :vissla:

Postat: 12 juni 2007, 23:08:54
av sodjan
OK, då blir det samma test som i det andra fallet...

Notera att en del av min kod inte är generell, utan bygger
på att du hade t.ex =255 och =0 i dina villkor, det gör
testerna i just *dom* fallen (lite) enklare.