Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper...
Transcript of Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper...
Coche Teledirigido
Profesor: Pedro Alonso Sanz
Instituto: I.E.S. Joan Miró
Localidad: San Sebastián de los Reyes
2
Í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 1.8.- Carrocería. ................................................................................................................. 12 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
3
1.- Hardware.
1.1.- Esquema Eléctrico simulado del Mando y Coche Teledirigido.
4
1.2.- Esquema Eléctrico del Mando.
5
1.3.- Esquema Eléctrico del Coche Teledirigido.
6
1.4.- Placa del Mando.
Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)
7
1.5.- Placa del Coche Teledirigido.
Top Cooper and Top Silk Bottom Cooper
Bottom Cooper (Mirror)
8
1.6.- Lista de Materiales del Mando.
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
9
Quantity: References Value
1 Q1 BD136_JOAN
7 Diodes
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
10
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 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
11
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
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
1.8.- Carrocería.
12
13
2.- Software
2.1.- Programa del Mando (TR_CO_1.ASM) 2.1.1.- Diagrama de Flujo del Transmisor del Coche Teledirigido
¿ PB0 =1 ?
VELOCIDAD_MAS
NO
SI
¿ PB1 =1 ?
IZQUIERDA
NO
SI
¿ PB2 =1 ?
PARAR
NO
SI
¿ PB3 =1 ?
VELOCIDAD_MENOS
NO
SI
¿ PB4 =1 ?
DERECHA
NO
SI
; Principal PC3 1 ;Inhabilitar Tarjeta de radiofrecuencia
Retardo_100mS
1
Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa
Transmisor Coche Teledirigido
TR_C0_1.ASM
Elegimos PIC List p=16f876 , f=inhx32
Asignación de nombres de RFS a direcciones.
#include <p16f876.inc>
; Registros CBLOCK 0X20 VELOCIDAD POSICION ENDC
Sección de Configuración
ORG 0x05 ; Inicio de Programa
COMIENZO
RP0 1 ; Ir al Banco 1 TRISB 11111111 B ; Poner el Puerto B como entrada de datos. TRISC(3) 0 ; Poner el PC3 como salida de datos. RP0 0 ; Ir al Banco 0
POSICIÓN #POS_CENTRAL ; Posición central del Servomotor VELOCIDAD #VEL_CERO ; Motor tractor parado.
CONFIGURACION_TRANS_SERIE
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 Velocidad. LLAVE_POSICION = D'121 ; LLave Posición.
14
Subrutina de VELOCIDAD_MAS
¿ VELOCIDAD = MAX_VEL_ADE ?
; Incrementar la velocidad VELOCIDAD VELOCIDAD + #INC_VEL
; Lanzar código de velocidad vía radiofrecuencia
LANZAR_VELOCIDAD
RETURN
SI
NO
Subrutina de VELOCIDAD_MENOS
¿ VELOCIDAD = MAX_VEL_ATR ?
;Decrementar la velocidad VELOCIDAD VELOCIDAD - #INC_VEL
; Lanzar código de velocidad vía radiofrecuencia
LANZAR_VELOCIDAD
RETURN
SI
NO
Subrutina de PARAR
; Parar Coche VELOCIDAD #VEL_CERO
; Lanzar código de velocidad vía radiofrecuencia
LANZAR_VELOCIDAD
RETURN
Subrutina de DERECHA
¿ POSICION = POS_MAX_DE ?
; Incrementar la posición. POSICION POSICION + #INC_POS
; Lanzar código de posición vía radiofrecuencia
LANZAR_POSICION
RETURN
SI
NO
Subrutina de IZQUIERDA
¿ POSICION = POS_MAX_IZ ?
; Decrementar la posición. POSICION POSICION - #INC_POS
; Lanzar código de posición vía radiofrecuencia
LANZAR_POSICION
RETURN
SI
NO
15
Subrutina de LANZAR_VELOCIDAD
; Cargar llave de velocidad LLAVE_ENTRADA #LLAVE_VELOCIDAD
; Lanzar código de velocidad vía radiofrecuencia
LANZAR_DATO_SERIE
RETURN
; Cargar en W el contenido de VELOCIDAD
W VELOCIDAD
Subrutina de LANZAR_POSICION
; Cargar llave de posición.
LLAVE_ENTRADA #LLAVE_POSICION
; Lanzar código de velocidad vía radiofrecuencia
LANZAR_DATO_SERIE
RETURN
; Cargar en W el contenido de POSICION
W POSICION
Librería de Transmisión de datos (Carga en el W el dato a transmitir)
(Cargar la llave de entrada en el registro LLAVE_ENTRADA)
T_M_S_RF.INC
; Igualdades TODOCERO = 00000000 B
; Registros CBLOCK DATO_TRANSMITIDO CONTADOR_TRANSMISIÓN LLAVE-ENTRADA ENDC
;Sección de Configuración CONFIGURACION_TRANS_SERIE RPO 1 ; Ir al Banco 1 SPBRG D’39’ ; Cargar la Velocidad de Transmisión de Datos
Baud Rate = Fosc/(64(X+1)) Baud Rate = 4MHz/(64(39+1)) = 1562,5 BIT por segundo
TXSTA 00100000 B ; Configuración de la transmisión
serie de datos (Modo Asíncrono y baja velocidad.
RP0 0 ; Ir al Banco 0 SPEN 1 ;Activamos la Puerta Serie (TX)
RETURN
2
16
2
LANZAR_DATO_SERIE DATO _ TRANSMITIDO W
; Cargar el número de transmisión CONTADOR_TRANSMISIÓN D’10’
; Lanzar TODOCERO TXREG #TODOCERO
¿ Ha terminado la transmisión ?
¿ TRMT = 1 ?
SI
NO
; Lanzar LLAVE_ENTRADA TXREG #LLAVE_ENTRADA
¿ Ha terminado la transmisión ?
¿ TRMT = 1 ?
NO
SI
; Lanzar DATO_TRANSMITIDO TXREG #DATO_TRANSMITIDO
¿ Ha terminado la transmisión ?
¿ TRMT = 1 ?
SI NO
; Decrementar el registro CONTADOR_TRANSMISION CONTADOR_TRANSMISION CONTADOR_TRANSMISIÓN - 1
¿ CONTADOR_TRANSMISIÓN = 0 ?
RETURN
NO
SI
17
2.1.2.- Programa del Transmisor del Coche Teledirigido
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_POSICION EQU D'121’ ; LLave Posición. ;******************************************** Registros **************************************************** CBLOCK 0X20 VELOCIDAD POSICION 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
18
MOVLW B'11111111' MOVWF TRISB BCF TRISC,3 BCF STATUS,RP0 MOVLW POS_CENTRAL ; Posición central del Servomotor
(Dirección). MOVWF POSICION MOVLW VEL_CERO ; Motor tractor parado. MOVWF VELOCIDAD ;**************************************** 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_MENOS 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 . ADDWF VELOCIDAD,F CALL LANZAR_VELOCIDAD ; Lanzar el código de velocidad vía
radiofrecuencia. SALIR_VEL_MAS RETURN ;*************************** Subrutina de VELOCIDAD_MENOS *************************************** VELOCIDAD_MENOS MOVF VELOCIDAD,W ; ¿Hemos llegado a la máxima
Velocidad hacia atrás? SUBLW MAX_VEL_ATR BTFSC STATUS,Z GOTO SALIR_VEL_MENOS MOVLW INC_VEL ; Decrementar la velocidad. SUBWF VELOCIDAD,F CALL LANZAR_VELOCIDAD ; Lanzar el código de velocidad vía
radiofrecuencia SALIR_VEL_MENOS RETURN
19
;************************** Subrutina de PARAR ******************************************************** PARAR MOVLW VEL_CERO ; Parar el coche. MOVWF VELOCIDAD CALL LANZAR_VELOCIDAD ; Lanzar el código de velocidad vía
radiofrecuencia RETURN ;*************************** Subrutina de DERECHA **************************************************** DERECHA MOVF POSICION,W ; ¿Hemos llegado a la máxima
posición hacia la derecha? SUBLW POS_MAX_DE BTFSC STATUS,Z GOTO SALIR_DER MOVLW INC_POS ; Incrementar posición. ADDWF POSICION,F CALL LANZAR_POSICION ; Lanzar el código de posición vía
radiofrecuencia SALIR_DER RETURN ;*************************** Subrutina de IZQUIERDA ************************************************** IZQUIERDA MOVF POSICION,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. SUBWF POSICION,F CALL LANZAR_POSICION ; Lanzar el código de posición vía
radiofrecuencia SALIR_IZQ RETURN ;*************************** 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. RETURN ;*************************** Subrutina de LANZAR_POSICION **************************************** LANZAR_POSICION BCF PORTC,3 ; Habilitar tarjeta de Radiofrecuencia. MOVLW LLAVE_POSICION ; Cargar llave de posición. MOVWF LLAVE_ENTRADA MOVF POSICION,W CALL LANZAR_DATO_SERIE ; Lanzar datos vía radiofrecuencia. RETURN ;*************************** Librerias ********************************************************************** INCLUDE <T_M_S_RF.INC> INCLUDE <RETARDOS.INC> END
20
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_TRANSMISION 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 ; Cargar la Velocidad de Transmisión de
Datos. ; BR = (Fosc/64(X+1))
BR = (4MHz/64(39+1)) = 1562,5 Hz MOVLW B'00100000' MOVWF TXSTA ; 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). RETURN ;*************************** Lanzar Llaves y Muestra Digital ****************************************** LANZAR_DATO_SERIE MOVWF DATO_TRANSMITIDO MOVLW d'10' MOVWF CONTADOR_TRANSMISION MOVLW TODOCERO ;Lanzar llave TODOCERO. MOVWF TXREG ;Transmisión de Datos en Serie. BSF STATUS,RP0 SEG1_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG1_TRANSMISION REPETIR_TRANSMISION BCF STATUS,RP0 ;Lanzar llave LLAVE_ENTRADA.
21
MOVF LLAVE_ENTRADA,W MOVWF TXREG ;Transmisión de Datos en Serie. BSF STATUS,RP0 SEG2_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG2_TRANSMISION BCF STATUS,RP0 ;Lanzar DATO_TRANSMITIDO. MOVF DATO_TRANSMITIDO,W MOVWF TXREG ;Transmisión de Datos en Serie. BSF STATUS,RP0 SEG3_TRANSMISION BTFSS TXSTA,TRMT ;Preguntamos si se ha transmitido el dato. GOTO SEG3_TRANSMISION BCF STATUS,RP0 DECFSZ CONTADOR_TRANSMISION,F GOTO REPETIR_TRANSMISION RETURN
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.
22
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.
23
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.
24
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 ; ===================================================================
25
2.2.- Programa del Coche Teledirigido (RE_CO_1.ASM)
2.2.1.- Diagrama de Flujo
Receptor del Coche Teledirigido
RE_CO_1.ASM
Elegimos PIC List p=16f876 , f=inhx32
Asignación de nombres de RFS a direcciones.
#include <p16f876.inc>
; Igualdades POS_CENTRAL = D'19' ; Posición central del Servomotor. VEL_CERO_INI = D'255' ; Velocidad cero. LLAVE_VELOCIDAD = D'205' ;Llave Velocidad. LLAVE_POSICION = D'121' ;Llave Posición. PERIODO = D’255’ ;Representa el Periodo
de la señal de PWM.
; Registros CBLOCK 0X20 VELOCIDAD POSICION W_TEMP STATUS_TEMP RCREG_GUARDA ENDC
Sección de código de Reset ORG OOH ; Dirección del vector de Reset GOTO COMIENZO ;Comienzo del Programa
1
Vector de Interrupción ORG 04H
GOTO INTERRUPCION
1
Sección de Configuración ORG 0X05H
COMIENZO RP0 1 ; Ir al Banco 1
TRISB 00000000 B ; Poner Puerto B como salida de dato
TRISC 00000000 B ; Poner Puerto C como salida de dato RP0 0 ; Ir al Banco 0 PORTC 00000000 B ; Limpiar el Puerto C.
CONFIGURACION_RECEP_SERIE
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 INTERNO) 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 POSICION #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.
; Principal
CCPR1L POSICION ; Nivel Alto de la señal PWM
(Salida por RC2) (Rueda delantera).
CCPR2L VELOCIDAD ; Nivel Alto de la señal PWM
(Salida por RC1) (Ruedas tractoras).
Retardo 20 ms
27
RETFIE
Rutina de Interrupción INTERRUPCION
¿ RCIF = 1?
; Salvar Registros W_TEMP W STATUS_TEMP STATUS
RETFIE
NO
SI
; Guardamos el registro RCREG RCREG_GUARDA RCREG
¿Ha llegado la llave de velocidad?
¿ RCREG =
LLAVE_VELOCIDAD ?
;Ir a la subrutina de Velocidad
SUBR_VELOCIDAD
¿Ha llegado la llave de posición?
¿ RCREG_GUARDA = LLAVE_POSICION ?
;Ir a la subrutina de Posición
SUBR_POSICION
; Recuperar Registros STATUS STATUS_TEMP W W_TEMP
SI
NO
SI
NO
28
Subrutina SUBR_VELOCIDAD
El Dato se queda cargado en el registro DATO_SERIE_VALIDO
RECEPCION_DATO_SERIE
;Cargar la llave de velocidad en llave de entrada
LLAVE_ENTRADA LLAVE_VELOCIDAD
¿DATO_SERIE_VALIDO = 128?
¿DATO_SERIE_VALIDO > 128?
¿DATO_SERIE_VALIDO < 128?
;Complementar el código a 128
VELOCIDAD 128 - VELOCIDAD
;Multiplicar por 2 el contenido del registro VELOCIDAD
VELOCIDAD 2 X VELOCIDAD
VEL_CERO
MA_128
ME_128
SI
SI
SI
NO
NO
NO
RETURN
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. DATO_SERIE_VALIDO (7) 0 VELOCIDAD DATO_SERIE_VALIDO
;Inversor de giro hacia adelante
PC3 1 PC4 0 PC5 1
;Activar led de señalización PB3 0 ; Led Adelante ON. PB2 1 ; Led Atras OFF. PB1 1 ; Led Parada OFF.
RETURN
29
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.
VELOCIDAD <- 128 - DATO_SERIE_VALIDO
;Inversor de giro hacia atrás
PC3 0 PC4 1 PC5 1
;Activar led de señalización PB3 1 ; Led Adelante OFF. PB2 0 ; Led Atras ON. PB1 1 ; Led Parada OFF.
RETURN
Subrutina SUBR_POSICION
El Dato se queda cargado en el registro DATO_SERIE_VALIDO
RECEPCION_DATO_SERIE
;Cargar la llave de posición en llave de entrada
LLAVE_ENTRADA LLAVE_POSICION
¿POSICION = #POS_CENTRAL?
¿POSICION > #POS_CENTRAL?
¿POSICION < #POS_CENTRAL?
SI
SI
SI
NO
NO
NO
RETURN
;Cargar el dato serie valido en posición.
POSICION DATO_SERIE_VALIDO
;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.
;Desactivar led de señalización PB4 1 ; Led Izquierda OFF. PB0 1 ; Led Derecha OFF.
Subrutina VEL_CERO
;Cargamos 1 en el registro velocidad
VELOCIDAD 1
;Inversor de giro desactivado
PC3 0 PC4 0 PC5 0
;Activar led de señalización PB3 1 ; Led Adelante OFF. PB2 1 ; Led Atras OFF. PB1 0 ; Led Parada ON.
RETURN
30
R_S_M_RF.INC
; Igualdades
; Registros CBLOCK DATO_SERIE1 DATO_SERIE2 DATO_SERIE_VALIDO LLAVE_ENTRADA ENDC
Sección de Configuración
CONFIGURACION_RECEP_SERIE RP0 1 ; Ir al Banco 1 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 ; Habilitamos la recepción
asíncrona. INTCON 11000000 B ; Habilitar la Interrupción serie PIE1 00100000 B ; Habilitar la Interrupción serie RP0 0 ; Ir al Banco 0 RCSTA 10010000 B ; Configurar y lanzar la recepción
serie (Habilitar puerto serie, 8 BIT y recepción continua).
RETURN
2
31
SI
;Validamos los datos recibidos DATO_SERIE_VALIDO DATO_SERIE1
RETURN
;Borramos flag de Recepción
RCIF 0
; Guardamos el dato segundo
DATO_SERIE2 RCREG
¿ Son iguales los datos recibidos ?
¿ DATO_SERIE1 = DATO_SERIE2 ?
¿ Ha llegado un nuevo dato ?
¿ RCIF = 1 ?
SI
; Guardamos el dato primero
DATO_SERIE1 RCREG
; Borramos flag de Recepción
RCIF 0
¿ Ha llegado la llave de entrada ? ¿ RCREG = LLAVE_ENTRADA ?
; Borramos flag de Recepción
RCIF 0
SI
2
¿ Ha llegado un nuevo dato ?
¿ RCIF = 1 ?
NO
NO
NO
SI
NO
RECEPCION_DATO_SERIE RCIF 0 ; Borramos flag de Recepción
32
2.2.2.- Programa del Receptor del Coche Teledirigido 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_POSICION EQU D'121' ;Llave Posición. PERIODO EQU D’255’ ;Representa el Periodo de la la señal de PWM. ;*********************************** Registros ************************************************************* CBLOCK 0X20 VELOCIDAD POSICION 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).
33
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' ;Cargamos el Valor Preescalar.(PWM INTERNO) MOVWF T2CON 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' ;Cargamos los 2 BIT menos significativos del nivel ;Alto de la Señal PWM y configuramos y lanzamos
PWM. MOVWF CCP2CON ;Salida de señal por RC1 MOVLW POS_CENTRAL ;Posicionamos el Servo en el centro. MOVWF POSICION MOVLW VEL_CERO_INI ;El coche esta parado. MOVWF VELOCIDAD MOVLW B'11111101' ;Activamos el Led de Parada. MOVWF PORTB ;******************************************** Principal ***************************************************** PRINCIPAL MOVF POSICION,W MOVWF CCPR1L ; Nivel Alto de la señal PWM (Salida por RC2)
(Rueda delantera). MOVF VELOCIDAD,W MOVWF CCPR2L ; Nivel Alto de la señal PWM.(Salida por RC1)
(Ruedas tractoras). CALL Retardo_20ms ; Tiene que transcurrir un periodo antes de refrescar
; el nivel alto de la señal. GOTO PRINCIPAL ;**************************************** 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 ;Guardamos el registro RCREG. MOVWF RCREG_GUARDA XORLW LLAVE_VELOCIDAD ;Preguntamos si ha llegado la
34
BTFSS STATUS,Z "LLAVE_VELOCIDAD". GOTO IR_POSICION CALL SUBR_VELOCIDAD ;Ir a la subrutina de Velocidad GOTO RECUPERAR IR_POSICION MOVF RCREG_GUARDA,W ;Preguntamos si ha llegado la
"LLAVE_POSICION". XORLW LLAVE_POSICION BTFSC STATUS,Z CALL SUBR_POSICION ;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 BTFSC STATUS,C ;Si DATO_SERIE_VALIDO < 128 ir a la
Subrutina de ME_128. GOTO MAYOR_128 ;Si DATO_SERIE_VALIDO > 128 ir a la
Subrutina de MA_128. GOTO MENOR_128 MAYOR_128 CALL MA_128 GOTO SAL_VELOCIDAD MENOR_128 CALL ME_128 GOTO SAL_VELOCIDAD VELOCIDAD_CERO CALL VEL_CERO 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) RETURN ;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 ;Inversor de giro esta desactivado. BCF PORTC,4 BCF PORTC,5
35
BSF PORTB,3 ;Led Adelante OFF. BSF PORTB,2 ;Led Atras OFF. BCF PORTB,1 ;Led Parada ON. RETURN ;****************************************** 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 ; Inversor de giro hacia adelante. BCF PORTC,4 BSF PORTC,5 BCF PORTB,3 ;Led Adelante ON. BSF PORTB,2 ;Led Atras OFF. BSF PORTB,1 ;Led Parada OFF. RETURN ;******************************************** 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 ; Inversor de giro hacia atrás. BSF PORTC,4 BSF PORTC,5 BSF PORTB,3 ;Led Adelante OFF. BCF PORTB,2 ;Led Atras ON. BSF PORTB,1 ;Led Parada OFF. RETURN ;************************************* Subrutina SUBR_POSICION ************************************* SUBR_POSICION MOVLW LLAVE_POSICION ;Cargar la LLAVE_POSICION
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 POSICION.
MOVWF POSICION MOVLW POS_CENTRAL ;Preguntamos si estamos en la
posición central
SUBWF POSICION,W ;Si POSICION = #POS_CENTRAL ir a
36
CENTRO. BTFSC STATUS,Z GOTO CENTRO BTFSC STATUS,C ;Si POSICION < #POS_CENTRAL ir a
DERECHA. GOTO DERECHA ;Si POSICION > #POS_CENTRAL ir a IZQUIERDA. GOTO IZQUIERDA DERECHA BSF PORTB,4 ;Led Izquierda OFF. BCF PORTB,0 ;Led Derecha ON. GOTO SALIR_POSICION IZQUIERDA BCF PORTB,4 ;Led Izquierda ON. BSF PORTB,0 ;Led Derecha OFF. GOTO SALIR_POSICION CENTRO BSF PORTB,4 ;Led Izquierda OFF. BSF PORTB,0 ;Led Derecha OFF. SALIR_POSICION RETURN ;*********************************************** 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
37
;**************************** Sección de Configuración ************************************************* CONFIGURACION_RECEP_SERIE BSF STATUS,RP0 ; Banco 1 BCF STATUS,RP1 BCF TXSTA,BRGH ;Trabajar con velocidad baja de
recepción. BSF TRISC,7
MOVLW D'39' ; Cargar la Velocidad de Recepción de Datos.
MOVWF SPBRG BCF TXSTA,SYNC MOVLW B'11000000' ;Habilitar Interrupción Serie MOVWF INTCON MOVLW B'00100000' ;Habilitar Interrupción Serie MOVWF PIE1 BCF STATUS,RP0 ; Banco 0 BCF STATUS,RP1 MOVLW B'10010000' ; Configurar y lanzar la
Recepción Serie MOVWF RCSTA RETURN ;****************************** 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. NO_DATO_SERIE1 BTFSS PIR1,RCIF ;Preguntamos si hemos recibido una
nuevo DATO. GOTO NO_DATO_SERIE1 MOVF RCREG,W MOVWF DATO_SERIE1 ;Guardamos el Dato Primero
BCF PIR1,RCIF ;Borramos Flag de la Recepción.
NO_LLAVE_ENTRADA BTFSS PIR1,RCIF ;Preguntamos si ha llegado la Llave "LLAVE_ENTRADA".
GOTO NO_LLAVE_ENTRADA MOVF RCREG,W ;Preguntamos si ha llegado la
Llave "LLAVE_ENTRADA". XORWF LLAVE_ENTRADA,W BTFSS STATUS,Z ;Si es correcta la Llave
volvemos a preguntar. GOTO SALIR_SERIE ;No es correcta la Llave
volvemos al PP previa recuperación de registros.
BCF PIR1,RCIF ;Borramos Flag de la
Recepción. NO_DATO_SERIE2 BTFSS PIR1,RCIF ;Preguntamos si hemos
recibido una nuevo DATO.
38
GOTO NO_DATO_SERIE2 MOVF RCREG,W MOVWF DATO_SERIE2 ;Guardamos el Dato Segundo MOVF DATO_SERIE1,W ;Si ambos datos son Iguales
validamos el dato serie recibido.
SUBWF DATO_SERIE2,F BTFSS STATUS,Z GOTO SALIR_SERIE VALIDAR_DATO_SERIE MOVF DATO_SERIE1,W MOVWF DATO_SERIE_VALIDO ; El Dato se queda cargado
en el Registro DATO_SERIE_VALIDO
SALIR_SERIE BCF PIR1,RCIF RETURN