21
Laboratorio de Procesamiento Digital de Señales Universidad Nacional de Córdoba NOTA DE APLICACIÓN Implementación de la multiplexación de displays en un Contador de Eventos sobre un microcontrolador MC68HC908JK1. por Martin Serra, LabDSP FCEFyN UNC supervisado por Ing. Diego Dujovne, LabDSP FCEFyN UNC Laboratorio de DSP – Universidad Nacional de Córdoba – Argentina Página 1/21 Introducción El siguiente trabajo se desarrolló con el fin de introducirse en la programación de microcontroladores de la familia HC908, en particular el modelo HC908JK1, a través de una aplicación sencilla pero de mucha utilidad, como lo es el multiplexado de displays. Esta aplicación se la implementó en un contador de eventos, que muestra los resultados en 5 displays de 7 segmentos. El modelo utilizado (HC908JK1) es el más pequeño de la familia, pero logra adaptarse en forma justa a los requerimientos en la cantidad de puertos, por lo que su precio económico lo hace ideal para aplicaciones donde no haya mayores requerimientos de hardware que los de los displays. Características El Contador de Eventos a pesar de haber sido realizado sobre un microcontrolador HC908JK1, puede ser fácilmente adaptado para cualquier otro modelo superior de la misma familia. Se trata de un programa que cuenta la cantidad de flancos ascendentes que se producen por segundo sobre el pin 4 del puerto D y la muestra a través de 5 displays de 7 segmentos en Hertz. Para poder contar el número de flancos que se producen, se utilizó la función de Captura de Entrada como un generador de interrupciones. Cabe destacar que originalmente esta función provista por el microcontrolador no solo permite generar interrupciones sino que además cuenta la cantidad de pulsos de clock entre eventos. Aquí se lo utilizó en forma parcial en reemplazo del pin de IRQ, para aprender a configurar esta función.

Contador de Eventos - facultad.efn.uncor.edu

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

NOTA DE APLICACIÓN

Implementación de la multiplexación de displays en un Contador deEventos sobre un microcontrolador MC68HC908JK1.

por Martin Serra, LabDSP FCEFyN UNC supervisado porIng. Diego Dujovne, LabDSP FCEFyN UNC

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 1/21

Introducción

El siguiente trabajo se desarrolló con el fin de introducirse en laprogramación de microcontroladores de la familia HC908, en particular el modeloHC908JK1, a través de una aplicación sencilla pero de mucha utilidad, como lo esel multiplexado de displays. Esta aplicación se la implementó en un contador deeventos, que muestra los resultados en 5 displays de 7 segmentos.

El modelo utilizado (HC908JK1) es el más pequeño de la familia, pero lograadaptarse en forma justa a los requerimientos en la cantidad de puertos, por loque su precio económico lo hace ideal para aplicaciones donde no haya mayoresrequerimientos de hardware que los de los displays.

Características

El Contador de Eventos a pesar de haber sido realizado sobre unmicrocontrolador HC908JK1, puede ser fácilmente adaptado para cualquier otromodelo superior de la misma familia.

Se trata de un programa que cuenta la cantidad de flancos ascendentes quese producen por segundo sobre el pin 4 del puerto D y la muestra a través de 5displays de 7 segmentos en Hertz.

Para poder contar el número de flancos que se producen, se utilizó la funciónde Captura de Entrada como un generador de interrupciones. Cabe destacar queoriginalmente esta función provista por el microcontrolador no solo permitegenerar interrupciones sino que además cuenta la cantidad de pulsos de clockentre eventos. Aquí se lo utilizó en forma parcial en reemplazo del pin de IRQ,para aprender a configurar esta función.

Page 2: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 2/21

Descripción General

La estructura general del programa responde al siguiente diagrama de flujo:

Una vez que las instrucciones de pre-procesamiento han sido ejecutadas, ylas variables junto con los registros inicializados, se entra en la rutina deLoop_Principal. Esta contiene una instrucción que salta a ella misma, en esperade alguna de las dos interrupciones posibles.

Cuando se detecta un flanco ascendente en el bit 4 del puerto D,correspondiente a la entrada de la función Captura de Entrada, se genera unainterrupción que accede a la rutina Captura. En esta rutina se incrementa en unouna variable de 16 bits llamada NEventos y se sale de la interrupción.

En forma paralela, el módulo de tiempo (TIM) se encuentra contando a lafrecuencia del clock del micro. Cuando la cuenta iguala a un valor cargado conanterioridad en el registro TMODH:TMODL, se produce lo que se denomina un″overflow” o desbordamiento y se genera una interrupción que llama a la rutinaMultDisp_&_Gate.

Esta rutina posee dos partes: Gate y Displays. La primera funciona comocompuerta: se encarga, cada un segundo, de colocar la cantidad de eventoscontados durante el último segundo, almacenados en NEventos, en la variablefrec y de borrar NEventos. Luego, esta variable es tomada por la segunda parte,Displays, convertida convenientemente al formato BCD y mostrada en el displayque corresponda.

