Usar 3 adc pic16f873a ensamblador

Hola buena noche tengo un problema, estoy usando el pic 16f873a y resulta que necesito sensar 3 señales analogicas, cuando sólo utilizo un canal, todo bien desde 0V hasta 5V me regresa el resultado correcto, pero cuando intento utilizar los 3, al subir o bajar el voltaje de las otras 2 señales afecta a los otros 2 adc (bueno yo sé que es uno pero multiplexado), es decir sensando la primer señal me regresa 105 por decir y cuando aumento o disminuyo el voltaje de otra señal la primera cambia a 92 por ejemplo, e igual con las otras señales al aumentar o disminuir ésta que me daba 105 las demas se modifican, estoy utilizando potenciometros para simular las señales reales.

aqui el codigo:
la rutina adc llama a cada uno de los adc y rutina encargada de hacer la conversion se llama adc0 que se encuentra en negrita, cursiva y subrayada, la cual la encontré buscando en internet.

ADC
; BCF STATUS,RP0
; BCF STATUS,RP1
; BSF PORTB,3
; CALL DIEZMIL
; CALL DIEZMIL
BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'00000011'
MOVWF PRIM ;ADCON1
BCF STATUS,RP0
MOVLW B'01000001'
MOVWF SECON ;ADCON0
CALL ADC0
CALL IN_BCD
MOVF BCDH,W
MOVWF TANK00
MOVF BCDM,W
MOVWF TANK01
MOVF BCDB,W
MOVWF TANK02
; CALL DEL5
; CALL DIEZMIL
; CALL DIEZMIL
; CALL DIEZMIL
; BCF PORTB,3
;/////////////////////////////////////////////////
; BCF STATUS,RP0
; BCF STATUS,RP1
; BSF PORTB,4
; CALL DIEZMIL
; CALL DIEZMIL
; BSF STATUS,RP0
; BCF STATUS,RP1
; MOVLW B'00000011'
; MOVWF PRIM
; BCF STATUS,RP0
; MOVLW B'01000001'
; MOVWF SECON
; CALL ADC0
; CALL IN_BCD
; MOVF BCDH,W
; MOVLW '0'
; MOVWF TANK10
; MOVF BCDM,W
; MOVLW '0'
; MOVWF TANK11
; MOVF BCDB,W
; MOVLW '0'
; MOVWF TANK12
;; CALL DEL5
; CALL DIEZMIL
; CALL DIEZMIL
; CALL DIEZMIL
; BCF PORTB,4
;///////////////////////////////////////////////
; BCF STATUS,RP0
; BCF STATUS,RP1
; BSF PORTB,5
; CALL DIEZMIL
; CALL DIEZMIL
; BSF STATUS,RP0
; BCF STATUS,RP1
; MOVLW B'00000011'
; MOVWF PRIM
; BCF STATUS,RP0
; MOVLW B'01000001'
; MOVWF SECON
; CALL ADC0
; CALL IN_BCD
; MOVF BCDH,W
; MOVLW '0'
; MOVWF TANK20
; MOVF BCDM,W
; MOVLW '0'
; MOVWF TANK21
; MOVF BCDB,W
; MOVLW '0'
; MOVWF TANK22
;; CALL DEL5
; CALL DIEZMIL
; CALL DIEZMIL
; CALL DIEZMIL
; BCF PORTB,5
RETURN








ADC0
BCF STATUS,RP0
BCF STATUS,RP1
CLRF CCP1CON ;CCP MODULE IS OFF
CLRF TMR2 ;CLEAR TIMER2
MOVLW 0X7F ;
MOVWF PR2
CALL A2D
CLRF INTCON ;DISABLE INTRPTS ANDCLEAR T0IF
BSF STATUS,RP0
BCF TRISC,2 ;MAKE PIN 2 PWM OUTPUT
CLRF PIE1 ;DISABLE PERIPHERAL INTS
BCF STATUS,RP0
CLRF PIR1 ;CLR PER INT FLAGS
MOVLW 0X2C ;PWM MODE, 2LSBs OF DUTY CYCLE=10
MOVWF CCP1CON
BSF T2CON,TMR2ON ;TIME2 STRTS TO INCREMENT
;
;CCP1 INT IS DISABLED
;DO POLLING ON THE TMR2 INT FLAG BIT
;
PWM_PERIOD_MATCH
BTFSS PIR1,TMR2IF
GOTO PWM_PERIOD_MATCH
;
;UPDATE THIS PWM PERIOD AND THE FOLLOWING PWM DUTY CYCLE
;
BCF PIR1,TMR2IF
RETURN
A2D BSF STATUS,RP0
BCF STATUS,RP1
MOVF PRIM,W
MOVWF ADCON1 ;left justified, RA0 = input
;/*-----Set up A2D parameters
MOVLW B'11010111' ;prescaler 1:256 tmr0, internal clock
MOVWF OPTION_REG
BCF STATUS,RP0
MOVF SECON,W
MOVWF ADCON0
;/*-----Delay loop to settle A2D, similar to de-bounce???
mnloop btfss INTCON,T0IF ;50us loop delay @ 4Mhz
goto mnloop
;/*-----Stop timer0 interrupt
BCF INTCON,T0IF
BSF ADCON0,GO_DONE ;start a2d conversion
WAITA2D NOP ;wait 4 finish
BTFSC ADCON0,GO_DONE
GOTO WAITA2D
;/*-----Put A2D/PWM value in W and send to ports.
BCF STATUS,RP0
BCF STATUS,RP1
MOVF ADRESH,W ;upper 8 bits-ignor lower 3
BCF STATUS,RP0
MOVWF CCPR1L ;PWM is output on pin 13 of 16F873
MOVWF BIN ;output Hex value to LEDs
RETURN ;DUTY CYCLE IS 25% OF PWM PERIOD
 
Atrás
Arriba