Autor Tema: duda sobre tablas en asm!  (Leído 3113 veces)

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

Desconectado xootraoox

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 248
duda sobre tablas en asm!
« en: 25 de Enero de 2005, 20:38:00 »
bueno resulta que no entiendo como es quese pueden leer las tablas pero solo la parte necesaria, osea como por ejemplo si yo quisiera hacer un reloj sobre una matriz led pero genero las tablas con los caracteres a mostrar y luego llamo solamente la parte que yo necesito de la misma ¿pero como puedo hacerlo?

Char_tbl
      addwf   PCL,f

   dt   0xC1,0xBE,0xBE,0xBE,0xC1   ;"O"
   dt   0xFF,0xFE,0x80,0xDE,0xFF   ;"1"
   dt   0xCE,0xB6,0xBA,0xBC,0xDE   ;"2"
   dt   0xB9,0x96,0xAE,0xBE,0xBD   ;"3"
   dt   0xFB,0x80,0xDB,0xEB,0xF3   ;"4"
   dt   0xB1,0xAE,0xAE,0xAE,0x8D   ;"5"
   dt   0xF9,0xB6,0xB6,0xD6,0xE1   ;"6"
   dt   0x9F,0xAF,0xB7,0xB8,0xBF   ;"7"
   dt   0xC9,0xB6,0xB6,0xB6,0xC9   ;"8"
   dt   0xC3,0xB5,0xB6,0xB6,0xCF   ;"9"
   dt   0xFF,0xDD,0xAA,0xDD,0xFF   ;":"

Char_tbl_end

bueno segun la tabla anterior, si yo quisiera mostrar por ejemplo las 12:00 pm obviamente debiera llamar solamente las sigientes filas

dt   0xFF,0xFE,0x80,0xDE,0xFF   ;"1"
dt   0xCE,0xB6,0xBA,0xBC,0xDE   ;"2"
dt   0xFF,0xDD,0xAA,0xDD,0xFF   ;":"
dt   0xC1,0xBE,0xBE,0xBE,0xC1   ;"0"
dt   0xC1,0xBE,0xBE,0xBE,0xC1   ;"0"

bueno si alguien pudiese hecharme una mano se le agradeceria

despide XooTRAooX


NOTA: Se agradece una explicacion detallada ya que mi dominio en programacion es extremadamente pobre

Desconectado Khronos_Nieto

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 40
RE: duda sobre tablas en asm!
« Respuesta #1 en: 26 de Enero de 2005, 05:13:00 »
Buenas compañero.

Para utilizar tablas en ensamblador, se utilizan básicamente dos instrucciones:
"Call" --> Para llamar a la tabla
"Retlw"--> Que es un retorno de rutina, pero ojo! cargando en w, el valor que   haya a continuación.

Echa un vistazo a esto:


;*******     TABLA DE NUMEROS   ***********
Tabla      addwf   PCL,F      ;Desplazamiento sobre la tabla
      retlw   b"00111111"   ;Dígito 0   11111100
      retlw   b"00000110"   ;Dígito 1   01100000
      retlw   b"01011011"   ;Dígito 2   11011010
      retlw   b"01001111"   ;Dígito 3   11110010
      retlw   b"01100110"   ;Dígito 4   01100110
      retlw   b"01101101"   ;Dígito 5   10110110
      retlw   b"01111101"   ;Dígito 6   10111110
      retlw   b"00000111"   ;Dígito 7   11100000
      retlw   b"01111111"   ;Dígito 8   11111110
      retlw   b"01100111"   ;Dígito 9   11100110

.
.
.
.

movlw   0x05                        ; Cargo un 5 en el W
call   Tabla      ;Llamo a la tabla
.
.
.


El caso...  llamamos a la tabla desde cualquier sitio, habiendo cargado previamente en el acumulador (w), el número binaro correspondiente a la posicion de la tabla que quieres sacar.

El programa sálta a la rutina "Tabla" o como le hayas llamado. Una vez allí, ejecuta la instrucción "addwf PCL,F" (como tu bien pones).
Dicha instrucción le suma al PC (contador de programa), el valor que haya en W.

Hagamos un paréntesis, para decir que el PC, es un registro, que contiene la direccíon de memoria de la siguiente instruccíon que se va a ejecutar. Normalmente el PC, se incrementa de uno en uno. Menos en los saltos y en nuestro caso.

