Hallo,
ich habe nur kurz drüber geschaut, der Fehler befindet sich wohl hier:
; move loop to do movement
decide
movlw pin7x ; put pin7x into w // FEHLER !!!!!
subwf pin6x,0 ; subtract pin7x from pin6x
btfss status,c ; carry flag
; carry = 1 : pin7x greater than pin6x
; carry = 0 : pin6x greater than pin7x
bsf gpio,pin2 ; if pin7x is greater than pin6x
nop
clrw
movwf pin7x
clrw
movwf pin6x
retlw 00
Statt
movlw pin7x ; put pin7x into w // FEHLER !!!!!
muss es
movfw pin7x ; put pin7x into w
Durch das movlw wird konstant die
Adresse von
pin7x geladen, und nicht der
Wert.
Paar Anmerkungen:
Die ADC kannst du deutlich verkürzen. Bis auf den Eingang sind die nahezu identisch. Ausserdem kannst du ADCON0 in einem beschreiben, nur zum Starten des ADC musst du
bsf verwenden.
Anstatt
bsf STATUS, PR1 etc. kann man überlicherweise
banksel "registername" verwenden.
Du beendest deine Funktionen immer mit einem
retlw 0. Da du den Wert aber nicht weiter benutzt tut es hier auch ein einfaches
return.
Anstatt
clrw
movwf pin7x
solltest du
clrf pin7x
verwenden. Das ist schneller da es einen Befehl weniger braucht.
Den Teil:
call rest ; wait a while
clrw
movwf adresh
call rest ; wait a while
call rest ; wait a while
kannst du dir sparen.
Sonst sind die ADC Routinen in Ordnung.
Welchen Compiler nutzt du eigentlich? Mich wundert es, dass die ganzen Kleinschreibungen der Registernamen keine Fehler verursachen.
Gruß
Stefan