TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: macedo en 27 de Agosto de 2012, 13:10:57

Título: Tablas y PIC12F675
Publicado por: macedo en 27 de Agosto de 2012, 13:10:57
Hola tengo este pequeño PIC que lo utilizo para una secuencia de luces, el problema es que para crear varios efectos tengo que hacer una tabla muy larga y al colocarla esta pasa de la dirección 0x100 y me tira erro el compilador apuntando a la instrucción que llame la tabla después de esta dirección
Yo comienzo la tabla en la dirección 0x40.
Como puedo hacer para resolver el problema.
Saludos
Título: Re: Tablas y PIC12F675
Publicado por: KALLITOS en 27 de Agosto de 2012, 13:13:07
eeprom externa por spi o 12c.

saludos
Título: Re: Tablas y PIC12F675
Publicado por: macedo en 27 de Agosto de 2012, 13:24:16
Hola no dad de eso, es un pic conectado a un hc595, las tablas las armo dentro del pic, te pongo algo del cod.:

Código: ASM
  1. TABLA  
  2.       MOVWF   PCL      
  3.  
  4.  
  5. SEC2_1    DT B'00100000',B'01001001',B'10010010',B'00100100',B'01001001',0XAA
  6. SEC2_2    DT B'10010000',B'00100100',B'01001001',B'10010010',B'00100100',0XAA
  7. SEC2_3    DT B'01000000',B'10010010',B'00100100',B'01001001',B'10010010',0XAA
  8. SEC5_1    DT B'01100000',B'00000000',B'00000000',B'00000000',B'00000000',0XAA
  9. SEC5_2    DT B'11110000',B'00000001',B'00000000',B'00000000',B'00000000',0XAA
  10. SEC5_3    DT B'11110000',B'00000001',B'00000000',B'00000000',B'10000000',0XAA
  11. SEC5_4    DT B'11110000',B'00000011',B'00000000',B'00000000',B'11000000',0XAA
  12. SEC5_5    DT B'11110000',B'00000111',B'00000000',B'00000000',B'11100000',0XAA
  13. SEC5_6    DT B'11110000',B'00001111',B'00000000',B'00000000',B'11110000',0XAA
  14. SEC5_7    DT B'11110000',B'00011111',B'00000000',B'00000000',B'11111000',0XAA
  15. SEC5_8    DT B'11110000',B'00111111',B'00000000',B'00000000',B'11111100',0XAA
  16. SEC5_9    DT B'11110000',B'01111111',B'00000000',B'00000000',B'11111110',0XAA
  17. SEC5_10   DT B'11110000',B'11111111',B'00000000',B'00000000',B'11111111',0XAA
  18. SEC5_11   DT B'11110000',B'11111111',B'00000001',B'10000000',B'11111111',0XAA
  19. SEC5_12   DT B'11110000',B'11111111',B'00000011',B'11000000',B'11111111',0XAA
  20. SEC5_13   DT B'11110000',B'11111111',B'00000111',B'11100000',B'11111111',0XAA
  21. SEC5_14   DT B'11110000',B'11111111',B'00001111',B'11110000',B'11111111',0XAA
  22. SEC5_15   DT B'11110000',B'11111111',B'00011111',B'11111000',B'11111111',0XAA
  23. SEC5_16   DT B'11110000',B'11111111',B'00111111',B'11111100',B'11111111',0XAA
  24. SEC5_17   DT B'11110000',B'11111111',B'01111111',B'11111110',B'11111111',0XAA

La tabla es mucho mas larga y me va a ocupar mas de la 3/4 parte del PIC.
Te adjunto el esquema.
Saludos
Título: Re: Tablas y PIC12F675
Publicado por: BrunoF en 27 de Agosto de 2012, 14:27:30
Necesitas poder utilizar un algoritmo que permite tablas que excedan los 256 words de tamaño y en cualquier posicion.

Te recomiendo que leas este hilo: http://www.todopic.com.ar/foros/index.php?topic=12918.0

Título: Re: Tablas y PIC12F675
Publicado por: macedo en 27 de Agosto de 2012, 16:02:49
Hola estuve viendo el post pero no pude hacer que funcione, mi PIC no tiene "page select" y si pongo, como te dije, las tablas despues de la direccion 0x100 no funcionan me tira un aviso "Argument out of range.  Least significant bits used."
saludos
Título: Re: Tablas y PIC12F675
Publicado por: macedo en 27 de Agosto de 2012, 16:06:08
perdon yo llamo asi a las tablas:

Código: ASM
  1. SECUENCIA2_1
  2.     MOVLW   SEC2_1           ;
  3.     CALL    SEND_SEC        ; Subrutina para la escritura del mensaje.
  4.  
  5. SECUENCIA2_2
  6.     MOVLW   SEC2_2           ;
  7.     CALL    SEND_SEC        ; Subrutina para la escritura del mensaje.
  8.  
  9. SECUENCIA2_3
  10.     MOVLW   SEC2_3           ;
  11.     CALL    SEND_SEC        ; Subrutina para la escritura del mensaje.

Y es ese " MOVLW   SEC2_1  " el que me tira el error
saludos
Título: Re: Tablas y PIC12F675
Publicado por: macedo en 31 de Agosto de 2012, 12:53:52
Hola lo pude resolver asi:

Cargo la direccion de la tabla, que puede estar en cualquier lado:
Código: ASM
  1. CLRF    DIR_CHAR
  2.     MOVLW   HIGH  SEC2_1
  3.     MOVWF   AddrTablaHigh
  4.     MOVLW   LOW   SEC2_1
  5.     MOVWF   AddrTablaLow
  6.     CALL    SEND_SEC_LEDS

La tabla es asi:
Código: ASM
  1. SECUENCIAS_LEDS
  2.         movf            DIR_CHAR,W
  3.         addwf           AddrTablaLow,W          ;determinamos si el salto no excede 0xFF
  4.         btfsc           STATUS,C
  5.         incf            AddrTablaHigh,F     ;Si excede => incrementamos la parte alta
  6.         movf            AddrTablaHigh,W
  7.         movwf           PCLATH                      ;actualizamos PCLATH(parte alta)
  8.         movf            DIR_CHAR,W
  9.         addwf           AddrTablaLow,W          ;volvemos a calcular el salto
  10.         movwf           PCL                                 ;actualizamos PCL para realizar el salto.
  11.  
  12. SEC2_1    DT B'00100000',B'01001001',B'10010010',B'00100100',B'01001001',0XAA
  13. SEC2_2    DT B'10010000',B'00100100',B'01001001',B'10010010',B'00100100',0XAA
  14. SEC2_3    DT B'01000000',B'10010010',B'00100100',B'01001001',B'10010010',0XAA

Solo despues de cargar la dirección de la tabla que quiero debo hacer un
Código: ASM
  1. CALL   SECUENCIAS_LEDS

Y LISTO DEVUELVE EL VALOR EN "W"
Esto es parte de un ejemplo que encontré en la web y lo adapte. Espero que les sirva.
Saludos  :-/
Título: Re: Tablas y PIC12F675
Publicado por: macedo en 06 de Septiembre de 2012, 11:31:22
Bueno unas anotaciones:
Una secuencia de la tabla no tiene que estar dividida, una mitad en una pagina de memoria y la otra en la siguiente ya que se cuelga. La tendrían que organizar desde el principio de la pagina asi:

