Coche Teledirigido. Profesor: Pedro Alonso Sanz Instituto: I.E.S. Joan Miró Localidad: San Sebastián de los Reyes

Documentos relacionados
Coche Teledirigido. Profesor: Pedro Alonso Sanz Instituto: I.E.S. Joan Miró Localidad: San Sebastián de los Reyes

Programa del PIC 16F877A

Practica de PIC 16F84

Registros SFR vistos hasta ahora: Microcontroladores PIC

Microcontrolador PIC 16F84

Bucles: o Bucles infinitos o Bucles finitos o Bucles anidados Medir tiempos con MPLAB Ejemplos y ejercicios

Las Instrucciones. A continuación vamos a presentar el conjunto de instrucciones básico de los Microcontroladores Picmicro.

Proyecto ROBOT-BALIZA

INSTRUCCIONES DE ENSAMBLADOR

PRACTICA 4. REALIZAR ENCENDIDO-APAGADO DE DIODOS LED

1. Proponer un circuito que tenga el puerto b como salida conectando 8 leds, realizando un programa que me encienda los bits 0, 1, 3, 5, 7.

x u 05h - - RA5 RA4 RA3 RA2 RA1 RA0 Bit Registro PORTA (05h)

El único lenguaje que entienden los microcontroladores es el código máquina formado por ceros y unos del sistema binario.

Características generales

;*****************************************PROGRAMA*******************************************

Tema 6: Microcontroladores

Capítulo VIII: PROGRAMACIÓN DEL PIC 16F876A

Tema: Comunicación serie entre PIC y PC.

[CURSO BÁSICO DE PIC TABLAS]

Instrucciones para programar el PIC16F877

Jesús Alberto Díaz Carmona Ingeniería en Informática. Curso 2005/06. Diseño de Sistemas Basados en Microprocesador

Programación en PIC Los primeros pasos

2.5-1 USART Introducción.

Proyecto Final Robot. Docentes: Collovati Susana Lasarte Matias Correa Diego Integrante: Jesús Olguera

RECURSOS FUNDAMENTALES

SALTOS EN FUNCIONDE UN BIT Aquéllas que pueden producir el salto en función del estado de un bit. Son btfsc y

Control de avance al encendido

1. ÍNDICE. Índice de contenido 2. INTRODUCCIÓN 3. CONTENIDO 1. OBJETIVOS DEL PROYECTO

Indice. Escrito por Administrator Martes, 02 de Septiembre de :45 - Actualizado Domingo, 20 de Septiembre de :45 1 / 15

PROFESOR: Práctica 8. Manejo de Puertos de Entrada y salida del Microcontrolador PIC

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO FACULTAD DE INGENIERÍA DIVISIÓN DE INGENIERÍA ELÉCTRICA DEPARTAMENTO DE INGENIERÍA EN COMPUTACIÓN

PIC MICRO ESTUDIO Reloj en tiempo real RTCU2 Clave: 719

Proyectos con el PIC16F84

Sistema de seguridad con emisión de mensaje SMS

Sistemas con Microprocesadores I

Tema 3: Lenguaje ensamblador. La primera abstracción de la máquina para el programador

CALCULADORA DE FUNCIONES BÁSICAS Oscar Gregorio Pérez Macías

LOS PIC16F88X: EEPROM de Usuario

PROGRAMACIÓN DEL MICROCONTROLADOR PIC 16C64 COMO CONTROLADOR MULTIEJE PARA MOTORES PASO

Transmisión de datos por Radio Frecuencia

Tema: Utilización del módulo ADC en los microcontroladores PIC.

17 Con el chorro de agua pequeño, la cubeta se llena en 10 minutos

Microcontrolador PIC 16F84

Set de instrucciones Microcontrolador PIC.

Sensores inalámbricos de bajo

ocontro- lador PIC16F84

Pines de entrada/salida (I/O) de propósito general. Mediante ellos, el micro PIC puede monitorizar y controlar otros dispositivos.

Alarma con Interfaz DTMF de Línea Telefónica basado en PIC16F84

Experiencia con Motores paso a paso

Manejo LCD Gráfico DSM

UNIVERSIDAD DON BOSCO

:: Microcontroladores PIC - Tabla de Referencias. Conceptos Básicos

Práctica 1. Introducción al laboratorio y al ensamblador del PIC. 1. Objetivos. 2. Introducción. 2.1 Ensamblar y simular

