;**************************************************************************************************** ; ; PROGRAMA : ROBOT4.ASM AUTOR:JORGE LEZANA FECHA: 30/7/2004 ; ;PROGRAMA PARA MOVER UNA ARAÑA SEGUN 3 POSICIONES DE LUZ, CON ESTO SE PUEDE HACER QUE CON ALGUNA ;COMBINACION ABANCE, SE DETENGA, GIRE ALA IZQUIERDA, GIRE ALA DERECHA, CADA SERVO ES CONTROLADO ;INDEPENDIENTEMENTE CON PULSOS QUE LIMITAN SU RECORRIDO A UN ANGULO ESPECIFICO, POR EJEMPLO ;PARA 90° SE LE ENVIA UN PULSO DE 1.5 MILISEGUNDOS, PARA 67° UN PULSO DE 1.2 MILISEGUNDOS ;PARA 112° UN PULO DE 1.8 MILISEGUNDOS, TODOS EN UNA FRECUENCIA DE 50 HZ ;PARA ESTO SE CALCULAN 4 NUMEROS AUXILIARES PARA LLEGAR A DICHOS TIEMPOS (2 PULSOS ALTOS Y ;2 PULSOS BAJOS) Y SE EMPLEAN RUTINAS. ; ; Revision : 1.0 Programa para : PIC16F84A ; Velocidad del reloj : 4 MHz Reloj instrucci¢n: 1 MHz = 1 us, T= 4 us ; Perro Guardian : Deshabilitado Tipo de reloj : XT ; Proteccion del codigo : OFF ; ; ;**************************************************************************************************** LIST P=16F84A ;EL PIC QUE VAMOS A UTILIZAR. ;****************************** IGUALIDADES ********************************************************* w EQU 0X00 ;DESTINO w (REGISTRO DE TRABAJO) f EQU 0X01 ;DESTINO f (REGISTRO A USADO) ESTADO EQU 0X03 ;ESTADO, ESTA EN LA DIRECCION 3 RP0 EQU 0X05 ;RP0 EQUIVALE A 5. PCL EQU 0x02 ;DIRECCION DEL PCL (CONTADOR DEL PC) PUERTAA EQU 0X05 ;PUERTAA SE ENCUENTRA EN LA DIRECCION 5. PUERTAB EQU 0X06 ;PUERTAB SE ENCUENTRA EN LA DIRECCION 6. ALTO_1 EQU 0x0c ;DIRECCION DEL REGISTRO DEL PULSO ALTO ALTO_2 EQU 0x0d ;DIRECCION DEL REGISTRO DEL PULSO ALTO BAJO_1 EQU 0X0e ;DIRECCION DEL REGISTRO DEL PULSO BAJO BAJO_2 EQU 0x0f ;DIRECCION DEL REGISTRO DEL PULSO ALTO HZ EQU 0x1c ;DIRECCION DEL REGISTRO HZ (50 VECES, PARA FORMAR 50HZ) ;***************** AQUI EMPIEZA EL PROGRAMA. ******************************************************** ORG 0 ;ORIGEN DEL PROGRAMA, AQUI EMPIEZA. goto INICIO ;VA A INICIO PARA SOBREPASAR ;EL VECTOR DE INTERRUPCION. ORG 5 INICIO bsf ESTADO,RP0 ;Cambio al banco 1 movlw b'00000111' ;2 bit de puerto A como entrada movwf PUERTAA clrf PUERTAB ;Puerta B como salida bcf ESTADO,RP0 ;Cambio al banco 0 clrf PUERTAA ;Borro puerta A clrf PUERTAB ;Borro puerta B ;******************** Leer las entrada para desplazar servo ***************************************** LEE_ENTRADA movf PUERTAA,0 ;Mueve el valor de la entrada al registro w (Lee entradas) addwf PCL,1 ;Sumo este valor al PCL goto QUIETO ;Si es 000 ejecuta QUIETO goto IZQUIERDA ;Si es 001 ejecuta IZQUIERDA goto ABANZA ;Si es 010 ejecuta ABANZA goto IZQUIERDA ;Si es 011 ejecuta IZQUIERDA goto DERECHA ;Si es 100 ejecuta DERECHA goto QUIETO ;Si es 101 ejecuta QUIETO goto DERECHA ;Si es 110 ejecuta DERECHA goto ABANZA ;Si es 111 ejecuta ABANZA QUIETO call SV_1_90 call SV_0_90 call SV_2_90 goto LEE_ENTRADA ABANZA call SV_1_67 call SV_0_112 call SV_1_112 call SV_2_67 call SV_1_112 call SV_0_67 call SV_1_67 call SV_2_112 goto LEE_ENTRADA IZQUIERDA call SV_1_112 call SV_0_112 call SV_1_112 call SV_2_67 call SV_1_112 call SV_0_67 call SV_1_112 call SV_2_112 goto LEE_ENTRADA DERECHA call SV_1_67 call SV_0_67 call SV_1_67 call SV_2_112 call SV_1_67 call SV_0_112 call SV_1_67 call SV_2_67 goto LEE_ENTRADA ;************ Rutina para posicionar el servo en los 90° ******************************************** SV_0_90 movlw d'13' movwf HZ ALTO_90_0 bsf PUERTAB,0 ;Pone a 1 el bit 0 de la puerta A call AL90 BAJO_90_0 bcf PUERTAB,0 ;Pone a 0 el bit 0 de la puerta A call BA90 decfsz HZ,1 goto ALTO_90_0 return SV_1_90 movlw d'13' movwf HZ ALTO_90_1 bsf PUERTAB,1 ;Pone a 1 el bit 0 de la puerta A call AL90 BAJO_90_1 bcf PUERTAB,1 ;Pone a 0 el bit 0 de la puerta A call BA90 decfsz HZ,1 goto ALTO_90_1 return SV_2_90 movlw d'13' movwf HZ ALTO_90_2 bsf PUERTAB,2 ;Pone a 1 el bit 0 de la puerta A call AL90 BAJO_90_2 bcf PUERTAB,2 ;Pone a 0 el bit 0 de la puerta A call BA90 decfsz HZ,1 goto ALTO_90_2 return ;************ Rutina para posicionar el servo en los 112.5° ***************************************** SV_0_112 movlw d'8' movwf HZ ALTO_112_0 bsf PUERTAB,0 ;Pone a 1 el bit 0 de la puerta A call AL112 BAJO_112_0 bcf PUERTAB,0 ;Pone a 0 el bit 0 de la puerta A call BA112 decfsz HZ,1 goto ALTO_112_0 return SV_1_112 movlw d'8' movwf HZ ALTO_112_1 bsf PUERTAB,1 ;Pone a 1 el bit 0 de la puerta A call AL112 BAJO_112_1 bcf PUERTAB,1 ;Pone a 0 el bit 0 de la puerta A call BA112 decfsz HZ,1 goto ALTO_112_1 return SV_2_112 movlw d'8' movwf HZ ALTO_112_2 bsf PUERTAB,2 ;Pone a 1 el bit 0 de la puerta A call AL112 BAJO_112_2 bcf PUERTAB,2 ;Pone a 0 el bit 0 de la puerta A call BA112 decfsz HZ,1 goto ALTO_112_2 return ;************ Rutina para posicionar el servo en los 67.5° ****************************************** SV_0_67 movlw d'8' movwf HZ ALTO_67_0 bsf PUERTAB,0 ;Pone a 1 el bit 0 de la puerta A call AL67 BAJO_67_0 bcf PUERTAB,0 ;Pone a 0 el bit 0 de la puerta A call BA67 decfsz HZ,1 goto ALTO_67_0 return SV_1_67 movlw d'8' movwf HZ ALTO_67_1 bsf PUERTAB,1 ;Pone a 1 el bit 0 de la puerta A call AL67 BAJO_67_1 bcf PUERTAB,1 ;Pone a 0 el bit 0 de la puerta A call BA67 decfsz HZ,1 goto ALTO_67_1 return SV_2_67 movlw d'8' movwf HZ ALTO_67_2 bsf PUERTAB,2 ;Pone a 1 el bit 0 de la puerta A call AL67 BAJO_67_2 bcf PUERTAB,2 ;Pone a 0 el bit 0 de la puerta A call BA67 decfsz HZ,1 goto ALTO_67_2 return ;*********** Pulso Alto a 90° 1.568 miliseg. ******************************************************** AL90 movlw d'49' movwf ALTO_1 A90 movlw d'8' movwf ALTO_2 DC1 decfsz ALTO_2,1 goto DC1 decfsz ALTO_1,1 goto A90 return ;*********** Pulso Bajo a 90° 18.4 miliseg. ********************************************************* BA90 movlw d'50' movwf BAJO_1 B90 movlw d'92' movwf BAJO_2 DC2 decfsz BAJO_2,1 goto DC2 decfsz BAJO_1,1 goto B90 return ;*********** Pulso Alto a 67.5° 1.232 miliseg. ****************************************************** AL67 movlw d'44' movwf ALTO_1 A67 movlw d'7' movwf ALTO_2 DC7 decfsz ALTO_2,1 goto DC7 decfsz ALTO_1,1 goto A67 return ;*********** Pulso Bajo a 67.5° 18.656 miliseg. ***************************************************** BA67 movlw d'53' movwf BAJO_1 B67 movlw d'88' movwf BAJO_2 DC8 decfsz BAJO_2,1 goto DC8 decfsz BAJO_1,1 goto B67 return ;*********** Pulso Alto a 112.5° 1.872 miliseg. ***************************************************** AL112 movlw d'52' movwf ALTO_1 A112 movlw d'9' movwf ALTO_2 DC9 decfsz ALTO_2,1 goto DC9 decfsz ALTO_1,1 goto A112 return ;*********** Pulso Bajo a 112.5° 18.02 miliseg. ***************************************************** BA112 movlw d'53' movwf BAJO_1 B112 movlw d'85' movwf BAJO_2 DC10 decfsz BAJO_2,1 goto DC10 decfsz BAJO_1,1 goto B112 return END