Todo el codigo:
Código: ASM
  1. ORG  0X300
  2.  
  3. SECUENCIAS_LEDS
  4.         movf            DIR_CHAR,W
  5.         addwf           AddrTablaLow,W          ;determinamos si el salto no excede 0xFF
  6.         btfsc           STATUS,C
  7.         incf            AddrTablaHigh,F     ;Si excede => incrementamos la parte alta
  8.         movf            AddrTablaHigh,W
  9.         movwf           PCLATH                      ;actualizamos PCLATH(parte alta)
  10.         movf            DIR_CHAR,W
  11.         addwf           AddrTablaLow,W          ;volvemos a calcular el salto
  12.         movwf           PCL                                 ;actualizamos PCL para realizar el salto.
  13.  
  14. SEC2_1    DT B'00100000',B'01001001',B'10010010',B'00100100',B'01001001',0XAA
  15. SEC2_2    DT B'10010000',B'00100100',B'01001001',B'10010010',B'00100100',0XAA
  16. SEC2_3    DT B'01000000',B'10010010',B'00100100',B'01001001',B'10010010',0XAA
  17.  
  18. SEC5_1    DT B'01100000',B'00000000',B'00000000',B'00000000',B'00000000',0XAA   ; SEC4_2
  19. SEC5_2    DT B'11110000',B'00000001',B'00000000',B'00000000',B'00000000',0XAA
  20. SEC5_3    DT B'11110000',B'00000001',B'00000000',B'00000000',B'10000000',0XAA
  21. SEC5_4    DT B'11110000',B'00000011',B'00000000',B'00000000',B'11000000',0XAA
  22. SEC5_5    DT B'11110000',B'00000111',B'00000000',B'00000000',B'11100000',0XAA
  23. SEC5_6    DT B'11110000',B'00001111',B'00000000',B'00000000',B'11110000',0XAA
  24. SEC5_7    DT B'11110000',B'00011111',B'00000000',B'00000000',B'11111000',0XAA
  25. SEC5_8    DT B'11110000',B'00111111',B'00000000',B'00000000',B'11111100',0XAA
  26. SEC5_9    DT B'11110000',B'01111111',B'00000000',B'00000000',B'11111110',0XAA
  27. SEC5_10   DT B'11110000',B'11111111',B'00000000',B'00000000',B'11111111',0XAA
  28. SEC5_11   DT B'11110000',B'11111111',B'00000001',B'10000000',B'11111111',0XAA
  29. SEC5_12   DT B'11110000',B'11111111',B'00000011',B'11000000',B'11111111',0XAA
  30. SEC5_13   DT B'11110000',B'11111111',B'00000111',B'11100000',B'11111111',0XAA
  31. SEC5_14   DT B'11110000',B'11111111',B'00001111',B'11110000',B'11111111',0XAA
  32. SEC5_15   DT B'11110000',B'11111111',B'00011111',B'11111000',B'11111111',0XAA
  33. SEC5_16   DT B'11110000',B'11111111',B'00111111',B'11111100',B'11111111',0XAA
  34. SEC5_17   DT B'11110000',B'11111111',B'01111111',B'11111110',B'11111111',0XAA
  35.  
  36. SEC7_1    DT B'00000000',B'11000000',B'00000000',B'00000000',B'00000011',0XAA
  37. SEC7_2    DT B'00000000',B'00100000',B'00000001',B'10000000',B'00000100',0XAA
  38. SEC7_3    DT B'00000000',B'00010000',B'00000010',B'01000000',B'00001000',0XAA
  39. SEC7_4    DT B'00000000',B'00001000',B'00000100',B'00100000',B'00010000',0XAA
  40. SEC7_5    DT B'00000000',B'00000100',B'00001000',B'00010000',B'00100000',0XAA
  41. SEC7_6    DT B'00000000',B'00000010',B'00010000',B'00001000',B'01000000',0XAA
  42. SEC7_7    DT B'00000000',B'00000001',B'00100000',B'00000100',B'10000000',0XAA
  43. SEC7_8    DT B'10010000',B'00000000',B'01000000',B'00000010',B'00000000',0XAA
  44. SEC7_9    DT B'01100000',B'00000000',B'10000000',B'00000001',B'00000000',0XAA
  45.  
  46. SEC9_0    DT B'00000000',B'00000000',B'00000000',B'00000000',B'00000000',0XAA
  47. SEC9_1    DT B'00000000',B'11000000',B'00000000',B'00000000',B'00000011',0XAA
  48. SEC9_2    DT B'00000000',B'11100000',B'00000001',B'10000000',B'00000111',0XAA
  49. SEC9_3    DT B'00000000',B'11110000',B'00000011',B'11000000',B'00001111',0XAA
  50. SEC9_4    DT B'00000000',B'11111000',B'00000111',B'11100000',B'00011111',0XAA
  51. SEC9_5    DT B'00000000',B'11111100',B'00001111',B'11110000',B'00111111',0XAA
  52. SEC9_6    DT B'00000000',B'11111110',B'00011111',B'11111000',B'01111111',0XAA
  53. SEC9_7    DT B'00000000',B'11111111',B'00111111',B'11111100',B'11111111',0XAA
  54. SEC9_8    DT B'10010000',B'11111111',B'01111111',B'11111110',B'11111111',0XAA
  55. SEC9_9    DT B'11110000',B'11111111',B'11111111',B'11111111',B'11111111',0XAA