Tema 8. Saltos. (parte I)

Tema 11. Introducción a los Microprocesadores y Microcontroladores

Interrupciones Fuentes de Interrupciones para el PIC16F1787

Rutinas de programación

Energía fotovoltaica y su aplicación rural

Indice General: :: Microcontroladores PIC - Parte IV - Trabajando con Display's y Tablas. Microcontroladores - Parte IV - Manejo de Tablas y Display's

Dentro del PIC16F877 se distinguen tres bloques de memoria.

PRÁCTICA 5 DIRECCIONAMIENTO INDIRECTO Y TECLADO MATRICIAL

Temporizadores y contadores en tiempo real: El módulo Timer0 del PIC.

Seguidores de clase. Universidad Pontificia de Salamanca (Madrid) Microcontrolador PIC 16F877

EDUPIC Módulo 16F628 Manual del Usuario

PIC Programable Integrates Circuit o Peripheral Interface Controller

INTRODUCCIÓN. Comunicación Serial.

UNIVERSIDAD DON BOSCO FACULTAD DE ESTUDIOS TECNOLÓGICOS COORDINACIÓN DE ELECTRÓNICA GUÍA DE LABORATORIO Nº 02

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA UNIDAD ENSENADA MATERIA: CONTROL DIGITAL MAESTRO: ZAMARRIPA TOPETE JOSE DE JESUS PRACTICA 1 DAC

SecurityBot. Entrega. Pontificia Universidad Católica de Chile. Departamento de Ciencias de la Computación IIC2342 Arquitectura de Computadores

PIC16F88. Características

Facultad de Ingenieria, UNAM. Ejercicio 1: Blinking leds

PRÁCTICA 4 LOS BITS DE CONFIGURACIÓN DEL PIC16F628

SERVOS v1.0 INTRODUCCIÓN

Tema: Uso de pantalla matricial LCD y teclado matricial con eliminación de rebote.

LCD. Las pantallas de cristal líquido o módulos LCD, como. Módulo. con interface serial

PIC16C5X (GAMA BAJA) Solo en dispositivos de 28 pins. Encapsulado y patillaje:

PRIMERA PRÁCTICA: PRIMERA TOMA DE CONTACTO CON MPLAB IDE MICROBOT RASTREADOR CONSTRUCCIÓN DE UN GRABADOR

TEMA 6 MICROCONTROLADORES. PIC 16F Introducción Referencia histórica.

Características generales en el PIC16F877

PRÁCTICA 1: Entorno de desarrollo MPLAB-IDE. Primeros ejemplos de programación.

PROYECTO: Velocista y coche teledirigido

UNIVERSIDAD EMILIANO ZAPATA

PIC 18F45XX CARACTERÍSTICAS GENERALES

Práctica 5. Comunicación serie y entradas analógicas

PIC16F882/883/884/886/887

Sistemas con Microprocesadores II

ÍNDICE 1 INTRODUCCIÓN DESCRIPCIÓN DEL MÓDULO POR ETAPAS... 4

DISEÑO DE TELEALARMAS. COMISIÓN FEDERAL DE ELECTRICIDAD.

Tema. Módulo Captura Comparación Modulación n de Achura de Pulsos. C. F. G.S. D.P.E. Módulo de Proyectos 1

Comprobador de Encendido Electrónico de un Motor de Explosión

El objeto de este proyecto es el de construir un robot araña controlado por un PIC16F84A.

El Microcontrolador PIC16F877. Resumen de hoja de datos

IMPLEMENTACION DE UN PROTOTIPO EXPERIMENTAL A PEQUEÑA ESCALA QUE SE ENCARGUE DE AUTOMATIZAR EL PROCESO DE DEVOLUCIÓN DE UN LIBRO EN UNA BIBLIOTECA

CURSO BÁSICO DE PIC16F877

MCBtec Mas información en

Coche teledirigido. Autores: David López Luengo Nauzet Melián Batista Jose Luis Santana Acosta Aythami Santana Monzón

Características Técnicas del PIC 16F84

DISEÑO Y CONSTRUCCIÓN DE UN BANCO DE PRUEBA PARA MOTORES DC DE BAJA POTENCIA

PROFESOR: Práctica 10. Modulación por ancho de pulso (PWM) Emplea un microcontrolador para procesamiento de señales analógicas y digitales

Microcontroladores PIC - PIC16F84

Transcripción:

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