Comunicación de tres microcontradores

Salvador Macías Hernández

Página hecha el 26 de Mayo del 2006

 

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:

 

PRIMER EXPERIMENTO

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 

DATOENVIADO:
clr TI
reti

DATORECIBIDO:
clr RI
mov Acc,SBUF
cjne A,#02h, VERIFICA_TURNO
mov R3, #02h
sjmp SALIR_INT_SERIAL


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 

DATOENVIADO:
clr TI
reti

DATORECIBIDO:
clr RI
mov Acc,SBUF
cjne A,#03h, VERIFICA_TURNO
mov R3, #03h
sjmp SALIR_INT_SERIAL


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:

 

 

Bibliografía

[1]     Intel;  MCS-51 Programmer's Guide and Instruction Set

[2]     CURSOS MECAWIN – MECANOGRAFIA 350 ON-LINE; http://www.aprendemas.com/cursos/cursos-mecawin

-%E2%80%93-mecanografia-350-on-line-165784.html




Autor: Maestro en Ciencias
Salvador Macías Hernández
Salvador@MaciasHernandez.com
http://salvador.maciashernandez.com