Curso de Microcontrolares Familia HC9S08 Artículo

Anuncio
Curso sobre Microcontroladores
Familia HC9S08 de Freescale
Por Ing. Daniel Di Lella – EduDevices – www.edudevices.com.ar
e-mail: [email protected]
Capítulo 7.Módulo Serial Sincrónico de Comunicaciones – SPI.
Serial Peripheral Interface.
Continuación ...
Ejemplo Práctico SPI01.
Introducción
Quienes hayan empleado el Edukit08 con la familia HC908 recordarán la
comunicación SPI que podía establecerse con en el microcontrolador Q. Esa
comunicación nos permitía 2 operaciones: modificar los parámetros de una señal
PWM y leer una tabla guardada en memoria no volátil.
Emplearemos la comunicación SPI con este último fin. Puesto que esa tabla tiene
guardado un grupo de caracteres en ASCII que forman una frase, mostraremos los
caracteres recibidos en el LCD para que se nos despliegue el mensaje.
Configuración del módulo SPI
Apelamos otra vez al Processor Expert, esta vez para iniciar el módulo SPI:
Entre las categorías más relevantes destacamos:
•
Buad rate Prescaler: La señal de reloj del módulo, en modo master, es tomada del
reloj del bus interno. Este parámetro actúa como prescaler de esta señal de reloj.
En nuestro caso elegimos una tasa de división de 8
•
Baud rate Devisor: También puede interpretarse como un prescaler. En
combinación con el anterior podemos generar una gran variedad de frecuencias de
reloj para el módulo SPI. Adoptamos la tasa de división más elevada: 256.
•
Mode Select: Puede Master o Slave. Ello depende de que papel juegue el
microcontrolador dentro de la comunicación SPI. En el caso del Edukit08 el
MC9S08AW60 hace las veces de master y el microcontrolador Q de slave.
•
Clock Polarity y Clock Phase: Clock polarity en active-high y clock phase en
second edge nos garantizan que se validen los bits durante los flancos ascendentes,
como lo muestra el siguiente gráfico:
Descripción de la comunicación con el Q
La comunicación con el microcontrolar Q se efectúa empleando una interfaz SPI. Para
completar esta comunicación SPI se deben enviar 3 Bytes. Recordemos que siempre el
microcontrolador MC9S08AW60 se comporta como master y el Q como esclavo.
Los 3 Bytes que intervienen es esta transacción, para la lectura de la información
almacenada en el Q, tienen la siguinte función:
•
Byte 1: Es igual a $10. Consiste en el comando de lectura.
•
Byte 2: Dirección. Es un índice a la tabla guardada en el Q.
•
Byte 3: Es un Byte ficticio que utilizamos para generar los 8 pulsos de reloj que nos
permitan rescatar el valor de la tabla del microcontrolador Q.
A partir de estas precisiones podemos comprender la subrutina spi_trans:
Spi_trans:
Esp_spi:
LDA
BCLR
STA
byte_tx
SS_BIT,SS_PORT
SPI1D
NOP
BRCLR SPIS_SPRF,SPI1S,esp_spi
BSET
LDA
STA
SS_BIT,SS_PORT
SPI1D
byte_rx
RTS
En primer lugar cargamos en el acumulador el contenido de la variable byte_tx para
luego transmitirlo. Ponemos a nivel bajo la salida SS_BIT ; ellas sirve para indicar al
dispositivo SPI, el microcontrolador Q en este caso, que debe prepararse para una
comunicación. Quedan así satisfechas las condiciones para iniciar la comunicación.
Es entonces cuando volcamos el acumulador en el registro SPI1D provocando la
transmisión de un byte por SPI. Sabemos que toda transmisión por un módulo SPI
implica a su vez una recepción, por lo cual dispondremos de un byte recibido cuando el
bit SPRF sea “1”. Por tal motivo hacemos polling sobre este bit hasta que logre el
estado “1”.
Aquí rescatamos el resultado leyendo el registro SPI1D, que cumple una doble función
según se lo emplee para lectura o para escritura:
•
Si se escribe sobre el registro SPI1D se produce la transmisión por SPI del byte
escrito.
•
Si se lee el registro SPI1D se lee el último byte recibido en este módulo.
También bajamos la salida S_BIT para indicar al dispositivo externo, el
microcontrolador Q en este caso particular, que la transección a concluido.
Claro que la subrutina spi_trans solo nos permite el intercambio de un byte. Si
queremos aplicarla al Edukit08, deberemos invocarla 3 veces como podemos observar
en el programa:
LDA
STA
#$10
byte_tx
JSR
spi_trans
JSR
demora_100us
LDA
STA
direccion
byte_tx
JSR
spi_trans
JSR
demora_100us
LDA
STA
#$0
byte_tx
JSR
spi_trans
El primer byte que enviamos es el $10, que corresponde al comando de lectura de la
tabla del Q. Descartamos el byte que llega por SPI hasta el HCS08 pues no cumple
función alguna. El segundo byte enviado corresponde al indice a la tabla que
pretendemos leer. También desechamos el byte que nos llega desde el Q.
El tercer byte es un $0 y no cumple una función en especial. Su utilidad reside en que su
transmisión obliga a recibir un byte del Q, que es lo que realmente nos importa, y de
esta manera obtenemos el valor proveniente de tabla. Dicho byte queda almacenado en
la variable byte_rx para su posterior uso.
Analicemos ahora, en líneas generales, el funcionamiento del programa. Luego de
iniciar el LCD, la ejecución del programa queda congelada hasta tanto el usuario oprima
el pulsador SW1:
InI:
BRSET SW1_BIT,SW1_PORT,ini
JSR demora_100us
LDA #$10
STA byte_tx
JSR spi_trans
JSR demora_100us
LDA direccion
STA byte_tx
JSR spi_trans
JSR demora_100us
LDA #$0
STA byte_tx
JSR spi_trans
JSR antirrebote
Al ser oprimido SW1 se da lugar a la comunicación SPI, en los términos explicados,
obteniendo por resultado la lectura de una posición de la tabla guardada en el
microcontrolador Q. La variable direccion brinda el índice a esa tabla y el byte leído
queda almacenado en la variable byte_rx. Los efectos de los rebotes mecánicos del
pulsador son suprimidos con la demora edecuada.
El siguiente paso es mostrar la información laida en el LCD. Dado que la tabla en el Q
contiene letras que forman un texto, lo lógico es mostrar este texto en el LCD. La única
prevención será que no excedamos los 16 caracteres que caben en un renglón del LCD,
en cuyo caso limpiaremos el renglón:
La variable posición es la encargada de controlar que haya menos de 17 caracteres en el
renglón del LCD. Si esto ocurriera, la ejecución del programa se dirige a la línea
ciclo_2 donde escribimos 16 espacios para limpiar el renglón. No podemos emplear el
comando de limpiar el LCD pues estamos utilizando el primer renglón para mostrar la
dirección de la tabla a la cual estamos accediendo.
De una u otra manera la ejecución del programa termina llegando a la línea ciclo_4
donde se presenta en pantalla la dirección accedida del LCD y el carácter obtenido por
SPI. Y luego de todo esto el programa vuelve a consultar el pulsador SW1.
Continuará .......
Nota de Redacción: El lector puede descargar este capítulo y capítulos anteriores del
curso desde la sección “Artículos” (Curso_HC9S08) en el sitio web de EduDevices
(www.edudevices.com.ar )
Descargar