Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper...

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

Transcript of Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper...

Page 1: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

Coche Teledirigido

Profesor: Pedro Alonso Sanz

Instituto: I.E.S. Joan Miró

Localidad: San Sebastián de los Reyes

Page 2: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 3: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

3

1.- Hardware.

1.1.- Esquema Eléctrico simulado del Mando y Coche Teledirigido.

Page 4: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

4

1.2.- Esquema Eléctrico del Mando.

Page 5: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

5

1.3.- Esquema Eléctrico del Coche Teledirigido.

Page 6: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

6

1.4.- Placa del Mando.

Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

Page 7: Diagrama de Flujo · 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)

Page 8: Diagrama de Flujo · 6 1.4.- Placa del Mando. 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

Page 9: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 10: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 11: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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.

Page 12: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

12

Page 13: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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.

Page 14: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 15: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 16: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 17: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 18: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 19: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 20: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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.

Page 21: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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.

Page 22: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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.

Page 23: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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.

Page 24: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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 ; ===================================================================

Page 25: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 26: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)
Page 27: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 28: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 29: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 30: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 31: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 32: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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).

Page 33: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 34: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 35: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 36: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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

Page 37: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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.

Page 38: Diagrama de Flujo · 6 1.4.- Placa del Mando. Top Cooper and Top Silk Bottom Cooper Bottom Cooper (Mirror)

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