]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/leds.asm
Agrego informe.
[z.facultad/66.09/etherled.git] / src / leds.asm
index bc729f119f8ad42b40793e2e657a8fd8542f2848..558f13fd04acdf8a8164220f9d07732df8ec3d86 100644 (file)
@@ -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_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
 .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)
 
 ; Á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)
 
 ; Variables es memoria RAM común
 .area   DSEG    (DATA)
-_leds_matrix_len::
+_leds_matrix_len::  ; Cantidad de columnas de la matriz
     .ds     1
     .ds     1
-_leds_delay::
+_leds_delay::       ; Retardo de dibujado configurado
     .ds     1
     .ds     1
-delay:
+delay:              ; Contador del retardo actual
+    .ds     1
+curr_col:           ; Columna que se está dibujando actualmente
     .ds     1
     .ds     1
-curr_col:
 
 ; Variables en memoria RAM extendida indirecta (8052)
 .area   ISEG    (DATA)
 
 ; 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
 
     .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)
 
 ; 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
     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     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
     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
 
 
     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
 _leds_test::
     ; escribo patrones en los leds
     mov     dptr, #0xffff
-    acall   _leds_write
-    acall   sleep
+    lcall   _leds_write
+    lcall   sleep
 
     mov     dptr, #0xaaaa
 
     mov     dptr, #0xaaaa
-    acall   _leds_write
-    acall   sleep
+    lcall   _leds_write
+    lcall   sleep
     
     mov     dptr, #0x5555
     
     mov     dptr, #0x5555
-    acall   _leds_write
-    acall   sleep
+    lcall   _leds_write
+    lcall   sleep
 
     mov     dptr, #0x0000
 
     mov     dptr, #0x0000
-    acall   _leds_write
-    acall   sleep
+    lcall   _leds_write
+    lcall   sleep
     
     ret    
 
     
     ret    
 
@@ -213,7 +220,31 @@ _leds_delay_update::
     mov     dpl, a
     mov     a, #DELAY_BASE
     subb    a, dpl
     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
     
 
     ret
     
 
@@ -222,6 +253,8 @@ _leds_delay_update::
 ;                   void leds_timer2_isr() interrupt 5;
 ;
 _leds_timer2_isr::
 ;                   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$
 
     ; 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
 
     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     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
 
     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
     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
 
     cpl     a ; complemento para ver encendidos los "1"
     movx    @dptr, a
 
@@ -302,39 +335,56 @@ DEFAULT_MATRIX_LEN:
     ;.db     32
 
 DEFAULT_MATRIX:
     ;.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
 
 ;    .dw     0b0000001111100000    ; columna 0
 ;    .dw     0b0000111110000000    ; columna 1