Se debe notar que a la parte de Gate se accede solo cada un segundo. En elresto de los casos, se saltea esta parte y solo se ejecuta Displays, usando losvalores guardados con anterioridad en la variable frec.

De esta manera, la cuenta mostrada por los displays, se actualiza cada unsegundo con el número exacto de eventos contados por la rutina Captura.

Rutina de interrupcióndel TIM

Instrucciones de pre-procesamientoInicio

Loop Principal

Rutina deinterrupción de la

Captura de Entrada

Multiplexación dedisplays

Lacheo de lacantidad de

eventos

Page 3: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 3/21

Descripción cuantitativa de cada sección

Instrucciones de pre-procesamiento

RAMStart EQU $0080ROMStart EQU $F600 ;Defino vbles que indican las direcciones iniciales de memoria.VectorStart EQU $FFDE

$Include 'jl3regs.inc' ;Archivo que contiene direcciones de registros.

org RAMStart

**************************************************** Definición de variables ****************************************************

contador ds 1 ;Contador de la rutina resta.sustraen ds 2 ;sustraendo: vble de la rutina resta.dig1 ds 1 ;Vbles que contienen cada digito de la frecuencia medidadig2 ds 1 ;despues de la decodificacion BCD.dig3 ds 1dig4 ds 1dig5 ds 1NumAConv ds 2 ;Numero a Convertir: se carga el numero a convertir a BCD.NEventos ds 2 ;Numero de Eventos: cantidad de flancos contados.frec ds 2 ;Frecuencia: numero de eventos despues del tiempo de Gate.NInterrup ds 2 ;Numero de Interrupciones: veces que interrupmpe el TIM (a

;las 100 se entra en Gate).NDIsplay ds 1 ;Numero de dislpay a multiplexar.

Al comienzo del programa se definen tres variables con las direcciones dememoria de los comienzos de la RAM, ROM y vectores de interrupción.

La sentencia $Include 'jl3regs.inc' permite incluir este archivo en lacompilación, ya que contiene la dirección de todos los registros del micro para notener que definir la dirección de aquellos utilizados.

Luego se definen en la RAM todas las variables que se usarán en elprograma.

Page 4: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 4/21

Inicio

org ROMstart

Inicio: rsp ;Reseteo stack pointer: SP ! 00FFbset 0,CONFIG1 ;Apago el COP.

clra ;Limpio acumulador y partes alta y baja del Index Register. clrx clrh

clr dig1 ;Limpio las variables. clr dig2 clr dig3 clr dig4

clr dig5 clr NEventos clr NEventos+1 clr frec clr frec+1

mov #$01,NInterrup ;Numero luego del cual se ejecutare al rutina Gate mov #$F4,NInterrup+1 ;(500).

mov #!6,NDisplay ;Numero del display a activar. mov #%11111111,DDRB ;Seteo puerto B como salida para mandar info al display. mov #%11101111,DDRD ;Seteo puerto D como salida para controlar los displays,

;excepto bit 4 que sirve de entrada de señal a medir. mov #%01010000,TSC ;Seteo el TIM para que el contador se incremente con

;una frecuencia de (Internal BusClk % 1). mov #$1C,TMODH ;Cargo el numero (7372) hasta el cual contara el TIM antes mov #$CC,TMODL ;de interrumpir para contar la cantidad de eventos (tiempo

;de Gate) y multiplexar displays. mov #%01000100,TSC0 ;Seteo el canal 0 del TIM para capturar la entrada en el

;flanco ascendente de la señal.

cli ;Activo interrupciones.

En este bloque se configuran los módulos a utilizar por medio de susrespectivos registros:

• la instrucción rsp inicializa el stack pointer, situando el mismo en la dirección$00FF para mantener la compatibilidad de código con los modelos HC05. Estose debe a que en la mayoría de los HC05 la RAM se extiende solo hasta$00FF, no siendo así en la mayoría de los HC08, en donde la memoriaexcede la dirección $00FF. Se debe tener en cuenta que el Stack Pointercontiene la dirección superior de la pila, por lo que la dirección de la mismadecrece con cada dato nuevo que se introduzca;

Page 5: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 5/21

• se setea en uno el bit 0 del registro CONFIG1, llamado COPD, paradeshabilitar el COP (Computer Operating Properly);

• se inicializan las variables antes definidas, colocando algunas en cero;

Debido a la necesidad de manejar números mayores a 255, se deben utilizarvariables, o lugares de memoria, de 16 bits, que permiten almacenar hasta elnúmero 65535. Sin embargo, como el microcontrolador junto con todo su set deinstrucciones es de 8 bits, se deben separar a las variables de 16 bits en dospartes de 8 bits cada una: el byte superior y el inferior. De esta manera, cadaparte de la variable larga puede ser tratada con las instrucciones de 8 bits.

