Anda di halaman 1dari 21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba NOTA DE APLICACIN

Implementacin de la multiplexacin 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

Introduccin
El siguiente trabajo se desarroll con el fin de introducirse en la programacin de microcontroladores de la familia HC908, en particular el modelo HC908JK1, a travs de una aplicacin sencilla pero de mucha utilidad, como lo es el multiplexado de displays. Esta aplicacin se la implement en un contador de eventos, que muestra los resultados en 5 displays de 7 segmentos. El modelo utilizado (HC908JK1) es el ms pequeo de la familia, pero logra adaptarse en forma justa a los requerimientos en la cantidad de puertos, por lo que su precio econmico lo hace ideal para aplicaciones donde no haya mayores requerimientos de hardware que los de los displays.

Caractersticas
El Contador de Eventos a pesar de haber sido realizado sobre un microcontrolador HC908JK1, puede ser fcilmente 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 travs de 5 displays de 7 segmentos en Hertz. Para poder contar el nmero de flancos que se producen, se utiliz la funcin de Captura de Entrada como un generador de interrupciones. Cabe destacar que originalmente esta funcin provista por el microcontrolador no solo permite generar interrupciones sino que adems 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 funcin.

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 1/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Descripcin General
La estructura general del programa responde al siguiente diagrama de flujo:
Instrucciones de pre-procesamiento Inicio Loop Principal

Rutina de interrupcin del TIM

Rutina de interrupcin de la Captura de Entrada

Multiplexacin de displays

Lacheo de la cantidad de eventos

Una vez que las instrucciones de pre-procesamiento han sido ejecutadas, y las variables junto con los registros inicializados, se entra en la rutina de Loop_Principal. Esta contiene una instruccin que salta a ella misma, en espera de 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 funcin Captura de Entrada, se genera una interrupcin que accede a la rutina Captura. En esta rutina se incrementa en uno una variable de 16 bits llamada NEventos y se sale de la interrupcin. En forma paralela, el mdulo de tiempo (TIM) se encuentra contando a la frecuencia del clock del micro. Cuando la cuenta iguala a un valor cargado con anterioridad en el registro TMODH:TMODL, se produce lo que se denomina un overflow o desbordamiento y se genera una interrupcin que llama a la rutina MultDisp_&_Gate. Esta rutina posee dos partes: Gate y Displays. La primera funciona como compuerta: se encarga, cada un segundo, de colocar la cantidad de eventos contados durante el ltimo segundo, almacenados en NEventos, en la variable frec y de borrar NEventos. Luego, esta variable es tomada por la segunda parte, Displays, convertida convenientemente al formato BCD y mostrada en el display que corresponda. Se debe notar que a la parte de Gate se accede solo cada un segundo. En el resto de los casos, se saltea esta parte y solo se ejecuta Displays, usando los valores guardados con anterioridad en la variable frec. De esta manera, la cuenta mostrada por los displays, se actualiza cada un segundo con el nmero exacto de eventos contados por la rutina Captura.
Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 2/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Descripcin cuantitativa de cada seccin


Instrucciones de pre-procesamiento

RAMStart EQU $0080 ROMStart EQU $F600 VectorStart EQU $FFDE $Include 'jl3regs.inc' org RAMStart

;Defino vbles que indican las direcciones iniciales de memoria.

;Archivo que contiene direcciones de registros.

*************************************************** * Definicin de variables * *************************************************** contador sustraen dig1 dig2 dig3 dig4 dig5 NumAConv NEventos frec NInterrup NDIsplay ds 1 ds 2 ds 1 ds 1 ds 1 ds 1 ds 1 ds 2 ds 2 ds 2 ds 2 ds 1 ;Contador de la rutina resta. ;sustraendo: vble de la rutina resta. ;Vbles que contienen cada digito de la frecuencia medida ;despues de la decodificacion BCD.

;Numero a Convertir: se carga el numero a convertir a BCD. ;Numero de Eventos: cantidad de flancos contados. ;Frecuencia: numero de eventos despues del tiempo de Gate. ;Numero de Interrupciones: veces que interrupmpe el TIM (a ;las 100 se entra en Gate). ;Numero de dislpay a multiplexar.