Si te das cuenta, lo que hacemos es "engañar" al PC, incrementandolo en "5" en lugar de en 1 como es habitual. De esta forma, se salta cinco lineas de código hasta llegar a "retlw  b"01101101" " , que me provoca un retorno de rutina (hasta el punto donde se llamó con "Call"Giño pero cargando en W, el valor que tiene al lado.

En mi caso usaba displays, y efectivamente el valor con el que vuelvo de la Tabla es el que me enciende los segmentos para representar el "5".

De esta forma, en tu programa justo despues del "Call"  puedes poner
"movwf PORTB"  que vuelca el acumulador en el puerto B

Espero que sirva de ayuda.

Saludos...
FlashFlash

"Camaradas, ni nuestro propio conocimiento conoce nuestro potencial"
- La caza del Octubre Rojo -

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: duda sobre tablas en asm!
« Respuesta #2 en: 26 de Enero de 2005, 05:18:00 »
Sonrisa GiganteSonrisa GiganteAgregado a esa excelente explicacion y para el uso que necesita Xootraox agregaria que el necesita multiplicar su numero obtenido por un Offset (en este caso es 5, que son los bytes que necesita para conformar su numero, luego saca secuencialmente los cinco bytes sucesivos de la tabla.

Para el caso del ":" debera ponerlo siempre (o en todo caso prenderlo y apagarlo cada 1/2 segundo), no tiene caso leerlo de una tabla....Sonrisa GiganteSonrisa GiganteSonrisa GiganteSonrisa Gigante
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Khronos_Nieto

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 40
RE: duda sobre tablas en asm!
« Respuesta #3 en: 26 de Enero de 2005, 05:24:00 »
Por cierto xootraoox, se me olvidaba:

Si quieres representar las "12:00" Primero tienes que llamar a la tabla con
W=1, despues volcar en el puerto. Despues llamar con W=2...y representar, y asi sucesivamente.


movlw   0x01
call   Tabla
movwf   PORTB
.
.
Claro que entre numero y número, debes de dejar un tiempo de unos 30ms (suficientes) que puedes conseguirlos con el TIMER del PIC.

Si lo haces del tirón no se si los leds se te llegarán a encender, o lucirán poco, piensa en la velocidad a la que va el PIC y el tiempo de encendido y apagado de un led, que por rápido que sea.....

Por otro lado si la temporizacion es demasiado lenta, no verás el número "12:00"
encendido todo a la vez.

Entorno a 30ms es lo suyo..


Saludos
"Camaradas, ni nuestro propio conocimiento conoce nuestro potencial"
- La caza del Octubre Rojo -

Desconectado Khronos_Nieto

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 40
RE: duda sobre tablas en asm!
« Respuesta #4 en: 26 de Enero de 2005, 05:28:00 »
AngelitoAngelitoUy!! Perdona MGLSOF, estaba escribiendo lo de antes justo cuando tu lo has mandado. Efectivamente es como dices.
"Camaradas, ni nuestro propio conocimiento conoce nuestro potencial"
- La caza del Octubre Rojo -

Desconectado xootraoox

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 248
RE: duda sobre tablas en asm!
« Respuesta #5 en: 26 de Enero de 2005, 21:27:00 »
bueno primero agradesco el tiempo prestado y comento que ya estoy entendiendo algo mas sobre lo citado pero les paso a explicar un poco mas de lo que pretendo realizar para que entiendam mi idea

primero que nada esto es para un propeller clock el cual mi intencion es desplegar la hora, la fecha y texto pero a la vez tambien quisiera poder agregarle efectos de animacion de entrada como de salida a todo esto

mi intencion es llegar a poder escribir en alguna parte del codigo nada mas que los caracteres en assci y que el pic se encarge de desplegar lo que debe por medio de unas tablas prefijadas como por ej. los numeros y el abecedario en minuscula y mayusculas de la siguiente forma

ejemplo

imprime "Hola Mundo"
borra    scrool_derecho
imprime   hora
borra   scrool_izquierdo
imprime fecha
borra   scrool_up
imprime "Bienbenido"
borra   scrool_down
ect....

pero cuando en el codigo escribo  "" imprime "Hola Mundo" "" el pic se encargue de leer por si solo la tabla correspondiente, o bien habia pensado hacer cada tabla para cada caracter para asi llamar solamente una tabla pequeña y no tener que recorrer una gran tabla para llegar a lo que quiero


bueno la idea es esa y si ha alguien se le ocurre alguna idea mejor para almacenar los caracteres y luego desplegarlos de una forma facil se agradece cualquier tipo de comentario o idea ya que en verdad no entiendo mucho estos animalitos y estoy recien empezando a domesticarlos

bueno en general mi idea es llegar a algo como esto



fotos de mi primer propeller

foto 1
foto 2
foto 3
foto 4
foto 5
foto 6
foto 7
foto 8
foto 9
foto 10
foto 11
foto 12

Desconectado xootraoox

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 248
RE: duda sobre tablas en asm!
« Respuesta #6 en: 31 de Enero de 2005, 00:03:00 »
upsss ya no hay mas comentarios EnfurruñadoEnfurruñado

Desconectado Eliza_Marti

  • PIC10
  • *
  • Mensajes: 3
RE: duda sobre tablas en asm!
« Respuesta #7 en: 07 de Marzo de 2005, 11:46:00 »
Holas Chicos!..Sonrisa ...Gracias Khronos_Nieto por tu explicación!..ahora entiendo mejor..Giño ..pero tengo todavia ciertas dudas....por ejemplo:
Primero llamo a la tabla dentro de mi programa principal asi:

programa
 
call   tabla
movwf   PORTB
goto   programa   


y antes porsupuesto tengo la definicion de la tabla asi:

 tabla
   movf   TMR0,0
   andlw   0fh
   addwf   PCL,1
   retlw   3fh
   retlw   06h
   retlw   5bh
   retlw   4fh
   retlw   66h
   retlw   6dh
   retlw   7dh
   retlw   07h
   retlw   7fh
   retlw   67h
   retlw   77h
   retlw   7ch
   retlw   39h
   retlw   5eh
   retlw   79h
   retlw   71h

como te darás cuenta el acumulador w se carga dentro de la tabla (andlw 0fh)..bueno ..como tu dijiste el PC contiene la siguiente direccion  a ejecutarse pero a excepcion de un call y otros....entonces Sonrisa en mi caso..en el momento en que hago el call el Pc tendrá la dirección de tabla..(corrijanme porfavor si estoy mal)..luego en tabla..el PC se cargará con la dirección de tabla + 0fh....no?...ahora esta es mi duda ..NO entiendo la logica de funcionamiento...si en mi ejemplo siempre le sumo al PC el mismo valor (que le asigno dentro de tabla)..comparará siempre el mismo valor?...mmmm..entonces ...quiere decir que mi tabla comparará de 0f en 0f?.....ahora si tabla está en 10h y le sumo al pc 0fh entonces con el addwf PCL,1 ..el  PC tendrá.. (10h +0f) ?..y en mi tabla que está arriba no existe esa posición para devolverle algo a W (solo hay hasta 15)...(como funciona?)...

Si alguien podría explicarme  se lo agradecia mucho..Rebotado como se podrán dar cuenta soy principiante...y necesito de los consejos de ustedes los expertos..Giño ..

Gracias por su tiempo!..Rebotado espero sus respuestas!.. Flash




Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: duda sobre tablas en asm!
« Respuesta #8 en: 08 de Marzo de 2005, 16:18:00 »
Hola Elisa, una de las formas de emplear las tablas es, que el PCL se puede cargar con cualquier valor (casi cualquier valor... Giño )
entonces el contador de programa "saltara" al nuevo valor, como si fuese un GOTO
de alli es el uso de addwf pcl,f
que seria adicione el valor de W al registro F, en este caso el PCL
el programa saltara de donde estaba, tantas lineas como sume w
y caera en este caso en la instruccion RETLW XXXXXX  
que seria, RETorne con el Literal en W
es decir, W carga el valor XXXX (no la posicion)
xxxx podria ser un binario  B"00100111"
un decimal  .123   o un asc  "A"

espero se aclare!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Meybel

  • Colaborador
  • PIC12
  • *****
  • Mensajes: 60
RE: duda sobre tablas en asm!
« Respuesta #9 en: 08 de Marzo de 2005, 16:51:00 »
Xooatroox, ¿algo así es lo que quieres?.


Codigo:
; En la pantalla se visualizan varios mensajes, uno detrás de otro. Cada mensaje permanece
; durante 2 segundos. Entre mensaje y mensaje la pantalla se apaga durante unos 200 ms.
;
; ZONA DE DATOS **********************************************************************

   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F84A
   INCLUDE  <P16F84A.INC>

   CBLOCK  0x0C
   ENDC

; ZONA DE CÓDIGOS ********************************************************************

   ORG   0
Inicio
   call   LCD_Inicializa
Principal
   movlw   Mensaje0      ; Apunta al mensaje 0.
   call   Visualiza
   movlw   Mensaje1      ; Apunta al mensaje 1.
   call   Visualiza
   movlw   Mensaje2      ; Apunta al mensaje 2.
   call   Visualiza
   call   Retardo_5s   ; Permanece apagada durante este tiempo.
   goto   Principal      ; Repite la visualización de todos los mensajes.
;
; Subrutina "Visualiza" -----------------------------------------------------------------
;
Visualiza
   call   LCD_Mensaje
   call   Retardo_2s      ; Visualiza el mensaje durante este tiempo.
   call   LCD_Borra      ; Borra la pantalla y se mantiene así durante
   call   Retardo_200ms      ; este tiempo.
   return
;
; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
   addwf   PCL,F
Mensaje0            ; Posición inicial del mensaje 0.
   DT "Estudia PIC, es", 0x00
Mensaje1            ; Posición inicial del mensaje 1.
   DT "muy divertido.", 0x00   
Mensaje2            ; Posición inicial del mensaje 2.
   DT "A mi me gusta.", 0x00

   INCLUDE  <LCD_4BIT.INC>
   INCLUDE  <LCD_MENS.INC>
   INCLUDE  <RETARDOS.INC>
   END

Desconectado Eliza_Marti

  • PIC10
  • *
  • Mensajes: 3
RE: duda sobre tablas en asm!
« Respuesta #10 en: 08 de Marzo de 2005, 19:24:00 »
Gracias Norberto (todopic) por tu explicación!..Giño ...me sirvió de mucho!..RebotadoRebotado ...Flash