.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)
; 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)
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
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
_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
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
; 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$
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
;.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