Tabla Loca PIC solo un salto no posible

Hola y gracias por leer esto de Tabla Loca ... o tal vez debería titularse: Programador con la cabeza quemada ...:LOL:
En fin, aquí vamos. Luego de grandes dolores de cabeza con la programación de un PIC, decidí generar un programita sólo para simular los benditos saltos a una Tabla.
El programa es el siguiente:
El Tema es que puedo ubicar la tabla en cualquier lado MENOS en 7FD. La he probado en 5FD 6FD e incluso en 9FD y EFD. Para cualquiera de estas posiciones el tema funciona de maravilla y eso que estaría saltando de página (2k) y fin de bloque de 0xFF.
Todo funciona bien MENOS en 7FD, en ese caso cuando hace el call el PC se carga con FFD y como consecuencia todo funciona mal.
En TODOS los otros casos el PC se carga correctamente y el programa función bien.
Ya he leído todo lo que hay al respecto y no encuentro una explicación lógica a este comportamiento.
Pensé que había encontrado la piedra filosofal cuando vi las instrucciones lcall y lgoto pero no funcionó (de dónde sacaron estas instrucciones? hay más de este tipo?).
Alguien puede ayudar?
Por otra parte desearía que me orienten para "bajar" algún PIC simulator piola (yo estoy usando el de Microchip MPLAB). Bajé el PIC sim pero parece que es para O.S. de 64 bits porque no me anda.
Bueno, muchas gracias por ahora y hasta pronto.
 

Adjuntos

  • Prueba_Salto.txt
    1 KB · Visitas: 8
Hola Gudino, gracias por responder.
EL micro es un PIC16F73 (un poco viejito lo sé, pero es el que tenía de sobra para este proyecto ya que necesito 3 PORTS o dos y medio).
Por lo que veo no se adjuntó el archivo del programa (lo posteo de nuevo).
El micro tien 4k (o sea dos páginas de 2k), y nunca escuché que use esa parte para gestionar el soft cargado.
Tengo el manual y lo voy a releer, pero no veo que algo pueda estar justo ahí.
A ver si esta vez lo logro (paciencia que soy nuevo en esto),. Ahí va el programa:
PHP:
LIST        P=16F73
    #INCLUDE    <P16F73.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    ERRORLEVEL-302
    ERRORLEVEL-305

    CBLOCK    0X20
    puntero
    keep_PCLATH
    endc

    IF((HIGH End_Tabla  - HIGH Start_Tabla) > 0)
        ;ERROR "GUARDA CHABON !!!"
        MESSG "CAMBIO DE BLOQUE EN TABLA"
    ENDIF
reset    org 0x00
Inicio
    movlw    .5
    movwf    puntero
    goto    Comienzo
    org 0x080
Comienzo    
    movlw     LOW (Tabla+1)     ;get low 8 bits of address
    addwf     puntero,F     ;do an 8-bit add operation
    movlw     HIGH (Tabla+1)     ;get high 5 bits of address
    btfsc     STATUS,C    ;page crossed?
    addlw     .1             ;yes then increment high address
    movwf     PCLATH         ;load high address in latch
    movf     puntero,W         ;load computed offset in w reg
    call     Tabla
    clrf    PCLATH
    nop
    goto    Inicio

    org 0x7FD
Start_Tabla    
Tabla
    movwf     PCL     ;load computed offset in PCL
    retlw     '0'     
    retlw     '1'     
    retlw     '2'     
    retlw    '3'        
    retlw     '4'     
    retlw     '5'     
    retlw     '6'     
    retlw    '7'        
    retlw     '8'     
    retlw     '9' 
    retlw     '*'     
    retlw    '#'    
End_Tabla    
    
    end
No logro que se adjunte el programa.
 
Última edición por un moderador:
Tu código prepara el PCLATH con la parte alta de la dirección del elemento de la tabla, y si el elemento cruza una página CON RESPECTO A LA TABLA, se incrementa PCLATH antes de la llamada al principio de la tabla QUE SE ENCUENTRA ANTES DEL CRUZE de la página. Siempre que el incremento no cambie la dirección de la página 0x700 a la 0x800 esto no afecta a la llamada CALL tabla, porque la instrucción CALL toma los 11 primeros bits de la misma instrucción y los dos restantes de los bits 3 y 4 de PCLATH, y mientras estos 2 bits no cambien desde que se carga en PCLATH la parte alta de la dirección de la rutina hasta la llamada efectiva a la rutina, entonces todo va bien.

¿Pero que pasa en el cambio de 0x7FD a 0x800?, pues que intentas preparar PCL para que se sume el valor correcto en la tabla, pero antes del salto PCLATH pasa de 0x07 a 0x08, es decir, ya se apunta a la página siguiente cuando el salto se debe producir a la dirección de la página anterior. ¿Parte alta de la dirección de CALL? 0x07 (porque la tabla empieza en 0x07FD), ¿si pongo a 0 los tres primeros bits de PCLATH (ya que para el salto no cuentan por lo contado antes) que tengo en PCLATH? 0x08, ¿si quiero saltar a la rutina de tabla, que debería contener? 0x00 (0x07 sin anular los tres bits mas bajos) ¿entonces donde salta? La parte alta sería 0x08+0x07=0x0F.

¿Como evitar esto? No tocar PCLATH antes del salto. Puedes, en lugar del addlw 1 al PCLATH, marcas un bit en alguna variable previamente puesta a cero, y ya luego del salto, en la rutina de la tabla al principio haces un BTFSC de dicho bit y si no es cero haces INCF PCLATH, así no tocas W y consigues corregir PCLATH para cuando computes PCL en la rutina.

PD: Fogo, aunque suene informal y no se dijera en una conferencia (bueno, en las de TED si) en España lo que he editado de este post no es una expresión malsonante, es como ROTF LOL en inglés. A veces se me olvida que es un foro internacional y no todo el mundo a veces entiende lo mismo.
 
Hola Palurdo,
Gacias por responder a mi pregunta y disculpas por el tiempo de respuesta mío (solo puedo trabajar en esto los fines de semana :) ).
Ya he solucionado el tema de la Tabla.
Ahora estoy buscando un assembler para generar un caracter propio en LCD.
Ya busqué por todo el foro, pero en el único lugar en donde está la solución, el link no funciona.
Yo he adquirido el libro de Enrique Palacios (Microcont. PIC16F84), pero en el CD no vienen incluidos los ejemplos para generarlos y nos los encuentro por ningun lado.
Tienes alguna guía para este tema.

Desde ya Gracias.
 
Gracias fdesergio por tu aporte.
MUY clara tu explicación y excelente video para los que necesitamos una explicación detallada.
Aprovecho tu participación para preguntarte si conoces algún buen simulador para PIC.
He probado el PIC Simulator IDE --> MUY LENTO y no tiene (o no conozco), una opción para ir directo a un breakpoint sin tener que esperar por todo la ejecución del programa (una demora para mostrar un display de 2 segundos resulta ETERNA en éste simulador).
Por otra parte no puedo simular un teclado como el que está en los ejemplos del Ing. Palacios.
Mi versión de Proteus no maneja el PIC16F73 que es el que estoy usando.:cry:
También probé el PICSimLAB pero ese sólo maneja un reducido número de PICs.
Estoy usando una versión vieja del MPLAB, tienes idea si con la que tu usas se puede simular LCD y teclado?

Una vez más , gracias
Salu2
 
Pues yo abandone esos y use porque hace rato no lo hago el ISIS-PROTEUS de los que probe me parecio el mejor, pero para ver en detalle la ejecucion me bastaba con el mplab en modo paso a paso, espero te sirva mi comentario, chaooooo
 
Atrás
Arriba