Autor Tema: tablas en 16f873a  (Leído 2152 veces)

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

Desconectado Andres71

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 149
tablas en 16f873a
« en: 10 de Enero de 2006, 16:02:00 »
Saludos,
estoy haciendo un programa que contiene varias tablas y deseo saber
que recomendaciones y cuidados debo tener en el momento de hacer el
programa, ya lo hice pero no funciona bien y cambia cuando ubico en
una parte diferente las tablas, mi programa tiene unas 650 lineas, cual es la forma mas correcta de hacerlo??? de antemano gracias.

ANDRES ALEGRIA
andresalegria@...
alegriaconejo2@...
Popayan-CAUCA-COLOMBIA
"Dice mas el necio cuando calla, que el sabio cuando habla"

ANDRES ALEGRIA
alegriaandres@gmail.com
andresalegria@hotmail.com

Desconectado poi5on

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 127
RE: tablas en 16f873a
« Respuesta #1 en: 10 de Enero de 2006, 16:15:00 »
Hola amigo.
Debes colocar las tablas los mas arriba que puedas en tu programa x q sino no funcionan y saltan erraticamente.

Saludos

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: tablas en 16f873a
« Respuesta #2 en: 10 de Enero de 2006, 18:22:00 »
Hola Andres71, como ya dijo poi5on las tablas deberán estar lo mas arriba posible, para ser mas exactos las tablas tienen que estas desde la posición 0 a la 255 de la memoria de programa, pero ojo, que las primeras 6 posiciones las utilizas para redireccionar los vectores de reset y de interrupción.

Por lo tanto las tablas no deben de superar la línea 255 si pasan de esta posición el salto que se produce dentro de la tabla será erróneo, en definitiva el largo total de la tabla podrá ser de máximo 250 líneas

Espero te ayude, suerte

Atte. CARLOS


La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
RE: tablas en 16f873a
« Respuesta #3 en: 11 de Enero de 2006, 02:43:00 »
Hola Andres71.

Cuando yo utilizo alguna tabla lo hago de la siguiente forma.

Codigo:
movlw   HIGH(tabla_display)      ;PC = PCLATH + PCL (primero calculamos la parte alta del PC (PCLATH) y despues le sumamos el PCL correspondiente)
movwf   PCLATH

movf   UNIDADES_CONSIGNA,W
call   tabla_display

.
.
.
.

tabla_display   ADDWF   PCL,F
                  RETLW   b"11101011"      ;0
                  RETLW   b"00001010"      ;1
                  RETLW   b"01111001"      ;2
                  RETLW   b"01011011"      ;3
                  RETLW   b"10011010"      ;4
                  RETLW   b"11010011"      ;5
                  RETLW   b"11110011"      ;6
                  RETLW   b"00001011"      ;7
                  RETLW   b"11111011"      ;8
                  RETLW   b"10011011"      ;9



Con esta forma de llamar a las tablas, auque tengas un programa muy largo y tengas que paginar la memoria, la cosa te funcionará perfectamente.

Dependiendo del valor que tengamos en "UNIDADES_CONSIGNA" la tabla nos devolverá un determinado valor.

Si la cosa no está muy clara puedes mirar en:

http://www.janso.com.ar/_spanish/nota1_paginado.htm

Espero que te sirva.


Un saludo desde Alicante.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
RE: tablas en 16f873a
« Respuesta #4 en: 11 de Enero de 2006, 07:10:00 »
Hola Andres71. Bueno...Azicuetano te ha respondido claramente lo que deseas. Siempre y cuando cargues la parte "ALTA" de la posicion de la tabla en el PCLATH antes de realizar la suma al PCL, no vas a tener problemas en utilizarla/s en cualquier parte del programa. Pero si tenes que tener en cuenta, que la una tabla no puede cruzar dos o mas pasos de 256 posiciones de memoria Flash.

Un detalle:

call tabla_display


tabla_display
movlw HIGH(tabla_display)
movwf PCLATH
movf UNIDADES_CONSIGNA,W