Como se sabe, el nombre de la variable no es más que una etiqueta queindica un lugar de memoria de 8 bits. Cuando se manejan variables de 16 bits,esta etiqueta indicará el lugar de memoria de 8 bits más bajo de la variable de16 bits. Esta posición de memoria corresponde a la parte alta de la variable de16 bits, es decir, el byte superior. Para hacer referencia a la parte baja de lavariable larga (el byte inferior), se le deberá sumar 1 byte a la direcciónapuntada por la etiqueta de la variable, a través del operando “+”.

Por ejemplo, en la sección de Inicio, NInterrup hace referencia a la partealta de la variable, mientras que Ninterrup+1 se refiere a la parte baja. De estamanera, cada byte de la variable larga, puede ser tratado como una variableindependiente de 1 byte.

• se configura el puerto B como salida para mandar los datos a los displays,cargando %11111111 en el registro Data Direction Register B (DDRB); y elpuerto D también como salida para controlar la activación de cada displaymediante el registro DDRD, excepto el bit 4 que corresponde a la entrada dela Captura de Entrada;

• se configura el módulo de tiempo (TIM):

Primero se carga el registro TSC:

colocando TOIE en 1, lo que habilita la generación de interrupciones porparte del TIM; TSTOP en 0, lo que habilita la cuenta; TRST en 1, para limpiarla cuenta y comenzar a contar desde $000; y [PS2:PS0] en %000 para queel contador se incremente a la frecuencia del bus interno del micro, es decir,que el pre-scaler divida esta frecuencia por uno.

Page 6: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 6/21

Luego, se carga en los registros TMODH:TMODL el número hasta elcual contará el TIM antes de generar el pedido interrupción, de forma tal queeste pedido se produzca con una frecuencia de 500Hz (2 mseg). El númerose calcula teniendo en cuenta que la frecuencia del bus interno del micro esun cuarto de la frecuencia del clock externo, y que el pre-scaler del TIM nomodifica este valor:

Finalmente, se carga el registro correspondiente al canal 1 del TIM,para configurar la Captura de Entrada:

colocando CH0IE en 1, para habilitar la generación de interrupciones; y[MS0A:ELS0B:ELS0A] en %001 para que la captura de entrada se produzcaen el flanco ascendente de la señal de entrada.

Loop Principal

Loop_Principal: bra Loop_Principal ;Espero interrupciones.

( )

=

4

1

1

clock

ONINTERRUPCITMODF

F

CCCTMOD 1$7372 ≡≅

×−=

41075.14 6_002,0

1

HzsegTMOD

( )ONINTERRUPCITMODclock FF 1

1

4−

=⋅

Page 7: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 7/21

Consiste en un bucle (loop) infinito, que no realiza ninguna operación fuerade la de salto, en donde se espera que se presenten alguna de los dosinterrupciones posibles.

Rutina de interrupción del TIM: Multiplexado de Displays y Gate

MultDisp_&_Gate:dec NInterrup+1 ;Decremento en uno la vble NInterrup.bne a ;Si no es cero, salteo la rutina Gate, en caso

lda NInterrup ;contrario, entro a Gate. cbeqa #$00,a dec NInterrup dec NInterrup+1

a: lda NInterrup+1 ora NInterrup

bne Displays

NEventos+1 --> frec+10 --> NEventos+1

NInterrup:NInterrup+1=0

500 -->NInterrup:NInterrup+1

NEventos --> frec0 --> NEventos

Si

dec NDisplay

NDisplay = 5Si Conversión a

BCD

No

frec:frec+1 Dig5 Dig5 --> PTB Selección deDISPLAY5

.

.

.

.

Dig1 --> PTB Selección deDISPLAY1Dig1 6 --> NDisplay Salir

No

Conversión aBCD

NDisplay = 4Si Conversión a

BCD

No

frec:frec+1 Dig4 Dig4 --> PTB Selección deDISPLAY4

NDisplay = 3Si Conversión a

BCD

No

frec:frec+1 Dig3 Dig3 --> PTB Selección deDISPLAY3

NDisplay = 2Si Conversión a

BCD

No

frec:frec+1 Dig2 Dig2 --> PTB Selección deDISPLAY2

frec:frec+1

Page 8: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 8/21

Para decrementar la variable de 16 bits NInterrup, que se carga con 500 enInicio, se decrementa primero la parte baja (NInterrup+1) hasta hacerla cero.Recién cuando esta es cero, se decrementa la parte alta (NInterrup) junto con labaja nuevamente. Mientras que las partes alta y baja de NInterrup no sean iguala cero simultáneamente, se salta directamente a la parte de los displays,salteando Gate.

Gate: mov NEventos,frec ;Muevo la vble NEventos a frec. mov NEventos+1,frec+1 clr NEventos ;Limpio NEventos. clr NEventos+1 mov #$01,NInterrup ;Cargo nuevamente NInterrup con 500. mov #$F4,NInterrup+1

Se mueven partes alta y baja de NEventos a frec y se recarga NEventos conel valor original. La variable frec contiene los datos, en formato hexadecimal,que serán utilizados por Displays para ser mostrados en los displays.

