Programa para rastreador de luz

#1
hola a todos, tengo cierto problemas con un programa para un robot rastreador de luz pero es en la parte de comparacion de tres voltajes aqui esta un ejemplo de una parte del programa que hize para probar mas no me corre correctamente alguien me puede decir como puedo hacer una comparacion de tres voltajes q le entran a un pic 16f877

Código:
LIST P=16F877
  INCLUDE "P16F877.INC"
  RADIX HEX
  ORG  0X00
  GOTO INICIO
  ORG  0X04
  GOTO INICIO
UNOH equ 0x20
UNOL equ 0x21
DOSH equ 0x22
DOSL equ 0x23
TRESH   equ 0x27
TRESL   equ 0x28
CON   EQU  0X2B
BComp  EQU  0X2C
BComp2      EQU     0X24
BComp3      EQU     0X25
BComp4      EQU     0X26
INICIO BCF  STATUS,6
        BSF  STATUS,5 ;CONFIGURA LOS PUERTOS DEL PIC como salidas o entradas
  MOVLW B'00000000'
  MOVWF TRISB
 
;-----------------------------------------
  MOVLW B'10000000'
  MOVWF ADCON1
  MOVLW B'11010111'
  MOVWF OPTION_REG
  BCF  STATUS,5
OPP  MOVLW B'10000001'  ; 'xx'xxx'x' 'x' configuro el conversor y selecciono el canal 0
  MOVWF ADCON0
LAZOA ;CALL RETARDO
  BSF  ADCON0,2
LAZOB BTFSC ADCON0,2
  GOTO LAZOB
  MOVF ADRESH,W
  MOVWF UNOH
  BSF  STATUS,5
  MOVF ADRESL,W
  BCF  STATUS,5
  MOVWF UNOL
  BCF  PIR1,ADIF
;-------------------------------------------------
  MOVLW B'10001001'  ; 'xx'xxx'x' 'x' configuro el conversor y selecciono el canal 1
  MOVWF ADCON0
 ; CALL RETARDO
  BSF  ADCON0,2
BUCB BTFSC ADCON0,2
  GOTO BUCB
  MOVF ADRESH,W
  MOVWF DOSH
  BSF  STATUS,5
  MOVF ADRESL,W
  BCF  STATUS,5
  MOVWF DOSL
  BCF  PIR1,ADIF
 ; CALL RETARDO

;--------------- CONVERSION A VOLTAJE ---------------------------------
  BCF  STATUS,6
        BSF  STATUS,5
  BCF  STATUS,C
  RRF  UNOH,F
  RRF  UNOL,F
  BCF  STATUS,C
  RRF  DOSH,F
  RRF  DOSL,F
  BCF  STATUS,C
 
 
    ;CALL RUTINA  ;CONVIERTO A BCD 
  CLRF CON   ;LIMPIO CONTADOR
  CLRF BComp  ;LIMPIO COMPARADOR
ARR  movlw b'11111111'
  movwf PORTB
  CALL Comp  ;COMPARO QUE CANAL ES MAYOR O SI SON IGUALES
  MOVLW 0X5B
  
 ; MOVF Centena,W
 ; ADDLW 0X30
  
 ; MOVF Decena,W
 ; ADDLW 0X30
 ; 
  ;MOVF Unidad,W
 ; ADDLW 0X30
  
  MOVF BComp,W
  SUBLW 0X01
  BTFSS STATUS,Z
  GOTO ARR
 a movlw b'00000000'
  movwf PORTB
  goto a
 ; cALL  RETARDO
 ; CALL  RETARDO
 ; CALL  RETARDO
 ; CALL  RETARDO
 ; CALL  RETARDO
 ; CALL BORRAR
  GOTO  OPP
  ;----------------------------------------------------------------
BORRAR 
  MOVLW .032
  MOVWF CON
REDD 
  MOVLW 0X08 
;  CALL TRANS
  DECFSZ CON,F
  GOTO REDD
  CLRF CON
  RETURN
  
;-----------------------------------------------
  GOTO LAZOA
RETARDO MOVLW D'1'
  MOVWF TMR0
LAZOC BTFSS INTCON,T0IF
  GOTO LAZOC
  BCF  INTCON,T0IF
  RETURN
          
                
; ******************************
;    Comparador de 16 Bit
; ******************************
Comp
   movf   UNOH,   W
   subwf   DOSH,   W
   btfsc   STATUS,   Z
   goto    A1_IGU_B1
                        
   btfsc   STATUS,   C      ; A1 <> B1
   goto   A_MEN_B
   goto   A_MAY_B
A1_IGU_B1:
   movf   UNOL,   W
   subwf   DOSL,   W
   btfsc   STATUS,   Z
   goto   A_IGU_B         ; A = B
               
   btfsc   STATUS,   C      ; A2 <> B2
   goto   A_MEN_B         
                     
A_MAY_B:     ;VALOR 1
   bsf      BComp,   0
   bcf      BComp,   1
   bcf      BComp,   2
   goto   Salir
A_IGU_B:     ;VALOR 2
   bcf      BComp,   0
   bsf      BComp,   1
   bcf      BComp,   2
   goto   Salir
A_MEN_B:     ;VALOR 4
   bcf      BComp,   0
   bcf      BComp,   1
   bsf      BComp,   2
Salir:
   return
; ******************************
 
Última edición por un moderador:
#2
por programación ni idea, pero por electronica sí...

digamos que vas a necesitar al menos 3 amplificadores operacionales, en configuración de comparador de tensión, cada uno con una tensión de referencia, y entonces, por debajo de la referencia estaran su salidas en 0 y cuando la entrada se iguale o supere la referencia la salida estará en 1 lógico (+Vcc)

saludos.
 

Adjuntos

Última edición:
#4
supongo que como te piden programación, y la comparación de luz es analógica, pero el PIC sólo trabaja señales digitales entre 0 y 5Vcc...vas a tener que conseguir algún conversor A/D o utilizar (no se si trae) el conversor interno del PIC

eso es fácil...los conversores A/D de por ejemplo 8bits, tiene 256 escalones en los cuales se divide toda la gama de tensiones analógica...en tu caso las infinitas cifras de tensiones analógicas comprendidas entre 0 y 5Vcc se dividen en 256 escalones...

el 0Vcc es el 00000000
el 5Vcc es el 11111111
cada escalón mide 19,5mVcc
 
Última edición:
#6
destinas 1 entrada a ser analogica...y el conversor en esa entrada...seguramente tendrás que poner esa ganancia (ganancia se le llama al valor de cada escalón) o mejor dicho a esa división de 5[Vcc] / 256[bits]

programacionalmente hablando no tengo idea...
 
Arriba