Al comienzo del programa se definen tres variables con las direcciones de memoria de los comienzos de la RAM, ROM y vectores de interrupcin. La sentencia $Include 'jl3regs.inc' permite incluir este archivo en la compilacin, ya que contiene la direccin de todos los registros del micro para no tener que definir la direccin de aquellos utilizados. Luego se definen en la RAM todas las variables que se usarn en el programa.

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 3/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Inicio

org ROMstart Inicio: rsp bset 0,CONFIG1 clra clrx clrh clr dig1 clr dig2 clr dig3 clr dig4 clr dig5 clr NEventos clr NEventos+1 clr frec clr frec+1 ;Reseteo stack pointer: SP ! 00FF ;Apago el COP. ;Limpio acumulador y partes alta y baja del Index Register.

;Limpio las variables.

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 seal 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 seal. cli ;Activo interrupciones.

En este bloque se configuran los mdulos a utilizar por medio de sus respectivos registros: la instruccin rsp inicializa el stack pointer, situando el mismo en la direccin $00FF para mantener la compatibilidad de cdigo con los modelos HC05. Esto se debe a que en la mayora de los HC05 la RAM se extiende solo hasta $00FF, no siendo as en la mayora de los HC08, en donde la memoria excede la direccin $00FF. Se debe tener en cuenta que el Stack Pointer contiene la direccin superior de la pila, por lo que la direccin de la misma decrece con cada dato nuevo que se introduzca;
Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 4/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

se setea en uno el bit 0 del registro CONFIG1, llamado COPD, para deshabilitar el COP (Computer Operating Properly); se inicializan las variables antes definidas, colocando algunas en cero;

Debido a la necesidad de manejar nmeros mayores a 255, se deben utilizar variables, o lugares de memoria, de 16 bits, que permiten almacenar hasta el nmero 65535. Sin embargo, como el microcontrolador junto con todo su set de instrucciones es de 8 bits, se deben separar a las variables de 16 bits en dos partes de 8 bits cada una: el byte superior y el inferior. De esta manera, cada parte de la variable larga puede ser tratada con las instrucciones de 8 bits. Como se sabe, el nombre de la variable no es ms que una etiqueta que indica un lugar de memoria de 8 bits. Cuando se manejan variables de 16 bits, esta etiqueta indicar el lugar de memoria de 8 bits ms bajo de la variable de 16 bits. Esta posicin de memoria corresponde a la parte alta de la variable de 16 bits, es decir, el byte superior. Para hacer referencia a la parte baja de la variable larga (el byte inferior), se le deber sumar 1 byte a la direccin apuntada por la etiqueta de la variable, a travs del operando +. Por ejemplo, en la seccin de Inicio, NInterrup hace referencia a la parte alta de la variable, mientras que Ninterrup+1 se refiere a la parte baja. De esta manera, cada byte de la variable larga, puede ser tratado como una variable independiente 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 el puerto D tambin como salida para controlar la activacin de cada display mediante el registro DDRD, excepto el bit 4 que corresponde a la entrada de la Captura de Entrada; se configura el mdulo de tiempo (TIM): Primero se carga el registro TSC:

colocando TOIE en 1, lo que habilita la generacin de interrupciones por parte del TIM; TSTOP en 0, lo que habilita la cuenta; TRST en 1, para limpiar la cuenta y comenzar a contar desde $000; y [PS2:PS0] en %000 para que el contador se incremente a la frecuencia del bus interno del micro, es decir, que el pre-scaler divida esta frecuencia por uno.
Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 5/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Luego, se carga en los registros TMODH:TMODL el nmero hasta el cual contar el TIM antes de generar el pedido interrupcin, de forma tal que este pedido se produzca con una frecuencia de 500Hz (2 mseg). El nmero se calcula teniendo en cuenta que la frecuencia del bus interno del micro es un cuarto de la frecuencia del clock externo, y que el pre-scaler del TIM no modifica este valor:

Fclock 4

TMOD =

(FINTERRUPCION )

(FINTERRUPCION ) TMOD =
Fclock 4
0,002 _ seg
1

TMOD =

14.7510 6 Hz 4

