]> git.llucax.com Git - z.facultad/66.09/etherled.git/commitdiff
Emprolija un poco el retarno, no necesita más usar el multiplicador.
authorLeandro Lucarella <llucax@gmail.com>
Wed, 14 Dec 2005 18:49:58 +0000 (18:49 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Wed, 14 Dec 2005 18:49:58 +0000 (18:49 +0000)
src/elp.c
src/leds.asm
src/leds.h

index 69e349065b0e72c2b7fe57303c15107870617453..5f03c8aa95756235577ae7950e573049410182a6 100644 (file)
--- a/src/elp.c
+++ b/src/elp.c
@@ -75,10 +75,10 @@ byte elp_read_process_command()
         case ELP_VAR_DELAY:
             // Si es GET, sólo calculamos tamaño de respuesta
             if (!elp_command.set)
-                return len + sizeof(leds_delay);
+                return len + LEDS_DELAY_SIZE;
             // Si es SET procesamos
-            netdev_read_start(sizeof(leds_delay));
-            leds_delay = udp_read_byte();
+            netdev_read_start(LEDS_DELAY_SIZE);
+            leds_delay_set(udp_read_byte());
             netdev_read_end();
             return len;
 
@@ -121,8 +121,8 @@ void elp_write_response()
             break;
 
         case ELP_VAR_DELAY:
-            netdev_write_start(sizeof(leds_delay));
-            udp_write_byte(leds_delay);
+            netdev_write_start(LEDS_DELAY_SIZE);
+            udp_write_byte(leds_delay_get());
             netdev_write_end();
             break;
     }
index e32ac13be12a6e44dc3ca5da4488e89ba69ed375..ab80fbf5f6231f8d04d777b34dd271f10d6e5600 100644 (file)
@@ -10,7 +10,6 @@ LEDS_MAX_COLS    = 32       ; Cantidad máxima de columnas
 ; Variables públicas
 .globl  _leds_matrix_len    ; unsigned char
 .globl  _leds_matrix        ; unsigned int[LEDS_MAX_COLS]
-.globl  _leds_delay         ; unsigned char
 
 ; Funciones públicas
 .globl  _leds_init          ; void leds_init();
@@ -25,10 +24,11 @@ LEDS_MAX_COLS    = 32       ; Cantidad máxima de columnas
 
 
 ; Constantes
-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
+LEDS_LOW        = 0x0080 ; posición de xdata donde está el latch 1
+LEDS_HIGH       = 0x00c0 ; posición de xdata donde está el latch 2
+DELAY_FACTOR    = 0      ; base del contador para el retardo
+DELAY_BASE      = 13     ; punto medio del retardo
+DELAY_DIVISOR   = 3      ; divisor para la cantidad de columnas
 
 ; Área de bancos de registros
 .area   REG_BANK_0    (REL,OVR,DATA)
@@ -47,10 +47,6 @@ DELAY_BASE      = 11 ; 16 columnas anda bien con 28 - (len / 2) == 20
 .area   DSEG    (DATA)
 _leds_matrix_len::  ; Cantidad de columnas de la matriz
     .ds     1
-_leds_delay::       ; Retardo de dibujado configurado
-    .ds     1
-delay:              ; Contador del retardo actual
-    .ds     1
 curr_col:           ; Columna que se está dibujando actualmente
     .ds     1
 
@@ -96,8 +92,8 @@ _leds_init::
     mov     r2, a ; tamaño en bytes de la matriz
 
     ; Cargo milisegundos
+    mov     rcap2l, #-DELAY_FACTOR  ; base del retardo
     lcall   _leds_delay_update
-    mov     delay, _leds_delay
 
     ; copio imagen por default de la ROM a la RAM
     mov     dptr, #DEFAULT_MATRIX
@@ -112,10 +108,6 @@ proximo$:
     mov     a, r0 ; para comparar
     cjne    a, ar2, proximo$ ; veo si quedan más bytes por leer
 