Displays: dec NDisplay ;Decremento NDisplay y verifico que display lda NDisplay ;corresponde multiplexar. cbeqa #!5,Displ5 cbeqa #!4,Displ4 cbeqa #!3,Displ3 cbeqa #!2,Displ2 cbeqa #!1,Displ1

Displ5: mov frec,NumAConv ;Cargo en la rutina de la resta la cantidad de eventos mov frec+1,NumAConv+1 ;hasta el momento. mov #$27,sustraen ;Cargo partes alta y baja de 10000 mov #$10,sustraen+1 ;(sustraen:sustraen+1). jsr Conversion_BCD ;Salto a rutina Resta. mov contador,dig5 ;Coloco en dig5 el resultado de la rutina Resta. ldx dig5 ;Busco en la posición dig5 de la tabla, la combinación que lda Tabla7seg,x ;corresponde a ese numero y la cargo en el acumulador.

mov #%00000100,PTD;Controlo la activación del display 5 con el bit 2 del puerto D. sta PTB ;Paso el acumulador a la salida del puerto B. bra Salida_Disp

Displ4: mov #$03,sustraen ;Cargo partes alta y baja de 1000 mov #$E8,sustraen+1 ;(sustraen:sustraen+1). jsr Conversion_BCD ;Salto a rutina Resta. mov contador,dig4 ;Coloco en dig4 el resultado de la rutina Resta. ldx dig4 lda Tabla7seg,x mov #%00001000,PTD ;Idem pero para el display 4, utilizando el bit 3 sta PTB ;del puerto D. bra Salida_Disp

Page 9: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 9/21

Displ3: mov #$00,sustraen ;Cargo partes alta y baja de 100 mov #$64,sustraen+1 ;(sustraen:sustraen+1). jsr Conversion_BCD ;Salto a rutina Resta. mov contador,dig3 ;Coloco en dig3 el resultado de la rutina Resta. ldx dig3 lda Tabla7seg,x mov #%00100000,PTD ;Idem pero para el display 3, utilizando el bit 4 sta PTB ;del puerto D. bra Salida_Disp

Displ2: mov #$00,sustraen ;Cargo partes alta y baja de 10 mov #$0A,sustraen+1 ;(sustraen:sustraen+1) jsr Conversion_BCD ;Salto a rutina Resta. mov contador,dig2 ;Coloco en dig2 el resultado de la rutina Resta. ldx dig2 lda Tabla7seg,x mov #%01000000,PTD ;Idem pero para el display 2, utilizando el bit 5 sta PTB ;del puerto D. bra Salida_Disp

Displ1: mov NumAConv+1,dig1 ;Coloco en dig1 el ultimo digito del numero a convertir. ldx dig1 lda Tabla7seg,x mov #%10000000,PTD ;Idem pero para el display 1, utilizando el bit 6 sta PTB ;del puerto D. mov #!6,NDisplay

Salida_Disp:bclr 7,TSC ;Limpio el bit TOF del registro de control del TIM rti ;para habilitar nuevas interrupciones.

La variable NDisplay contiene el número de display a activar. Al comienzo dela rutina, se compara este valor y se salta a la parte de la misma quecorresponda al display seleccionado (Displx).

Una vez adentro, se carga en sustraen la unidad decimal del orden que lecorresponde al display, lo cual es pasado a la subrutina Conversión_BCD. Estasubrutina devuelve, a través de la variable contador, el número decimalcorrespondiente al display a activar. Este número, después de ser transferido adigx (donde x corresponde al número de display a activar), es cargado en laparte baja del registro Index Register (Registro de Indice) usando tax. Luego,este valor almacenado en el registro se usa para indicar la posición de la tablaTabla7seg que contiene la codificación en formato 7 segmentos que correspondeal número a mostrar en el display. Esta codificación se carga en el acumuladorutilizando la instrucción lda Tabla7seg,x.

Finalmente, se coloca en el puerto D la combinación adecuada para permitirel encendido de los leds del display que corresponda y en el puerto B el númeroa mostrar en formato 7 segmentos. Se debe notar que este programa fuediseñado para displays del tipo ánodo común.

Page 10: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 10/21

La variable NumAConv es la que contiene en formato hexadecimal el númeroque será convertido por la rutina Conversión_BCD en cada display. Esta variablese carga con la cantidad de eventos únicamente en la parte Displ5 de Gate, y esmodificada después de cada conversión. Recordemos que la cuenta había sidocolocada en la variable frec por Gate. En Displ1 no se llama a la subrutina deconversión, debido a que el resto de la conversión anterior, que se guardó enNumAConv, corresponde al último dígito en formato decimal.

La rutina finaliza limpiando el bit 7 del registro TSC (TOF) para habilitarnuevas interrupciones.

Conversion_BCD:clr contador

Repite: lda NumAConv+1 sub sustraen+1 sta NumAConv+1 bcc Massigni dec NumAConv

