
El código ensamblador de las rutinas implementadas en el módulo de control remoto se describen a continuación:
************************************************************************************** CONTROL: PERMITE LEER UN COMANDO POR MEDIO DE UN TECLADO
*CUANDO LA TECLA ES PRESIONADA TECLA PRESIONADA,MOSTRARLA EN PANTALLA Y *Y TRANSMITIR LOS COMANDOS POR EL PUERTO SERIAL
*FELIPE BARRIOS
*CARLOS ENCISO
*ÚLTIMA MODIFICACIÓN 24/07/01
*************************************************************************************
* Definición de equates globales
INI_PROG EQU $C000 Dirección de inicio del programa
VAR_PROG EQU $C250 Dirección de inicio de variables del programa
INI_INTE EQU $00EB Dirección RTI
STACK EQU $DFFF Dirección inicial del stack
* Definición de equates para la rutina PRINCIPAL CONTROL
OUTSTR EQU $FFC7 Dirección de la subrutina OUTSTR
ESTADO0 EQU $0 FILA, COLUMNA, VECES=0
ESTADO1 EQU $1 FILA, COLUMNA, VECES=1
ESTADO2 EQU $2 FILA, VECES=2
TODOS EQU %11111111 Todos los bit
FIL0 EQU %01000000 Primera fila
FIL1 EQU %00100000 Segunda fila
FIL2 EQU %00010000 Tercera fila
FIL3 EQU %00001000 Cuarta fila
COL0 EQU %00000001 Primera columna
COL1 EQU %00000010 Segunda columna
COL2 EQU %00000100 Tercera columna
REGISTROS EQU $1000 Dirección base de los registros
PORTA EQU $0 Dirección del registro de control del puerto A
PACTL EQU $26 Dirección del registro del pulse accumulator control register
TMSK2 EQU $24 Dirección del registro del timer mask register
TFLG2 EQU $25 Dirección del registro del registro de banderas 2
RTIF EQU %01000000 Real time interrupt flag
RTR1 EQU %00000010 Real time interrupt rate select 0
RTR0 EQU %00000001 Real time interrupt rate select 1
RTII EQU %01000000 Real time interrupt enable
* Definición de equates para la parte de tx
TE EQU %00001000 Para habilitar la transmisión
TDRE EQU %10000000 Para preguntar por el flag(TDRE)
MODE EQU %00010000 Para configurar el modo
B2604 EQU %00010100 Para configurar la velocidad a 2604 BAUDs
*REGISTROS EQU $1000 Dirección base de los registros
BAUD EQU $2B Registro para configurar la velocidad
SCCR1 EQU $2C Registro de control 1
SCCR2 EQU $2D Registro de control 2
SCSR EQU $2E Registro de estado
SCDR EQU $2F Registro en donde se escribe el dato
*************************************************************************************
* Definicion de equates del modulo DIGASCII_1
TECLA_1 EQU 1 1
TECLA_2 EQU 2 2
TECLA_3 EQU 3 3
TECLA_4 EQU 4 4
TECLA_5 EQU 5 5
TECLA_6 EQU 6 6
TECLA_7 EQU 7 7
TECLA_8 EQU 8 8
TECLA_9 EQU 9 9
TECLA_10 EQU 10 *
TECLA_11 EQU 11 0
TECLA_12 EQU 12 #
* ESTA ES LA CODIFICACIÓN PARA TRASMITIR LOS COMANDOS
ASCII_1 EQU $54 T
ASCII_2 EQU $4D M
ASCII_3 EQU $4F O
ASCII_4 EQU $34 4
ASCII_5 EQU $41 A
ASCII_6 EQU $36 6
ASCII_7 EQU $49 I
ASCII_8 EQU $38 8
ASCII_9 EQU $44 D
ASCII_10 EQU $2A *
ASCII_11 EQU $50 P
ASCII_12 EQU $23 #
* Variables del Barrido
ORG VAR_PROG
BANDERA FCB 0 contiene el estado del teclado(BANDERA=1, si se apretó alguna tecla)
FILA FCB 0 Contiene el estado de las filas
COLUMNA FCB 0 Contiene el estado de las columnas
VECES FCB 0 Contiene el estado del filtro
TECLA FCB 0 Contiene el valor númerico de la tecla presionada
TECLA2 FCB 0 Contiene el doble delvalor númerico de la tecla presionada
* Variables para poder ver en pantalla lo que se escribió con el teclado, ubicadas estratégicamente.
TRIPODE FCC "T"
FCB $04
MARCHA FCC "M"
FCB $04
ORUGA FCC "O"
FCB $04
cuatro FCC "4"
FCB $04
AVANCE FCC "A"
FCB $04
seis FCC "6"
FCB $04
IZQUIERDA FCC "I"
FCB $04
ocho FCC "8"
FCB $04
DERECHA FCC "D"
FCB $04
asterisco FCC "*"
FCB $04
PARADA FCC "P"
FCB $04
numeral FCC "#"
FCB $04
* Variables utilizadas en el modulo DIGASCII_1
*TECLA FCB 11 Contiene el digito a convertir al codigo ASCI
ASCII RMB 1 Contiene el codigo ASCII del digito convertido
* Inicializa el vector de interrupción del RTI
ORG INI_INTE
JMP TECLADO
* Dirección inicial del programa
ORG INI_PROG
CONTROL
INICIOCON
CLI Habilita las interrupciones enmascarable
LDS #STACK Se inicializa el stack
JSR INICIAL
SIEMPRE
*SI BANDERA=1(Significa que hay un nuevo comado a transmitir, es decir que hay una nueva tecla presionada)
LDAA BANDERA
CMPA #ESTADO1
BNE SINOBAN
CLR BANDERA Para que no transmita el dato más de una vez
JSR TRANSMITE
SINOBAN BRA SIEMPRE
FINCON SWI
**************************************************************************************IMPLEMETACION DEL BARRIDO DE LAS FILAS DEL TECLADO *
* Rutina de servicio de Interrupción que permite detectar y reconocer la tecla presionada *
* en un teclado tipo telefónico(4 Filas ; 3 Columas), ésta parte de la rutina se *
* ejecuta periódicamente por medio de una interrupción.
* El barrido de cada una de las filas se realiza con un intervalo de 16ms *
* Si VECES = 0 significa que no está siendo presionada ninguna tecla.
*************************************************************************************
TECLADO
INICIOTEC
*ESTABLECER EL TEMPORIZADOR DE LA INTERRUPCIÓN PERIÓDICA PARA QUE INTERRUMPA NUEVAMENTE
LDX #REGISTROS Lugar donde comienzan los registros
* BSET TFLG2,X RTIF Se borra el flag de interrupción
*SI FILA ES IGUAL A CERO ENTONCES
LDAA FILA
CMPA #ESTADO0
BNE SINOTEC_1
*ESCRIBIR EN LA PRIMERA FILA A TRAVÉS DEL PUERTO DE SALIDA
BSET PORTA,X TODOS Se deshabilita el barrido del teclado
BCLR PORTA,X FIL0 Barre la primera fila con lógica negada
*LLAMAR A SUBRUTINA COLUMNAS
JSR COLUMNAS
TST COLUMNA
BNE FINSITEC_1
*INCREMENTAR PARA IR A LA SIGUIENTE FILA
INC FILA
BRA FINSITEC_1
SINOTEC_1
*SI FILA ES IGUAL A UNO ENTONCES
CMPA #ESTADO1
BNE SINOTEC_2
*ESCRIBIR EN LA SEGUNDA FILA A TRAVÉS DEL PUERTO DE SALIDA
BSET PORTA,X TODOS Se deshabilita el barrido del teclado
BCLR PORTA,X FIL1 Barre la segunda fila con Lógica negada
*LLAMAR A SUBRUTINA COLUMNAS
JSR COLUMNAS
TST COLUMNA
BNE FINSITEC_2
*INCREMENTAR PARA IR A LA SIGUIENTE FILA
INC FILA
BRA FINSITEC_2
SINOTEC_2
*SI FILA ES IGUAL A DOS ENTONCES
CMPA #ESTADO2
BNE SINOTEC_3
*ESCRIBIR EN LA TERCERA FILA A TRAVÉS DEL PUERTO DE SALIDA
BSET PORTA,X TODOS Se deshabilita el barrido del teclado
BCLR PORTA,X FIL2 Barre la tercera fila con Lógica negada
*LLAMAR A SUBRUTINA COLUMNAS
JSR COLUMNAS
TST COLUMNA
BNE FINSITEC_3
*INCREMENTAR PARA IR A LA SIGUIENTE FILA
INC FILA
BRA FINSITEC_3
SINOTEC_3
*ESCRIBIR EN LA TERCERA FILA A TRAVÉS DEL PUERTO DE SALIDA
BSET PORTA,X TODOS Se deshabilita el barrido del teclado
BCLR PORTA,X FIL3 Barre la cuarta fila con Lógica negada
*LLAMAR A SUBRUTINA COLUMNAS
JSR COLUMNAS
TST COLUMNA
BNE FINSITEC_4
*LIMPIAR PARA IR A LA PRIMERA FILA
CLR FILA
* BRA FINSITEC_4
FINSITEC_4
FINSITEC_3
FINSITEC_2
FINSITEC_1
LDX #REGISTROS Lugar donde comienzan los registros
BSET TFLG2,X RTIF Se borra el flag de interrupción
FINTEC RTI
**************************************************************************************LECTURA DE LAS COLUMNAS *
*Subrutina llamada COLUMNAS, que forma parte del módulo barrido de teclado
*Permite detectar que se está apretando una tecla de cualquiera de las *
*tres columnas
*************************************************************************************
COLUMNAS
INICIOCOL
LDX #REGISTROS Se carga para direccionar el puerto
*SI COLUMNA ES IGUAL A CERO ENTONCES
LDAA COLUMNA
CMPA #ESTADO0
BNE SINOCOL_1
*LEER DE LA PRIMERA COLUMNA A TRAVÉS DEL PUERTO DE ENTRADA
*SI TECLA ES APRETADA ENTONCES
BRSET PORTA,X COL0 SINOLEE_1 lee la primera columna
JSR FILTRADO
BRA FINSICOL_1
*ESTABLECER QUE NINGUNA TECLA HA SIDO APRETADA
SINOLEE_1 CLR VECES
*INCREMENTAR PARA IR A LA SIGUIENTE COLUMNA
INC COLUMNA
BRA FINSICOL_1
SINOCOL_1
*SI COLUMNA ES IGUAL A UNO ENTONCES
CMPA #ESTADO1
BNE SINOCOL_2
*LEER DE LA SEGUNDA COLUMNA A TRAVÉS DEL PUERTO DE ENTRADA
*SI TECLA ES APRETADA ENTONCES
BRSET PORTA,X COL1 SINOLEE_2 lee la segunda columna
JSR FILTRADO
BRA FINSICOL_2
*ESTABLECER QUE NINGUNA TECLA HA SIDO APRETADA
SINOLEE_2 CLR VECES
*INCREMENTAR PARA IR A LA SIGUIENTE COLUMNA
INC COLUMNA
BRA FINSICOL_2
SINOCOL_2
*LEER DE LA TERCERA COLUMNA A TRAVÉS DEL PUERTO DE ENTRADA
*SI TECLA ES APRETADA ENTONCES
BRSET PORTA,X COL2 SINOLEE_3 lee la tercera columna
JSR FILTRADO
BRA FINSICOL_3
*ESTABLECER QUE NINGUNA TECLA HA SIDO APRETADA
SINOLEE_3 CLR VECES
*LIMPIAR PARA IR A LA PRIMERA COLUMNA
CLR COLUMNA
* BRA FINSICOL_3
FINSICOL_3
FINSICOL_2
FINSICOL_1
FINCOL RTS
**************************************************************************************FILTRO REALIAZA EL FILTRADO SW PARA EL TECLADO
*Subrutina llamada FILTRADO, que forma parte del módulo barrido de teclado
*SW: Permite confirmar que efectivamente se está apretando una tecla *
*Cuando VECES es igual a 3, VECES pasa a valer 0(esto se hace en la rutina COLUMNAS), *
*esto significa que ninguna tecla es apretada * *
*************************************************************************************FILTRADO
INICIOFIL
*SI VECES ES IGUAL A CERO ENTONCES
LDAA VECES
CMPA #ESTADO0
BNE SINOFIL_1
*INCREMENTAR VECES IR AL SIGUIENTE VALOR
INC VECES
BRA FINSIFIL_1
SINOFIL_1
*SI VECES ES IGUAL A UNO ENTONCES
CMPA #ESTADO1
BNE SINOFIL_2
*INCREMENTAR VECES IR AL SIGUIENTE VALOR
INC VECES
*LLAMAR A SUBRUTINA GUARDAR
JSR MOSTRAR
BRA FINSIFIL_2
SINOFIL_2
*SI VECES ES IGUAL A DOS ENTONCES
CMPA #ESTADO2
BNE SINOFIL_3
*INCREMENTAR VECES IR AL SIGUIENTE VALOR
INC VECES
* BRA FINSIFIL_3
SINOFIL_3
FINSIFIL_3
FINSIFIL_2
FINSIFIL_1
FINFIL RTS
*************************************************************************************
*MOSTRAR *
*Subrutina llamada MOSTRAR, que forma parte del módulo barrido de teclado
*Permite guardar el valor numérico de la tecla apretada., esto se realiza aplicando *
*la fórmula(3*FILA+COLUMNA+1). Además permite ver en pantalla la tecla presionada, esto es
*guardando estratégicamente los caracteres en posiciones contiguas y en orden. *
*RESULTADOS
*TECLAS
*Phono suma Códico Phono suma Códico Phono suma Códico Phono suma Códico
*1------1------T 4------4------4 7-------7------I *------10------* *
*2------2------M 5------5------A 8-------8------8 0------11------P *
*3------3------O 6------6------6 9-------9------D #------12------# *
*************************************************************************************MOSTRAR
INICIOGUA
SEI
*CARGAR FILA EN A
LDAA FILA
*CARGAR FILA EN B
LDAB FILA
*EN A CARGAR A+B
ABA
*EN A CARGAR A+B
ABA
*CARGAR COLUMNA EN B
LDAB COLUMNA
*EN A CARGAR A+B
ABA
*EN A CARGAR A+1
INCA
*GUARDAR EN MEMORIA (TECLA)
STAA TECLA
*ESTO ES PARA PODER VER EN PANTALLA LO QUE SE PRESIONÓ
*B ES IGUAL A (TECLA)
LDAB TECLA
*A ES IGUAL A 2*(TECLA)
ABA
*SE DEBE MULTIPLICAR *2 EL CONTENIDO DE TECLA POR QUE LOS CARACTERES TERMINAN CON NULL
STAA TECLA2
*PARA PODER SUMAR 2*(TECLA) CON LA DIRECCIÓN BASE DE LOS CARACTERES A MOSTRAR EN PANTALLA
LDAB TECLA2
LDX #TECLA
*DIRECCIÓN DONDE SE ENCUENTRA EL CARACTER ASOCIADA CON LA TECLA APRETADA
ABX
*SE MUESTRA EL CARACTER EN PANTALLA
*AVISAR A LA RUTINA PRINCIPAL QUE SE PREIONÓ UNA TECLA, ES DECIR SE INGRESÓ UNA ORDEN
JSR OUTSTR
INC BANDERA Bandera = 1 Para transmitir
FINGUA RTS
**************************************************************************************DIGASCII_1 *
*Subrutina que realiza la siguiente conversión:
*1 a (ascii de la T) *
*2 a (ascii de la M) *
*3 a (ascii de la O) *
*5 a (ascii de la A) *
*7 a (ascii de la I) *
*9 a (ascii de la D) *
*11 a (ascii de la P) *
*************************************************************************************DIGASCII_1
INICIO_DA1
SI_DA1_1 LDAA TECLA Si TECLA=1
CMPA #TECLA_1
BNE SINO_DA1_1
LDAA #ASCII_1
STAA ASCII
BRA FIN_SI_DA1_1
SINO_DA1_1
SI_DA1_2 LDAA TECLA Si TECLA=2
CMPA #TECLA_2
BNE SINO_DA1_2
LDAA #ASCII_2
STAA ASCII
BRA FIN_SI_DA1_2
SINO_DA1_2
SI_DA1_3 LDAA TECLA Si TECLA=3
CMPA #TECLA_3
BNE SINO_DA1_3
LDAA #ASCII_3
STAA ASCII
BRA FIN_SI_DA1_3
SINO_DA1_3
JSR DIGASCII_2
FIN_SI_DA1_3
FIN_SI_DA1_2
FIN_SI_DA1_1
FIN_DA1 RTS
**************************************************************************************DIGASCII_2 *
*************************************************************************************
DIGASCII_2
INICIO_DA2
SI_DA2_1 LDAA TECLA Si TECLA=4
CMPA #TECLA_4
BNE SINO_DA2_1
LDAA #ASCII_4
STAA ASCII
BRA FIN_SI_DA2_1
SINO_DA2_1
SI_DA2_2 LDAA TECLA Si TECLA=5
CMPA #TECLA_5
BNE SINO_DA2_2
LDAA #ASCII_5
STAA ASCII
BRA FIN_SI_DA2_2
SINO_DA2_2
SI_DA2_3 LDAA TECLA Si TECLA=6
CMPA #TECLA_6
BNE SINO_DA2_3
LDAA #ASCII_6
STAA ASCII
BRA FIN_SI_DA2_3
SINO_DA2_3
JSR DIGASCII_3
FIN_SI_DA2_3
FIN_SI_DA2_2
FIN_SI_DA2_1
FIN_DA2 RTS
**************************************************************************************DIGASCII_3 *
*************************************************************************************
DIGASCII_3
INICIO_DA3
SI_DA3_1 LDAA TECLA Si TECLA=7
CMPA #TECLA_7
BNE SINO_DA3_1
LDAA #ASCII_7
STAA ASCII
BRA FIN_SI_DA3_1
SINO_DA3_1
SI_DA3_2 LDAA TECLA Si TECLA=8
CMPA #TECLA_8
BNE SINO_DA3_2
LDAA #ASCII_8
STAA ASCII
BRA FIN_SI_DA3_2
SINO_DA3_2
SI_DA3_3 LDAA TECLA Si TECLA=9
CMPA #TECLA_9
BNE SINO_DA3_3
LDAA #ASCII_9
STAA ASCII
BRA FIN_SI_DA3_3
SINO_DA3_3
JSR DIGASCII_4
FIN_SI_DA3_3
FIN_SI_DA3_2
FIN_SI_DA3_1
FIN_DA3 RTS
**************************************************************************************DIGASCII_4 *
*************************************************************************************
DIGASCII_4
INICIO_DA4
SI_DA4_1 LDAA TECLA Si TECLA=10
CMPA #TECLA_10
BNE SINO_DA4_1
LDAA #ASCII_10
STAA ASCII
BRA FIN_SI_DA4_1
SINO_DA4_1
SI_DA4_2 LDAA TECLA Si TECLA=11
CMPA #TECLA_11
BNE SINO_DA4_2
LDAA #ASCII_11
STAA ASCII
BRA FIN_SI_DA4_2
SINO_DA4_2
LDAA #ASCII_12
STAA ASCII
FIN_SI_DA4_2
FIN_SI_DA4_1
FIN_DA4 RTS
**************************************************************************************Se transmite parada, porque el robot debe primero parar para ejcutar un nuevo comando
*************************************************************************************TRANSMITE
*INICIO
*TRANSMITE POR EL PUERTO SERIAL
LDX #REGISTROS
*MIENTRAS EL PUERTO SE ENCUENTRA OCUPADO ESPERAR
TDRE0 BRCLR SCSR,X TDRE TDRE0
*FIN MIENTRAS
*ESCRIBIR DATO EN EL REGISTRO DEL PUERTO SERIAL
*EN B PARA PODER TRANSMITIRLO POR EL PUERTO SERIAL
LDAA #ASCII_11
STAA SCDR,X
************************************************************************************** En esta parte del programa se realiza un retardo de 2,8 s aproximadamente esto es para que
* el robot siempre pueda procesar la orden de parada y posteriormente la nueva orden
*************************************************************************************
* ESPERA 622 ms
LDY #65535
* WHILE Y <> 0
WAI1 CPY #0
BEQ SAL1
* DO DECREMETA EL CONTADOR Y
DEY
BRA WAI1
SAL1
* ESPERA 622 ms
LDY #65535
* WHILE Y <> 0
WAI2 CPY #0
BEQ SAL2
* DO DECREMENTA EL CONTADOR Y
DEY
BRA WAI2
SAL2
* ESPERA 622 ms
LDY #65535
* WHILE Y <> 0
WAI3 CPY #0
BEQ SAL3
* DO DECREMENTAR EL CONTADOR Y
DEY
BRA WAI3
SAL3
* ESPERA 622 ms
LDY #65535
* WHILE Y <> 0
WAI4 CPY #0
BEQ SAL4
* DO DECREMENETA EL CONTADOR Y
DEY
BRA WAI4
SAL4
************************************************************************************** Se transmite la orden o comando ingresado por el usuario
**************************************************************************************TRASMITIR DATO O COMANDO
*PARA CONVERTIR EL VALOR DE LA TECLA PRESIONADA A ASCII
JSR DIGASCII_1
*MIENTRAS EL PUERTO SE ENCUENTRA OCUPADO ESPERAR
*FIN MIENTRAS
TDRE1 BRCLR SCSR,X TDRE TDRE1
*ESCRIBIR DATO EN EL REGISTRO DEL PUERTO SERIAL
*EN B PARA PODER TRANSMITIRLO POR EL PUERTO SERIAL
LDAA ASCII
STAA SCDR,X
*FIN
RTS
************************************************************************************** Se inicializan las interrupciones los puertos etc
*************************************************************************************INICIAL
*INICIO
*CONFIGURAR EL REAL TIME INTERRUPT
LDX #REGISTROS
BSET PACTL,X RTR1
BCLR PACTL,X RTR0
BSET TMSK2,X RTII
*CONFIGURAR EL PUERTO SERIAL
BCLR SCCR1,X MODE Modo de transmisión(1bit star; 8 bit; 1bit stop)
BSET SCCR2,X TE Configuración del puerto serie como transmisor
LDAA #B2604 Velocidad en baudios(2604)
STAA BAUD,X Configuración de la velocidad en baudios(2604)
CLR BANDERA
*FIN
RTS
*************************************************************************************
El código en lenguaje C de las rutinas implementadas en el módulo de controlado se describen a continuación:
/******************************************************************************/
/* */
/* STIQUITO.C: Módulo que controla al robot stiquito utilizando el ds5000t */
/*
/*FELIPE BARRIOS
/*CARLOS ENCISO
/*ÚLTIMA MODIFICACIÓN 24/07/01
/******************************************************************************/
#include <reg51.h>
#include <stdio.h>
#define ON 1
#define OFF 0
unsigned char idata dato;
unsigned char idata estado;
unsigned char idata modo;
sbit P1_1 = P1^1;
sbit P1_2 = P1^2;
sbit P1_3 = P1^3;
sbit P1_4 = P1^4;
sbit P1_5 = P1^5;
sbit P1_6 = P1^6;
int bandera;
void estadsgte1(void);
void estadsgte2(void);
void estadsgte3(void);
void estadsgte4(void);
void estadsgte5(void);
void estadsgte6(void);
void estadsgte7(void);
void tarea1(void);
void tarea2(void);
void tarea3(void);
void tarea4(void);
void tarea5(void);
void tarea6(void);
void tarea7(void);
void tripode(void);
void marcha(void);
void oruga(void);
void esperaractivacion(void);
void esperarrecuperacion(void);
void inicializacion(void);
void intserial(void);
void intexterna0(void);
void inttimer0(void);
void main(void)
{
dato = 'P';
estado = '1';
modo = 'T';
bandera = 1;
inicializacion();
while (1)
{
if (estado == '1')
{
tarea1();
estadsgte1();
}
else
{
if (estado == '2')
{
tarea2();
estadsgte2();
}
else
{
if (estado == '3')
{
tarea3();
estadsgte3();
}
else
{
if (estado == '4')
{
tarea4();
estadsgte4();
}
else
{
if (estado == '5')
{
tarea5();
estadsgte5();
}
else
{
if (estado == '6')
{
tarea6();
estadsgte6();
}
else
{
if (estado == '7')
{
tarea7();
estadsgte7();
}
}
}
}
}
}
}
}
}
/* */
void estadsgte1(void)
{
if (dato == 'A')
{
estado ='2';
}
else
{
if (dato == 'I')
{
estado ='3';
}
else
{
if (dato == 'D')
{
estado ='4';
}
else
{
if (dato == 'P')
{
estado ='1';
}
else
{
if (dato == 'T')
{
estado ='5';
}
else
{
if (dato == 'M')
{
estado ='6';
}
else
{
if (dato == 'O')
{
estado ='7';
}
}
}
}
}
}
}
}
/* */
void estadsgte2(void)
{
if (dato == 'P')
{
estado ='1';
}
}
/* */
void estadsgte3(void)
{
if (dato == 'P')
{
estado ='1';
}
}
/* */
void estadsgte4(void)
{
if (dato == 'P')
{
estado ='1';
}
}
/* */
void estadsgte5(void)
{
estado = '1';
}
/* */
void estadsgte6(void)
{
estado = '1';
}
/* */
void estadsgte7(void)
{
estado = '1';
}
/* */
void tarea1(void)
{
P1_1 = OFF;
P1_2 = OFF;
P1_3 = OFF;
P1_4 = OFF;
P1_5 = OFF;
P1_6 = OFF;
}
/* */
void tarea2(void)
{
if (modo == 'T')
{
tripode();
}
else
{
if (modo == 'M')
{
marcha();
}
else
{
if (modo == 'O')
{
oruga();
}
}
}
}
/* */
void tripode(void)
{
P1_1 = ON;
P1_3 = ON;
P1_5 = ON;
esperaractivacion();
P1_1 = OFF;
P1_3 = OFF;
P1_5 = OFF;
esperarrecuperacion();
P1_2 = ON;
P1_4 = ON;
P1_6 = ON;
esperaractivacion();
P1_2 = OFF;
P1_4 = OFF;
P1_6 = OFF;
esperarrecuperacion();
}
/* */
void marcha(void)
{
P1_1 = ON;
P1_2 = ON;
P1_3 = ON;
esperaractivacion();
P1_1 = OFF;
P1_2 = OFF;
P1_3 = OFF;
esperarrecuperacion();
P1_4 = ON;
P1_5 = ON;
P1_6 = ON;
esperaractivacion();
P1_4 = OFF;
P1_5 = OFF;
P1_6 = OFF;
esperarrecuperacion();
}
/* */
void oruga(void)
{
P1_1 = ON;
P1_3 = ON;
P1_4 = ON;
P1_6 = ON;
esperaractivacion();
P1_1 = OFF;
P1_3 = OFF;
P1_4 = OFF;
P1_6 = OFF;
esperarrecuperacion();
P1_2 = ON;
P1_5 = ON;
esperaractivacion();
P1_2 = OFF;
P1_5 = OFF;
esperarrecuperacion();
}
/* */
void esperaractivacion(void)
{
TR0 = 1;
while(bandera);
bandera = 1;
TR0 = 0;
}
/* */
void esperarrecuperacion(void)
{
TR0 = 1;
while(bandera);
bandera = 1;
while(bandera);
bandera = 1;
while(bandera);
bandera = 1;
while(bandera);
bandera = 1;
while(bandera);
bandera = 1;
TR0 = 0;
}
/* */
void tarea3(void)
{
P1_4 = ON;
P1_5 = ON;
P1_6 = ON;
esperaractivacion();
P1_4 = OFF;
P1_5 = OFF;
P1_6 = OFF;
esperarrecuperacion();
}
/* */
void tarea4(void)
{
P1_1 = ON;
P1_2 = ON;
P1_3 = ON;
esperaractivacion();
P1_1 = OFF;
P1_2 = OFF;
P1_3 = OFF;
esperarrecuperacion();
}
/**/
void tarea5(void)
{
if (dato == 'T')
{
modo = dato;
}
}
/**/
void tarea6(void)
{
if (dato == 'M')
{
modo = dato;
}
}
/**/
void tarea7(void)
{
if (dato == 'O')
{
modo = dato;
}
}
void inicializacion(void)
{
TH1 = 0xF8; /*Valor del registro de autorecarga para el timer 1*/
TH0 = 0x00; /*Valor de carga del temporizador 0 para 65536 ciclos = 196 ms*/
TL0 = 0xFF;
TMOD = 0x21; /*Configuración del timer 1 en modo 2 con autorecarga y del timer 0 en modo 1 (16 bits)*/
SCON = 0x70; /*Configuración del puerto serial: modo 1, RI depende del bit de stop y recepción habilitada*/
PCON = 0x80; /*Confiduración de SMOD=1 para el valor de xxx=192 utilzado en el cálculo de baudios*/
IE = 0x93; /*Se habilita la interrupción INT0, del puerto serial y de todas las interrupciones*/
// TR0 = 1; /*Se habilita la interrupción del timer 0*/
// TR1 = 1; /*Se habilita la interrupción del timer 1*/
TCON = 0x51; /*Activa la interrupción del temporizador 0 y la interrupción externa 0 (INT0) por flanco de bajada*/
IP = 0x10; /* Alta prioridad al puerto serial */
}
void intserial(void) interrupt 4 using 3
{
if (RI)
{
RI = 0;
dato = SBUF;
}
}
void intexterna0(void) interrupt 0 using 2
{
if (IE0)
{
dato = 'P';
}
}
void inttimer0(void) interrupt 1 using 1
{
if (!TF0)
{
bandera = 0;
}
}