O asi, dividiendo en dos paginas:
Código: ASM
  1. SECUENCIAS_LEDS
  2.         movf            DIR_CHAR,W
  3.         addwf           AddrTablaLow,W          ;determinamos si el salto no excede 0xFF
  4.         btfsc           STATUS,C
  5.         incf            AddrTablaHigh,F     ;Si excede => incrementamos la parte alta
  6.         movf            AddrTablaHigh,W
  7.         movwf           PCLATH                      ;actualizamos PCLATH(parte alta)
  8.         movf            DIR_CHAR,W
  9.         addwf           AddrTablaLow,W          ;volvemos a calcular el salto
  10.         movwf           PCL                                 ;actualizamos PCL para realizar el salto.
  11.  
  12. SEC2_1    DT B'00100000',B'01001001',B'10010010',B'00100100',B'01001001',0XAA
  13. SEC2_2    DT B'10010000',B'00100100',B'01001001',B'10010010',B'00100100',0XAA
  14. SEC2_3    DT B'01000000',B'10010010',B'00100100',B'01001001',B'10010010',0XAA
  15.  
  16. SEC5_1    DT B'01100000',B'00000000',B'00000000',B'00000000',B'00000000',0XAA   ; SEC4_2
  17. SEC5_2    DT B'11110000',B'00000001',B'00000000',B'00000000',B'00000000',0XAA
  18. SEC5_3    DT B'11110000',B'00000001',B'00000000',B'00000000',B'10000000',0XAA
  19. SEC5_4    DT B'11110000',B'00000011',B'00000000',B'00000000',B'11000000',0XAA
  20. SEC5_5    DT B'11110000',B'00000111',B'00000000',B'00000000',B'11100000',0XAA
  21. SEC5_6    DT B'11110000',B'00001111',B'00000000',B'00000000',B'11110000',0XAA
  22. SEC5_7    DT B'11110000',B'00011111',B'00000000',B'00000000',B'11111000',0XAA
  23. SEC5_8    DT B'11110000',B'00111111',B'00000000',B'00000000',B'11111100',0XAA
  24. SEC5_9    DT B'11110000',B'01111111',B'00000000',B'00000000',B'11111110',0XAA
  25. SEC5_10   DT B'11110000',B'11111111',B'00000000',B'00000000',B'11111111',0XAA
  26. SEC5_11   DT B'11110000',B'11111111',B'00000001',B'10000000',B'11111111',0XAA
  27. SEC5_12   DT B'11110000',B'11111111',B'00000011',B'11000000',B'11111111',0XAA
  28. SEC5_13   DT B'11110000',B'11111111',B'00000111',B'11100000',B'11111111',0XAA
  29. SEC5_14   DT B'11110000',B'11111111',B'00001111',B'11110000',B'11111111',0XAA
  30. SEC5_15   DT B'11110000',B'11111111',B'00011111',B'11111000',B'11111111',0XAA
  31. SEC5_16   DT B'11110000',B'11111111',B'00111111',B'11111100',B'11111111',0XAA
  32. SEC5_17   DT B'11110000',B'11111111',B'01111111',B'11111110',B'11111111',0XAA
  33.  
  34.     ORG  0X300     ; Asi funciona tambien, no tiene que estar la tabla dividada por
  35.                     ; la pagina de memoria.
  36.  
  37. SEC7_1    DT B'00000000',B'11000000',B'00000000',B'00000000',B'00000011',0XAA
  38. SEC7_2    DT B'00000000',B'00100000',B'00000001',B'10000000',B'00000100',0XAA
  39. SEC7_3    DT B'00000000',B'00010000',B'00000010',B'01000000',B'00001000',0XAA
  40. SEC7_4    DT B'00000000',B'00001000',B'00000100',B'00100000',B'00010000',0XAA
  41. SEC7_5    DT B'00000000',B'00000100',B'00001000',B'00010000',B'00100000',0XAA
  42. SEC7_6    DT B'00000000',B'00000010',B'00010000',B'00001000',B'01000000',0XAA
  43. SEC7_7    DT B'00000000',B'00000001',B'00100000',B'00000100',B'10000000',0XAA
  44. SEC7_8    DT B'10010000',B'00000000',B'01000000',B'00000010',B'00000000',0XAA
  45. SEC7_9    DT B'01100000',B'00000000',B'10000000',B'00000001',B'00000000',0XAA
  46.  
  47. SEC9_0    DT B'00000000',B'00000000',B'00000000',B'00000000',B'00000000',0XAA
  48. SEC9_1    DT B'00000000',B'11000000',B'00000000',B'00000000',B'00000011',0XAA
  49. SEC9_2    DT B'00000000',B'11100000',B'00000001',B'10000000',B'00000111',0XAA
  50. SEC9_3    DT B'00000000',B'11110000',B'00000011',B'11000000',B'00001111',0XAA
  51. SEC9_4    DT B'00000000',B'11111000',B'00000111',B'11100000',B'00011111',0XAA
  52. SEC9_5    DT B'00000000',B'11111100',B'00001111',B'11110000',B'00111111',0XAA
  53. SEC9_6    DT B'00000000',B'11111110',B'00011111',B'11111000',B'01111111',0XAA
  54. SEC9_7    DT B'00000000',B'11111111',B'00111111',B'11111100',B'11111111',0XAA
  55. SEC9_8    DT B'10010000',B'11111111',B'01111111',B'11111110',B'11111111',0XAA
  56. SEC9_9    DT B'11110000',B'11111111',B'11111111',B'11111111',B'11111111',0XAA

Espero que les sirva.
Saludos