TMOD 7372 $1CCC

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

colocando CH0IE en 1, para habilitar la generacin de interrupciones; y [MS0A:ELS0B:ELS0A] en %001 para que la captura de entrada se produzca en el flanco ascendente de la seal de entrada. Loop Principal

Loop_Principal: bra Loop_Principal

;Espero interrupciones.

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 6/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Consiste en un bucle (loop) infinito, que no realiza ninguna operacin fuera de la de salto, en donde se espera que se presenten alguna de los dos interrupciones posibles. Rutina de interrupcin del TIM: Multiplexado de Displays y Gate

NInterrup:NInterrup+1 =0

Si

NEventos+1 --> frec+1 0 --> NEventos+1

NEventos --> frec 0 --> NEventos

500 --> NInterrup:NInterrup+1

No

dec NDisplay

NDisplay = 5
No

Si

frec:frec+1

Conversin a BCD

Dig5

Dig5 --> PTB

Seleccin de DISPLAY5

. . NDisplay = 4 . .
No

Si

frec:frec+1

Conversin a BCD

Dig4

Dig4 --> PTB

Seleccin de DISPLAY4

NDisplay = 3

Si

frec:frec+1

Conversin a BCD

Dig3

Dig3 --> PTB

Seleccin de DISPLAY3

No

NDisplay = 2

Si

frec:frec+1

Conversin a BCD

Dig2

Dig2 --> PTB

Seleccin de DISPLAY2

frec:frec+1

No

Conversin a BCD

Dig1

Dig1 --> PTB

Seleccin de DISPLAY1

6 --> NDisplay

Salir

MultDisp_&_Gate: dec NInterrup+1 bne a lda NInterrup cbeqa #$00,a dec NInterrup dec NInterrup+1 a: lda NInterrup+1 ora NInterrup bne Displays

;Decremento en uno la vble NInterrup. ;Si no es cero, salteo la rutina Gate, en caso ;contrario, entro a Gate.

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 7/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Para decrementar la variable de 16 bits NInterrup, que se carga con 500 en Inicio, se decrementa primero la parte baja (NInterrup+1) hasta hacerla cero. Recin cuando esta es cero, se decrementa la parte alta (NInterrup) junto con la baja nuevamente. Mientras que las partes alta y baja de NInterrup no sean igual a cero simultneamente, se salta directamente a la parte de los displays, salteando Gate.

Gate:

mov NEventos,frec mov NEventos+1,frec+1 clr NEventos clr NEventos+1 mov #$01,NInterrup mov #$F4,NInterrup+1

;Muevo la vble NEventos a frec. ;Limpio NEventos. ;Cargo nuevamente NInterrup con 500.

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

Displays:

dec NDisplay lda NDisplay cbeqa #!5,Displ5 cbeqa #!4,Displ4 cbeqa #!3,Displ3 cbeqa #!2,Displ2 cbeqa #!1,Displ1

;Decremento NDisplay y verifico que display ;corresponde multiplexar.

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 posicin dig5 de la tabla, la combinacin que lda Tabla7seg,x ;corresponde a ese numero y la cargo en el acumulador. mov #%00000100,PTD;Controlo la activacin del display 5 con el bit 2 del puerto D. sta PTB ;Paso el acumulador a la salida del puerto B. bra Salida_Disp 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

Displ4:

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 8/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

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 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 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 ;Limpio el bit TOF del registro de control del TIM ;para habilitar nuevas interrupciones.

Displ2:

Displ1:

Salida_Disp:bclr 7,TSC rti

La variable NDisplay contiene el nmero de display a activar. Al comienzo de la rutina, se compara este valor y se salta a la parte de la misma que corresponda al display seleccionado (Displx). Una vez adentro, se carga en sustraen la unidad decimal del orden que le corresponde al display, lo cual es pasado a la subrutina Conversin_BCD. Esta subrutina devuelve, a travs de la variable contador, el nmero decimal correspondiente al display a activar. Este nmero, despus de ser transferido a digx (donde x corresponde al nmero de display a activar), es cargado en la parte baja del registro Index Register (Registro de Indice) usando tax. Luego, este valor almacenado en el registro se usa para indicar la posicin de la tabla Tabla7seg que contiene la codificacin en formato 7 segmentos que corresponde al nmero a mostrar en el display. Esta codificacin se carga en el acumulador utilizando la instruccin lda Tabla7seg,x. Finalmente, se coloca en el puerto D la combinacin adecuada para permitir el encendido de los leds del display que corresponda y en el puerto B el nmero a mostrar en formato 7 segmentos. Se debe notar que este programa fue diseado para displays del tipo nodo comn.
Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 9/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

