El objetivo de este
proyecto es demostrar que es posible comunicar varios procesadores para que
colaboren entre sí para llegar a cumplir su misión. El experimento que se
propone, es el de comunicar una PC con tres microcontroladores para que lo que
se vaya escribiendo en la PC se vaya observando en tiempo real, en los displays
de los microcontroladores. Así como se muestra en la diapositiva siguiente, que
es parte de la PrePresentación
de la tesis.
Para realizar este
experimento, hay que tener las siguientes dispositivos:
Una vez que se tienen
estos dispositivos (por lo menos uno de cada uno), procederemos a realizar la
primera fase, que consiste en la conexión, comunicación, entre la PC y un
Módulo de Microcontrolador - Display. Y el objetivo es ver en el display lo que
se escribe en la PC y todo en tiempo real. Este experimento se describe en la
liga de Comunicación de la PC a un display
de LCD, de este mismo sitio.
SEGUNDO
EXPERIMENTO
Ya que pudimos comunicar
la PC con un microcontrolador, y desplegar en tiempo real la información que se
manda de la PC a través del Hyperterminal. Ahora es tiempo de conectar dos
microcontroladores que despliegen en forma coordinada el texto que se está
tecleando en la máquina. Vamos a utilizar el mismo esquema general de conexión
que en el experimento anterior.
A continuación
mostramos la conexión hecha, tenemos dos módulos de Microcontrolador- Display.
El de la izquierda que es el módulo dos, y el del protoboard que es el módulo
uno.
Lo novedoso aquí, es
que, ahora hay que coordinar el trabajo de la PC y de los dos
microcontroladores. Puesto que lo único que comparten es el canal de
comunicación. Para ello se debieron de imponer las siguientes reglas:
Las terminales de
recepción y transmisión, se unirán eléctricamente para hacer un solo
canal de comunicación donde todos escuchen lo mismo
La PC es la única
que podrá mandar datos
Los
microcontroladores son los únicos que podrán mandar códigos de control
El usuario deberá
mandar únicamente texto. No se podrán mandar códigos extendidos del
sistema ascii
Cada
microcontrolador tendrá una dirección, comprendida desde la 01 hasta la 31
decimal
La PC no requiere de
ninguna dirección
Ahora bien, partiendo de
lo que tenemos (experimento anterior), vimos que el display despliega los
primeros 16 caracteres de lo que se está tecleando, pero si el usuario sigue
tecleando más caracteres, el display seguira guardando en su memoria los
caracteres insertados. Ahora lo que requerimos es que muestre esos primeros 16
caracteres, y que después ceda el turno al siguiente display, para que éste
despliege otros 16 caracteres.
Pora eso propusimos que
el microcontrolador con la dirección 01 cuente los caracteres enviados y
desplegados. Y cuando ya haya desplegado los 16 caracteres que tiene capacidad
de desplegar (primeros 16 caracteres enviados por la PC), mande inmediatamente
un código de control, que indique al siguiente microcontrolador que es su
turno. Este código de control, va a ser la dirección del microcontrolador. En
este caso mandará un 02, que en código ascii es una carita en negro. Y
cuando ese microcontrolador acabe de desplegar sus 16 caracteres (segundos 16
caracteres enviados por la PC), inmediatamente enviará un 03, y así
suecesivamente. Hasta que se llegue a activar al último módulo conectado.
Bueno, y tal vez se
estará preguntando: ¿Como puede funcionar este minúsculo protocolo, si el
usuario de la PC esta tecleando constantemente, y la PC está ocupando el canal
constantantemente? y la respuesta es simple. La PC ocupa el canal
constantemente, pero no en todo momento. La PC manda un byte cada que el usuario
pulsa una tecla. Y la velocidad de transmisión es muchisimo mayor que la
velocidad de mecanografiado de un humano.
Una excelente
secretaria, con muchisima experiencia, llega a mecanografiar hasta 350
pulsasiones por minuto, lo que equivale a decir que teclea 5.8333 caracteres por
segundo, lo que quiere decir que pulsa una tecla cada 0.17143 segundos. Pero la
PC tarda en enviar un byte con su bit de comienzo y su bit de parada (10 bits en
total) 0.00104166 segundos a una velocidad de 9600 Bits por segundo. La
diferencia de tiempos es enorma casi 100 veces, por tanto, no podemos asegurar
que no ocurriran colisiones, pero sí podemos asegurar que serán muy escasas, o
tal vez nulas.
Una vez aclarado esto, y
armado el circuito. Vamos comenzar el experimento. Lo primero que hay que hacer
es iniciar una conexión serial, utilizando el Hypreterminal. Que lo puedes
encontrar en: Inicio \ Programas\ Accesorios\Comunicaciones. Y hay configurarlo
para que tengamos una conexión a:
9600 Bps
8 bits de datos
1 bit de parada
Sin paridad
Luego hay que alimentar
los microcontroladores, y esperar a que muestren su dirección y su estado. Van
a desplegar algo así: Modulo 02 Listo! Cuando
ya hayan desplegado eso. Entonces sí, lo que el usuario tendrá que hacer es
teclear una frase, oración, o simplemente su nombrey número de matrícula,
como lo fue en este caso. Observaremos que en el Hyperterminal, se observará lo
que se está tecleando, y al mismo instante también se observará en los
displays de los módulos. Así como lo muestran las fotografías siguientes:
En la fotografía
anterior, que es de la ventana del Hyperterminal, se nota mi nombre y en el
caracter 17 se ve una carita en negro, esa carita es el código de control (02h)
que le indica al siguiente módulo, que es su turno. Por eso es que en el
módulo con dirección 01h se observa desplegado "Salvador Macias" y
en el siguiente módulo con dirección 02h se observa "Hernandez
717320"
Como se observa en las
fotos, se logró una muy buena coordinación entre los procesadores. No existe
ningún procesador central que controle absolutamente todo, sino que se hizo una
cooperación entre los diferentes módulos. Cada procesador le tocó hacer una
tarea en específico, y se despreocupó de la de los demás. Esto nos permitió,
tener varios microcontroladores sencillos, en vez de un gran y COSTOSO
procesador, que quiera controlar todo.
A continuación
presentamos el programa que se integró en el primer microcontrolador
(dirección 01h). Y que puedes bajar (archivo .hex) en el final de esta
página. Sólamente se presenta la subrutina de recepción serial, puesto que es
parte activo de este programa. Las demás subrutinas están en otras páginas de
este mismo sitio.
Lti003.asm
LCD_DI equ P1.0 ;Bit del microcontrolador que se
;conecta al pin DI del Display de LCD
LCD_En equ P1.1 ;Bit del microcontrolador que se
;conecta al pin EN del Display de LCD
SERIALBUFFER equ 0FF00h
org 0000h
sjmp INICIO
org 0023h
jmp INTERRUPCION_SERIAL
INICIO:
call INICIALIZA_LCD
mov DPTR,#CADENA1 ;Muestra mensaje de Bienvenida
call MUESTRA_MENSAJE_LCD
call BAJA_RENGLON_LCD
setb EA
setb ES
mov R2,#00h
mov R3,#01h
mov P3,#0FFh
call INICIALIZA_9600_8_1SP_11Mhz
FIN: sjmp FIN
;===================================================================
; CADENAS DE CARACTÉRES
;===================================================================
CADENA0: db '1234567890123456'
CADENA1: db 'Modulo 01 Listo!'
;-----------------------------------------------------------
;INTERRUPCION_SERIAL -- Transmite cadena de caracteres, Recibe
; una cadena de caracteres y la manda a
; un buffer serial para su futura
; operacion
;
;USA: PSW.5 Acc MODIFICA: DPTR
;
;Variables de Entrada:
; DPTR -- Dirección del Mensaje
; SERIALBUFFER -- Dirección de inicio del Buffer Serial
;Variables de Salida:
; NINGUNA
;
;Observaciones: Puerto serial a 9600bps, Hay que definir la
; direccion del buffer serial, el separador de
; comandos es enter 13 decimal = 0Dh
;
;Ejemplo:
; SERIALBUFFER equ 0FF00h
;
;
;MENSAJE1:
; DB 'Salvador Macias Hernandez'
; DB 00h
;-----------------------------------------------------------
INTERRUPCION_SERIAL:
JB TI, DATOENVIADO ;Verificando Mótivo de Interrupción
JB RI, DATORECIBIDO
DATOENVIADO:
clr TI
reti
DATORECIBIDO:
clr RI
cjne R3, #01h, SALIR_INT_SERIAL ;Verifica si es el turno
;de este micro
DESPLEGAR_INFO:
mov Acc, SBUF
clr LCD_En
setb LCD_DI ;Decimos que es dato ;)
mov P0,Acc
setb LCD_En
call ESPERA_50uS
clr LCD_En
inc R2
cjne R2, #16, SALIR_INT_SERIAL ;Verifica que no se hayan
mov SBUF, #02h ;escrito los 16 caracteres de
mov R3,#02h ;este display, si sí pasa turno a 02h
sjmp SALIR_INT_SERIAL
SALIR_INT_SERIAL:
reti
end
El siguiente programa es
el que se cargó en el segundo microcontrolador (dirección 02h)
Lti003_02.asm
LCD_DI equ P1.0 ;Bit del microcontrolador que se
;conecta al pin DI del Display de LCD
LCD_En equ P1.1 ;Bit del microcontrolador que se
;conecta al pin EN del Display de LCD
SERIALBUFFER equ 0FF00h
org 0000h
sjmp INICIO
org 0023h
jmp INTERRUPCION_SERIAL
INICIO:
call INICIALIZA_LCD
mov DPTR,#CADENA1 ;Muestra mensaje de Bienvenida
call MUESTRA_MENSAJE_LCD
call BAJA_RENGLON_LCD
setb EA
setb ES
mov R2,#00h
mov R3,#01h
mov P3,#0FFh
call INICIALIZA_9600_8_1SP_11Mhz
FIN: sjmp FIN
;===================================================================
; CADENAS DE CARACTÉRES
;===================================================================
CADENA0: db '1234567890123456'
CADENA1: db 'Modulo 02 Listo!'
;-----------------------------------------------------------
;INTERRUPCION_SERIAL -- Transmite cadena de caracteres, Recibe
; una cadena de caracteres y la manda a
; un buffer serial para su futura
; operacion
;
;USA: PSW.5 Acc MODIFICA: DPTR
;
;Variables de Entrada:
; DPTR -- Dirección del Mensaje
; SERIALBUFFER -- Dirección de inicio del Buffer Serial
;Variables de Salida:
; NINGUNA
;
;Observaciones: Puerto serial a 9600bps, Hay que definir la
; direccion del buffer serial, el separador de
; comandos es enter 13 decimal = 0Dh
;
;Ejemplo:
; SERIALBUFFER equ 0FF00h
;
;
;MENSAJE1:
; DB 'Salvador Macias Hernandez'
; DB 00h
;-----------------------------------------------------------
INTERRUPCION_SERIAL:
JB TI, DATOENVIADO ;Verificando Mótivo de Interrupción
JB RI, DATORECIBIDO
VERIFICA_TURNO:
cjne R3, #02h, SALIR_INT_SERIAL ;Verifica si es el turno
;de este micro
DESPLEGAR_INFO:
mov Acc, SBUF
clr LCD_En
setb LCD_DI ;Decimos que es dato ;)
mov P0,Acc
setb LCD_En
call ESPERA_50uS
clr LCD_En
inc R2
cjne R2, #16, SALIR_INT_SERIAL ;Verifica que no se hayan
mov SBUF, #03h ;escrito los 16 caracteres de
mov R3,#03h ;este display, si sí pasa turno a 02h
sjmp SALIR_INT_SERIAL
SALIR_INT_SERIAL:
reti
end
Ahora vamos a conectar
el tercer módulo, para tener completo nuestro proyecto.
El programa que
utilizaremos en el tercer micocontrolador es:
Lti003_3.asm
LCD_DI equ P1.0 ;Bit del microcontrolador que se
;conecta al pin DI del Display de LCD
LCD_En equ P1.1 ;Bit del microcontrolador que se
;conecta al pin EN del Display de LCD
SERIALBUFFER equ 0FF00h
org 0000h
sjmp INICIO
org 0023h
jmp INTERRUPCION_SERIAL
INICIO:
call INICIALIZA_LCD
mov DPTR,#CADENA1 ;Muestra mensaje de Bienvenida
call MUESTRA_MENSAJE_LCD
call BAJA_RENGLON_LCD
setb EA
setb ES
mov R2,#00h
mov R3,#01h
mov P3,#0FFh
call INICIALIZA_9600_8_1SP_11Mhz
FIN: sjmp FIN
;===================================================================
; CADENAS DE CARACTÉRES
;===================================================================
CADENA0: db '1234567890123456'
CADENA1: db 'Modulo 03 Listo!'
;-----------------------------------------------------------
;INTERRUPCION_SERIAL -- Transmite cadena de caracteres, Recibe
; una cadena de caracteres y la manda a
; un buffer serial para su futura
; operacion
;
;USA: PSW.5 Acc MODIFICA: DPTR
;
;Variables de Entrada:
; DPTR -- Dirección del Mensaje
; SERIALBUFFER -- Dirección de inicio del Buffer Serial
;Variables de Salida:
; NINGUNA
;
;Observaciones: Puerto serial a 9600bps, Hay que definir la
; direccion del buffer serial, el separador de
; comandos es enter 13 decimal = 0Dh
;
;Ejemplo:
; SERIALBUFFER equ 0FF00h
;
;
;MENSAJE1:
; DB 'Salvador Macias Hernandez'
; DB 00h
;-----------------------------------------------------------
INTERRUPCION_SERIAL:
JB TI, DATOENVIADO ;Verificando Mótivo de Interrupción
JB RI, DATORECIBIDO
VERIFICA_TURNO:
cjne R3, #03h, SALIR_INT_SERIAL ;Verifica si es el turno
;de este micro
DESPLEGAR_INFO:
mov Acc, SBUF
clr LCD_En
setb LCD_DI ;Decimos que es dato ;)
mov P0,Acc
setb LCD_En
call ESPERA_50uS
clr LCD_En
inc R2
cjne R2, #16, SALIR_INT_SERIAL ;Verifica que no se hayan
mov SBUF, #04h ;escrito los 16 caracteres de
mov R3,#04h ;este display, si sí pasa turno a 02h
sjmp SALIR_INT_SERIAL
SALIR_INT_SERIAL:
reti
end
La foto que se muestra a
continuación, es la evidencia de que el proyecto funciona adecuadamente. En
éste se puso como texto "Salvador macias Hernandez 717320 ITESM
C.E.M. "
Impresión de pantalla
del hyperterminal. Se observa los códigos de control cada 16 caracteres
enviados. Además puedes darle clic en la pantalla paraa agrandarla y
verla mejor
En esta fotografía se
ve solo el módulo cuya dirección es la 01
En esta fotografía se
ve solo el módulo cuya dirección es la 02
En esta fotografía se
ve solo el módulo cuya dirección es la 03
Para que puedas hacer tu
propio proyecto, te dejo aquí el archivo .hex para que lo cargues en tus tres
microcontroladores: