Autor Tema: Problemas usando tablas  (Leído 1771 veces)

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

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Problemas usando tablas
« en: 01 de Mayo de 2013, 09:16:13 »
Muchos saludos...

Tengo un pequeño problema que desde ayer me está inquietando. Estoy haciendo un programa para el PIC16F84A que al pulsar tanto un botón de subida como uno de bajada, cuente o descuente respectivamente.

Después de haber buscado en el foro y en Google, he visto que en todas partes explican lo mismo. He tratado de hacerlo tal y como lo veo, sin embargo, me da siempre el mismo problema: no muestra en pantalla. Es como si llamara la tabla, pero no retorna nada. Como soy muy nuevo, quizás se me esté escapando algo.

En lo que he podido observar, el problema está en la llamada de la tabla. Si quito esa llamada, el código sigue su ciclo normal, pero una vez que coloco el call tabla nuevamente, el código como que se desvía y no retorna...

Agradecería mucho que alguien me de un empujoncito..

El fragmento del código en donde está el fallo es este:

Nota: Si a la tabla le quito ADDWF  PCL,f y coloco MOVWF PCL me retorna un valor, pero obviamente el valor no es variable.   

Código: [Seleccionar]

f_descuenta DECF 22h,1 ;Descontamos el valor del registro 22h
DECF 23h,1 ;Descontamos el valor del registro 23h


f_pund2 MOVLW 22h ;Cargo en W el valor contenido en 22h
CALL tbl_und ;Llamo la tabla
MOVWF PORTA ;Imprimo el valor que retorna


f_pdec2 MOVLW 23h ;Cargo en W el valor contenido en 23h
CALL tbl_dec ;Llamo la tabla
MOVWF PORTB ;Imprimo el valor que retorna
f_exit3 RETURN

;----------------------------------------------------------------------------------------------------

tbl_und ADDWF PCL,f ; se incrementa el contador de programa
RETLW B'00000' ; código para el 0
RETLW B'00001' ; código para el 1
RETLW B'00010' ; código para el 2
RETLW B'00011' ; código para el 3
RETLW B'00100' ; código para el 4
RETLW B'00101' ; código para el 5
RETLW B'00110' ; código para el 6
RETLW B'00111' ; código para el 7
RETLW B'01000' ; código para el 8
RETLW B'01001' ; código para el 9

tbl_dec ADDWF PCL,f ; se incrementa el contador de programa
RETLW B'00000000' ; código para el 0
RETLW B'00010000' ; código para el 1
RETLW B'00100000' ; código para el 2
RETLW B'00110000' ; código para el 3
RETLW B'01000000' ; código para el 4
RETLW B'01010000' ; código para el 5
RETLW B'01100000' ; código para el 6
RETLW B'01110000' ; código para el 7
RETLW B'10000000' ; código para el 8
RETLW B'10010000' ; código para el 9

« Última modificación: 01 de Mayo de 2013, 09:29:36 por romarco »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas usando tablas
« Respuesta #1 en: 01 de Mayo de 2013, 13:49:15 »
Hola,

debe ser un problema de paginación. Hemos hablado e incluso propuesto soluciones para este inconveniente. En tu caso, si sólo tenés esas dos tablas, te recomiendo que te asegures que esten siempre dentro de las primeras 256 Words de la FLASH. Ese es el problema acá seguramente.

Podés hacer por ejemplo:

     ORG 0x000
     ;...
     GOTO INICIO
        
     ORG 0x004       ;ISR
     GOTO ISR
 
;ACA LAS  TABLAS
;.....

ISR
      ;...
INICIO
     ;...
      

  
"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 Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problemas usando tablas
« Respuesta #2 en: 01 de Mayo de 2013, 17:11:36 »
Hola romarco como dice BrunoF seria algo parecido a esto:
Código: ASM
  1. list            p=16f873A       ; list directive to define processor
  2.         #include        <p16f873A.inc; processor specific variable definitions
  3.        
  4.         __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF & _DEBUG_OFF
  5.  
  6. ; '__CONFIG' directive is used to embed configuration data within .asm file.
  7. ; The lables following the directive are located in the respective .inc file.
  8. ; See respective data sheet for additional information on configuration word.
  9.  
  10.  
  11.         ERRORLEVEL -205
  12.  
  13.  
  14. ;***** VARIABLE DEFINITIONS
  15. w_temp          EQU     0x20            ; variable used for context saving
  16. w_temp1         EQU     0xA0            ; reserve bank1 equivalent of w_temp
  17. status_temp     EQU     0x21            ; variable used for context saving
  18. pclath_temp     EQU     0x22            ; variable used for context saving
  19. Pulsador        EQU     0                       ; Definimos Pulsador como el bit 0, en este caso PORTA
  20.  
  21. CBLOCK          0x23
  22. Contador
  23. PDel0
  24. PDel1
  25. ENDC
  26.  
  27.  
  28.  
  29. ;**********************************************************************
  30.         ORG     0x000             ; processor reset vector
  31.  
  32. ;       nop                                               ; nop required for icd
  33.         goto    main              ; go to beginning of program
  34.  
  35.  
  36.         ORG     0x004             ; interrupt vector location
  37.  
  38.         movwf   w_temp            ; save off current W register contents
  39.         movf    STATUS,w          ; move status register into W register
  40.         bcf     STATUS,RP0        ; ensure file register bank set to 0
  41.         movwf   status_temp       ; save off contents of STATUS register
  42.         movf    PCLATH,w              ; move pclath register into w register
  43.         movwf   pclath_temp           ; save off contents of PCLATH register
  44.  
  45.  
  46. ; isr code can go here or be located as a call subroutine elsewhere
  47.  
  48.         bcf     STATUS,RP0        ; ensure file register bank set to 0
  49.         movf    pclath_temp,w     ; retrieve copy of PCLATH register
  50.         movwf   PCLATH                ; restore pre-isr PCLATH register contents
  51.         movf    status_temp,w     ; retrieve copy of STATUS register
  52.         movwf   STATUS            ; restore pre-isr STATUS register contents
  53.         swapf   w_temp,f
  54.         swapf   w_temp,w          ; restore pre-isr W register contents
  55.         retfie                    ; return from interrupt
  56.  
  57. BCD7SEG:
  58.         addwf   PCL,1                           ; Se incrementa el contador del programa
  59.         retlw   b'0111111'                      ; 0
  60.         retlw   b'0000110'                      ; 1
  61.         retlw   b'1011011'                      ; 2
  62.         retlw   b'1001111'                      ; 3
  63.         retlw   b'1100110'                      ; 4
  64.         retlw   b'1101101'                      ; 5
  65.         retlw   b'1111101'                      ; 6
  66.         retlw   b'0000111'                      ; 7
  67.         retlw   b'1111111'                      ; 8
  68.         retlw   b'1101111'                      ; 9
  69.         clrf    Contador                        ; Si llega a 10, se resetea contador
  70.         retlw   b'0111111'                      ; 0
  71.  
  72. main
  73.         bcf             STATUS,RP0
  74.         bcf             STATUS,RP1                      ; Bank0
  75.         clrf    PORTA                           ; Initialize PORTA by clearing output data latches
  76.         clrf    PORTB                           ; Initialize PORTB by clearing output data latches
  77.         bsf             STATUS,RP0                      ; Bank1
  78.         movlw   0x06                            ; Configure all pins as digital inputs
  79.         movwf   ADCON1
  80.         movlw   b'00000001'                     ; Value used to initialize data direction
  81.         movwf   TRISA                           ; Set RA<0> as input, RA<5:1> as outputs
  82.                                                                 ; TRISA<7:6> are always read as '0'
  83.         clrf    TRISB
  84.         bcf             STATUS,RP0                      ; Bank0
  85.         movlw   b'0111111'                      ; Comienza en '0'
  86.         movwf   PORTB
  87.         clrf    Contador
  88.        
  89. ;Testeo del pulsador
  90. Testeo
  91.         btfss   PORTA,Pulsador          ; Testeamos si esta a '1' logico
  92.         goto    Testeo                          ; No, seguimos testeando               
  93.         call    Demora15                        ; Eliminamos efecto rebote
  94.         btfss   PORTA,Pulsador          ; Testeamos nuevamente
  95.         goto    Testeo                          ; Falsa alarma, seguimos testeando
  96.         incf    Contador,0                      ; Se ha pulsado, incrementamos contador
  97.         movwf   Contador                        ; Pasamos contador a W
  98.         call    BCD7SEG                         ; Llamamos tabla
  99.         movwf   PORTB                           ; Cargamos valor recibido  por Tabla en PORTB
  100.         btfsc   PORTA,Pulsador          ; Esperamos a que se suelte el pulsador
  101.         goto    $-1                                     ; No, PLC - 1, --> btfss
  102.         call    Demora15                        ; Eliminamos efecto rebote
  103.         btfsc   PORTA,Pulsador          ; Testeamos nuevamente
  104.         goto    $-4                                     ; No, falsa alarma, volvemos a testear a que se suelte
  105.         goto    Testeo                          ; Si, testeamos nuevamente
  106.        
  107. ;-------------------------------------------------------------
  108. ; Demora 15ms
  109. ; Generado con PDEL ver SP  r 1.0  el 04/03/2013 Hs 21:26:04
  110. ; Descripcion: Delay 15000 ciclos
  111. ;-------------------------------------------------------------
  112. Demora15
  113.             movlw     .21       ; 1 set numero de repeticion  (B)
  114.         movwf     PDel0     ; 1 |
  115. PLoop1  movlw     .142      ; 1 set numero de repeticion  (A)
  116.         movwf     PDel1     ; 1 |
  117. PLoop2  clrwdt              ; 1 clear watchdog
  118.         clrwdt              ; 1 ciclo delay
  119.         decfsz    PDel1,1   ; 1 + (1) es el tiempo 0  ? (A)
  120.         goto      PLoop2    ; 2 no, loop
  121.         decfsz    PDel0,1   ; 1 + (1) es el tiempo 0  ? (B)
  122.         goto      PLoop1    ; 2 no, loop
  123.         clrwdt              ; 1 ciclo delay
  124.         return              ; 2+2 Fin.
  125. ;-------------------------------------------------------------
  126.        
  127.        
  128.         END                       ; directive 'end of program'

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problemas usando tablas
« Respuesta #3 en: 02 de Mayo de 2013, 07:01:05 »
Prueba a cambiar:

"movlw 22h" por  "movf  22h,0"

Porque lo que esta cargando, creo yo, es el valor 22h quee es 34 en decimal y te desborda las tablas.

Desconectado romarco

  • PIC10
  • *
  • Mensajes: 19
Re: Problemas usando tablas
« Respuesta #4 en: 02 de Mayo de 2013, 10:08:33 »
Les agradezco sus respuestas... Lo de la paginación no era el problema, aún así seguí los consejos de  BrunoF y Miquel_S y coloqué las tablas al principio por si acaso.

El error estaba en lo que dijo tapi8, pues en vez de estar colocando el valor del registro 22h en W, lo que estaba cargando era el valor 22h en W y por eso se desbordaba.

Muchas gracias, la próxima vez a tener esto en cuenta...

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Problemas usando tablas
« Respuesta #5 en: 02 de Mayo de 2013, 14:33:49 »
Me alegra que lo hayas solucionado.

Todavia tendras otro problema, cuando decrementas no miras si ya es 0, cuando sea 0 si dcrementas quedara FF y te desbordara las tablas, debes mirar si ya es 0 antes de dcrementar:

movf  22h,1   ;mover 22h a W y devolverlo a 22h
btfsc  STATUS,Z  ;al pasar un reg. por W, si es 0 pondra a 1 el falg Z
goto  NO_DECREMENTA  ;ya es 0, por tanto no dcrementa
decf  22h,1    ;decrementa porque no es 0

Bueno mas o menos asi.

Si tambien incrementa debes mirar que no sobrepase del numero maximo, sino tambien desbordara las tablas.


 

anything