La variable NumAConv es la que contiene en formato hexadecimal el nmero que ser convertido por la rutina Conversin_BCD en cada display. Esta variable se carga con la cantidad de eventos nicamente en la parte Displ5 de Gate, y es modificada despus de cada conversin. Recordemos que la cuenta haba sido colocada en la variable frec por Gate. En Displ1 no se llama a la subrutina de conversin, debido a que el resto de la conversin anterior, que se guard en NumAConv, corresponde al ltimo dgito en formato decimal. La rutina finaliza limpiando el bit 7 del registro TSC (TOF) para habilitar nuevas 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

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 10/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

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

Si Carry = 0 No (NumAConv) - 1 --> (NumAConv)

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

Negative = 1 No

Si

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

(contador) + 1 --> (contador)

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

Salida

El principio de funcionamiento de la conversin se basa en restarle al nmero a convertir (contenida en la variable NumAConv) la unidad decimal del orden correspondiente al display a activar, en forma sucesiva hasta obtener un resultado negativo. La unidad decimal del orden correspondiente se almacena en la variable sustraen, dentro de Displays. Cada vez que el resultado es positivo, se incrementa en uno la variable contador, se almacena el resultado en NumAConv y se vuelve a realizar la resta, utilizando ahora el resultado de la resta anterior guardado en NumAConv. Cuando el resultado de la operacin sea negativo, se deshace la ltima resta, es decir, se le suma a NumAConv lo que se le haba restado en la ltima operacin (sustraen), sin incrementar contador. Es despus de un resultado negativo que se sale de la subrutina.

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 11/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Rutina de interrupcin de la Captura de Entrada: Captura

inc NEventos+1

NEventos+1=0
Si

No

inc NEventos

Salida

Captura:

f:

inc bne inc bclr rti

NEventos+1 f NEventos 7,TSC0

;Incremento en uno la vble NEventos.

;Limpio el bit TOF para permitir nuevas interrupciones.

Como ya se mencion con anterioridad, la funcin de esta rutina es la de incrementar en uno la variable de 16 bits NEventos cada vez que se produzca un flanco ascendente en el bit 4 del puerto D. De este manera, va almacenando la cantidad de eventos producidos a partir del ltimo Gate. Para realizar esto, se divida a la variable en sus dos partes de 8 bits, incrementndose siempre primero la parte baja (NEventos+1), y luego verificando si se ha hecho cero. En caso de producirse esto ltimo, es que se han contado 16 eventos (F en hexadecimal), y se debe incrementar en uno la parte alta de la variable (NEventos).

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 12/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Conclusin
La idea fundamental de este ejemplo fue la de permitir la familiarizacin con la programacin de esta nueva lnea de microcontroladores, los HC08. A pesar de ser visiblemente ms potentes que sus antecesores (los HC05), su forma de programacin se ha mantenido prcticamente intacta. Slo existen pequeas diferencias en algunas instrucciones que hacen referencia especficamente a recursos ms potentes. En este programa se intentaron implementar aquellos recursos del micro que aparecen en prcticamente cualquier tipo de aplicacin, como son el Timer Interface Module, los puertos como entradas y salidas, las interrupciones vectorizadas, el manejo de las interrupciones, etc. Esto permiti mostrar la forma en que deben ser programados sus registros, el significado de sus bits ms importante y la forma de calcular los valores de los contadores para obtener las frecuencias deseadas. Cabe destacar que estos puntos son especficos de esta marca de microcontroladores. Por otro lado, se repasaron algunas tcnicas bsicas de programacin. Estas ltimas son, en su mayora, universales para cualquier lnea de microcontroladores. Se destacan dentro de estas tcnicas: el manejo de valores mayores a 8 bits, la multiplexacin de displays, indexacin de tabla, conversin de formato binario a BCD y BCD a 7 segmentos, etc.

