;------------------------------------------------------------------- ; ; Fichero: ; memlab13.psm 26/10/2017 ; ; (c) J.M. Mendias ; Diseño Automático de Sistemas ; Facultad de Informática. Universidad Complutense de Madrid ; ; Propósito: ; Laboratorio 13: Programa ejecutado por el PicoBlace ; ; Notas de diseño: ; ;------------------------------------------------------------------- ;Define las direcciones de dispositivos como constantes (por claridad) ; CONSTANT GPIODAT1, fe CONSTANT GPIOCON1, ff CONSTANT GPIODAT2, fc CONSTANT GPIOCON2, fd CONSTANT GPIODAT3, fa CONSTANT GPIOCON3, fb ;Define los codigos de 7-segmentos como constantes (por claridad) ; CONSTANT SEGS_0, 7e CONSTANT SEGS_1, 30 CONSTANT SEGS_2, 6d CONSTANT SEGS_3, 79 CONSTANT SEGS_4, 33 CONSTANT SEGS_5, 5b CONSTANT SEGS_6, 5f CONSTANT SEGS_7, 70 CONSTANT SEGS_8, 7f CONSTANT SEGS_9, 7b CONSTANT SEGS_a, 77 CONSTANT SEGS_b, 1f CONSTANT SEGS_c, 4e CONSTANT SEGS_d, 3d CONSTANT SEGS_e, 4f CONSTANT SEGS_f, 47 ;Renombra registros (por claridad) ; NAMEREG s0, arg NAMEREG s1, idx1 NAMEREG s2, idx2 NAMEREG s3, idx3 NAMEREG sF, aux ;------------------------------------------------------------------- ADDRESS 000 ;Programa principal ; main: DISABLE INTERRUPT CALL gpio_init ;Inicializa dispositivos CALL segs_init ENABLE INTERRUPT LOAD arg, 00 loop: CALL segs_putchar ;Indefinidamente muestra los numeros 0-f en el display CALL delay ADD arg, 01 AND arg, 0f JUMP loop ;Rutina de tratamiento de interrupcion ; isr: STORE aux, 3f ;Guarda el valor del registro usado INPUT aux, GPIODAT1 ;Lee dato de GPIO-1 OUTPUT aux, GPIODAT2 ;Escribe el dato leido en GPIO-2 FETCH aux, 3f ;Restaura el valor del registro usado RETURNI ENABLE ;Realiza un retardo como anidación de 3 buques con cuenta 255-0 ; Argumentos de entrada: ninguno ; Argumentos de salida: ninguno ; delay: LOAD idx1, ff for_loop1: LOAD idx2, ff for_loop2: LOAD idx3, ff for_loop3: SUB idx3, 01 JUMP NZ, for_loop3 SUB idx2, 01 JUMP NZ, for_loop2 SUB idx1, 01 JUMP NZ, for_loop1 RETURN ;------------------------------------------------------------------- ;Inicializa GPIO ; Argumentos de entrada: ninguno ; Argumentos de salida: ninguno ; gpio_init: LOAD aux, ff ;Programa GPIO-1 como entrada OUTPUT aux, GPIOCON1 LOAD aux, 00 ;Programa GPIO-2 como salida OUTPUT aux, GPIOCON2 LOAD aux, 00 ;Programa GPIO-3 como salida OUTPUT aux, GPIOCON3 RETURN ;------------------------------------------------------------------- ;Inicializa el driver del diplay 7-segs ; Argumentos de entrada: ninguno ; Argumentos de salida: ninguno ; segs_init: LOAD aux, 00 OUTPUT aux, GPIODAT3 ;Apaga el display LOAD aux, SEGS_0 ;Crea en la scratchad una tabla de codigos 7-segmentos a partir de la dirección 0 STORE aux, 00 LOAD aux, SEGS_1 STORE aux, 01 LOAD aux, SEGS_2 STORE aux, 02 LOAD aux, SEGS_3 STORE aux, 03 LOAD aux, SEGS_4 STORE aux, 04 LOAD aux, SEGS_5 STORE aux, 05 LOAD aux, SEGS_6 STORE aux, 06 LOAD aux, SEGS_7 STORE aux, 07 LOAD aux, SEGS_8 STORE aux, 08 LOAD aux, SEGS_9 STORE aux, 09 LOAD aux, SEGS_a STORE aux, 0a LOAD aux, SEGS_b STORE aux, 0b LOAD aux, SEGS_c STORE aux, 0c LOAD aux, SEGS_d STORE aux, 0d LOAD aux, SEGS_e STORE aux, 0e LOAD aux, SEGS_f STORE aux, 0f RETURN ;Visualiza un numero en el display 7-segs indexando la tabla de codigos ubicada en el scratchpad ; Argumentos de entrada: arg = numero a visualizar ; Argumentos de salida: ninguno ; segs_putchar: FETCH aux, (arg) OUTPUT aux, GPIODAT3 RETURN ;------------------------------------------------------------------- ;Instala la ISR en la tabla del vector de interrupción ; ADDRESS 3ff JUMP isr