Proyecto con Microprocesadores 1






Implementación del Sistema


1. Implementación Software

1.1. Módulo de Control Remoto

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

*************************************************************************************

1.2. Módulo Controlado (Robot Stiquito)

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;

                }

}