Hardware utilizado

E-FLASH 08

Hardware propio

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 13/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Bibliografa
TECHNICAL DATA - MC68HC908JK1/JK3/JL3 (HCMOS Microcontroller Unit) 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 colaboracin de Motorola por el apoyo ofrecido al Laboratorio y, en este caso, por el aporte de la bibliografa aqu utilizada. Adems, agradecemos a la empresa Electrocomponentes S.A. que nos brind la placa de emulacin en circuito con los programas correspondientes para el uso de la misma, permitindonos as, programar, simular y emular nuestros proyectos. Dichos programas son, respectivamente, WINIDE v1.2, CASM08Z v3.16, ICD08SZ v1.32, ICS08JLZ v1.32 y PROG08SZ, todos de P&E Microcomputer Systems, Inc.

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 14/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba

Archivo List File del programa


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

0000 0000 0000

0000

0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

0000 0000 0000 0000

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 15/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba


Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 2 0000 0000 56 57 58 0000 59 0000 60 0000 61 62 0000 63 0000 64 0000 65 66 0000 67 68 69 70 71 72 73 74 0080 75 76 77 78 79 80 0080 81 0081 82 0083 83 0084 84 0085 85 0086 86 0087 87 0088 88 008A 89 008C 90 008E 91 0090 92 93 94 F600 95 96 F600 [01] 9C 97 F601 [04] 101F 98 F603 [01] 4F 99 FLSPR EQU $FE09 FLTCR EQU $FE0A BRKH EQU $FE0C BRKL EQU $FE0D BSCR EQU $FE0E INT1 EQU $FE04 INT2 EQU $FE05 INT3 EQU $FE06 ; Break control

; Interrupt Status

COPCTL EQU $FFFF

; COP control register

;(C)opywrite P&E Microcomputer Systems, 1999 ; You may use this code freely as long as this copyright notice ; is included.

org RAMStart *************************************************** * Definicin de variables * *************************************************** contador ds 1 sustraen ds 2 dig1 ds 1 dig2 ds 1 dig3 ds 1 dig4 ds 1 dig5 ds 1 NumAConv ds 2 NEventos ds 2 frec ds 2 NInterrup ds 2 NDIsplay ds 1

org ROMstart Inicio: rsp bset 0,CONFIG1 clra

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 3 F604 [01] 5F F605 [01] 8C F606 [03] 3F83 F608 [03] 3F84 F60A [03] 3F85 F60C [03] 3F86 F60E [03] 3F87 F610 [03] 3F8A F612 [03] 3F8B F614 [03] 3F8C F616 [03] 3F8D 100 101 102 103 104 105 106 107 108 109 110 111 clrx clrh clr dig1. clr dig2 clr dig3 clr dig4 clr dig5 clr NEventos clr NEventos+1 clr frec clr frec+1

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 16/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba


F618 [04] 6E018E F61B [04] 6EF48F F61E [04] 6E0690 F621 [04] 6EFE05 F624 [04] 6EEF07 112 113 114 115 116 117 F627 [04] 6E5020 118 119 F62A [04] 6E1C23 120 F62D [04] 6ECC24 121 F630 [04] 6E4425 122 123 124 F633 [02] 9A 125 126 127 F634 [03] 20FE 128 129 130 131 132 133 134 135 136 mov mov mov mov mov #$01,NInterrup #$F4,NInterrup+1 #!6,NDisplay #%11111110,DDRB. #%11101111,DDRD

mov #%01010000,TSC mov #$1C,TMODH mov #$CC,TMODL mov #%01000100,TSC0

cli Loop_Principal: bra Loop_Principal

