Detector de Obstáculos

Anuncio
 DSBM: Trabajo de curso Detector de obstáculos 09/07/2008 Diseño de Sistemas Basados en Microprocesador Enrique Mendoza Robaina y José Évora Gómez Índice Objetivos Página 3 Material de la práctica Página 4 Desarrollo práctico Página 6 ‐ Descripción del procedimiento Página 6 ‐ Integración con el robot móvil Página 7 ‐ Configuración del PIC18f1320 Página 8 Conclusiones Página 9 Anexo 1 Página 10 Anexo 2 Página 15 Anexo 3 Página 19 2
Objetivos El objetivo de esta práctica era el desarrollo de un detector de obstáculos pensado para un sistema robótico móvil. Para ello, ha sido necesario utilizar muchos componentes; algunos para la fase de desarrollo, y otros que se han usado en todo momento. El elemento principal ha sido el PIC con conversor analógico/digital que permitía hacer las lecturas sobre la salida del sensor de ultrasonidos. A su vez, como no, fue necesario el uso del sensor nombrado anteriormente para poder tomar medidas de distancia y detectar objetos. También se ha usado resistencias, leds y un pulsador para poder observar la salida que generaba el sensor tras pasar por el PIC. Por último, se ha utilizado placas, cableado y fuente de alimentación. 3
Material de la práctica Acerca del PIC18f1320 Este microcontrolador tiene una tecnología nanoWatt, que proporciona seis modos de energía controlable por software, con un consumo tan pequeño como 0.1 microamperios en standby y opera en un rango de voltajes ente ‐2,2 y 5,5 voltios; lo cual hace a este dispositivo ideal para las aplicaciones de manejo de batería. Este dispositivo también presenta un contador watchdog de bajo consumo, con dos velocidades de iniciar tras ser reseteado o haber estado en modo sleep. Además, posee un nuevo monitor que permite detectar un fallo externo del reloj. Este potente 10 MIPS (100 nanosegundos por instrucion) es fácil de programar (solo 77 instrucciones) con una memoria del tipo CMOS FLASH para un microcontrolador de 10 bits. El encapsulado es de 18 pines y es compatible con otros pics como: PIC16C5X, PIC12CXXX, PIC16CXX y PIC17CXX, es decir, es posible migrar parte del código a estos pics debido a la alto nivel de integración de hardware que hay entre ellos. Es posible programar estos pic por medio de un entorno de desarrollo basado en C, tiene 128 bytes EEPROM, auto‐programacion, un ICD, captura/compara/PWM functions, siete canales de 10 bits para la conversión analógico/digital entre otras cosas. Todos estos elementos permiten manejar perfectamente el uso de baterías para aplicaciones críticas como pueden de instrumentación y monitorización. Veamos el patillaje del pic: 4
Sensor de ultrasonidos: Sharp GP2D12 Este sensor de ultrasonidos tiene un rango de distancias que van desde los 8 centímetros hasta los 80 centímetros según el fabricante. A nosotros no nos ha ido así de bien, ya que éste trabajaba en un rango de distancias mucho menor. Esto es debido a que no es tan sencillo integrar dicho sensor con el resto de elementos. Por otro lado, nos hemos encontrado con un pequeño inconveniente, y es que, con el paso del tiempo, éste se iba recalentando; entonces, el voltaje que daba iba creciendo para medidas que era iguales. Lo que hicimos fue calibrarlo para cuando partía del reposo, por tanto, no se puede certificar su correcto funcionamiento tras un tiempo encendido. Cuando el objeto se encuentra muy cerca del sensor, éste genera una salida alta en voltaje, mientras que si está alejado, generará una salida baja en voltaje. En función de esto y realizando varias pruebas para cada medida, nos ha sido posible calibrar el sensor por medio de las lecturas del pic. 5
Desarrollo práctico Descripción del procedimiento La primera etapa de la misma, consistió hacernos con los conocimientos necesarios para manejar este PIC, ya que es distinto al que habíamos usado en la primera práctica. Fue necesario observar como configurarlo para poder tomar las medidas del sensor. También tuvimos que mirar el patillaje para hacer las conexiones entre los diferentes elementos del circuito: como alimentación, sensor de distancia, resistencias con leds… Tras adquirir los conocimientos necesarios procedimos a hacer el circuito en el que se conectarían todos estos elementos. En este punto, hubo varios problemas, ya que no era tan trivial conectar el sensor de distancia a toda esa circuitería. De hecho, fue necesario alimentar aparte del resto del circuito al sensor, ya que si no la salida que generaba era incoherente. Una vez solucionadas las diferentes dificultades en cuanto al circuito, procedimos a la parte programática, en la cual, pusimos en práctica lo aprendido en cuanto a configuración del PIC. Afortunadamente, el repertorio de instrucciones de este PIC18f1320 es muy parecido al del PIC16f84 que usábamos en la primera práctica; lo cual, nos ahorró tiempo. Inicialmente generamos un programa que, por medio de la lectura del PIC, mostrase por medio de los LEDs cual era el número (en 0s y 1s) de la salida del sensor (Anexo 1). Con ello, ya pudimos proceder a delimitar los rangos sobre los que se actuaría: no hay objeto, objeto lejano, objeto cercano, objeto muy cercano. Para ello, tuvimos que leer la parte más significativa que nos proporcionaba el PIC; y en función de ésta establecer los rangos. Además, tuvimos que tener en cuenta, como ya se ha comentado antes, el problema que consistía en el sobrecalentamiento del sensor, cuando éste ya llevaba un tiempo encendido. Cuando esto ocurría la salida del mismo empezaba a ser mayor; es por ello, que nuestro rango de acción solo sirve para cuando éste está en frío. A continuación, tras saber el rango a mostrar, construimos un programa que tras realizar la medida mostrase, en función de la lejanía o cercanía del objeto, por los leds lo siguiente: ‐
‐
‐
‐
Los dos leds encendidos: muy cerca. Uno de ellos encendido: cerca. El otro que no es el anterior encendido: lejos Apagados los dos: no hay objeto. Cuando conseguimos que esto funcionara, fue cuando empezamos a trabajar en la creación de una librería, la cual se pondrá en el anexo (Anexo 2). Ésta permitía que por medio de una llamada a una función, éste te devolviera en una variable el valor de la medida que se realizó. Realmente, solo eran necesarios dos bits del registro en el que lo devolvíamos; por ello, optamos por ponerlos al final del registro (en los dos bits menos significativos). Finalmente, cuando ya todo lo que tenía que ver con el sensor de distancia estaba perfilado, comenzamos a trabajar en la adaptación de ello en un sistema robótico móvil. Para ello, nos pusimos con un grupo que se había estado encargando de crear un sistema robótico móvil. Entre todos nosotros, empezamos a trabajar en el modo de acoplar estos sistemas. Nosotros tuvimos que desarrollar un programa que enviase a otro PIC los datos de las lecturas del sensor (los dos bits); para que ese otro PIC, a su vez, ordenase al PIC controlador de los motores la acción que debía realizar (Anexo 3). 6
Integración con el robot móvil Después de finalizar la librería detectora de obstáculos, comenzamos el acoplamiento en un sistema robótico. Para ello, trabajamos con otro grupo que había creado un protocolo de gestión de los motores a través de dos PIC’s. El primero de ellos se encargaba de activar o desactivar los motores y el segundo de ordenar las acciones que debía realizar el primero. Nuestro trabajo consistió en, con nuestro PIC, enviar al segundo PIC de ellos los datos con las lecturas del sensor de distancia para que éste gestionara los motores. El protocolo de transmisión se basaba en mandar dos bits, mediante el puerto B, que indicaban el valor de la distancia. Recordamos que los bits del puerto B que usamos son el 6 y el 7. Además, como hemos mencionado, sólo tenemos 4 posibilidades: • 0 0: no hay obstáculo • 0 1: obstáculo lejano • 1 0: obstáculo cerca • 1 1: obstáculo muy cerca 7
Configuración del PIC18f1320 Conversor A/D: Las dos primeras instrucciones nos permiten seleccionar el canal por el que se va a realizar la conversión A/D; para este caso hemos seleccionado el canal 0. movlw 0xFE movwf ADCON1 ;1º SELECCIONAR CANAL 0 El segundo par de instrucciones nos permiten configurar como será la salida (justificada a la izquierda o derecha) y el oscilador entre otras cosas. movlw b'00000101'; left justified, 0TAD, FOSC/16 ;### b'10000101'right justified movwf ADCON2 ; configrar adcon2 Por último, se activa el conversor mediante las siguientes instrucciones: movlw movwf bsf b'00000000' ;enable A/D, AN0, mod enable ADCON0 ADCON0,0 ; ACTIVAMOS EL CONVERSOR Registros de configuración: En la librería ponemos una configuración que funciona correctamente con lo que se pretende realizar con el conversor; no obstante aquí explicaremos que cosas son totalmente necesarias para que funcione dicha librería. Esta es la configuración que nosotros hemos usado: code 0x300000 CONFIG1 data 0xC9FF CONFIG2 data 0x000C CONFIG3 data 0x00FF CONFIG4 data 0xFF80 CONFIG5 data 0xC003 CONFIG6 data 0xE003 CONFIG7 data 0x4003 Lo realmente importante es: DEVID1: bit 7‐5 DEV2:DEV0: Device ID bits 111 = PIC18F1220 110 = PIC18F1320 En nuestro caso, tendríamos que poner la última opción. 8
Conclusiones Con esta práctica hemos podido conocer más acerca de los sensores de ultrasonidos y del PIC; y su función como conversor analógico/digital. A su vez, también hemos aprendido a hacer circuitos para "acomodar" un PIC con diferentes accesorios como pueden ser leds y sensores. Algo importante, que ya se ha reseñado, es el sobrecalentamiento de los sensores de ultrasonidos. Esto era algo que teóricamente si conocíamos pero que nunca se nos había dado en la práctica; lo cual supuso una pequeña adversidad. Finalmente, optamos por un funcionamiento óptimo cuando este no tiene sobrecalentamiento. Por último, también ha resultado muy interesante el modo en el que hemos ensamblado nuestra práctica con la de los otros dos compañeros para poder conseguir un robot móvil que detectase obstáculos. Puesto que hemos tenido que crear un protocolo para la transmisión de datos (del sensor) y un código con los significados de lo que se observa por el sensor de ultrasonidos. 9
Anexo 1 Pruebas con el PIC list p=18f1320 include <P18F1320.INC> delayA equ 0h ; direccion 0h delayB equ 1h ; direcion 1h ADC 2h ; equ cont3 equ 3h ;temporal para el muestra_adc delayC equ 4h org 0 goto inicio org 20h inicio movlw 0xFF movwf OSCCON; velocidad de reloj 8MHz clrf PORTB movlw 0x00 movwf TRISB movlw 0x70 movwf ADCON1 ;PONE LOS BITS 0,1,4 DEL7 PUERTO B COMO I/O DIGITAL ;NO LO ESTÁN POR DEFECTO, LO ESTAN A CONVERSION A/D bsf TRISA,0 ;PONGO EL BIT CERO DE PUERTO A COMO ENTRADA, PARA USARLO COMO ENTRADA ANALÓGICA bsf TRISA,1 ;PONGO EL BIT 1 DE PUERTO A COMO ENTRADA DIGITAL movlw 0x7F movwf ADCON1 ;en un principio todos los canales son iniciados a i/o pins loop BTFSC PORTA,1 goto loop call Ret_2max call analog call mostrar_ADC bsf PORTB,4 call Ret_max 10
bcf PORTB,4 call Ret_max final goto loop ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;‐‐‐retardo doble Ret_2max movlw 8 movwf delayC Ret2max call delay decfsz delayC goto Ret2max return ;‐‐‐‐‐retardo Ret_max movlw 4 movwf delayC Retmax call delay decfsz delayC goto Ret2max return ;‐‐‐‐‐‐‐‐retardo mitad Ret_max2 movlw 2 movwf delayC Retmax2 call delay decfsz delayC goto Ret2max return ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;Delay Routine delay movlw 0xFF movwf delayA movlw 0xFF movwf delayB loopA loopB decfsz delayB, f goto decfsz delayA, f loopB 11
goto return loopA ;‐‐‐‐‐‐‐‐‐‐‐ ; lectura ADC analog movlw 0xFE movwf ADCON1 ;1º SELECCIONAR CANAL 0 movlw b'10000101'; right justified, 0TAD, FOSC/16 movwf ADCON2 ; configrar adcon2 movlw b'00000000' movwf ADCON0 bsf ADCON0,0 ; ACTIVAMOS EL CONVERSOR ;enable A/D, AN0, mod enable ; ESPERAMOS EL TIEMPO NECESARIO PARA LA ADQUISICION 1000 INSTRUCCIONES movlw 2 movwf delayA call delay ; tras la espera hacemos la conversion bsf ADCON0,GO adloop btfsc ADCON0,DONE goto adloop movff ADRESL,ADC bcf ADCON0,0 return ;go do a/d conversion ;get the value in speed ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;MUESTRA EL CONTENIDO DEL REGISTRO ADC BIT A BIT DE MENOS A MAS SIGNIFICATIVO ;PORTB7 DATO ;PORTB6 RELOJ ;CUANDO EL RELOJ ESTÁ A UNO EL DATO ES VALIDO ;CUANDO EL RELOJ ESTÁ A CERO NO HACER CASO AL DATO ;PRESUPONE EL PORTB EN MODO SALIDA ;DESTRUYE ADC mostrar_ADC movlw 3 movwf cont3 ppad1 BSF PORTB,6 ;ENCIENDE RELOJ call Ret_max2 ; RETARDO BCF PORTB,6 ; APAGA RELOJ call Ret_max2 ;RETARDO DECFSZ cont3 goto ppad1 ; call Ret_2max movlw 8 12
movwf cont3 siguiente_bit BCF PORTB,6 ; APAGA RELOJ call Ret_max ;RETARDO BCF PORTB,7 BTFSC ADC,0 BSF PORTB,7 ;coloca el siguiente bit en Dato BSF PORTB,6 ; activa el reloj call Ret_2max ;retardo RRCF ADC DECFSZ cont3 goto siguiente_bit ; termina la transmision, se apagan los leds BCF PORTB,7 BCF PORTB,6 call Ret_max ;‐‐‐‐‐‐‐‐‐‐indica fin de transmision movlw 3 movwf cont3 ppad2 BSF PORTB,6 ;ENCIENDE RELOJ call Ret_max2 ; RETARDO BCF PORTB,6 ; APAGA RELOJ call Ret_max2 ;RETARDO DECFSZ cont3 goto ppad2 return ;FIN MUESTRA_ADC‐‐‐‐‐‐‐‐‐‐‐ ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;PROgramacion de configuracion org 0x300000 CONFIG1 data 0xC9FF CONFIG2 data 0x000C CONFIG3 data 0x00FF CONFIG4 data 0xFF80 CONFIG5 data 0xC003 CONFIG6 data 0xE003 CONFIG7 data 0x4003 ;CONFIG1L data 0xFF ;CONFIG1H data 0xC9 ;CONFIG2L data 0x0C 13
;CONFIG2H data 0x00 ;CONFIG3L data 0xFF ;CONFIG3H data 0x00 ;CONFIG4L data 0x80 ;CONFIG4H data 0xFF ;CONFIG5L data 0x03 ;CONFIG5H data 0xC0 ;CONFIG6L data 0x03 ;CONFIG6H data 0xE0 ;CONFIG7L data 0x03 ;CONFIG7H data 0x40 END 14
Anexo 2 Librería detecta obstáculos detecta obs.inc EXTERN SALIDA ; Registro externo EXTERN ANALOG ; Función externa ;******************************************************************************** ;* * ;* Libreria para PIC18F1320 que se encarga de detectar obstáculos * ;* * ;******************************************************************************** ;* ;* SALIDA: Registro en el que se devuelve el resultado de la lectura del ;* sensor. ;* Salidas posibles: ;* ;* ;* ;* * * * * ‐ 00: No hay obstáculo * ‐ 01: Lejos de un obstáculo * ‐ 10: Cerca de un obstáculo * ‐ 11: Muy cerca de un obstáculo * ;* * ;* ANALOG: Función que realiza la conversión analógica/digital de la * ;* lectura del sensor. El resultado lo devuelve en SALIDA * ;* * ;******************************************************************************** ;* * ;* Esta es la configuración del pic (18f1320) usada por los autores: * ;* ;* code 0x300000 ;* CONFIG1 data 0xC9FF ;* ;* ;* ;* * * * CONFIG2 data 0x000C * CONFIG3 data 0x00FF * CONFIG4 data 0xFF80 * CONFIG5 data 0xC003 * ;* CONFIG6 data 0xE003 * ;* CONFIG7 data 0x4003 * ;* * ;******************************************************************************** ;* ;* AUTORES: * ;* ‐ José Évora Gómez ;* ‐ Enrique Ismael Mendoza Robaina * ;* * * * 15
;******************************************************************************** detecta obs.asm list p=18f1320 include <P18F1320.INC> ; Sección de variables sin inicializar UDATA delayA res 1 delayB res 1 ADC 1 ; res delayC res 1 SALIDA res 1 ; Variale donde se almacenará el resultado(en los dos últimos bits) ; Funciones globales GLOBAL SALIDA ANALOG CODE ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;Delay Routine delay movlw 0xFF movwf delayA movlw 0xFF movwf delayB loopA loopB decfsz delayB, f goto decfsz delayA, f goto return loopB loopA ;‐‐‐‐‐‐‐‐‐‐‐ ; lectura ADC ANALOG GLOBAL ANALOG movlw 0xFE movwf ADCON1 ;1º SELECCIONAR CANAL 0 movlw b'00000101'; left justified, 0TAD, FOSC/16 ;### b'10000101'right justified movwf ADCON2 ; configrar adcon2 movlw b'00000000' movwf ADCON0 bsf ADCON0,0 ; ACTIVAMOS EL CONVERSOR ;enable A/D, AN0, mod enable ; ESPERAMOS EL TIEMPO NECESARIO PARA LA ADQUISICION 1000 INSTRUCCIONES 16
movlw 2 movwf delayA call delay ; tras la espera hacemos la conversion bsf ADCON0,GO adloop btfsc ADCON0,DONE goto adloop movff ADRESH,ADC bcf ADCON0,0 ;go do a/d conversion ;get the value in speed ;### ADRESL call Distancia goto fin Distancia BTFSC ADC,7 goto Distancia111 BTFSS ADC,6 ; porque siempre el primer bit es 0 goto Distancia0 goto Distancia1 Distancia1 RLCF ADC BTFSS ADC,6 goto Lejos ;dist10 goto Distancia11 Distancia0 RLCF ADC BTFSC ADC,6 goto Lejos RLCF ADC BTFSC ADC,6 goto Lejos RLCF ADC BTFSC ADC,6 goto Lejos ; RLCF ADC ; BTFSC ADC,6 ; goto Lejos ; RLCF ADC ; BTFSC ADC,6 ; goto Lejos ;call Ret_2max ;call Ret_2max BCF SALIDA, 1 BCF SALIDA, 0 17
return Lejos ;BSF PORTB,7 ;call Ret_2max ;BCF PORTB,7 ;call Ret_2max BCF SALIDA, 1 BSF SALIDA, 0 return Distancia10 ;cerca ;BSF PORTB,6 ;call Ret_2max ;BCF PORTB,6 ;call Ret_2max BSF SALIDA, 1 BCF SALIDA, 0 return Distancia11 RLCF ADC BTFSS ADC,6 goto Distancia10 goto Distancia111 Distancia111 ;muy cerca ;BSF PORTB,7 ;BSF PORTB,6 ;call Ret_2max ;BCF PORTB,7 ;BCF PORTB,6 ;call Ret_2max BSF SALIDA, 1 BSF SALIDA, 0 return fin return ;FIN MUESTRA_ADC‐‐‐‐‐‐‐‐‐‐‐ ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;PROgramacion de configuracion END
18
Anexo 3 Integración en un robot móvil programaprincipal.asm list p=18f1320 include <P18F1320.INC> include "detecta_obs.inc" UDATA delayA res 1 ; direccion 0h delayB res 1 ; direcion 1h delayC res 1 cont3 res 1 ; temporal para el muestra_adc code 0x300000 CONFIG1 data 0xC9FF CONFIG2 data 0x000C CONFIG3 data 0x00FF CONFIG4 data 0xFF80 CONFIG5 data 0xC003 CONFIG6 data 0xE003 CONFIG7 data 0x4003 s code 0 goto inicio goto inicio main code inicio movlw 0xFF movwf OSCCON; velocidad de reloj 8MHz clrf PORTB movlw 0x00 movwf TRISB movlw 0x70 movwf ADCON1 ;PONE LOS BITS 0,1,4 DEL7 PUERTO B COMO I/O DIGITAL ;NO LO ESTÁN POR DEFECTO, LO ESTAN A CONVERSION A/D bsf TRISA,0 ;PONGO EL BIT CERO DE PUERTO A COMO ENTRADA, PARA USARLO COMO ENTRADA ANALÓGICA bsf TRISA,1 ;PONGO EL BIT 1 DE PUERTO A COMO ENTRADA DIGITAL movlw 0x7F ADCON1 ;en un principio todos los canales son iniciados a i/o pins movwf 19
loop ;BTFSC PORTA,1 ;goto loop ;call ppad1 ;call Ret_max call ANALOG call comprueba call comprueba2 Ret_max call ;BCF PORTB,6 ;BCF PORTB,7 ;call Ret_max ;call ppad3 goto loop ;‐‐‐‐‐‐‐‐‐‐indica fin de transmision comprueba BTFSS SALIDA,1 goto apaga1 goto enciende1 apaga1 BCF PORTB,7 return enciende1 BSF PORTB,7 return comprueba2 BTFSS SALIDA,0 goto apaga2 goto enciende2 apaga2 BCF PORTB,6 return enciende2 BSF PORTB,6 return ppad1 20
movlw 3 movwf cont3 ppad2 BSF PORTB,7 ;ENCIENDE RELOJ call Ret_max2 ; RETARDO BCF PORTB,7 ; APAGA RELOJ call Ret_max2 ;RETARDO DECFSZ cont3 goto ppad2 return ppad3 movlw 3 movwf cont3 ppad4 BSF PORTB,6 ;ENCIENDE RELOJ call Ret_max2 ; RETARDO BCF PORTB,6 ; APAGA RELOJ call Ret_max2 ;RETARDO DECFSZ cont3 goto ppad4 return final goto loop ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;‐‐‐retardo doble Ret_2max movlw 8 movwf delayC Ret2max call delay decfsz delayC goto Ret2max return ;‐‐‐‐‐retardo Ret_max movlw 4 movwf delayC Retmax call delay decfsz delayC goto Ret2max 21
return ;‐‐‐‐‐‐‐‐retardo mitad Ret_max2 movlw 2 movwf delayC Retmax2 call delay decfsz delayC goto Ret2max return ;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ;Delay Routine delay movlw 0xFF movwf delayA movlw 0xFF movwf delayB loopA loopB decfsz delayB, f goto decfsz delayA, f goto return loopB loopA END 22
Descargar