X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/blobdiff_plain/6add33161e732ed834469f217a7ba97200694d63..d6c5f7cf0e7f53c9251477b092e8b208a313e928:/src/leds.asm?ds=sidebyside diff --git a/src/leds.asm b/src/leds.asm index bc729f1..558f13f 100644 --- a/src/leds.asm +++ b/src/leds.asm @@ -19,15 +19,16 @@ LEDS_MAX_COLS = 32 ; Cantidad máxima de columnas .globl _leds_write_low ; void leds_write_low(unsigned char); .globl _leds_write_high ; void leds_write_high(unsigned char); .globl _leds_delay_update ; void leds_delay_update(); +.globl _leds_lock ; void leds_lock(); +.globl _leds_unlock ; void leds_unlock(); .globl _leds_timer2_isr ; void leds_timer2_isr() interrupt 5; ; Constantes -; UN CICLO DE MAQUINA SON 1.6666 useg (clock 8MHz) -INTERVAL = 33 ; 0.05ms (por el clock de 8MHz) -LEDS_HIGH = 0x0080 -LEDS_LOW = 0x00c0 -DELAY_BASE = 28 ; 16 columnas anda bien con 28 - (len / 2) == 20 +INTERVAL = 666 ; 0.1ms (por el clock de 8MHz) +LEDS_LOW = 0x0080 +LEDS_HIGH = 0x00c0 +DELAY_BASE = 11 ; 16 columnas anda bien con 28 - (len / 2) == 20 ; Área de bancos de registros .area REG_BANK_0 (REL,OVR,DATA) @@ -44,19 +45,25 @@ DELAY_BASE = 28 ; 16 columnas anda bien con 28 - (len / 2) == 20 ; Variables es memoria RAM común .area DSEG (DATA) -_leds_matrix_len:: +_leds_matrix_len:: ; Cantidad de columnas de la matriz .ds 1 -_leds_delay:: +_leds_delay:: ; Retardo de dibujado configurado .ds 1 -delay: +delay: ; Contador del retardo actual + .ds 1 +curr_col: ; Columna que se está dibujando actualmente .ds 1 -curr_col: ; Variables en memoria RAM extendida indirecta (8052) .area ISEG (DATA) -_leds_matrix:: +_leds_matrix:: ; Matriz a dibujar .ds LEDS_MAX_COLS * 2 ; 2 bytes por columna +; Variables de bit +.area BSEG (BIT) +lock: ; Variable utilizada para el 'locking', indica si el timer + .ds 1 ; estaba andando al momento de lockear para que el unlock + ; pueda reactivarlo de ser necesario ; Configuramos el vector de interrupciones para atender el timer2 ;.area INTV (ABS, CODE) @@ -89,7 +96,7 @@ _leds_init:: mov r2, a ; tamaño en bytes de la matriz ; Cargo milisegundos - acall _leds_delay_update + lcall _leds_delay_update mov delay, _leds_delay ; copio imagen por default de la ROM a la RAM @@ -110,7 +117,7 @@ proximo$: mov rcap2h, #>(-INTERVAL) ; high byte del intervalo mov t2con, #0x00; setup del timer2 (auto-reload), no lo arrancamos - setb et2 ; habilito interrupcion timer2 (IE.5) + setb tr2 ; largo a correr el timer2 mov curr_col, #0 ; inicializo el contador de columna en 0 @@ -130,20 +137,20 @@ proximo$: _leds_test:: ; escribo patrones en los leds mov dptr, #0xffff - acall _leds_write - acall sleep + lcall _leds_write + lcall sleep mov dptr, #0xaaaa - acall _leds_write - acall sleep + lcall _leds_write + lcall sleep mov dptr, #0x5555 - acall _leds_write - acall sleep + lcall _leds_write + lcall sleep mov dptr, #0x0000 - acall _leds_write - acall sleep + lcall _leds_write + lcall sleep ret @@ -213,7 +220,31 @@ _leds_delay_update:: mov dpl, a mov a, #DELAY_BASE subb a, dpl - mov _leds_matrix_len, a + mov _leds_delay, a + ret + + +; Bloquea el timer de los leds cuando se accede a una zona crítica (P0 y/o P2). +; Primitiva de C: +; void leds_lock(); +; +; C se encarga de hacer push y pop del dptr, a y psw si lo necesita. +_leds_lock:: + mov c, et2 ; En lock me queda si está el timer andando o no. + mov lock, c + clr et2 ; Sea como sea, lo paro. + ret + + +; Desbloquea el timer de los leds. +; Primitiva de C: +; void leds_unlock(); +; +; C se encarga de hacer push y pop del dptr, a y psw si lo necesita. +_leds_unlock:: + jnb lock, 1$ ; Si no estába andando, no hago nada + setb et2 ; Si estaba andando lo prendo +1$: ret @@ -222,6 +253,8 @@ _leds_delay_update:: ; void leds_timer2_isr() interrupt 5; ; _leds_timer2_isr:: + ; limpiamos flag del timer2 + clr tf2 ; vemos si todavía hay que seguir esperando o si ya tenemos que leer djnz delay, 255$ @@ -253,16 +286,16 @@ _leds_timer2_isr:: add a, r0 ; le sumo al puntero el offset actual segun la columna mov r0, a - ; imprimo en LEDS_LOW + ; imprimo en LEDS_HIGH mov a, @r0 ; leo el contenido de la matriz - mov dptr, #LEDS_LOW + mov dptr, #LEDS_HIGH cpl a ; complemento para ver encendidos los "1" movx @dptr, a - ; imprimo en LEDS_HIGH + ; imprimo en LEDS_LOW inc r0 ; busco proximo byte de la columna mov a, @r0 ; leo el contenido de la matriz - mov dptr, #LEDS_HIGH + mov dptr, #LEDS_LOW cpl a ; complemento para ver encendidos los "1" movx @dptr, a @@ -302,39 +335,56 @@ DEFAULT_MATRIX_LEN: ;.db 32 DEFAULT_MATRIX: - .dw 0b0000111111110000 ; columna 0 - .dw 0b0011111111111100 ; columna 1 - .dw 0b0111000000001110 ; columna 2 - .dw 0b0110000000000110 ; columna 3 - .dw 0b1100001100000011 ; columna 4 - .dw 0b1100011000110011 ; columna 5 - .dw 0b1100110000110011 ; columna 6 - .dw 0b1100110000000011 ; columna 7 - .dw 0b1100110000000011 ; columna 8 - .dw 0b1100110000110011 ; columna 9 - .dw 0b1100011000110011 ; columna 10 - .dw 0b1100001100000011 ; columna 11 - .dw 0b0110000000000110 ; columna 12 - .dw 0b0111000000001110 ; columna 13 - .dw 0b0011111111111100 ; columna 14 - .dw 0b0000111111110000 ; columna 15 - - .dw 0b1111000000001111 ; columna 0 - .dw 0b1100000000000011 ; columna 1 - .dw 0b1000111111110001 ; columna 2 - .dw 0b1001111111111001 ; columna 3 - .dw 0b0011001111111100 ; columna 4 - .dw 0b0011100111001100 ; columna 5 - .dw 0b0011110011001100 ; columna 6 - .dw 0b0011110011111100 ; columna 7 - .dw 0b0011110011111100 ; columna 8 - .dw 0b0011110011001100 ; columna 9 - .dw 0b0011100111001100 ; columna 01 - .dw 0b0011001111111100 ; columna 00 - .dw 0b1001111111111001 ; columna 01 - .dw 0b1000111111110001 ; columna 03 - .dw 0b1100000000000011 ; columna 04 - .dw 0b1111000000001111 ; columna 05 +; .dw 0b0000111111110000 ; columna 0 +; .dw 0b0011111111111100 ; columna 1 +; .dw 0b0111000000001110 ; columna 2 +; .dw 0b0110000000000110 ; columna 3 +; .dw 0b1100001100000011 ; columna 4 +; .dw 0b1100011000110011 ; columna 5 +; .dw 0b1100110000110011 ; columna 6 +; .dw 0b1100110000000011 ; columna 7 +; .dw 0b1100110000000011 ; columna 8 +; .dw 0b1100110000110011 ; columna 9 +; .dw 0b1100011000110011 ; columna 10 +; .dw 0b1100001100000011 ; columna 11 +; .dw 0b0110000000000110 ; columna 12 +; .dw 0b0111000000001110 ; columna 13 +; .dw 0b0011111111111100 ; columna 14 +; .dw 0b0000111111110000 ; columna 15 + + .dw 0b0000011111100000 + .dw 0b0001111111111000 + .dw 0b0011100000011100 + .dw 0b0111110000000110 + .dw 0b0110111000000110 + .dw 0b1100011100000011 + .dw 0b1100001110000011 + .dw 0b1111111111111111 + .dw 0b1111111111111111 + .dw 0b1100001110000011 + .dw 0b1100011100000011 + .dw 0b0110111000000110 + .dw 0b0111110000000110 + .dw 0b0011100000011100 + .dw 0b0001111111111000 + .dw 0b0000011111100000 + +; .dw 0b1111000000001111 ; columna 0 +; .dw 0b1100000000000011 ; columna 1 +; .dw 0b1000111111110001 ; columna 2 +; .dw 0b1001111111111001 ; columna 3 +; .dw 0b0011001111111100 ; columna 4 +; .dw 0b0011100111001100 ; columna 5 +; .dw 0b0011110011001100 ; columna 6 +; .dw 0b0011110011111100 ; columna 7 +; .dw 0b0011110011111100 ; columna 8 +; .dw 0b0011110011001100 ; columna 9 +; .dw 0b0011100111001100 ; columna 01 +; .dw 0b0011001111111100 ; columna 00 +; .dw 0b1001111111111001 ; columna 01 +; .dw 0b1000111111110001 ; columna 03 +; .dw 0b1100000000000011 ; columna 04 +; .dw 0b1111000000001111 ; columna 05 ; .dw 0b0000001111100000 ; columna 0 ; .dw 0b0000111110000000 ; columna 1