ADDWF PCL,F
RETLW b"11101011" ;0
RETLW b"00001010" ;1
RETLW b"01111001" ;2
RETLW b"01011011" ;3
RETLW b"10011010" ;4
RETLW b"11010011" ;5
RETLW b"11110011" ;6
RETLW b"00001011" ;7
RETLW b"11111011" ;8
RETLW b"10011011" ;9

Esa variacion debe funcionar perfectamente. No es nada importante, pero por ahi te haga el codigo del programa principal un poco mas facil de comprender para posterior analisis y lectura.
Exitos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Andres71

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 149
RE: tablas en 16f873a
« Respuesta #5 en: 11 de Enero de 2006, 13:36:00 »
Gracias por las respuestas, intentare lo que me dicen pues la verad ya no se cque hacer, cuando arreglo una tabla, falla la otra en fin probare y les comunicare los resultados, nuevamente mil gracias por dedicar su tiempo a ayudar a quien lo necesita.RebotadoFlash
"Dice mas el necio cuando calla, que el sabio cuando habla"

ANDRES ALEGRIA
alegriaandres@gmail.com
andresalegria@hotmail.com

Desconectado Andres71

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 149
RE: tablas en 16f873a
« Respuesta #6 en: 12 de Enero de 2006, 21:08:00 »
!Solucionado¡Rebotado
Bueno por ahi faltaba un detalle que ahora veo era importante, las tablas se usaban la mayoria dentro de las interrupciones, y ese era otro problema, bueno la solucion fue:
1- antes de llamar una tabla, recuperar la palte alta de PCL de la posicion de la tabla  y guardarla en PCLATCH, despues de esto llamar  la tabla y listo no molestaba mas y queda asi:

      movlw      HIGH(tablaciclo0)   
      movwf      PCLATH
      movf       Ciclo,W   
      call          tablaciclo0
      movwf      CICLO_0

esta es para llamar a la tabla tablaciclo0 y guardar el valor recuperado en CICLO_0.

2- Y esta que la verdad ni sabia que habia que hacerla, al ingresar a la INTs recuperar y guardar el valor de PCLATCH, despues de atendida la INTs recuperar este valor y listo, queda asi:

INTs        bcf         Intcon,7                ;desactio las INTs
      MOVWF      W_TEMP         ;SALVO EL REGISTRO W
      SWAPF        STATUS,W
      MOVWF      STATUS_TEMP        ;SALVO EL REGISTRO STATUS
      CLRF         STATUS            ;TRABAJO EN BANK 0
      MOVFW      PCLATH           ; SALVO EL REGISTRO PCLATH
      MOVWF      PCLATH_TEMP
      CLRF         PCLATH                    ;borro PCLATCH
                -                                                      ;
                -                                                      ;
                -                                                      ;atiendo todas las INTs
                -                                                      ;
                -                                                      ;
                -                                                      ;


saINT       MOVFW      PCLATH_TEMP
      MOVWF          PCLATH
      SWAPF           STATUS_TEMP,W
      MOVWF          STATUS
      SWAPF           W_TEMP,F

      bcf               Intcon,0   ;borro bandera RBIF
      bcf               Intcon,2   ;borro bandera TOIF
      bcf               Intcon,1   ;borro bandera INTF
      BSF              Intcon,7
            retfie                                      ;Retorna habilitando las interrupciones


y al salir recupero los valores de ya sabemos W, STATUS y PCLATCH, ahora el programa funciona de lo mas bien, nuevamente mil gracias por la ayuda atodas las personas.

"Dice mas el necio cuando calla, que el sabio cuando habla"

ANDRES ALEGRIA
alegriaandres@gmail.com
andresalegria@hotmail.com

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: tablas en 16f873a
« Respuesta #7 en: 12 de Enero de 2006, 21:31:00 »
Hola Andres71 el gusto fue nuestro poder ayudarte.

Suerte

Atte. CARLOS
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.


 

anything