BUENO PUES COMO NO PUEDO ADJUNTAR EL ARCHIVO DEL PROGRAMA AY LO LLEVAIS
LIST P=16f876
include "P16f876.INC"
RADIX HEX
WREG EQU 0x00
Z EQU 0x02
TEMP1 EQU 0x20 ; Registros de propósito general.
TEMP2 EQU 0x21
CONTA0 EQU 0x22
VALORA0 EQU 0x23 ; Valor de la conversion de los sensores
VALORA1 EQU 0x24
VALORA2 EQU 0x25
CONTADE EQU 0x26 ; Contador para limitar el giro
CONTAIZ EQU 0x27
;*****************************************************************
org 0x00
goto inicio
org 0x05
inicio: clrf INTCON ;Se anulan las interrupciones.
movlw 0X04
movwf CONTADE ; Limita el giro a la derecha.
movwf CONTAIZ ; limita el giro a la izquierda.
bcf STATUS,RP1
bsf STATUS,RP0 ; Seleccionamos el banco 1
movlw b"00000000"
movwf TRISB ; Puerto B de salida
movlw b"00000000" ; Puerto C de salida
movwf TRISC
movlw b"00000111" ; RA0,RA1 y RA2 como entradas
movwf TRISA
movlw b"10000000" ; Configuramos entradas analogicas
movwf ADCON1 ; Resultado justificado en ADRESH.
bcf STATUS,RP0 ; Seleccionamos banco1
clrf PORTA ; PORTA <- 0
clrf PORTC
movlw b"00110101" ; Secuencia de inicializacion del motor.
movwf PORTB ; Sincroniza las bobinas con una secuencia inicial
call TEMPO ; para evitar un comportamiento anómalo la
; primera que recibe una secuencia de giro
movlw b"00110101"
movwf PORTB
call TEMPO
movlw b"00110101"
movwf PORTB
call TEMPO
movlw b"00110101"
movwf PORTB
movlw b"00000000"; Se selecciona RA0 para realizar la conversion
movwf ADCON0
bsf ADCON0,0 ; Activa el convertidor A/D
convertir: call espera20u
bsf ADCON0,2 ; Inicia la conversion
espera: btfsc ADCON0,2 ; Espera a que termine la conversion
goto espera
bsf STATUS,RP0
movf ADRESL,0
bcf STATUS,RP0
movwf VALORA0
movf ADRESH,0
sublw b"00000000" ; Si ADRESH es 0x00, VALORA0=ADRESL
btfsc STATUS,Z
goto convertir2
movlw b"11111111" ; Si ADRESH <> 0x00, VALORA0=0xFF
movwf VALORA0
convertir2: bsf ADCON0,3 ; Seleccionamos RA1
call espera20u
bsf ADCON0,2 ; Inicia la conversion
espera2: btfsc ADCON0,2 ; Espera a que termine la conversion
goto espera2
bsf STATUS,RP0;
movf ADRESL,0
bcf STATUS,RP0
movwf VALORA1
movf ADRESH,0
sublw b"00000000" ;Si ADRESH es 0x00, VALORA1=ADRESL
btfsc STATUS,Z
goto convertir3
movlw b"11111111"
movwf VALORA1 ; Si ADRESH <> 0x00, VALORA0=0xFF
convertir3: bcf ADCON0,3 ;
bsf ADCON0,4 ; Seleccionamos RA2
call espera20u
bsf ADCON0,2 ; Inicia la conversion
espera3: btfsc ADCON0,2 ; Espera a que termine la conversion
goto espera3
bsf STATUS,RP0;
movf ADRESL,0
bcf STATUS,RP0
movwf VALORA2
movf ADRESH,0
sublw b"00000000" ;Si ADRESH es 0x00, VALORA1=ADRESL
btfsc STATUS,Z
goto comparar
movlw b"11111111"
movwf VALORA2 ; Si ADRESH <> 0x00, VALORA0=0xFF
comparar: movf VALORA0,0
subwf VALORA2,0 ; Comparamos los extremos
btfsc STATUS,Z
goto configura ;Si los extremos son iguales, vuelve a coger valores
btfss STATUS,0 ; Vemos cual es el que ha detectado mas luz
goto compara2 ; RA2 Detecta mas luz
compara1: movf VALORA0,0 ; RA0 Detecta mas luz
subwf VALORA1,0 ; Restamos RA0 - RA1 (Central y extremo con mayor luz)
btfsc STATUS,0
goto derecha ; RA0 es el sensor que detecta mas luz
goto configura ; RA1 es el central y es el que tiene mas luz
compara2: movf VALORA2,0
subwf VALORA1,0 ; Restamos RA2 - RA1 (Central y extremo con mayor luz)
btfsc STATUS,0;
goto izquierda ; RA2 es el sensor que detecta mas luz
configura: movlw b"00000000" ; Se selecciona RA0 para realizar la conversion
movwf ADCON0
bsf ADCON0,0 ; Activa el convertidor A/D
goto convertir
derecha: decfsz CONTADE,1 ; Comprobamos que no ha llegado al tope
goto derechaok ; Si llega al tope que no gire
incf CONTADE,1 ; y vuelva a tomar valores
movlw 0x04
movwf PORTC
goto configura
derechaok: movlw 0x00
movwf PORTC
incf CONTAIZ,1
movlw b"00110101" ; primer paso
movwf PORTB
call TEMPO ;Temporización antes de realizar el siguiente paso
movlw b"00110110" ;segundo paso.
movwf PORTB
call TEMPO
movlw b"00111010" ;tercer paso.
movwf PORTB
call TEMPO
movlw b"00111001" ;cuarto y último paso
movwf PORTB
call TEMPO
goto configura
izquierda: decfsz CONTAIZ,1 ; Comprobamos que no ha llegado al tope
goto izquierdaok ; Si llega al tope que no gire
incf CONTAIZ,1 ; y vuelva a tomar valores
movlw 0x08
movwf PORTC
goto configura
izquierdaok: movlw 0x00
movwf PORTC
incf CONTADE,1
movlw b"00111001" ; Primer paso para el giro hacia la derecha.
movwf PORTB
call TEMPO ;Temporización antes de realizar el siguiente paso
movlw b"00111010" ;Segundo paso.
movwf PORTB
call TEMPO
movlw b"00110110" ;Tercer paso.
movwf PORTB
call TEMPO
movlw b"00110101" ;Último paso.
movwf PORTB
call TEMPO
goto configura
;******************************************************************************************
;TEMPO Subrutina de temporización para poder enviar otra secuencia al motor.
TEMPO movlw 0xFF ;carga FF en TEMP1
movwf TEMP1
clrf TEMP2 ;Carga 0 en TEMP2
TEMPO_1 decfsz TEMP2,1 ;Decrementa TEMP2 y si es 0 salta
goto TEMPO_1 ;volver a TEMPO_1
decfsz TEMP1,1 ;Decrementa TEMP1 y si es 0 salta
goto TEMPO_1 ;volver a TEMPO_1
RETURN
;**********************************************************************************
; espera20u Subrutina de espera para poder volver a tomar otro valor del conversor
espera20u movlw 0x05
movwf CONTA0
ret1 decfsz CONTA0,1
goto ret1
return
end