Vous êtes sur la page 1sur 6

LSP: UART SW

COMUNICACIÓN SERIE ENTRE MICROCONTROLADORES


MEDIANTE UART SW

En esta práctica se describe la forma de realizar una comunicación serie half-duplex entre
dos microcontroladores utilizando UARTs software. En el apartado 1 se describe el hardware
empleado para la conexión con el circuito real (que en principio no se utilizará). En el apartado 2
se indica el formato de trama y el modo de funcionamiento de la UART software tanto para la
transmisión como la recepción. En el apartado 3 se indican las pruebas a realizar, que se limitan
al empleo del simulador.

1. Descripción del hardware (circuito real).

La figura representa el conexionado realizado. El aislamiento galvánico se garantiza


mediante 2 optoacopladores (PC817), lo que obliga a utilizar 4 líneas de conexión (Figura 1).

micro 0 micro 1
2K2
GND P3.4

P3.2 +5V
4K7 Líneas de
conexión 4K7
+5V P3.2

P3.4 GND
2K2

Figura 1 Hardware para el enlace serie entre dos microcontroladores.

Se supone que el puerto serie incorporado en el micro ya está siendo utilizado para otra
tarea (p. ej. el enlace con un PC), por lo que debe programarse una UART software. Por
simplicidad, se emplea una UART half-duplex. Se elige el terminal P3.2 (RxD) como receptor
para utilizar el bit de inicio de la trama (START) como fuente de interrupción (INT 0). La señal
se transmite por el terminal P3.4 (TxD).

1
LSP: UART SW

2. Descripción de la UART SW

Para realizar la UART SW se utilizan los siguientes recursos:

1) Interrupción externa 0. La línea de recepción de datos (RxD) se conecta en la entrada P3.2


(INT0). De esta forma, es posible detectar la llegada de una trama mediante la interrupción
generada por INT0.

2) Temporizador 1. Este temporizador se emplea para obtener los intervalos de tiempo necesarios
en la generación de la señal transmitida y en el muestreo de la recibida.

2.1. Recepción de una trama

La recepción de una trama se debe realizar de la siguiente forma (ver Figura 2):

1) La llegada del bit de START genera la interrupción externa 0. En la rutina de atención a la


interrupción (ISR) correspondiente se inicializa un contador de bits recibidos (rx_nbit = 0). A
continuación se carga en el temporizador 0 el valor adecuado para que se desborde después de
que transcurra un tiempo t mediobit . De esta forma, la ISR del temporizador se ejecutará
coincidiendo con el centro del bit de START. Además, las interrupciones externas 0 se dejan
inhibidas. De esta forma se evita que otros flancos internos de la trama puedan generar una
interrupción similar a la del bit de START.

2) El resto del proceso de recepción lo realiza la ISR del temporizador 1. La primera vez que
entra la ISR (rx_nbit=0) se verifica que RxD se mantiene a 0. En caso contrario se considera que
se trata de una trama no válida, provocada probablemente por una interferencia. Si el START es
correcto, se prepara el temporizador para generar la próxima ISR después de un tiempo t bit y se
incrementa rx_nbit. En sucesivas entradas de la ISR se muestrean los 8 bits de datos y se verifica
el bit de parada (STOP). La variable rx_nbit permite a la ISR determinar qué bit de la trama se
recibe en cada momento. Cuando finaliza la trama (llegada de un bit de STOP válido), se activa
un indicador UART_RI, se deja parado el temporizador y se vuelven a habilitar las
interrupciones externas. De esta forma se hace posible la recepción de una nueva trama.

2
LSP: UART SW

start stop

DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7

tmediobit
Comprobación del nivel
tbit
Lectura de bit de datos

Figura 2 Formato de trama y proceso de recepción.

Para saber si ha llegado una trama, se debe consultar el bit UART_RI. Si está a '1', se
puede leer el byte recibido de la variable uart_rxbuf. Es importante dejar borrado el indicador
UART_RI para que una posterior consulta contenga la información esperada.

2.2. Transmisión de una trama

Antes de transmitir un byte, se debe esperar a que el indicador UART_TI se encuentre a


'1'. Entonces, se carga el byte en la variable uart_txbuf y se llama a a subrutina txbyte. La
transmisión se lleva a cabo de la siguiente forma.

1) La subrutina txbyte inicializa un contador de bits transmitidos (tx_nbit=0), carga el byte a


transmitir en la variable tx_shift, activa el indicador txing y provoca la entrada de la ISR del
temporizador 1 activando TF1.

2) La ISR del temporizador 1 verifica siempre txing para saber si debe gestionar una transmisión
(txing=1) o una recepción (txing=0). La primera vez que entra la ISR del temporizador, el
contador tx_nbit está a cero y la ISR pone la salida de datos TxD a '0' (bit de START). En
entradas posteriores actualiza TxD con los bits de datos y finalmente con el bit de STOP
(TxD='1'). Además, incrementa tx_nbit y prepara el temporizador para que genere la siguiente
interrupción. Cuando tx_nbit es 10, la ISR da por concluida la transmisión (ya ha finalizado el
bit de STOP), por lo que activa UART_TI, pone a '0' el indicador txing y habilita la interrupción
externa 0 (habilita recepción).

3
LSP: UART SW

start stop

DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7

tbit
Salida de nivel fijo

Salida de bit de datos

Figura 3 Formato de trama y proceso de transmisión.

2.3. Diagramas de flujo

De acuerdo con el funcionamiento descrito en el apartado anterior, en las figuras siguientes


se indican los diagramas de flujo correspondientes a la ISR de la interrupción externa INT0, la
subrutina de transmisión de datos y la ISR del temporizador 1.

intext0

rx_nbit = 0

inhibe interr.
externa 0

prepara temp.0
prepara temp. 0
para tmediobit

reti

Figura 4 Diagrama de flujo de la ISR de INT0.

4
LSP: UART SW

txbyte

tx_nbit = 0
tx_shift = uart_txbuf

inhibe interr.
externa 0

txing = 1
TF0= 1
(genera int.
(genera int. temp0)
temp.1)

ret
reti

Figura 5 Diagrama de flujo de la subrutina de transmisión.

inttim0
inttim1

parartemp.1
parar tim0

txing=1 ?
si no

TxD = 0 si tx_nbit=0 ? rx_nbit=0 ? si RxD = 0 ? no


no no si

TxD = tx_nbit rx_nbit DB(rx_nbit) =


DB(tx_nbit) si entre 1 y 8 ? entre 1 y 8 ? si RxD
no no
rx_nbit es 9

TxD = 1 si tx_nbit=9 ? RxD = 1 ?


error de trama
no
no si
tx_nbit ++ txing = 0 UART_RI= 1 rx_nbit ++
UART_TI= 1
borra IE0
habilita EXT0 error de trama

borra IE0
reti habilita EXT0

preparar temp. 0
prepara temp.1
para tbit

Figura 6 Diagrama de flujo de la ISR de TEMP1.

5
LSP: UART SW

3 Trabajo propuesto

La forma más cómoda de depurar el SW de la UART consiste en realizar una simulación.


Para ello se crean en el archivo CNX dos microcontroladores (con el mismo programa) y un
botón conectado al primero de ellos (micro1). El pin del micro 1 que actúa como salida serie se
conecta al pin de entrada serie del micro2, asignándoles el mismo número de nodo. Cada vez que
se pulse el botón, el micro1 debe enviar un byte (o varios) al micro2. Para verificar el
funcionamiento se pueden visualizar las tramas generadas, empleando el analizador lógico de
UVI51win.

Vous aimerez peut-être aussi