PDF de programación - Capítulo 3/6 - Puerto I/O - Curso sobre Microcontroladores

Imágen de pdf Capítulo 3/6 - Puerto I/O - Curso sobre Microcontroladores

Capítulo 3/6 - Puerto I/O - Curso sobre Microcontroladoresgráfica de visualizaciones

Publicado el 31 de Mayo del 2018
583 visualizaciones desde el 31 de Mayo del 2018
737,8 KB
11 paginas
Creado hace 12a (22/05/2011)
Curso sobre Microcontroladores
Familia HC9S08 de Freescale

Por Ing. Daniel Di Lella – EduDevices – www.edudevices.com.ar
e-mail: [email protected]
Responsable Area Educación – ELKO / ARROW – www.elkonet.com
e-mail: [email protected]

Capítulo 3.

Entrega Nº 6
Puertos I/O.
Keyboard Interrupt Module (KBI).

El módulo KBI (Keyboard Interrupt Module) de la familia HC9S08 es similar en
funcionamiento al de la familia HC908 y permite generar interrupciones por cambios de
estado en Puertos I/O que están configurados como entrada y habilitada la función KBI.

Características:

• Vector de Interrupción único e independiente para la función KBI.
• Selección de disparo por flanco creciente o decreciente.
• Mecanismos de “Wake Up” del MCU desde el estado de STOP o WAIT.
• Pin a Pin habilitable.

Operación Sincrónica y Asincrónica de la Interrupción por KBI.

Una de las características interesantes de la familia HC9S08 es el funcionamiento
sincrónico o asincrónico de la interrupción de KBI cuando se está en modo STOP o
cuando se está en modo RUN (MCU corriendo).

Mientras el CPU está corriendo, la interrupción por KBI se muestrea en forma
sincrónica y lleva un tiempo de 1,5 ciclos de reloj para ser atendida. Por ejemplo, si la
frecuencia de Bus (FBUS) es igual a 10 Mhz, el tiempo total de atención de la
interrupción será de 150 nS.

Cuando el CPU está en modo STOP o Wait, no hay clocks y las interrupciones se
producen en forma asincrónica (al igual que un Reset, e IRQ), y el tiempo
involucrado es igual a 100 nS independientemente de la velocidad del Bus antes de
producirse el modo de bajo consumo.

Tiempos de atención interrupción KBI Sincrónica y Asincrónica.

Registros involucrados en la función KBI.

Tabla de verdad de habilitaciones de resistores de Pull –Up / Pull - Down

A esta altura, el lector se habrá dado cuenta que el módulo de KBI podría ser utilizado
no solo para la función de supervisión de pulsadores y teclados, sino que además
constituye un módulo muy interesante para generar múltiples canales de interrupción de
otros dispositivos externos, extendiendo así la funcionalidad de la “tradicional” línea
“IRQ” (Interrupt Request) de los MCUs.

Como se ha mencionado en otros capítulos de este curso, el entorno integrado de trabajo
(IDE) “CodeWarrior” y su aplicativo de configuración “Processor Expert” nos
ayudarán en la configuración y uso de este módulo en forma sencilla y ordenada, sin la
necesidad de “memorizar” en forma detallada bit a bit los distintos registros de
configuración del mismo.

Como siempre decimos en EduDevices.... “Para fijar un concepto, hay que llevarlo a
la práctica” y nada mejor que verlo en un ejemplo de aplicación .....

Entonces .... ¡Manos a la obra!

El ejemplo.

Esta aplicación consiste en un cronómetro implementado en nuestro sistema didáctico
“EDUKIT08” personalizado para trabajar con la familia HC9S08 por medio de la placa
“PLUGIN_AW”. El cronómetro así implementado se encuentra inicialmente detenido.
Al oprimir el pulsador SW1 el cronómetro se dispara y empieza a contar décimas de
segundo, segundos y minutos.

Si en estas condiciones pulsamos SW4 el cronómetro se detiene, conservando la
cuenta, y todo el procedimiento vuelve a comenzar.

Configuración del módulo KBI
Para empezar, recordemos que el módulo KBI se basa en que al menos un pin del
microcontrolador funcione como entrada. Estas entradas pueden generar una
interrupción cuando se produce un flanco ( ascendente o descendente ) o también si esa
entrada se encuentra en un nivel determinado.

Emplearemos este módulo con las entradas de los pulsadores SW1 y SW4, pero al
arrancar el programa solo la primera estará configurada como KBI. El Processor
Expert nos permite configurar cualquiera de los módulos del microcontrolador, entre
ellos al KBI. Basta tener abierta la ventana del Processor Expert dentro del
CodeWarrior y hacer cliq en rectángulo asociado al módulo de keyboard interrupt.

A consecuencia de hacer cliq allí se desplegará la ventana de configuración de este
módulo:

El fin buscado se consigue seleccionando la siguiente configuración para los distintos
parámetros del módulo:

Los items que modificamos son:

• Triggering sensitivity: Aquí podemos seleccionar si queremos que las

interrupciones se produzcan al ocurrir un flanco en la señal de entrada o también si
la señal se mantiene en un nivel lógico (alto o bajo).

• Pin 4: Para emplear interrupciones por KBI en este pin debe ponerlo como

Enabled. Se nos indica que corresponde al puerto PTG4 (el del SW1 del
EDUKIT08). En este pin seleccionamos resistor de Pull – Up habilitado e
interrupciones por Flanco Descendente.

• Pin 5: Establecemos la misma configuración que para el pin 4.

• Interrupts: Keyboard Request Interrupt debe estar en Enabled, con que

