Curso de Microcontrolares Familia HC9S08 ... Artículo ... - Edudevices
Curso de Microcontrolares Familia HC9S08 ... Artículo ... - Edudevices
Curso de Microcontrolares Familia HC9S08 ... Artículo ... - Edudevices
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Curso</strong> sobre Microcontroladores<br />
<strong>Familia</strong> <strong>HC9S08</strong> <strong>de</strong> Freescale<br />
Por Ing. Daniel Di Lella – EduDevices – www.edu<strong>de</strong>vices.com.ar<br />
e-mail: info@edu<strong>de</strong>vices.com.ar<br />
Capítulo 6.-<br />
Módulo Serial Asincrónico <strong>de</strong> Comunicación<br />
- SCI - Serial Comunication Interface.<br />
El módulo SCI o UART (Universal Asynchronous Receiver Transmitter) <strong>de</strong> la familia<br />
<strong>HC9S08</strong> es muy similar al que posee la familia HC908 con algunas diferencias que<br />
mejoran su flexibilidad y configuración con respecto a esta familia.<br />
El módulo SCI <strong>de</strong> la familia <strong>HC9S08</strong> provee comunicaciones asincrónicas <strong>de</strong> alta<br />
velocidad con otros periféricos externos o MCUs. La SCI utiliza el formato full –<br />
dúplex , No Retorno a cero (NRZ) e incluye un generador <strong>de</strong> Baud Rate interno.<br />
El generador <strong>de</strong> Baud Rate no requiere <strong>de</strong> TIMER alguno <strong>de</strong>l MCU, lo que le da una<br />
total in<strong>de</strong>pen<strong>de</strong>ncia <strong>de</strong>l resto <strong>de</strong> los módulos, al igual que en la familia HC908.<br />
Muchas <strong>de</strong> las características <strong>de</strong>l SCI ayudan al diseñador a realizar comunicaciones <strong>de</strong><br />
re<strong>de</strong>s más eficientes y con gran flexibilidad <strong>de</strong> uso.<br />
La transmisión y la recepción pue<strong>de</strong>n ser habilitadas en forma in<strong>de</strong>pendiente una<br />
<strong>de</strong> otra, comparten el mismo Buad Rate y utilizan un sistema <strong>de</strong> “Doble Buffer”<br />
que le permite enviar y recibir información sin la intervención <strong>de</strong>l CPU durante<br />
todo el proceso, y solo cuando la operación es completada.<br />
El módulo SCI pue<strong>de</strong> manejarse por interrupciones y flags in<strong>de</strong>pendientes para<br />
cada situación <strong>de</strong> la comunicación, lo que le otorga al módulo una gran capacidad<br />
para realizar comunicaciones complejas en re<strong>de</strong>s multinodos con un manejo eficiente <strong>de</strong><br />
la comunicación.
Po<strong>de</strong>mos resumir las características generales <strong>de</strong>l módulo <strong>de</strong> la siguiente forma:<br />
• Formato <strong>de</strong> comunicación NRZ – Full – Dúplex.<br />
• Baud Rate programable por medio <strong>de</strong> un divisor <strong>de</strong> 13 Bits <strong>de</strong> longitud.<br />
• Sistema <strong>de</strong> “Doble – Buffer” en Recepción y Transmisión.<br />
• Manejo por Interrupciones o por encuesta (polling) <strong>de</strong> flags en las siguiente<br />
situaciones:<br />
- Transmit Data Register Empty y Transmission Complete.<br />
- Receive Data Register Full.<br />
- Indicación <strong>de</strong> errores como: Receive Overrun, Parity error, Framing error,<br />
y noise error.<br />
- Detección <strong>de</strong> Idle Receiver.<br />
- Largo <strong>de</strong> carácter programable <strong>de</strong> 8 y 9 Bits.<br />
- Generación y Chequeo <strong>de</strong> paridad por hardware.<br />
- Wake Up <strong>de</strong>l Receptor por línea IDLE o por “Address – Mark”.<br />
- Envío opcional <strong>de</strong> carácter “Break” <strong>de</strong> 13 Bits.<br />
- Polaridad programable <strong>de</strong>l transmisor.<br />
A continuación, se analizarán los distintos registros con que cuenta el módulo y algunos<br />
<strong>de</strong>talles <strong>de</strong> funcionamiento <strong>de</strong> este.<br />
SCI Data Register (SCID).<br />
Al igual que en la familia HC908, el registro <strong>de</strong> Datos <strong>de</strong>l módulo SCI posee un<br />
sistema <strong>de</strong> “Doble – Buffer” que permite leer y escribir en una misma posición física<br />
<strong>de</strong> memoria <strong>de</strong>l registro, 2 registros distintos. Cuando se lee el SCID, en realidad se está<br />
leyendo el buffer <strong>de</strong> recepción <strong>de</strong> datos, mientras cuando se escribe en el SCID, en<br />
realidad se está escribiendo en el buffer <strong>de</strong> transmisión <strong>de</strong> datos <strong>de</strong>l módulo.<br />
Tanto la lectura como la escritura provocan la limpieza automática <strong>de</strong> los flags <strong>de</strong><br />
estado <strong>de</strong>l módulo relacionado con estas operaciones.
Sistema <strong>de</strong> Doble – Buffer.<br />
Para transmitir un dato hacia el exterior, el CPU escribe el dato en el registro SCID.<br />
Tal como se vio en la familia HC908, el transmisor <strong>de</strong>l SCI incluye un shift register<br />
(registro <strong>de</strong> <strong>de</strong>splazamiento) <strong>de</strong> 11 bits para almacenar la información durante la<br />
transmisión. Esto permite al CPU escribir un carácter <strong>de</strong> dato mientras el módulo SCI<br />
está transmitiendo el carácter <strong>de</strong> dato previo. Para transmitir un dato, el CPU solamente<br />
necesita chequear si el registro <strong>de</strong> datos <strong>de</strong>l módulo (SCI Data Register) está vacío antes<br />
<strong>de</strong> escribir en el.<br />
La figura anterior, nos muestra un ejemplo típico <strong>de</strong> transmisión <strong>de</strong> datos. Asumiendo<br />
que el registro <strong>de</strong> datos SCID está vacío y que el CPU quiere transmitir un dato.<br />
Entonces, primero, el CPU escribe el carácter en el registro <strong>de</strong> datos <strong>de</strong>l SCI (SCID).<br />
Segundo, cuando el shift register está listo para aceptar el nuevo dato, el hardware <strong>de</strong>l<br />
SCI mueve en forma automática el dato <strong>de</strong>s<strong>de</strong> el registro <strong>de</strong> datos al shift register.<br />
Tercero, una vez que el dato fue movido al shift register, el módulo SCI pone un “1” en<br />
el flag “Transmit Data Register Empty” (TDRE), indicando al CPU que otro carácter<br />
pue<strong>de</strong> ser enviado. Se pue<strong>de</strong> utilizar este flag para “monitorear” el estado <strong>de</strong>l mismo o<br />
bien habilitar la interrupción correspondiente a este flag para generar un pedido <strong>de</strong><br />
interrupción cuando se presente el evento.<br />
Cuarto, los datos son enviados al exterior a la velocidad configurada por el generador <strong>de</strong><br />
Baud Rate por medio <strong>de</strong>l pin TxD.<br />
Quinto y último, una vez que el último bit es enviado al exterior, el módulo SCI pone a<br />
“1” el flag <strong>de</strong> transmisión completa (TC) y en forma opcional (si se la habilita) genera<br />
un pedido <strong>de</strong> interrupción al CPU.<br />
De igual forma, pero en sentido inverso, la sección <strong>de</strong> recepción efectúa los mismos<br />
pasos que los efectuados durante la transmisión.
Sistema <strong>de</strong> Recuperación <strong>de</strong> Datos <strong>de</strong>l SCI.<br />
El receptor <strong>de</strong>l módulo SCI incluye un sistema <strong>de</strong> recuperación <strong>de</strong> datos que muestrea y<br />
verifica el dato recibido. Este sistema es idéntico al empleado en el SCI <strong>de</strong> los<br />
HC908, por lo que se asumirá que el lector ya lo conoce en profundidad, y no es<br />
necesario ampliar el tema, si ello no fuera así, se sugiere leer con <strong>de</strong>tenimiento el <strong>Curso</strong><br />
sobre la familia HC908 y los manuales <strong>de</strong> datos <strong>de</strong> la familia <strong>HC9S08</strong> contenido en el<br />
CD ROM <strong>de</strong>l kit “EDUKIT08” y sus kits complementarios.<br />
SCI Baud Rate Generator.<br />
El generador <strong>de</strong> Baud Rate implementado en el módulo SCI <strong>de</strong> la familia <strong>HC9S08</strong>,<br />
es muy diferente al implementado en los HC908. En la figura superior, pue<strong>de</strong> verse<br />
los bloques constitutivos y las señales <strong>de</strong>l generador <strong>de</strong> Baud Rate.
Dicho generador incluye un módulo divisor <strong>de</strong> 13 Bits que pue<strong>de</strong> programarse<br />
utilizando 2 registros especiales para ello. Como el lector podrá apreciar, ya no existe el<br />
módulo <strong>de</strong> “pre – scaler” empleado por los HC908, sino que todo el conjunto <strong>de</strong> pre –<br />
scaler + bits <strong>de</strong>l divisor, han sido reemplazados por un único divisor <strong>de</strong> 13 Bits que<br />
otorga mayor flexibilidad a la hora <strong>de</strong> “ajustar” el Baud Rate buscado y hace más<br />
sencillo el cálculo final <strong>de</strong>l Baud Rate ante una frecuencia <strong>de</strong> Bus dada.<br />
La fuente <strong>de</strong> reloj (clock) para el generador <strong>de</strong> Baud Rate es el Bus Clock (FBUS).<br />
Es otra <strong>de</strong> las diferencias, ya que en el HC908 se pue<strong>de</strong> optar entre el FBUS o el<br />
CGMXCLK (4 x FBUS), pudiéndose lograr velocida<strong>de</strong>s <strong>de</strong> comunicación 4 veces<br />
mayores con solo cambiar la fuente <strong>de</strong> referencia.<br />
Para calcular el Baud Rate en el módulo SCI <strong>de</strong>l <strong>HC9S08</strong>, se <strong>de</strong>be dividir la<br />
frecuencia <strong>de</strong>l reloj <strong>de</strong> referencia (FBUS) por el valor configurado en el registro<br />
divisor <strong>de</strong> 13 Bits y a su vez, por 16, como se muestra en la figura superior.<br />
Si el lector efectúa algunos cálculos, podrá comprobar que el módulo SCI <strong>de</strong> los<br />
<strong>HC9S08</strong> no solo pue<strong>de</strong> alcanzar velocida<strong>de</strong>s <strong>de</strong> comunicación iguales o superiores<br />
al <strong>de</strong> la familia HC908, sino que también posee mayor flexibilidad para establecer<br />
velocida<strong>de</strong>s especiales o bien estándar <strong>de</strong>s<strong>de</strong> frecuencia <strong>de</strong> Bus algo particulares.<br />
La tolerancia en los <strong>de</strong>sajustes <strong>de</strong> las velocida<strong>de</strong>s <strong>de</strong> comunicación para este módulo es<br />
<strong>de</strong> +/- 4,5% para el formato <strong>de</strong> datos <strong>de</strong> 8 Bits y <strong>de</strong> +/- 4% para el formato <strong>de</strong> 9 Bits.<br />
Esta tolerancia es más que aceptable para lograr comunicaciones estables y confiables<br />
con la gran mayoría <strong>de</strong> los periféricos <strong>de</strong>l mundo real y permite que nuestro sistema se<br />
“adapte” a las diferencias <strong>de</strong> velocida<strong>de</strong>s que puedan presentarse.
Echemos un vistazo a los registros <strong>de</strong> Buad Rate SCIBDH y SCIBDL.<br />
Este registro <strong>de</strong> 13 Bits (SBR12 a SBR0) que lo llamaremos genéricamente como<br />
“BR” pue<strong>de</strong> configurarse para lograr la división requerida. Cuando BR = 0, el<br />
generador <strong>de</strong> Baud Rate es apagado para reducir el consumo <strong>de</strong> energía.<br />
Los valores posibles para el mismo son entre 1 y 8191.<br />
Para actualizar el valor contenido en los registros <strong>de</strong> Baud Rate, primero hay que<br />
escribir, el nuevo valor, en la parte más alta <strong>de</strong> dicho registro (SCIBDH) y luego en<br />
la parte más baja <strong>de</strong>l mismo (SCIBDL). El nuevo valor no tendrá efecto hasta que se<br />
escriba la parte más baja <strong>de</strong>l registro (SCIBDL).<br />
Si el lector observa el contenido <strong>de</strong> la parte baja <strong>de</strong>l registro (SCIBDL) al salir el MCU<br />
<strong>de</strong>l estado <strong>de</strong> Reset, podrá notar que el mismo es distinto <strong>de</strong> “0”, el cual indica que el<br />
generador <strong>de</strong> Baud Rate estaría habilitado. Sin embargo, luego <strong>de</strong>l reset, el generador<br />
<strong>de</strong> Baud Rate permanece <strong>de</strong>shabilitado hasta que por primera vez la sección <strong>de</strong><br />
recepción o transmisión sea habilitada.<br />
Al igual que en el HC908, la sección <strong>de</strong> recepción o transmisión pue<strong>de</strong>n ser<br />
habilitadas en forma in<strong>de</strong>pendiente por medio <strong>de</strong> los bits “RE” para recepción y<br />
“TE” para la transmisión al ponerlos a “1” en el registro SCIC2.<br />
Un ejemplo Práctico:<br />
Supongamos tener un sistema con <strong>HC9S08</strong> a una frecuencia <strong>de</strong> Bus <strong>de</strong><br />
FBUS = 4,9152Mhz y queremos obtener un Baud Rate <strong>de</strong> 19.200 BPS, por lo que<br />
<strong>de</strong>beremos configurar el Baud Rate generator con los siguientes valores:
Por lo que el Baud Rate máximo a obtener con una FBUS = 4,9152Mhz y BR = 1<br />
será <strong>de</strong>:<br />
Baud Rate Máx = 307.200 Bps<br />
Y el Baud Rate mínimo con BR = 8191 será <strong>de</strong>:<br />
Baud Rate Min. = 37,5 Bps.<br />
De este ejercicio intelectual, se <strong>de</strong>duce que la velocidad <strong>de</strong> comunicación máxima <strong>de</strong><br />
este módulo pue<strong>de</strong> superar los 1 MBPS (1.000.000 BPS ¡!!), una velocidad muy<br />
interesante para implementar re<strong>de</strong>s <strong>de</strong> alta complejidad y tráfico.<br />
Continuará.......<br />
Nota <strong>de</strong> Redacción: El lector pue<strong>de</strong> <strong>de</strong>scargar este capítulo y capítulos anteriores <strong>de</strong>l<br />
curso <strong>de</strong>s<strong>de</strong> la sección “<strong>Artículo</strong>s” (<strong>Curso</strong>_<strong>HC9S08</strong>) en el sitio web <strong>de</strong> EduDevices<br />
(www.edu<strong>de</strong>vices.com.ar )