***************************************************************** * Rutina de interrupcin del TIM: * * se multiplexan los displays y * * se captura la cuenta de eventos cada 500 entradas * *****************************************************************

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 4 137 MultDisp_&_Gate: 138 F636 [04] 3A8F 139 dec NInterrup+1 F638 [03] 2609 140 bne a F63A [03] B68E 141 lda NInterrup F63C [04] 410004 142 cbeqa #$00,a F63F [04] 3A8E 143 dec NInterrup F641 [04] 3A8F 144 dec NInterrup+1 F643 [03] B68F 145 a: lda NInterrup+1 F645 [03] BA8E 146 ora NInterrup F647 [03] 2610 147 bne Displays 148 149 **************************************************** 150 * Ruitna de Gate: * 151 * se captura la cuenta de los eventos * 152 **************************************************** 153 F649 [05] 4E8A8C 154 Gate: mov NEventos,frec F64C [05] 4E8B8D155 mov NEventos+1,frec+1 F64F [03] 3F8A 156 clr NEventos F651 [03] 3F8B 157 clr NEventos+1 F653 [04] 6E018E 158 mov #$01,NInterrup F656 [04] 6EF48F 159 mov #$F4,NInterrup+1 160 161 **************************************************** 162 * Rutina para multiplexar displays * 163 **************************************************** 164 F659 [04] 3A90 165 Displays: dec NDisplay F65B [03] B690 166 lda NDisplay F65D [04] 41050C 167 cbeqa #!5,Displ5 F660 [04] 410427 168 cbeqa #!4,Displ4 F663 [04] 41033C 169 cbeqa #!3,Displ3

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 17/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba


F666 [04] 410251 170 cbeqa #!2,Displ2 F669 [04] 410166 171 cbeqa #!1,Displ1 F66C [05] 4E8C88 172 Displ5: mov frec,NumAConv F66F [05] 4E8D89 173 mov frec+1,NumAConv+1 F672 [04] 6E2781 174 mov #$27,sustraen F675 [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 F67B [05] 4E8087 F67E [03] BE87 F680 [04] D6F713 F683 [04] 6E0403 F686 [03] B701 F688 [03] 2058 F68A [04] 6E0381 F68D [04] 6EE882 F690 [05] CDF6E5 F693 [05] 4E8086 F696 [03] BE86 F698 [04] D6F713 F69B [04] 6E0803 F69E [03] B701 F6A0 [03] 2040 F6A2 [04] 6E0081 F6A5 [04] 6E6482 F6A8 [05] CDF6E5 F6AB [05] 4E8085 F6AE [03] BE85 F6B0 [04] D6F713 F6B3 [04] 6E2003 F6B6 [03] B701 F6B8 [03] 2028 F6BA [04] 6E0081 F6BD [04] 6E0A82 F6C0 [05] CDF6E5 F6C3 [05] 4E8084 F6C6 [03] BE84 F6C8 [04] D6F713 F6CB [04] 6E4003 F6CE [03] B701 176 jsr Conversion_BCD 177 mov contador,dig5 178 ldx dig5 179 lda Tabla7seg,x 180 mov #%00000100,PTD 181 sta PTB 182 bra Salida_Disp 183 Displ4: mov #$03,sustraen 184 mov #$E8,sustraen+1 185 jsr Conversion_BCD 186 mov contador,dig4 187 ldx dig4 188 lda Tabla7seg,x 189 mov #%00001000,PTD 190 sta PTB 191 bra Salida_Disp 192 Displ3: mov #$00,sustraen 193 mov #$64,sustraen+1 194 jsr Conversion_BCD 195 mov contador,dig3 196 ldx dig3 197 lda Tabla7seg,x 198 mov #%00100000,PTD 199 sta PTB 200 bra Salida_Disp 201 Displ2: mov #$00,sustraen 202 mov #$0A,sustraen+1 203 jsr Conversion_BCD 204 mov contador,dig2 205 ldx dig2 206 lda Tabla7seg,x 207 mov #%01000000,PTD 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_Disp F6D2 [05] 4E8983 210 Displ1: mov NumAConv+1,dig1 F6D5 [03] BE83 211 ldx dig1 F6D7 [04] D6F713 212 lda Tabla7seg,x F6DA [04] 6E8003 213 mov #%10000000,PTD F6DD [03] B701 214 sta PTB F6DF [04] 6E0690 215 mov #!6,NDisplay F6E2 [04] 1F20 216 Salida_Disp:bclr 7,TSC F6E4 [07] 80 217 rti 218 219 ************************************************************ 220 * Rutina de conversin de hexadecimal a BCD * 221 ************************************************************ 222 223 Conversion_BCD: F6E5 [03] 3F80 224 clr contador

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 18/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba


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