-    ; cargo los capture registers
-    mov     rcap2l, #<(-INTERVAL) ; low byte del intervalo
-    mov     rcap2h, #>(-INTERVAL) ; high byte del intervalo
-
     mov     t2con, #0x00; setup del timer2 (auto-reload), no lo arrancamos
     setb    tr2 ; largo a correr el timer2
 
@@ -211,16 +203,28 @@ _leds_write_high::
 ; Primitiva de C:
 ;                   void leds_delay_update();
 ;
-; La fórmula utilizada es: (DELAY_BASE - (leds_matrix_len / 2)) * 0.1 ms
+; La fórmula utilizada es:
+;   DELAY_FACTOR * (DELAY_BASE - (leds_matrix_len / DELAY_DIVISOR))
+; En realidad ya está cargado rcap2l DELAY_FACTOR (constante) y en rcap2h se
+; carga el resultado de:
+;   DELAY_BASE - (leds_matrix_len / DELAY_DIVISOR)
 ; C se encarga de hacer push y pop del dptr, a y psw si lo necesita.
 _leds_delay_update::
+    push    b ; uso b, lo guardo
     mov     a, _leds_matrix_len
-    clr     c
-    rrc     a ; divido por 2
+    mov     b, #DELAY_DIVISOR
+    div     ab ; en a me queda leds_matrix_len / DELAY_DIVISOR
     mov     dpl, a
     mov     a, #DELAY_BASE
-    subb    a, dpl
-    mov     _leds_delay, a
+    subb    a, dpl ; en a me queda DELAY_BASE - leds_matrix_len / DELAY_DIVISOR
+    jnb     cy, 1$ ; Si leds_matrix_len / DELAY_DIVISOR > DELAY_BASE
+    mov     a, #1 ; ponemos 1 para que no quede nulo el intervalo (o 'negativo')
+1$:               ; Si no, seguimos como siempre
+    mov     dpl, a  ; complemento a la base
+    mov     a, #0
+    subb    a, dpl 
+    mov     rcap2h, a ; Cargo el nuevo retardo
+    pop     b ; devuelvo b
     ret
 
 
@@ -255,11 +259,6 @@ _leds_unlock::
 _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$
-
-    ; comenzamos realmente a leer la próxima columna
-    mov     delay, _leds_delay
 
     ; guardamos en el stack el estado actual de los registros que vamos a usar
     push    acc
@@ -311,7 +310,6 @@ _leds_timer2_isr::
     pop     psw
     pop     acc
 
-255$:
     reti ; listo! seguimos viaje...
 
 
index c69a956044fc4aa60aa9877fc870d78f5d8ff9ce..45c640ed9f4d9fe120d1deed42ad06c25ffe432d 100644 (file)
@@ -3,6 +3,8 @@
 #ifndef _LEDS_H_
 #define _LEDS_H_
 
+#include "reg51.h"
+
 /** Cantidad mínima de columnas (es más un límite estético que físico) */
 #define LEDS_MIN_COLS 8
 
@@ -15,8 +17,17 @@ extern unsigned char leds_matrix_len;
 /** Matriz de leds, cada elemento del array es una columna */
 extern idata unsigned int leds_matrix[LEDS_MAX_COLS];
 
-/** Retardo de refresco de la matriz (en múltiplos de 0.1ms) */
-extern unsigned char leds_delay;
+/** Setea retardo de refresco de la matriz */
+#define leds_delay_set(delay) (RCAP2H = ((unsigned char) -delay))
+/* usamos directamente el rcap2h negado (complementado) */
+
+/** Obtiene retardo de refresco de la matriz */
+#define leds_delay_get() ((unsigned char) -RCAP2H)
+/* usamos directamente el rcap2h negado (complementado) */
+
+/** Tamaño del retardo de refresco de la matriz */
+#define LEDS_DELAY_SIZE sizeof(RCAP2H)
+/* usamos directamente el rcap2h */
 
 /** Inicializa leds
  *