Autor Tema: manejar registros grandes  (Leído 1454 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado xootraoox

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 248
manejar registros grandes
« en: 24 de Marzo de 2005, 13:00:00 »
primero que nada saludos a todos, lo que pasa es que no se como poder manejar registros grandes (80 bits para ser mas exacto) en realidad lo puedo hacer pero dividiendo los 80 bits en 10 partes dejando asi 10 registros de 8 bits pero ese metodo me trae muchos problemas despues para manipular ese byte ya que los 80 bits son para unos shift register de 8 bits los cuales controlan las columnas de unas matrices osea solo para la primera matriz utilizo los primeros 5 bits por lo que me quedan 3 bits en el primer registro y los siguientes 2 en el segindo registro y es hay donde tengo los problemas ya que no se como poder despues modificar esos dos registros para solo tocar los ultimos 3bits y los primeros dos bits correspondiente a la 5 columnas de la segunda matriz

bueno la matriz esta compuesta por 16 matrices bicolores por lo que da un total de  1120 leds osea una matriz de 7x80 de la cual ya he logrado hacer algunas cosas pero no de mucha importancia bueno tambien coloco un ejemplo de lo que he hecho para solo encender las 5 columnas de la primera matriz y dejar la 2 sin encender y luego encender la tercera y asi sucesivamente

Codigo:

   LIST   p=16F628A
   include "P16F628A.inc"
   __config 0x3D18
      errorlevel -302
;----------------------------------------------------------------------
;----------------------------------------------------------------------
#DEFINE SRCLK   PORTA,0     ; 74hc595 clock
#DEFINE SRLAT   PORTA,1     ; 74hc595 latch
#DEFINE SRDAT   PORTA,2     ; 74hc595 data
;----------------------------------------------------------------------
;----------------------------------------------------------------------
   cblock   0x20         ; definicion de registros
      sr_tmp            ; este es utlilizado para un contador para enviar los datos en cadenas de 1 byte
      sr_sr            ; este es utlilizado para hacer una copia de bufferx para manipular los datos a enviar de forma serial

      BUFFER0            ; estos son los registros en donde almaceno los 80 bits
      BUFFER1            ; de forma dividida, osea en cada uno almaceno 8 bits
      BUFFER2            ; y es esto lo que en realidad quisiera evitar almacenando
      BUFFER3            ; todo en un solo buffer
      BUFFER4            ;
      BUFFER5            ;
      BUFFER6            ;
      BUFFER7            ;
      BUFFER8            ;
      BUFFER9            ;
   endc
;----------------------------------------------------------------------
;----------------------------------------------------------------------
   org   0x0000            ;
                     ;   
    movlw   0x07         ; apaga los comparadores de este micro, eliminando estas lineas el programa
   movwf   CMCON         ; deberia trabajar sin problemas sobre un 16f84

      bsf    STATUS,RP0      ; selecciono banco 1
      movlw    b"00000000"      ; configuro todos los puertos y pines como salidas
      movwf    TRISB         ;
      movlw    b"00000000"      ;
   movwf   TRISA         ;
   bcf      STATUS,RP0      ; vuelvo al banco 0
;----------------------------------------------------------------------
;----------------------------------------------------------------------

INICIO
   movlw   b"00011111"      ; los datos a enviar de forma serial
   movwf   BUFFER0         ; y los almaceno en el buffer
   movlw   b"01111100"      ;
   movwf   BUFFER1         ;
   movlw   b"11110000"      ;
   movwf   BUFFER2         ;
   movlw   b"11000001"      ;
   movwf   BUFFER3         ;
   movlw   b"00000111"      ;
   movwf   BUFFER4         ;
   movlw   b"00011111"      ;
   movwf   BUFFER5         ;
   movlw   b"01111100"      ;
   movwf   BUFFER6         ;
   movlw   b"11110000"      ;
   movwf   BUFFER7         ;
   movlw   b"11000001"      ;
   movwf   BUFFER8         ;
   movlw   b"00000111"      ;
   movwf   BUFFER9         ;
                     ;
   call   ENVIA_SPI      ; llamo a la subrutina que me emula una comunicacion SPI enviandome
                     ; los datos de forma serial.
   bsf      SRLAT         ; una vez terminado el envio mando un pulso de latch el cual activa los shift register
   nop                  ; una diminuta demora para asegurar de que se lea con exito el pulso
   bcf      SRLAT         ;
                     ;
   goto   INICIO         ; vuelvo a inicio

;*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

ENVIA_SPI
   movlw    d"8"         ; coloco en 8 el registro sr_tmp para generar un contador de pulsos de reloj
   movwf    sr_tmp         ; para los shift registers
    movf    BUFFER9,w      ; paso el contenido de bufferx a w para hacer una copia del mismo
    movwf   sr_sr         ; hago la copia de bufferx en sr_sr
   CALL   ENVIA         ; llamo a la subrutina que me envia el contenido de bufferx
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER8,w      ; **** se repite todo para poder enviar todos los buffers ****
    movwf   sr_sr         ;
   CALL   ENVIA         ;
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER7,w      ;
    movwf   sr_sr         ;
   CALL   ENVIA         ;
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER6,w      ;
    movwf   sr_sr         ;
   CALL   ENVIA         ;
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER5,w      ;
    movwf   sr_sr         ;
   CALL   ENVIA         ;
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER4,w      ;
    movwf   sr_sr         ;
   CALL   ENVIA         ;
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER3,w      ;
    movwf   sr_sr         ;
   CALL   ENVIA         ;
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER2,w      ;
    movwf   sr_sr         ;
   CALL   ENVIA         ;
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER1,w      ;
    movwf   sr_sr         ;
   CALL   ENVIA         ;
   movlw    d"8"         ;
   movwf    sr_tmp         ;
    movf    BUFFER0,w      ;
    movwf   sr_sr         ;
   CALL   ENVIA         ;

   return               ;

ENVIA
   bcf       SRDAT           ; coloca a cero el pin de datos si es que esta en alto
   rlf    sr_sr,f         ; rota el contenido de sr_sr
   btfsc   STATUS,C      ; la verdad no se bien lo que hace esta linea pero comprueba si el ultimo bit de sr_sr es 1 o 0
   bsf       SRDAT          ; enviando un pulso de dato si es 1 y si es 0 se salta una linea
   nop
   bsf       SRCLK           ; pone en 1 el pin clock
   nop
   bcf       SRCLK         ; pone en 0 el pin clock
   decfsz   sr_tmp,f      ; decrementa sr_tmp y si no es cero prosigue con el envio y si llega a cero salta una linea dando
                     ; fin a esta subrutina
   goto   ENVIA          ;

   return

   goto INICIO            ;

   end                  ;fin




bueno pronto colocare mas datos de esto mismo por si alguien quisiera experimentar con estas matrices

-==XooTRAooX==-

Desconectado xootraoox

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 248
RE: manejar registros grandes
« Respuesta #1 en: 24 de Marzo de 2005, 14:17:00 »
bueno el codigo quedo un tanto desordenado por lo que aqui dejo un enalce para que se pueda descargar asi como tambien unas fotos de la matriz y un pequeño video para que vean lo que estoy haciendo



bueno el video no se ve muy bien pero lo que hace es que se enciende solo 2 columnas a la vez recorriendo toda la matriz, tambien es normal que baje lentisimo ya que el server en donde esta es gratuito por lo que limitan la velocidad de transferencia, solo queda la paciencia

el video esta partido en 2 con winrar por lo que hay que descargar las 2 partes y descomprimirlas con dicho software

Video parte 1
Video parte 2

Foto1



Foto2



Foto3



Foto4



Foto5



Foto6



-==XooTRAooX==-