Massigni: lda NumAConv sub sustraen sta NumAConv bmi Salida_Resta inc contador bra Repite

Salida_Resta: lda NumAConv+1 add sustraen+1 sta NumAConv+1 lda NumAConv adc sustraen sta NumAConv

rts

Page 11: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 11/21

El principio de funcionamiento de la conversión se basa en restarle al númeroa convertir (contenida en la variable NumAConv) la unidad decimal del ordencorrespondiente al display a activar, en forma sucesiva hasta obtener unresultado negativo. La unidad decimal del orden correspondiente se almacena enla variable sustraen, dentro de Displays. Cada vez que el resultado es positivo,se incrementa en uno la variable contador, se almacena el resultado enNumAConv y se vuelve a realizar la resta, utilizando ahora el resultado de laresta anterior guardado en NumAConv. Cuando el resultado de la operación seanegativo, se deshace la última resta, es decir, se le suma a NumAConv lo que sele había restado en la última operación (sustraen), sin incrementar contador. Esdespués de un resultado negativo que se sale de la subrutina.

(NumAConv+1) - (sustraen+1) --> (NumAConv+1)

Carry = 0

(NumAConv) - 1 --> (NumAConv)

(NumAConv) - (sustraen) --> (numaconv)

Negative = 1 (NumAConv+1) + (sustraen+1) --> (NumAConv+1

(NumAConv) + (sustraen) --> (numaconv)(contador) + 1 --> (contador)

Salida

Si

No

Si

No

Page 12: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 12/21

Rutina de interrupción de la Captura de Entrada: Captura

Captura: inc NEventos+1 ;Incremento en uno la vble NEventos. bne f inc NEventosf: bclr 7,TSC0 ;Limpio el bit TOF para permitir nuevas interrupciones. rti

Como ya se mencionó con anterioridad, la función de esta rutina es la deincrementar en uno la variable de 16 bits NEventos cada vez que se produzca unflanco ascendente en el bit 4 del puerto D. De este manera, va almacenando lacantidad de eventos producidos a partir del último Gate.

Para realizar esto, se divida a la variable en sus dos partes de 8 bits,incrementándose siempre primero la parte baja (NEventos+1), y luegoverificando si se ha hecho cero. En caso de producirse esto último, es que se hancontado 16 eventos (F en hexadecimal), y se debe incrementar en uno la partealta de la variable (NEventos).

inc NEventos+1

NEventos+1=0

inc NEventos

Salida

Si

No

Page 13: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 13/21

Conclusión

La idea fundamental de este ejemplo fue la de permitir la familiarizacióncon la programación de esta nueva línea de microcontroladores, los HC08. Apesar de ser visiblemente más potentes que sus antecesores (los HC05), suforma de programación se ha mantenido prácticamente intacta. Sólo existenpequeñas diferencias en algunas instrucciones que hacen referenciaespecíficamente a recursos más potentes.

En este programa se intentaron implementar aquellos recursos del microque aparecen en prácticamente cualquier tipo de aplicación, como son el TimerInterface Module, los puertos como entradas y salidas, las interrupcionesvectorizadas, el manejo de las interrupciones, etc. Esto permitió mostrar la formaen que deben ser programados sus registros, el significado de sus bits másimportante y la forma de calcular los valores de los contadores para obtener lasfrecuencias deseadas. Cabe destacar que estos puntos son específicos de estamarca de microcontroladores.

Por otro lado, se repasaron algunas técnicas básicas de programación.Estas últimas son, en su mayoría, universales para cualquier línea demicrocontroladores. Se destacan dentro de estas técnicas: el manejo de valoresmayores a 8 bits, la multiplexación de displays, indexación de tabla, conversiónde formato binario a BCD y BCD a 7 segmentos, etc.

Hardware utilizado

Hardwarepropio

E-FLASH 08

Page 14: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 14/21

Bibliografía

• TECHNICAL DATA - MC68HC908JK1/JK3/JL3 (HCMOS MicrocontrollerUnit) de MOTOROLA.

• TIM08 - Timer Interface Module (Reference Manual) de MOTOROLA.• CENTRAL PROCESSOR UNIT (Reference Manual) de MOTOROLA.• E-FLASH 08 - Manual del usuario – de Electrocomponentes S.A.• CASM08Z - 68HC08 Assembler Help de P&E Microcomputer Systems.

Agradecimientos

Agradecemos la colaboración de Motorola por el apoyo ofrecido alLaboratorio y, en este caso, por el aporte de la bibliografía aquí utilizada.

Además, agradecemos a la empresa Electrocomponentes S.A. que nosbrindó la placa de emulación en circuito con los programas correspondientespara el uso de la misma, permitiéndonos así, programar, simular y emularnuestros proyectos. Dichos programas son, respectivamente, WINIDE v1.2,CASM08Z v3.16, ICD08SZ v1.32, ICS08JLZ v1.32 y PROG08SZ, todos de P&EMicrocomputer Systems, Inc.

Page 15: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 15/21

Archivo List File del programaContador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 1

1 0000 2 RAMStart EQU $0080 0000 3 ROMStart EQU $F600 0000 4 VectorStart EQU $FFDE 5 6 0000 7 $Include 'jl3regs.inc' 8 ; 68HC908JL3, 68HC908JK3, 68HC908JK1 Equates 9 0000 10 PTA EQU $0000 ; Ports and data direction 0000 11 PORTA EQU $0000 0000 12 PTB EQU $0001 0000 13 PORTB EQU $0001 0000 14 PTD EQU $0003 0000 15 PORTD EQU $0003 16 0000 17 DDRA EQU $0004 0000 18 DDRB EQU $0005 0000 19 DDRD EQU $0007 20 0000 21 PDCR EQU $000A 0000 22 PTAUE EQU $000D 23 0000 24 INTKBSR EQU $001A ; IRQ & Keyboard 0000 25 KBSCR EQU $001A 0000 26 INTKBIER EQU $001B 0000 27 KBIER EQU $001B 28 0000 29 INTSCR EQU $001D 30 0000 31 CONFIG1 EQU $001F ; System configuration register 0000 32 CONFIG2 EQU $001E ; System configuration register 33 0000 34 TSC EQU $0020 ; Timer 0000 35 TCNTH EQU $0021 0000 36 TCNTL EQU $0022 0000 37 TMODH EQU $0023 0000 38 TMODL EQU $0024 0000 39 TSC0 EQU $0025 0000 40 TCH0H EQU $0026 0000 41 TCH0L EQU $0027 0000 42 TSC1 EQU $0028 0000 43 TCH1H EQU $0029 0000 44 TCH1L EQU $002A 45 0000 46 ADSCR EQU $003C ; ADC Converter 0000 47 ADR EQU $003D 0000 48 ADCLK EQU $003E 49 50 0000 51 BSR EQU $FE00 ; SIM Module 0000 52 RSR EQU $FE01 0000 53 BFCR EQU $FE03 54 0000 55 FLCR EQU $FE08 ; Flash control

Page 16: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 16/21

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 2

0000 56 FLSPR EQU $FE09 0000 57 FLTCR EQU $FE0A 58 0000 59 BRKH EQU $FE0C ; Break control 0000 60 BRKL EQU $FE0D 0000 61 BSCR EQU $FE0E 62 0000 63 INT1 EQU $FE04 ; Interrupt Status 0000 64 INT2 EQU $FE05 0000 65 INT3 EQU $FE06 66 0000 67 COPCTL EQU $FFFF ; COP control register 68 69 ;(C)opywrite P&E Microcomputer Systems, 1999 70 ; You may use this code freely as long as this copyright notice 71 ; is included. 72 73 74 0080 75 org RAMStart 76 77 *************************************************** 78 * Definición de variables * 79 *************************************************** 80 0080 81 contador ds 1 0081 82 sustraen ds 2 0083 83 dig1 ds 1 0084 84 dig2 ds 1 0085 85 dig3 ds 1 0086 86 dig4 ds 1 0087 87 dig5 ds 1 0088 88 NumAConv ds 2 008A 89 NEventos ds 2 008C 90 frec ds 2 008E 91 NInterrup ds 2 0090 92 NDIsplay ds 1 93 94 F600 95 org ROMstart 96 F600 [01] 9C 97 Inicio: rsp F601 [04] 101F 98 bset 0,CONFIG1 F603 [01] 4F 99 clra

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 3

F604 [01] 5F 100 clrx F605 [01] 8C 101 clrh F606 [03] 3F83 102 clr dig1. F608 [03] 3F84 103 clr dig2 F60A [03] 3F85 104 clr dig3 F60C [03] 3F86 105 clr dig4 F60E [03] 3F87 106 clr dig5 F610 [03] 3F8A 107 clr NEventos F612 [03] 3F8B 108 clr NEventos+1 F614 [03] 3F8C 109 clr frec F616 [03] 3F8D 110 clr frec+1 111

Page 17: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 17/21

F618 [04] 6E018E 112 mov #$01,NInterrup F61B [04] 6EF48F 113 mov #$F4,NInterrup+1 F61E [04] 6E0690 114 mov #!6,NDisplay F621 [04] 6EFE05 115 mov #%11111110,DDRB. F624 [04] 6EEF07 116 mov #%11101111,DDRD 117 F627 [04] 6E5020 118 mov #%01010000,TSC 119 F62A [04] 6E1C23 120 mov #$1C,TMODH F62D [04] 6ECC24 121 mov #$CC,TMODL F630 [04] 6E4425 122 mov #%01000100,TSC0 123

124 F633 [02] 9A 125 cli 126 127 Loop_Principal: F634 [03] 20FE 128 bra Loop_Principal 129 130 131 ***************************************************************** 132 * Rutina de interrupción del TIM: * 133 * se multiplexan los displays y * 134 * se captura la cuenta de eventos cada 500 entradas * 135 ***************************************************************** 136

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 4

137 MultDisp_&_Gate: 138F636 [04] 3A8F 139 dec NInterrup+1F638 [03] 2609 140 bne aF63A [03] B68E 141 lda NInterrupF63C [04] 410004 142 cbeqa #$00,aF63F [04] 3A8E 143 dec NInterrupF641 [04] 3A8F 144 dec NInterrup+1F643 [03] B68F 145 a: lda NInterrup+1F645 [03] BA8E 146 ora NInterrupF647 [03] 2610 147 bne Displays 148 149 **************************************************** 150 * Ruitna de Gate: * 151 * se captura la cuenta de los eventos * 152 **************************************************** 153F649 [05] 4E8A8C 154 Gate: mov NEventos,frecF64C [05] 4E8B8D155 mov NEventos+1,frec+1F64F [03] 3F8A 156 clr NEventosF651 [03] 3F8B 157 clr NEventos+1F653 [04] 6E018E 158 mov #$01,NInterrupF656 [04] 6EF48F 159 mov #$F4,NInterrup+1 160 161 **************************************************** 162 * Rutina para multiplexar displays * 163 **************************************************** 164F659 [04] 3A90 165 Displays: dec NDisplayF65B [03] B690 166 lda NDisplayF65D [04] 41050C 167 cbeqa #!5,Displ5F660 [04] 410427 168 cbeqa #!4,Displ4F663 [04] 41033C 169 cbeqa #!3,Displ3

Page 18: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 18/21

F666 [04] 410251 170 cbeqa #!2,Displ2F669 [04] 410166 171 cbeqa #!1,Displ1F66C [05] 4E8C88 172 Displ5: mov frec,NumAConvF66F [05] 4E8D89 173 mov frec+1,NumAConv+1F672 [04] 6E2781 174 mov #$27,sustraenF675 [04] 6E1082 175 mov #$10,sustraen+1

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 5

F678 [05] CDF6E5 176 jsr Conversion_BCDF67B [05] 4E8087 177 mov contador,dig5F67E [03] BE87 178 ldx dig5F680 [04] D6F713 179 lda Tabla7seg,xF683 [04] 6E0403 180 mov #%00000100,PTDF686 [03] B701 181 sta PTBF688 [03] 2058 182 bra Salida_DispF68A [04] 6E0381 183 Displ4: mov #$03,sustraenF68D [04] 6EE882 184 mov #$E8,sustraen+1F690 [05] CDF6E5 185 jsr Conversion_BCDF693 [05] 4E8086 186 mov contador,dig4F696 [03] BE86 187 ldx dig4F698 [04] D6F713 188 lda Tabla7seg,xF69B [04] 6E0803 189 mov #%00001000,PTDF69E [03] B701 190 sta PTBF6A0 [03] 2040 191 bra Salida_DispF6A2 [04] 6E0081 192 Displ3: mov #$00,sustraenF6A5 [04] 6E6482 193 mov #$64,sustraen+1F6A8 [05] CDF6E5 194 jsr Conversion_BCDF6AB [05] 4E8085 195 mov contador,dig3F6AE [03] BE85 196 ldx dig3F6B0 [04] D6F713 197 lda Tabla7seg,xF6B3 [04] 6E2003 198 mov #%00100000,PTDF6B6 [03] B701 199 sta PTBF6B8 [03] 2028 200 bra Salida_DispF6BA [04] 6E0081 201 Displ2: mov #$00,sustraenF6BD [04] 6E0A82 202 mov #$0A,sustraen+1F6C0 [05] CDF6E5 203 jsr Conversion_BCDF6C3 [05] 4E8084 204 mov contador,dig2F6C6 [03] BE84 205 ldx dig2F6C8 [04] D6F713 206 lda Tabla7seg,xF6CB [04] 6E4003 207 mov #%01000000,PTDF6CE [03] B701 208 sta PTB

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 6

F6D0 [03] 2010 209 bra Salida_DispF6D2 [05] 4E8983 210 Displ1: mov NumAConv+1,dig1F6D5 [03] BE83 211 ldx dig1F6D7 [04] D6F713 212 lda Tabla7seg,xF6DA [04] 6E8003 213 mov #%10000000,PTDF6DD [03] B701 214 sta PTBF6DF [04] 6E0690 215 mov #!6,NDisplayF6E2 [04] 1F20 216 Salida_Disp:bclr 7,TSCF6E4 [07] 80 217 rti 218 219 ************************************************************ 220 * Rutina de conversión de hexadecimal a BCD * 221 ************************************************************ 222 223 Conversion_BCD: F6E5 [03] 3F80 224 clr contador

Page 19: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 19/21

F6E7 [03] B689 225 Repite: lda NumAConv+1 F6E9 [03] B082 226 sub sustraen+1 F6EB [03] B789 227 sta NumAConv+1 F6ED [03] 2402 228 bcc Massigni F6EF [04] 3A88 229 dec NumAConv F6F1 [03] B688 230 Massigni: lda NumAConv F6F3 [03] B081 231 sub sustraen F6F5 [03] B788 232 sta NumAConv F6F7 [03] 2B04 233 bmi Salida_Resta F6F9 [04] 3C80 234 inc contador F6FB [03] 20EA 235 bra Repite 236 Salida_Resta: F6FD [03] B689 237 lda NumAConv+1 F6FF [03] BB82 238 add sustraen+1 F701 [03] B789 239 sta NumAConv+1 F703 [03] B688 240 lda NumAConv F705 [03] B981 241 adc sustraen F707 [03] B788 242 sta NumAConv F709 [04] 81 243 rts 244 245 246 *********************************************************** 247 * Rutina de interrupción de la captura de entrada * 248 *********************************************************** 249F70A [04] 3C8B 250 Captura: inc NEventos+1F70C [03] 2602 251 bne fF70E [04] 3C8A 252 inc NEventosF710 [04] 1F25 253 f: bclr 7,TSC0

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 7

F712 [07] 80 254 rti 255 256 257 ************************************************************** 258 * Tabla de decodificacion de BCD a 7 segmentos * 259 ************************************************************** 260 261 Tabla7seg: F713 7E 262 db %01111110 F714 0C 263 db %00001100 F715 B6 264 db %10110110 F716 9E 265 db %10011110 F717 CC 266 db %11001100 F718 DA 267 db %11011010 F719 F8 268 db %11111000 F71A 0E 269 db %00001110 F71B FE 270 db %11111110 F71C CE 271 db %11001110 F71D 7C 272 db %01111100 F71E F2 273 db %11110010 F71F EE 274 db %11101110 F720 E2 275 db %11100010 276 277 278 ******************************************************** 279 * Rutina de servicio de interrupción inservible * 280 ******************************************************** 281 282 dummy_isr:

Page 20: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 20/21

F721 [07] 80 283 rti 284 285 286 **************************************************** 287 * Vectores de interrupción * 288 * permite vectorizar las interrupciones * 289 **************************************************** 290 FFDE 291 org VectorStart 292 FFDE F721 293 dw dummy_isr FFE0 F721 294 dw dummy_isr FFE2 F721 295 dw dummy_isr FFE4 F721 296 dw dummy_isr FFE6 F721 297 dw dummy_isr

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 8

FFE8 F721 298 dw dummy_isrFFEA F721 299 dw dummy_isrFFEC F721 300 dw dummy_isrFFEE F721 301 dw dummy_isrFFF0 F721 302 dw dummy_isrFFF2 F636 303 dw MultDisp_&_GateFFF4 F721 304 dw dummy_isrFFF6 F70A 305 dw CapturaFFF8 F721 306 dw dummy_isrFFFA F721 307 dw dummy_isrFFFC F721 308 dw dummy_isrFFFE F600 309 dw Inicio 310 311 Symbol Table

A F643ADCLK 003EADR 003DADSCR 003CBFCR FE03BRKH FE0CBRKL FE0DBSCR FE0EBSR FE00CAPTURA F70ACONFIG1 001FCONFIG2 001ECONTADOR 0080CONVERSION_BCD F6E5COPCTL FFFFDDRA 0004DDRB 0005DDRD 0007DIG1 0083DIG2 0084DIG3 0085DIG4 0086DIG5 0087DISPL1 F6D2DISPL2 F6BADISPL3 F6A2DISPL4 F68A

Page 21: Contador de Eventos - facultad.efn.uncor.edu

Laboratorio deProcesamiento Digital de Señales

Universidad Nacional de Córdoba

Laboratorio de DSP – Universidad Nacional de Córdoba – ArgentinaPágina 21/21

DISPL5 F66CDISPLAYS F659DUMMY_ISR F721F F710FLCR FE08FLSPR FE09FLTCR FE0A

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 9

FREC 008CGATE F649INICIO F600INT1 FE04INT2 FE05INT3 FE06INTKBIER 001BINTKBSR 001AINTSCR 001DKBIER 001BKBSCR 001ALOOP_PRINCIPAL F634MASSIGNI F6F1MULTDISP_&_GATE F636NDISPLAY 0090NEVENTOS 008ANINTERRUP 008ENUMACONV 0088PDCR 000APORTA 0000PORTB 0001PORTD 0003PTA 0000PTAUE 000DPTB 0001PTD 0003RAMSTART 0080REPITE F6E7ROMSTART F600RSR FE01SALIDA_DISP F6E2SALIDA_RESTA F6FDSUSTRAEN 0081TABLA7SEG F713TCH0H 0026TCH0L 0027TCH1H 0029TCH1L 002ATCNTH 0021TCNTL 0022TMODH 0023TMODL 0024TSC 0020TSC0 0025TSC1 0028

VECTORSTART FFDE

Contacto del autor: [email protected]

Copyright © 2002 LabDSP FCEFyN UNC Córdoba, Argentina