desenmascaramos las interrupciones por KBI. Se nos indica, cosa muy importante,
que el nombre de la ISR del módulo KBI es isrVkeyboard1.

Por supuesto que esta inicialización del módulo KBI no precisamos hacerla para correr
el programa “KBI01” pues ya ha sido previamente hecha. Valga solo a título
informativo para que el lector sepa seguir estos pasos cuando diseñe sus propios
programas.

Con las pautas dadas puede generarse el archivo “MCUinit.inc” que contendrá el
código de inicialización de los módulos empleados en este ejemplo, entre ellos el de
KBI. Si luego de creado observamos detenidamente el archivo encontraremos la ISR
correspondiente al módulo KBI:

Bajo el nombre isrVkeyboard1: el nombre que ya nos había indicado el Processor
Expert. Se trata de una ISR vacía que solo se encarga de retornar de la interrupción
mediante la instrucción RTI. Aquí es donde nosotros como programadores deberemos
completar con el código que permita procesar convenientemente el evento que generó la
interrupción.

Este procedimiento que nos genera una ISR para determinado módulo, en este caso
KBI, en el archivo “MCUinit.inc” merece una aclaración: Un programa que emplee
interupciones necesita de una ISR, que nosotros escribiremos. Esta rutina formará
parte del archivo “MCUinit.inc”.

Es posible que deseemos modificar la inicialización de los módulos hecha con el
Processor Expert, para corregir algún error que podamos haber cometido o para ampliar
nuestro programa. En ese caso nos varíamos obligados a generar nuevamente el archivo
“MCUinit.inc” para que refleje los cambios efectuados con el Processor Expert.

Y en tal caso surge la pregunta: ¿Se pierde el código escrito en las ISR al generarse
nuevamente el archivo “MCUinit.inc”?

La buena noticia es que no se pierde. El Processor Expert tiene la suficiente
prudencia para no destruir las ISRs que podamos haber escrito. De otro modo se haría
muy engorroso corregir un error que podamos haber cometido al usar el Processor
Expert, pues deberíamos hacer un backup del archivo “MCUint.inc” para no perder lo
programado.

Descripción del programa.

Tenemos por delante la explicación de un programa temporizador, que arranca su
funcionamiento al oprimir SW1 y se detiene al tocar SW4; y el tiempo contado se
muestra en el LCD.

Observemos el comienzo del programa:

_Startup:
LDHX #RAMEnd+1

TXS

JSR MCU_init

Inicializamos el puntero de pila, SP, y llamamos a la subrutina MCUinit. Esta última,
como en todos los programas que explicamos, se encarga de inicializar todos los
dispositivos de acuerdo a lo pedido desde el Processor Expert. En este caso se
inicializarán los puertos para manejar el LCD y también las entradas de pulsador SW1
y SW4 para que funcionen con el módulo KBI.

Una característica particular de esta subrutina es que desenmascara las interrupciones.
Esto no siempre resulta edecuado, siendo en algunas situaciones preferible hacerlo en
otro punto del programa. Por ello enmascaramos las interrupciones nada mas retornar de
la rutina anterior:

.



SEI
BSET BACK_BIT,BACK_PORT

LDA
JSR

#2
lcd_control

JSR

ley_ini

Y a continuación inicializamos el LCD a 8 Bits y 2 renglones, para luego mostrar la
leyenda “TIEMPO CONTADO”. El paso siguiente es limpiar la variable banderas,
que contiene un flag llamado BLQT cuya función explicaremos mas adelante:

CLR banderas

BSET BLQT_BIT, BLQT_BYTE

CLR decimas

CLR seg_u
CLR seg_d

CLR min_u
CLR min_d

CLI

También ponemos a 0 las variables encargadas de llevar el tiempo; ya estamos en
condiciones de desenmascarar las interrupciones. En este punto del programa
presentamos el tiempo en el LCD:

ciclo_1:



LDA #$C0
JSR

lcd_control

LDA min_d
ADD #$30
JSR

lcd_dato

LDA min_u
ADD #$30
JSR lcd_dato

Ahora llega el momento de determinar si la cuenta debe ser incrementada o no. Para ello
usamos el bit BLQT que según su estado lógico cumple una función:

• Si BLQT está en “0” significa que el temporizador está corriendo, por lo tanto
la cuenta debe ser incrementada.

• Si BLQT está en “1” significa que el temporizador está detenido y en

consecuencia la cuenta no debe aumentar.

En el programa el uso de este bit es el siguiente:

ciclo_2:

BRSET BLQT_BIT,BLQT_BYTE,ciclo_2

Vemos que la ejecuación queda congelada mientras este bit se halle en “1”. Es el estado
inicial en el que se encuentra, pues fue llevado a ese estado durante la inicialización de
las variables. Puede surgir la duda de cómo sale este bit de ese estado si la ejecución del
programa queda encerada en la línea ciclo_2.

Por el momento diremos que una interrupción por KBI es la encargada de cambiar de
estado a este bit; ya nos acuparemos de ella. Por el momento aceptemos que por algún
mecanísmo el bit BLQT se hace “0”. En ese caso el programa continúa con lo
siguiente:

JSR

demora_100ms

INC

LDA
CBEQA

decimas
decimas
#$0a,aumenta_1

Esperamos 100 mili segundos, pues es la base de tiempo para incrementar las variables
que llevan la cuanta del t
  • Links de descarga
http://lwp-l.com/pdf11465

Comentarios de: Capítulo 3/6 - Puerto I/O - Curso sobre Microcontroladores (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad