Coche Teledirigido Profesor: Pedro Alonso Sanz Instituto: I.E.S. Joan Miró Localidad: San Sebastián de los Reyes
Índice Página 1.- Hardware... 2 1.1.- Esquema Eléctrico simulado del Mando y Coche Teledirigido... 3 1.2.- Esquema Eléctrico del Mando... 4 1.3.- Esquema Eléctrico del Coche Teledirigido... 5 1.4.- Placa del Mando... 6 1.5.- Placa del Coche Teledirigido... 7 1.6.- Lista de Materiales del Mando.... 8 1.7.- Lista de Materiales del Coche Teledirigido... 10 2.- Software... 13 2.1.- Programa del Mando (TR_CO_1.ASM)... 13 2.1.1.- Diagrama de Flujo... 13 2.1.2.- Programa del Transmisor del Coche Teledirigido... 17 2.1.3.- Librería T_M_S_RF.INC... 20 2.1.4.- Librería RETARDOS.INC... 21 2.2.- Programa del Coche Teledirigido (RE_CO_1.ASM)... 25 2.2.1.- Diagrama de Flujo... 25 2.2.2.- Programa del Receptor del Coche Teledirigido... 32 2.2.3.- Librería R_S_M_RF.INC... 36 2
1.- Hardware. 1.1.- Esquema Eléctrico simulado del Mando y Coche Teledirigido. 3
1.2.- Esquema Eléctrico del Mando. 4
1.3.- Esquema Eléctrico del Coche Teledirigido. 5
1.4.- Placa del Mando. 6
1.5.- Placa del Coche Teledirigido. 1.6.- Lista de Materiales del Mando. 7
Lista de materiales del Mando1.DSN Título : Mando1.DSN Autor : Pedro Alonso Sanz Revision : Fecha de creación : sábado, 16 de septiembre de 2006 Ultima modificación : jueves, 28 de septiembre de 2006 Número de componentes : 36 7 Resistors Quantity: References Value 6 R1-R6 220 1 R7 2.2k 3 Capacitors Quantity: References Value 2 C2, C3 15pF 1 C4, C1 220uF 2 Integrated Circuits Quantity: References Value 1 U1 7805_JOAN 1 U2 PIC16F876_JOAN 1 Transistors Quantity: References Value 1 Q1 BD136_JOAN 7 Diodes 8
Quantity: References Value 1 D1 1N4007_JOAN 1 D2 LED-YELLOW_JOAN 1 D3 LED-GREEN_JOAN 4 D4-D7 LED-RED_JOAN 10 Miscellaneous Quantity: References Value 5 ADELANTE, ATRAS, DERECHA, IZQUIERDA, PARAR PULSADOR_JOAN 1 ANTENA BORNIER1_JOAN 1 E1 CEBEK-C-0503_JOAN 1 ENCENDIDO INTERRUPTOR_JOAN 1 VCC 9V 1 X1 CRYSTAL_JOAN (4 MHz ) sábado, 04 de noviembre de 2006 19:29:35 1.7.- Lista de Materiales del Coche Teledirigido Lista de materiales Coche Teledirigido 1.DSN Título : Coche Teledirigido 1.DSN Autor : Pedro Alonso Sanz Revision : Fecha de creación : sábado, 16 de septiembre de 2006 Ultima modificación : jueves, 28 de septiembre de 2006 Número de componentes : 36 9
9 Resistors Quantity: References Value 1 R1 220 1 R2 68 1 R3 470 1 R4 47k 5 R5-R9 220 3 Capacitors Quantity: References Value 1 C1,C4 220uF 2 C2, C3 15pF 3 Integrated Circuits Quantity: References Value 1 U1 PIC16F876_JOAN 1 U2 L298 1 U4 7805_JOAN 1 Transistors Quantity: References Value 1 Q1 BD136_JOAN 12 Diodes Quantity: References Value 5 D1, D3-D6 1N4007_JOAN 2 D2, D11 LED-RED_JOAN 2 D7, D9 LED-YELLOW_JOAN 2 D8, D10 LED-GREEN_JOAN 10
1 D12 DIODO_ZENER_JOAN (6.8V) 8 Miscellaneous Quantity: References Value 1 ANTENA (17 CM) BORNIER1_JOAN 1 BAT1 12V 1 MOTOR DC 12V 1 RF1 CEBEK-C-0504_JOAN 1 SERVOMOTOR SERVOMOTOR-PWM_JOAN 1 SW1 INTERRUPTOR_JOAN 1 SW2 PULSADOR_JOAN 1 X1 CRYSTAL_JOAN martes, 17 de octubre de 2006 23:17:25 11
12
2.- Software 2.1.- Programa del Mando (TR_CO_1.ASM) 2.1.1.- Diagrama de Flujo del Transmisor del Coche Teledirigido 1 Transmisor Coche Teledirigido TR_C0_1.ASM Retardo_100mS Elegimos PIC List p=16f876, f=inhx32 Principal PC3 1 Inhabilitar Tarjeta de radiofrecuencia Asignación de nombres de RFS a direcciones. #include <p16f876.inc> PB0 =1? Igualdades MAX_VEL_ADE = D'248' Máxima velocidad hacia adelante. MAX_VEL_ATR = D 0 Máxima velocidad hacia atrás. VEL_CERO = D 128 Velocidad cero. INC_VEL = D 8 Incremento de velocidad. POS_MAX_DE = D 28 Posición máxima del Servo hacia la derecha. POS_MAX_IZ = D 9 Posición máxima del Servo hacia la Izquierda. POS_CENTRAL = D 19 Posición central del Servomotor. INC_POS = D 1 Incremento de posición. LLAVE_VELOCIDAD = D'205' LLAVE_POCION = D'121 LLave Velocidad. LLave Posición. VELOCIDAD_MAS PB1 =1? IZQUIERDA Registros CBLOCK 0X20 VELOCIDAD POCION ENDC PB2 =1? PARAR Subrutina Sección de de código de Reset VELOCIDAD_MAS ORG OOH Dirección del vector de Reset GOTO COMIENZO Comienzo del Programa VELOCIDAD Sección = de Configuración MAX_VEL_ADE? ORG 0x05 Inicio de Programa Subrutina de VELOCIDAD_ME PB3 =1? VELOCIDAD VELOCIDAD_MES = MAX_VEL_ATR? COMIENZO CONFIGURACION_TRANS_SERIE RP0 1 Incrementar TRISB la velocidad 11111111 B Ir al Banco 1 Poner el Puerto B como entrada de Decrementar datos. la velocidad PB4 =1? TRISC(3) 0 Poner el PC3 como salida de datos. VELOCIDAD RP0 VELOCIDAD 0 + #INC_VEL Ir al Banco 0 VELOCIDAD VELOCIDAD - #INC_VEL POCIÓN #POS_CENTRAL Posición central del Servomotor VELOCIDAD #VEL_CERO Motor tractor parado. DERECHA Lanzar código de velocidad vía radiofrecuencia LANZAR_VELOCIDAD 1 Lanzar código de velocidad vía radiofrecuencia LANZAR_VELOCIDAD 13
Subrutina de PARAR Parar Coche VELOCIDAD #VEL_CERO Lanzar código de velocidad vía radiofrecuencia LANZAR_VELOCIDAD Subrutina de IZQUIERDA Subrutina de DERECHA POCION = POS_MAX_IZ? POCION = POS_MAX_DE? Subrutina de LANZAR_VELOCIDAD Subrutina de LANZAR_POCION Decrementar la posición. Incrementar la posición. POCION Cargar POCION llave - de #INC_POS velocidad POCION POCION Cargar llave + #INC_POS de posición. LLAVE_ENTRADA #LLAVE_VELOCIDAD LLAVE_ENTRADA #LLAVE_POCION Lanzar código de posición vía radiofrecuencia Cargar en W el contenido de VELOCIDAD LANZAR_POCION W VELOCIDAD Lanzar código de posición vía radiofrecuencia Cargar en W el contenido de POCION LANZAR_POCION W POCION Lanzar código de velocidad vía radiofrecuencia LANZAR_DATO_SERIE Lanzar código de velocidad vía radiofrecuencia LANZAR_DATO_SERIE 14
RETUR N 2 LANZAR_DATO_SERIE DATO _ TRANSMITIDO W Cargar el número de transmisión CONTADOR_TRANSMIÓN D 10 Lanzar TODOCERO Librería de Transmisión de datos TXREG #TODOCERO (Carga en el W el dato a transmitir) (Cargar la llave de entrada en el registro LLAVE_ENTRADA) T_M_S_RF.INC Ha terminado la transmisión? Igualdades TRMT = 1? TODOCERO = 00000000 B Registros Lanzar LLAVE_ENTRADA CBLOCK TXREG #LLAVE_ENTRADA DATO_TRANSMITIDO CONTADOR_TRANSMIÓN LLAVE-ENTRADA ENDC Sección de Configuración Ha terminado la CONFIGURACION_TRANS_SERIE transmisión? RPO 1 Ir al Banco 1 CONTADOR_TRANSMIÓN = 0? TRMT SPBRG = 1? D 39 Cargar la Velocidad de Transmisión de Datos Decrementar el registro CONTADOR_TRANSMION Baud Rate = Fosc/(64(X+1)) Baud Rate CONTADOR_TRANSMION = 4MHz/(64(39+1)) = 1562,5 BIT CONTADOR_TRANSMIÓN por segundo - 1 TXSTA 00100000 B Lanzar DATO_TRANSMITIDO TXREG #DATO_TRANSMITIDO RP0 0 Ir al Banco 0 Configuración de la transmisión serie de datos (Modo Asíncrono y baja velocidad. SPEN 1 Activamos la Puerta Serie (TX) Ha terminado 2 la transmisión? TRMT = 1? RETUR N 15
2.1.2.- Programa del Transmisor del Coche Teledirigido 16
title " Transmisor Coche Teledirigido" ***************************** Leer el Puerto B y transmitirlo vía serie ********************************* Programa para PIC 16F876. Velocidad del Reloj: 4 MHz. Reloj instrucción: 1 MHz = 1uS. Perro Guardián deshabilitado. Tipo de Reloj XT. Protección de Código: OFF. **************************** Elegimos PIC *************************************************************** list p=16f876, f=inhx32 ********** Asignación de etiquetas de Registros de Funciones especiales a direcciones ********* #include <p16f876.inc> Este fichero contiene los nombres y direcciones de los registros de funciones especiales. Este fichero esta localizado en el directorio con el nombre MPASM ******************************************* Igualdades *************************************************** MAX_VEL_ADE EQU D'248' Máxima velocidad hacia adelante. MAX_VEL_ATR EQU D 0 Máxima velocidad hacia atrás. VEL_CERO EQU D 128 Velocidad cero. INC_VEL EQU D 8 Incremento de velocidad. POS_MAX_DE EQU D 28 Posición máxima del Servo hacia la derecha. POS_MAX_IZ EQU D 9 Posición máxima del Servo hacia la Izquierda. POS_CENTRAL EQU D 19 Posición central del Servomotor. INC_POS EQU D 1 Incremento de posición. LLAVE_VELOCIDAD EQU D'205' LLave Velocidad. LLAVE_POCION EQU D'121 LLave Posición. ******************************************** Registros **************************************************** CBLOCK 0X20 VELOCIDAD POCION ENDC ************************************ Sección Código de Reset ****************************************** ORG 0X00 Dirección del Vector Reset GOTO COMIENZO Comienzo del Programa ************************************ Sección de Configuración ***************************************** ORG 0X05 Inicio de Programa (Una posición detrás del vector de Interrupción) COMIENZO CALL CONFIGURACION_TRANS_SERIE BSF STATUS,RP0 MOVLW B'11111111' 17
MOVWF TRISB BCF TRISC,3 BCF STATUS,RP0 MOVLW POS_CENTRAL MOVWF POCION MOVLW VEL_CERO MOVWF VELOCIDAD Posición central del Servomotor (Dirección). Motor tractor parado. **************************************** Principal ********************************************************* ********** Testeo de los Micropulsadores de Velocidad y lanzamiento de su información.********* SEG1 BSF PORTC,3 Inhabilitar tarjeta de Radiofrecuencia. CALL Retardo_100ms BTFSS PORTB,0 Aumentamos velocidad? CALL VELOCIDAD_MAS BTFSS PORTB,1 Vamos hacia la izquierda? CALL IZQUIERDA BTFSS PORTB,2 Paramos? CALL PARAR BTFSS PORTB,3 Disminuimos la velocidad? CALL VELOCIDAD_MES BTFSS PORTB,4 CALL DERECHA Vamos hacia la derecha? GOTO SEG1 *************************** Subrutina de VELOCIDAD_MAS ****************************************** VELOCIDAD_MAS MOVF VELOCIDAD,W Hemos llegado a la máxima Velocidad hacia adelante? SUBLW MAX_VEL_ADE BTFSC STATUS,Z GOTO SALIR_VEL_MAS MOVLW INC_VEL Incrementar la velocidad. SALIR_VEL_MAS ADDWF VELOCIDAD,F CALL LANZAR_VELOCIDAD Lanzar el código de velocidad vía radiofrecuencia. *************************** Subrutina de VELOCIDAD_MES *************************************** VELOCIDAD_MES MOVF VELOCIDAD,W SALIR_VEL_MES SUBLW MAX_VEL_ATR BTFSC STATUS,Z GOTO SALIR_VEL_MES MOVLW INC_VEL SUBWF VELOCIDAD,F CALL LANZAR_VELOCIDAD Hemos llegado a la máxima Velocidad hacia atrás? Decrementar la velocidad. Lanzar el código de velocidad vía radiofrecuencia ************************** Subrutina de PARAR ******************************************************** 18
PARAR MOVLW VEL_CERO Parar el coche. MOVWF VELOCIDAD CALL LANZAR_VELOCIDAD Lanzar el código de velocidad vía radiofrecuencia *************************** Subrutina de DERECHA **************************************************** DERECHA MOVF POCION,W Hemos llegado a la máxima posición hacia la derecha? SUBLW POS_MAX_DE BTFSC STATUS,Z GOTO SALIR_DER SALIR_DER MOVLW INC_POS ADDWF POCION,F CALL LANZAR_POCION Incrementar posición. Lanzar el código de posición vía radiofrecuencia *************************** Subrutina de IZQUIERDA ************************************************** IZQUIERDA MOVF POCION,W Hemos llegado a la máxima posición hacia la izquierda? SUBLW POS_MAX_IZ BTFSC STATUS,Z GOTO SALIR_IZQ MOVLW INC_POS Decrementar posición. SALIR_IZQ SUBWF POCION,F CALL LANZAR_POCION Lanzar el código de posición vía radiofrecuencia *************************** Subrutina de LANZAR_VELOCIDAD ************************************** LANZAR_VELOCIDAD BCF PORTC,3 Habilitar tarjeta de Radiofrecuencia. MOVLW LLAVE_VELOCIDAD Cargar llave de velocidad. MOVWF LLAVE_ENTRADA MOVF VELOCIDAD,W CALL LANZAR_DATO_SERIE Lanzar datos vía radiofrecuencia. *************************** Subrutina de LANZAR_POCION **************************************** LANZAR_POCION BCF PORTC,3 Habilitar tarjeta de Radiofrecuencia. MOVLW LLAVE_POCION Cargar llave de posición. MOVWF LLAVE_ENTRADA MOVF POCION,W CALL LANZAR_DATO_SERIE Lanzar datos vía radiofrecuencia. *************************** Librerias ********************************************************************** INCLUDE <T_M_S_RF.INC> INCLUDE <RETARDOS.INC> END 19
2.1.3.- Librería T_M_S_RF.INC Librería de Transmisor SERIE vía Radiofrecuencia para una Tarjeta Emisora SAW para Datos 433,92 MHz. ( CEBEK C-0503 ) Cargar la llave de entrada en el registro LLAVE_ENTRADA Cargar en W el dato a transmitir ***************************** Igualdades **************************************************************** TODOCERO EQU B'00000000' (Dato). Llave para iniciar un código, la tarjeta de transmisión de datos necesita el pulso de STOP para transmitir un código. ***************************** Registros ******************************************************************* CBLOCK DATO_TRANSMITIDO CONTADOR_TRANSMION LLAVE_ENTRADA ENDC **************************** Sección de Configuración ************************************************* CONFIGURACION_TRANS_SERIE BCF STATUS,RP1 Ir al Banco 1. BSF STATUS,RP0 MOVLW D'39' MOVWF SPBRG MOVLW B'00100000' MOVWF TXSTA Cargar la Velocidad de Transmisión de Datos. BR = (Fosc/64(X+1)) BR = (4MHz/64(39+1)) = 1562,5 Hz Configuración de la Transmisión Serie. BCF STATUS,RP0 Ir al Banco 0. BCF STATUS,RP1 BSF RCSTA,SPEN Activamos la Puerta Serie (TX). *************************** Lanzar Llaves y Muestra Digital ****************************************** LANZAR_DATO_SERIE MOVWF DATO_TRANSMITIDO MOVLW d'10' MOVWF CONTADOR_TRANSMION MOVLW TODOCERO Lanzar llave TODOCERO. MOVWF TXREG Transmisión de Datos en Serie. BSF STATUS,RP0 SEG1_TRANSMION BTFSS TXSTA,TRMT Preguntamos si se ha transmitido el dato. GOTO SEG1_TRANSMION REPETIR_TRANSMION BCF STATUS,RP0 Lanzar llave LLAVE_ENTRADA. 20
MOVF LLAVE_ENTRADA,W MOVWF TXREG Transmisión de Datos en Serie. BSF STATUS,RP0 SEG2_TRANSMION BTFSS TXSTA,TRMT Preguntamos si se ha transmitido el dato. GOTO SEG2_TRANSMION BCF STATUS,RP0 Lanzar DATO_TRANSMITIDO. MOVF DATO_TRANSMITIDO,W MOVWF TXREG Transmisión de Datos en Serie. BSF STATUS,RP0 SEG3_TRANSMION BTFSS TXSTA,TRMT Preguntamos si se ha transmitido el dato. GOTO SEG3_TRANSMION BCF STATUS,RP0 DECFSZ CONTADOR_TRANSMION,F GOTO REPETIR_TRANSMION 2.1.4.- Librería RETARDOS.INC **************************** Librería "RETARDOS.INC" ***************************************************** =================================================================== Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" E. Palacios, F. Remiro y L. López. Editorial Ra-Ma. www.ra-ma.es =================================================================== Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos. Además se pueden implementar otras subrutinas muy fácilmente. Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada ciclo máquina tarda 4 x 1/4MHz = 1 µs. En los comentarios, "cm" significa "ciclos máquina". ZONA DE DATOS ************************************************************************************* CBLOCK R_ContA Contadores para los retardos. R_ContB R_ContC ENDC RETARDOS de 4 hasta 10 microsegundos ------------------------------------------------------------------- A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ, la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina. Retardo_10micros La llamada "call" aporta 2 ciclos máquina. nop Aporta 1 ciclo máquina. nop Aporta 1 ciclo máquina. nop Aporta 1 ciclo máquina. nop Aporta 1 ciclo máquina. nop Aporta 1 ciclo máquina. Retardo_5micros La llamada "call" aporta 2 ciclos máquina. nop Aporta 1 ciclo máquina. Retardo_4micros La llamada "call" aporta 2 ciclos máquina. 21
return El salto del retorno aporta 2 ciclos máquina. RETARDOS de 20 hasta 500 microsegundos ----------------------------------------------------------------- Retardo_500micros La llamada "call" aporta 2 ciclos máquina. nop Aporta 1 ciclo máquina. movlw d'164' Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros Aporta 2 ciclos máquina. Retardo_200micros La llamada "call" aporta 2 ciclos máquina. nop Aporta 1 ciclo máquina. movlw d'64' Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros Aporta 2 ciclos máquina. Retardo_100micros La llamada "call" aporta 2 ciclos máquina. movlw d'31' Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros Aporta 2 ciclos máquina. Retardo_50micros La llamada "call" aporta 2 ciclos máquina. nop Aporta 1 ciclo máquina. movlw d'14' Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros Aporta 2 ciclos máquina. Retardo_20micros La llamada "call" aporta 2 ciclos máquina. movlw d'5' Aporta 1 ciclo máquina. Este es el valor de "K". El próximo bloque "RetardoMicros" tarda: 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina. RetardoMicros movwf R_ContA Aporta 1 ciclo máquina. Rmicros_Bucle decfsz R_ContA,F (K-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto Rmicros_Bucle Aporta (K-1)x2 ciclos máquina. return El salto del retorno aporta 2 ciclos máquina. En total estas subrutinas tardan: - Retardo_500micros: 2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz). - Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz). - Retardo_100micros: 2 + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz). - Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) = 50 cm = 50 µs. (para K= 14 y 4 MHz). - Retardo_20micros : 2 + 1 + (2 + 3K) = 20 cm = 20 µs. (para K= 5 y 4 MHz). RETARDOS de 1 ms hasta 200 ms. ------------------------------------------------------------------------------ Retardo_200ms La llamada "call" aporta 2 ciclos máquina. movlw d'200' Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms Aporta 2 ciclos máquina. Retardo_100ms La llamada "call" aporta 2 ciclos máquina. movlw d'100' Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms Aporta 2 ciclos máquina. Retardo_50ms La llamada "call" aporta 2 ciclos máquina. movlw d'50' Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms Aporta 2 ciclos máquina. Retardo_20ms La llamada "call" aporta 2 ciclos máquina. movlw d'20' Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms Aporta 2 ciclos máquina. Retardo_10ms La llamada "call" aporta 2 ciclos máquina. movlw d'10' Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms Aporta 2 ciclos máquina. Retardo_5ms La llamada "call" aporta 2 ciclos máquina. movlw d'5' Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms Aporta 2 ciclos máquina. Retardo_2ms La llamada "call" aporta 2 ciclos máquina. movlw d'2' Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms Aporta 2 ciclos máquina. 22
Retardo_1ms La llamada "call" aporta 2 ciclos máquina. movlw d'1' Aporta 1 ciclo máquina. Este es el valor de "M". El próximo bloque "Retardos_ms" tarda: 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 = = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina que a 4 MHz son 1002 µs = 1 ms. Retardos_ms movwf R_ContB Aporta 1 ciclo máquina. R1ms_BucleExterno movlw d'249' Aporta Mx1 ciclos máquina. Este es el valor de "K". movwf R_ContA Aporta Mx1 ciclos máquina. R1ms_BucleInterno nop Aporta KxMx1 ciclos máquina. decfsz R_ContA,F (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar). goto R1ms_BucleInterno Aporta (K-1)xMx2 ciclos máquina. decfsz R_ContB,F (M-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1ms_BucleExterno Aporta (M-1)x2 ciclos máquina. return El salto del retorno aporta 2 ciclos máquina. En total estas subrutinas tardan: - Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249). - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249). - Retardo_50ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 50007 cm = 50 ms. (M= 50 y K=249). - Retardo_20ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 20007 cm = 20 ms. (M= 20 y K=249). - Retardo_10ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 10007 cm = 10 ms. (M= 10 y K=249). - Retardo_5ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 5007 cm = 5 ms. (M= 5 y K=249). - Retardo_2ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 2007 cm = 2 ms. (M= 2 y K=249). - Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249). RETARDOS de 0.5 hasta 20 segundos -------------------------------------------------------------------------- Retardo_20s La llamada "call" aporta 2 ciclos máquina. movlw d'200' Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima Aporta 2 ciclos máquina. Retardo_10s La llamada "call" aporta 2 ciclos máquina. movlw d'100' Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima Aporta 2 ciclos máquina. Retardo_5s La llamada "call" aporta 2 ciclos máquina. movlw d'50' Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima Aporta 2 ciclos máquina. Retardo_2s La llamada "call" aporta 2 ciclos máquina. movlw d'20' Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima Aporta 2 ciclos máquina. Retardo_1s La llamada "call" aporta 2 ciclos máquina. movlw d'10' Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima Aporta 2 ciclos máquina. Retardo_500ms La llamada "call" aporta 2 ciclos máquina. movlw d'5' Aporta 1 ciclo máquina. Este es el valor de "N". El próximo bloque "Retardo_1Decima" tarda: 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 + + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 = = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011 ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo. Retardo_1Decima movwf R_ContC Aporta 1 ciclo máquina. R1Decima_BucleExterno2 movlw d'100' Aporta Nx1 ciclos máquina. Este es el valor de "M". movwf R_ContB Aporta Nx1 ciclos máquina. 23
R1Decima_BucleExterno movlw d'249' Aporta MxNx1 ciclos máquina. Este es el valor de "K". movwf R_ContA Aporta MxNx1 ciclos máquina. R1Decima_BucleInterno nop Aporta KxMxNx1 ciclos máquina. decfsz R_ContA,F (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar). goto R1Decima_BucleInterno Aporta (K-1)xMxNx2 ciclos máquina. decfsz R_ContB,F (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar). goto R1Decima_BucleExterno Aporta (M-1)xNx2 ciclos máquina. decfsz R_ContC,F (N-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1Decima_BucleExterno2 Aporta (N-1)x2 ciclos máquina. return El salto del retorno aporta 2 ciclos máquina. En total estas subrutinas tardan: - Retardo_20s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s. (N=200, M=100 y K=249). - Retardo_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s. (N=100, M=100 y K=249). - Retardo_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5 s. (N= 50, M=100 y K=249). - Retardo_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 2 s. (N= 20, M=100 y K=249). - Retardo_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 1 s. (N= 10, M=100 y K=249). - Retardo_500ms: 2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 cm = 0,5 s. (N= 5, M=100 y K=249). =================================================================== Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS" E. Palacios, F. Remiro y L. López. Editorial Ra-Ma. www.ra-ma.es =================================================================== 24
2.2.- Programa del Coche Teledirigido (RE_CO_1.ASM) 2.2.1.- Diagrama de Flujo Receptor del Coche Teledirigido RE_CO_1.ASM 1 Sección de Configuración ORG 0X05H Igualdades Elegimos PIC List p=16f876, f=inhx32 Asignación de nombres de RFS a direcciones. #include <p16f876.inc> POS_CENTRAL = D'19' Posición central del Servomotor. VEL_CERO_INI = D'255' Velocidad cero. LLAVE_VELOCIDAD = D'205' LLAVE_POCION = D'121' Llave Velocidad. Llave Posición. PERIODO = D 255 Representa el Periodo de la señal de PWM. Registros CBLOCK 0X20 VELOCIDAD POCION W_TEMP STATUS_TEMP RCREG_GUARDA ENDC COMIENZO RP0 1 Ir al Banco 1 TRISB 00000000 B de dato TRISC 00000000 B Poner Puerto B como salida Poner Puerto C como salida de dato RP0 0 Ir al Banco 0 PORTC 00000000 B Limpiar el Puerto C. RP0 1 Ir al Banco 1 PR2 #PERIODO Cargamos el Periodo de la señal de PWM. RP0 0 Ir al Banco 0 T2CON 00000111 B Cargamos el Valor Preescalar. (PWM INTER) CCP1CON 00001100 B Cargamos los 2 BIT menos significativos del nivel Alto de la Señal PWM y configuramos y lanzamos el PWM. Salida de señal por RC2 CCP2CON 00001100 B Cargamos los 2 BIT menos significativos del nivel Alto de la Señal PWM y configuramos y lanzamos el PWM. Salida de señal por RC1 POCION #POS_CENTRAL Posicionamos el Servo en el centro. VELOCIDAD #VEL_CERO_INI Posicionamos el Servo en el centro. PORTB 11111101 B Activamos el Led de Parada. Sección de código de Reset ORG OOH Dirección del vector de Reset GOTO COMIENZO Comienzo del Programa Principal CCPR1L POCION Nivel Alto de la señal PWM (Salida por RC2) (Rueda delantera). Vector de Interrupción ORG 04H GOTO INTERRUPCION CCPR2L VELOCIDAD Nivel Alto de la señal PWM (Salida por RC1) (Ruedas tractoras). 1 Retardo 20 ms 25
RETUR N Rutina de Interrupción INTERRUPCION RCIF = 1? Salvar Registros RETFI E W_TEMP W STATUS_TEMP STATUS Guardamos el registro RCREG RCREG_GUARDA RCREG Subrutina SUBR_VELOCIDA D Ha llegado la llave de Cargar la llave de velocidad velocidad? en llave de entrada Ir a la subrutina de Velocidad LLAVE_ENTRADA RCREG LLAVE_VELOCIDAD = LLAVE_VELOCIDAD? SUBR_VELOCIDAD El Dato se queda cargado en el registro DATO_SERIE_VALIDO RECEPCION_DATO_SERIE Ha llegado la llave de DATO_SERIE_VALIDO posición? = 128? RCREG_GUARDA = LLAVE_POCION? Ir a la subrutina de Posición VEL_CERO SUBR_POCION DATO_SERIE_VALIDO > 128? MA_128 Recuperar Registros STATUS STATUS_TEMP DATO_SERIE_VALIDO W W_TEMP < 128? ME_128 RETFIE Complementar el código a 128 VELOCIDAD 128 - VELOCIDAD Multiplicar por 2 el contenido del registro VELOCIDAD VELOCIDAD 2 X VELOCIDAD 26
RETUR N Subrutina MA_128 Transformamos los códigos del registro comprendidos entre 129 y 255 en códigos de 1 a 127 y los cargamos en el registro VELOCIDAD. Subrutina VEL_CER DATO_SERIE_VALIDO (7) 0 VELOCIDAD DATO_SERIE_VALIDO Inversor de giro hacia adelante Cargamos 1 en el registro velocidad VELOCIDAD 1 PC3 1 PC4 0 PC5 1 Inversor de giro desactivado PC3 0 PC4 0 PC5 0 Activar led de señalización PB3 0 Led Adelante ON. PB2 1 Led Atras OFF. PB1 1 Led Parada OFF. Activar led de señalización PB3 1 Led Adelante OFF. PB2 1 Led Atras OFF. PB1 0 Led Parada ON. RETUR N 27
Subrutina ME_128 Transformamos los códigos del registro DATO_SERIE_VALIDO comprendidos entre 0 y 127 en códigos de 128 a 1 y los cargamos en el registro VELOCIDAD. Subrutina SUBR_POCION Cargar la llave de posición en llave de entrada VELOCIDAD <- 128 - DATO_SERIE_VALIDO Inversor de giro hacia atrás PC3 0 PC4 1 PC5 1 LLAVE_ENTRADA LLAVE_POCION Activar led de señalización El Dato se queda cargado en el registro DATO_SERIE_VALIDO RECEPCION_DATO_SERIE PB3 1 PB2 0 PB1 1 Led Adelante OFF. Led Atras ON. Led Parada OFF. Cargar el dato serie valido en posición. POCION DATO_SERIE_VALIDO RETUR N POCION = #POS_CENTRAL? POCION > #POS_CENTRAL? POCION < #POS_CENTRAL? Desactivar led de señalización PB4 1 Led Izquierda OFF. PB0 1 Led Derecha OFF. Activar led de señalización PB4 1 Led Izquierda OFF. PB0 0 Led Derecha ON. Activar led de señalización PB4 0 Led Izquierda ON. PB0 1 Led Derecha OFF. RETUR N 28
R_S_M_RF.INC Igualdades Registros CBLOCK DATO_SERIE1 DATO_SERIE2 DATO_SERIE_VALIDO 2 LLAVE_ENTRADA ENDC RECEPCION_DATO_SERIE RCIF 0 Borramos flag de Recepción Sección de Configuración CONFIGURACION_RECEP_SERIE RP0 1 Ir al Banco 1 Borramos flag de Recepción RCIF 0 Validamos los datos recibidos BRGH 0 Trabajar con velocidad baja de recepción. SPBRG D 9 Cargar la velocidad de Transmisión de datos Baud Rate = Fosc/(64(X+1)) Baud Rate = 1MHz/(64(9+1)) = 1562,5 BIT por segundo SYNC 0 INTCON 11000000 B PIE1 00100000 B Habilitamos llegado la recepción asíncrona. un nuevo dato? Habilitar la Interrupción serie Habilitar RCIF la Interrupción = 1? serie RP0 0 Ir al Banco 0 DATO_SERIE_VALIDO DATO_SERIE1 RCSTA 10010000 B Configurar y lanzar la recepción serie Guardamos (Habilitar el puerto dato primero serie, 8 BIT y recepción continua). DATO_SERIE1 RCREG Son iguales los datos recibidos? Borramos flag de Recepción RCIF 0 DATO_SERIE1 = DATO_SERIE2? 2 Ha llegado la llave de entrada? RCREG = Guardamos el dato segundo DATO_SERIE2 RCREG Borramos flag de Recepción RCIF 0 Ha llegado un nuevo dato? RCIF = 1? 29
2.2.2.- Programa del Receptor del Coche Teledirigido 30
title " Receptor Coche Teledirigido " Programa para PIC 16F876a. Velocidad del Reloj = 1 MHz. Reloj instrucción: 250 khz = 4 us. Perro Guardián deshabilitado. Tipo de Reloj XT. Protección de Código: OFF. ****************************************** Elegimos PIC ************************************************* list p=16f876, f=inhx32 *************** Asignación de etiquetas de Registros de Funciones especiales a direcciones **** #include <p16f876.inc> Este fichero contiene los nombres y direcciones de los registros de funciones especiales. Este fichero esta localizado en el directorio con el nombre MPASM. ******************************************** Igualdades ************************************************** POS_CENTRAL EQU D'19' Posición central del Servomotor. VEL_CERO_INI EQU D'255' Velocidad cero. LLAVE_VELOCIDAD EQU D'205' Llave Velocidad. LLAVE_POCION EQU D'121' Llave Posición. PERIODO EQU D 255 Representa el Periodo de la la señal de PWM. *********************************** Registros ************************************************************* CBLOCK 0X20 VELOCIDAD POCION W_TEMP Registro de salvaguarda de la Rutina de Interrupción. STATUS_TEMP RCREG_GUARDA ENDC ********************************** Sección Código de Reset ******************************************** ORG 0X00 Dirección del Vector Reset GOTO COMIENZO Comienzo del Programa ************************************* Vector de Interrupción ******************************************** ORG 0X04 GOTO INTERRUPCION Vector de Interrupción. ************************************ Sección de Configuración ***************************************** ORG 0X05 Inicio de Programa (Una posición detrás del vector de Interrupción). 31
COMIENZO BSF STATUS,RP0 Ir al Banco 1. CLRF TRISB Poner el PORTB como salida de datos. CLRF TRISC Poner el PORTC como salida de datos. BCF STATUS,RP0 Ir al Banco 0. CLRF PORTC Limpiar el PORTC. CALL CONFIGURACION_RECEP_SERIE Configuración de la Recepción serie. BSF STATUS,RP0 Ir al Banco 1. MOVLW PERIODO Cargamos el Periodo de la señal de PWM. MOVWF PR2 BCF STATUS,RP0 Ir al Banco 0. MOVLW B'00000111' MOVWF T2CON Cargamos el Valor Preescalar.(PWM INTER) MOVLW B'00001100' Cargamos los 2 BIT menos significativos del nivel Alto de la Señal PWM y configuramos y lanzamos PWM. MOVWF CCP1CON Salida de señal por RC2 MOVLW B'00001100' MOVWF CCP2CON Cargamos los 2 BIT menos significativos del nivel Alto de la Señal PWM y configuramos y lanzamos PWM. Salida de señal por RC1 MOVLW POS_CENTRAL MOVWF POCION MOVLW VEL_CERO_INI MOVWF VELOCIDAD MOVLW B'11111101' MOVWF PORTB Posicionamos el Servo en el centro. El coche esta parado. Activamos el Led de Parada. ******************************************** Principal ***************************************************** PRINCIPAL MOVF POCION,W MOVWF CCPR1L MOVF VELOCIDAD,W MOVWF CCPR2L CALL Retardo_20ms GOTO PRINCIPAL Nivel Alto de la señal PWM (Salida por RC2) (Rueda delantera). Nivel Alto de la señal PWM.(Salida por RC1) (Ruedas tractoras). Tiene que transcurrir un periodo antes de refrescar el nivel alto de la señal. **************************************** Rutina de Interrupción ***************************************** INTERRUPCION BTFSS PIR1,RCIF Detectamos si ha interrumpido la Recepción Serie. RETFIE SALVAR MOVWF W_TEMP Salvamos Registros SWAPF STATUS,W MOVWF STATUS_TEMP MOVF RCREG,W MOVWF RCREG_GUARDA XORLW LLAVE_VELOCIDAD BTFSS STATUS,Z Guardamos el registro RCREG. Preguntamos si ha llegado la "LLAVE_VELOCIDAD". 32
GOTO IR_POCION CALL SUBR_VELOCIDAD GOTO RECUPERAR Ir a la subrutina de Velocidad IR_POCION MOVF RCREG_GUARDA,W Preguntamos si ha llegado la "LLAVE_POCION". XORLW LLAVE_POCION BTFSC STATUS,Z CALL SUBR_POCION Ir a la subrutina de Posición. RECUPERAR SWAPF STATUS_TEMP,W Recuperamos Registros. MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE Retorno de Interrupción. ********************************* Subrutina SUBR_VELOCIDAD ************************************** SUBR_VELOCIDAD MOVLW LLAVE_VELOCIDAD Cargar la LLAVE_VELOCIDAD en el registro LLAVE_ENTRADA. MOVWF LLAVE_ENTRADA CALL RECEPCION_DATO_SERIE Ir a la subrutina de recepción de datos serie. COMPARACION MOVLW D'128' Si DATO_SERIE_VALIDO = 128 ir a la Subrutina de VELOCIDAD _ CERO. SUBWF DATO_SERIE_VALIDO,W BTFSC STATUS,Z GOTO VELOCIDAD_CERO MAYOR_128 MER_128 VELOCIDAD_CERO BTFSC STATUS,C GOTO MAYOR_128 GOTO MER_128 CALL MA_128 GOTO SAL_VELOCIDAD CALL ME_128 GOTO SAL_VELOCIDAD CALL VEL_CERO Si DATO_SERIE_VALIDO < 128 ir a la Subrutina de ME_128. Si DATO_SERIE_VALIDO > 128 ir a la Subrutina de MA_128. SAL_VELOCIDAD MOVF VELOCIDAD,W VELOCIDAD <- 128-VELOCIDAD (Complementar el código a 128) SUBLW D'128' Esto es debido a que el TRT del circuito se satura con cero. MOVWF VELOCIDAD RLF VELOCIDAD,F VELOCIDAD <- VELOCIDAD * 2 (Multiplicar por 2 la Velocidad) Esto es debido a que el registro CCPR2L va de 0 a 255. ************************************* Subrutina VEL_CERO ******************************************** VEL_CERO MOVLW D'1' Cargamos 1 en el registro VELOCIDAD. MOVWF VELOCIDAD BCF PORTC,3 BCF PORTC,4 BCF PORTC,5 Inversor de giro esta desactivado. 33
BSF PORTB,3 BSF PORTB,2 BCF PORTB,1 Led Adelante OFF. Led Atras OFF. Led Parada ON. ****************************************** Subrutina MA_128 ******************************************* MA_128 BCF DATO_SERIE_VALIDO,7 Transformamos los códigos del registro DATO_SERIE_VALIDO MOVF DATO_SERIE_VALIDO,W comprendidos entre 129 y 255 en códigos de 1 a 127 y los cargamos MOVWF VELOCIDAD en el registro VELOCIDAD. BSF PORTC,3 BCF PORTC,4 BSF PORTC,5 BCF PORTB,3 BSF PORTB,2 BSF PORTB,1 Inversor de giro hacia adelante. Led Adelante ON. Led Atras OFF. Led Parada OFF. ******************************************** Subrutina ME_128 ***************************************** ME_128 MOVF DATO_SERIE_VALIDO,W Transformamos los códigos del registro DATO_SERIE_VALIDO SUBLW D'128' comprendidos entre 0 y 127 en códigos de 128 a 1 MOVWF DATO_SERIE_VALIDO MOVF DATO_SERIE_VALIDO,W MOVWF VELOCIDAD VELOCIDAD <- 128 - DATO_SERIE_VALIDO BCF PORTC,3 BSF PORTC,4 BSF PORTC,5 BSF PORTB,3 BCF PORTB,2 BSF PORTB,1 Inversor de giro hacia atrás. Led Adelante OFF. Led Atras ON. Led Parada OFF. ************************************* Subrutina SUBR_POCION ************************************* SUBR_POCION MOVLW LLAVE_POCION Cargar la LLAVE_POCION en el registro LLAVE_ENTRADA. MOVWF LLAVE_ENTRADA CALL RECEPCION_DATO_SERIE Ir a la subrutina de recepción de datos serie. MOVF DATO_SERIE_VALIDO,W Cargar el DATO_SERE_VALIDO en POCION. MOVWF POCION MOVLW POS_CENTRAL SUBWF POCION,W Preguntamos si estamos en la posición central Si POCION = #POS_CENTRAL ir a CENTRO. 34
BTFSC STATUS,Z GOTO CENTRO BTFSC STATUS,C Si POCION < #POS_CENTRAL ir a DERECHA. GOTO DERECHA Si POCION > #POS_CENTRAL ir a IZQUIERDA. GOTO IZQUIERDA DERECHA BSF PORTB,4 Led Izquierda OFF. BCF PORTB,0 Led Derecha ON. GOTO SALIR_POCION IZQUIERDA BCF PORTB,4 Led Izquierda ON. BSF PORTB,0 Led Derecha OFF. GOTO SALIR_POCION CENTRO BSF PORTB,4 Led Izquierda OFF. BSF PORTB,0 Led Derecha OFF. SALIR_POCION *********************************************** Librerías ************************************************** INCLUDE <R_M_S_RF.INC> INCLUDE <RETARDOS.INC> END 2.2.3.- Librería R_S_M_RF.INC Librería Receptor SERIE vía Radiofrecuencia para una Tarjeta Emisora SAW para Datos 433,92 MHz. ( CEBEK C-0504 ) La Llave de entrada aleatoria. Los datos se validan si llegan dos datos idénticos consecutivos. El dato recibido se carga en el registro DATO_SERIE_VALIDO Si se reciben dos datos consecutivos se valida el dato. Esta configurada la Interrupción en Recepción Serie. Es necesario cargar el Vector de interrupción ORG 0X04 GOTO INTERRUPCION Se pregunta primero en la rutina de interrupción serie que llave de entrada ha llegado y se carga la llave de entrada que corresponda. (Ejemplo Proyecto de Transmisión de datos) La Subrutina de Recepción Serie devuelve el dato valido en el Registro DATO_SERIE_VALIDO **************************** Igualdades ****************************************************************** **************************** Registros******************************************************************** CBLOCK DATO_SERIE1 DATO_SERIE2 DATO_SERIE_VALIDO LLAVE_ENTRADA ENDC **************************** Sección de Configuración ************************************************* 35
CONFIGURACION_RECEP_SERIE BSF STATUS,RP0 Banco 1 BCF STATUS,RP1 BCF TXSTA,BRGH BSF TRISC,7 MOVLW D'39' MOVWF SPBRG Trabajar con velocidad baja de recepción. Cargar la Velocidad de Recepción de Datos. BCF TXSTA,SYNC MOVLW B'11000000' MOVWF INTCON MOVLW B'00100000' MOVWF PIE1 Habilitar Interrupción Serie Habilitar Interrupción Serie BCF STATUS,RP0 Banco 0 BCF STATUS,RP1 MOVLW B'10010000' MOVWF RCSTA Configurar y lanzar la Recepción Serie ****************************** Subrutina de Recepción Serie ****************************************** Tiene que estar dentro de la Rutina de INTERRUPCION RECEPCION_DATO_SERIE BCF PIR1,RCIF Borramos Flag de la Recepción. _DATO_SERIE1 BTFSS PIR1,RCIF Preguntamos si hemos recibido una nuevo DATO. GOTO _DATO_SERIE1 MOVF RCREG,W MOVWF DATO_SERIE1 Guardamos el Dato Primero BCF PIR1,RCIF Borramos Flag de la Recepción. _LLAVE_ENTRADA BTFSS PIR1,RCIF Preguntamos si ha llegado la Llave "LLAVE_ENTRADA". GOTO _LLAVE_ENTRADA MOVF RCREG,W XORWF LLAVE_ENTRADA,W BTFSS STATUS,Z GOTO SALIR_SERIE Preguntamos si ha llegado la Llave "LLAVE_ENTRADA". Si es correcta la Llave volvemos a preguntar. No es correcta la Llave volvemos al PP previa recuperación de registros. BCF PIR1,RCIF Borramos Flag de la Recepción. _DATO_SERIE2 BTFSS PIR1,RCIF Preguntamos si hemos recibido una nuevo DATO. GOTO _DATO_SERIE2 36
MOVF RCREG,W MOVWF DATO_SERIE2 MOVF DATO_SERIE1,W SUBWF DATO_SERIE2,F BTFSS STATUS,Z GOTO SALIR_SERIE Guardamos el Dato Segundo Si ambos datos son Iguales validamos el dato serie recibido. VALIDAR_DATO_SERIE SALIR_SERIE MOVF DATO_SERIE1,W MOVWF DATO_SERIE_VALIDO BCF PIR1,RCIF El Dato se queda cargado en el Registro DATO_SERIE_VALIDO 37