F70A [04] 3C8B F70C [03] 2602 F70E [04] 3C8A F710 [04] 1F25

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: 262 db %01111110 263 db %00001100 264 db %10110110 265 db %10011110 266 db %11001100 267 db %11011010 268 db %11111000 269 db %00001110 270 db %11111110 271 db %11001110 272 db %01111100 273 db %11110010 274 db %11101110 275 db %11100010 276 277 278 ******************************************************** 279 * Rutina de servicio de interrupcin inservible * 280 ******************************************************** 281 282 dummy_isr:

F713 F714 F715 F716 F717 F718 F719 F71A F71B F71C F71D F71E F71F F720

7E 0C B6 9E CC DA F8 0E FE CE 7C F2 EE E2

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 19/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba


F721 [07] 80 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 rti

**************************************************** * Vectores de interrupcin * * permite vectorizar las interrupciones * **************************************************** org VectorStart dw dw dw dw dw dummy_isr dummy_isr dummy_isr dummy_isr dummy_isr

FFDE FFDE FFE0 FFE2 FFE4 FFE6 F721 F721 F721 F721 F721

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 8 FFE8 FFEA FFEC FFEE FFF0 FFF2 FFF4 FFF6 FFF8 FFFA FFFC FFFE F721 F721 F721 F721 F721 F636 F721 F70A F721 F721 F721 F600 298 299 300 301 302 303 304 305 306 307 308 309 310 311 dw dummy_isr dw dummy_isr dw dummy_isr dw dummy_isr dw dummy_isr dw MultDisp_&_Gate dw dummy_isr dw Captura dw dummy_isr dw dummy_isr dw dummy_isr dw Inicio

Symbol Table A ADCLK ADR ADSCR BFCR BRKH BRKL BSCR BSR CAPTURA CONFIG1 CONFIG2 CONTADOR CONVERSION_BCD COPCTL DDRA DDRB DDRD DIG1 DIG2 DIG3 DIG4 DIG5 DISPL1 DISPL2 DISPL3 DISPL4 F643 003E 003D 003C FE03 FE0C FE0D FE0E FE00 F70A 001F 001E 0080 F6E5 FFFF 0004 0005 0007 0083 0084 0085 0086 0087 F6D2 F6BA F6A2 F68A

Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 20/21

Laboratorio de Procesamiento Digital de Seales Universidad Nacional de Crdoba


DISPL5 DISPLAYS DUMMY_ISR F FLCR FLSPR FLTCR F66C F659 F721 F710 FE08 FE09 FE0A

Contador de Eventos.asm Assembled with CASM08Z 06/08/02 11:31:22 a.m. PAGE 9 FREC GATE INICIO INT1 INT2 INT3 INTKBIER INTKBSR INTSCR KBIER KBSCR LOOP_PRINCIPAL MASSIGNI MULTDISP_&_GATE NDISPLAY NEVENTOS NINTERRUP NUMACONV PDCR PORTA PORTB PORTD PTA PTAUE PTB PTD RAMSTART REPITE ROMSTART RSR SALIDA_DISP SALIDA_RESTA SUSTRAEN TABLA7SEG TCH0H TCH0L TCH1H TCH1L TCNTH TCNTL TMODH TMODL TSC TSC0 TSC1 VECTORSTART FFDE 008C F649 F600 FE04 FE05 FE06 001B 001A 001D 001B 001A F634 F6F1 F636 0090 008A 008E 0088 000A 0000 0001 0003 0000 000D 0001 0003 0080 F6E7 F600 FE01 F6E2 F6FD 0081 F713 0026 0027 0029 002A 0021 0022 0023 0024 0020 0025 0028

Contacto del autor: mserra@efn.uncor.edu


Copyright 2002 LabDSP FCEFyN UNC Crdoba, Argentina Laboratorio de DSP Universidad Nacional de Crdoba Argentina Pgina 21/21

Anda mungkin juga menyukai