Problema con las páginas del PIC

Colegas, un cordial saludo .

Siempre he leído, rebuscado y armando rompecabezas para solucionar los problemas que se me presentan, pero esta vez, tengo la necesidad de escribirles para pedirles humildemente ayuda con el siguiente caso.

Aquí va...

Desarrollo un programa en el PIC16F648A que ocupa aproximadamente 4K de memoria de programa. Según datasheet y a todo lo que he consultado, las instrucciones del tipo CALL o GOTO ponen 11 bits en el Contador de Programa (PC) y el registro PCLATH < 3:4 > agrega al PC los 2 bits restantes para completar los 13 bits de direccionamiento. Estos dos últimos bits deben modificarse manualmente antes de cada salto de página (cada 2K).

Tengo dos problemas:

1. Cuando aparentemente escribo "1" en el bit 3 del PCLATH para ir desde la página 0 a la 1 (> 0x800), y a continuación leo el PCLATH, siempre me muestra "0".

Lenguaje PIC BASIC PRO (disculpen, es el que manejo):

PCLATH.3=1 ; Escribe 1 el bit 3 del PCLATH
PCLATH=%00001000 ; Escribe 1 el bit 3 del PCLATH
LCDOUT $FE,1, BIN PCLATH ; Muestra el valor binario cargado en el registro PCLATH (siempre aparece en "0")

2.El programa de casi un peso de 4K se ejecuta "aparentemente" bien sin necesidad de modificar el PCLATH. Intentando verificar puedo leer el PCL (8 bits), pero como el resultado de leer el PCLATH es siempre "0", no puedo verificar el PC completo (13 bits) y por lo tanto, no puedo saber si el PC se está direccionando correctamente.
Frente a este comportamiento, me surgen las siguientes dudas: ¿Es posible que el PIC16F648A no requiera modificar el PCLATH para que salte sin problemas entre páginas? y si es necesario modificar el PCLATH, por qué mi programa se ejecuta normalmente sin tocar este registro? Será posible que este PIC no tenga páginas de 2K sino un solo bloque de 4K?


Ojalá alguno de ustedes tenga la respuesta o me pueda dar más pistas ya que sigo en el limbo (y muchos conocen la sensación, que a veces no te deja dormir... ). Gracias de antemano
 
¿Es posible que el PIC16F648A no requiera modificar el PCLATH para que salte sin problemas entre páginas?
Debe ser porque el compilador se encarga de direccionar las páginas, recuerda que estás usando un lenguaje de alto nivel.
Si estuvieras usando ensamblador entonces sí tendrías que tocar ese registro.

Si quieres saber qué es lo que está pasando con el registro PCLATH, dale una mirada al archivo .LST que genera el compilador.
 
Buen día a todos, tengo un problema de cambio de página en el pic16f877a, es más teórico pero ya busqué en varios lugares y no logro solucionarlo, mi programa muestra el ultimo carácter presionado en el teclado de la PC en una matriz de leds, la idea de hacer esto es que quiero saber manejar las tablas y las paginas del pic para poder hacer algún mejor proyecto que ocupe muchas instrucciones, mi problema en concreto es que no sé cómo seguir con la cuenta del PCL en la pagina 0, una vez que hago una llamada a la página 1, 2 o 3 y regreso. En el programa ordeno las instrucciones a realizar para mostrar el carácter en la pagina 0 y las tablas en la página 1, la cuestión es que al ser tabla, y encontrarse en otra página, no sé si deba hacer algo especial. Pude mostrar algunos caracteres de esta manera: pasando a la página 1, llamando a mi tabla, y desactivando la página 1, pero solo puedo mostrar pocos caracteres pues creo que al rebasar mas de 255 lineas de código el contador de programa ya afecta al PCLATH y supongo que no estoy cargando correctamente los bits en el que debe seguir contando, igualmente, utilicé pageselw y pagesel que son instrucciones usadas para pasar de página automáticamente pero pasó lo mismo, aproximadamente entre la linea 500 ya no realiza la función y tengo el mismo presentimiento de que es que no cargo correctamente el PCL Y PCLATH al regresar de la página 1.

Adjunto un codigo, aproximadamente en la linea 500 es donde muestro el carácter "L" y deja de funcionar, muestra el carácter en la simulación pero el programa parece que termina y no puedo presionar algún otro carácter
Hice otro como yo creo que debía ir, Activando el bit 3 de PCLATH, llamando a la tabla y al regresar, desactivar el bit 3 de PCLATH, el problema es que aproximadamente por la linea 255 es donde ya no funciona tampoco y creo que es por no cargar correctamente el PCL al regresar de la tabla.



Código:
;ESTE PROGRAMA MUESTRA LOS CARACTERES PRESIONADOS EN UNA MATRIZ DE 7X5 MEDIANTE UNA COMUNICACION SERIAL ENTRE EL MICROCONTROLADOR Y LA PC.
;--------------------------------------------------------------------------------------------------
 list p=16f877A;
 #include <p16f877a.inc>                                                       
 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF;
;--------------------------------------------------------------------------------------------------
pushw                  equ    0x20;
pushs                  equ    0x21;
pspclath               equ    0x22;
puhfsr                 equ    0x23;
milis                  equ    0x24;
ent_milis              equ    0x25;
n_x_milis              equ    0x26;
con_milis              equ    0x27;
con_seg                equ    0x28;
Dato_rx                equ    0x29;
Dato_tx                equ    0x2a;
var_car                equ    0x2b;
banderas_int           equ    0x2c; 
Contador1              equ    0x2d;Variable a utili. en la subrutina de perdida de tiempo.
Contador2              equ    0x2e;
Contador3              equ    0x2f;
apuntador              equ    0x30;
contador               equ    0x31;
contador1              equ    0x32;
Contador4              equ    0x33;
Contador5              equ    0x34;
Contador6              equ    0x35;
Contador7              equ    0x36;
;---------------------------------------------------------------------------------------------------

;Def. de constantes a utilizar.
O                       equ   .10
U                       equ   .5
Q                       equ   .22;
num_itera               equ     .5;
decenas                 equ    0x37;
;---------------------------------------------------------------------------------------------
;
;Def. de Ptos. I/0.
;Puerto A.
Sin_UsoRA0              equ     .0; // Sin Uso RA0.
Sin_UsoRA1              equ     .1; // Sin Uso RA1.
Sin_UsoRA2              equ     .2; // Sin Uso RA2.
Sin_UsoRA3              equ     .3; // Sin Uso RA3.
Sin_UsoRA4              equ     .4; // Sin Uso RA3.
Sin_UsoRA5              equ     .5; // Sin Uso RA5.

proga                equ B'111111';Def. la encua

;Puerto B.
Dec_Sega                equ     .0; // Salida para controlar el segmento a del digito decenas.
Dec_Segb                equ     .1; // Salida para controlar el segmento b del digito decenas.
Dec_Segc                equ     .2; // Salida para controlar el segmento c del digito decenas.
Dec_Segd                equ     .3; // Salida para controlar el segmento d del digito decenas.
Dec_Sege                equ     .4; // Salida para controlar el segmento e del digito decenas.
Dec_Segf                equ     .5; // Salida para controlar el segmento f del digito decenas.
Dec_Segg                equ     .6; // Salida para controlar el segmento g del digito decenas.
Dec_Segdp               equ     .7; // Salida para controlar el segmento dp del digito decenas.

progb              equ b'00000000'; // Programaciòn inicial del puerto B.

;Puerto C.
Sin_UsoRC0              equ     .0; // Sin Uso RC0.
Sin_UsoRC1              equ     .1; // Sin Uso RC1.
Sin_UsoRC2              equ     .2; // Sin Uso RC2.
Sin_UsoRC3              equ     .3; // Sin Uso RC3.
Sin_UsoRC4              equ     .4; // Sin Uso RC4.
Sin_UsoRC5              equ     .5; // Sin Uso RC5.
TX_dataBit              equ     .6; // Salida para transmitir datos.
RX_dataBit              equ     .7; // Entrada para recibir datos.

progc              equ B'10111111';Def. la encua

;Puerto D.
Uni_Sega                equ     .0; // Salida para controlar el segmento a del digito unidades.
Uni_Segb                equ     .1; // Salida para controlar el segmento b del digito unidades.
Uni_Segc                equ     .2; // Salida para controlar el segmento c del digito unidades.
Uni_Segd                equ     .3; // Salida para controlar el segmento d del digito unidades.
Uni_Sege                equ     .4; // Salida para controlar el segmento e del digito unidades.
Uni_Segf                equ     .5; // Salida para controlar el segmento f del digito unidades.
Uni_Segg                equ     .6; // Salida para controlar el segmento g del digito unidades.
Uni_Segdp               equ     .7; // Salida para controlar el segmento dp del digito unidades.

progd              equ b'00000000'; // Programaciòn inicial del puerto B.

;Puerto E.
Sin_UsoRE0              equ     .0; // Sin Uso RE0.
Sin_UsoRE1              equ     .1; // Sin Uso RE1.
Sin_UsoRE2              equ     .1; // Sin Uso RE2.

proge                   equ b'111'; // Programaciòn inicial del puerto E.
;-------------------------------------------------------------------------------------------------

;Bits de banderas de los registros.
;Banderas del registro banderas_int.
tim_0                  equ     .0;
tim_1                  equ     .1;
tim_2                  equ     .2;
tim_3                  equ     .3;
tim_4                  equ     .4;
tim_5                  equ     .5;
tim_6                  equ     .6;
tim_7                  equ     .7;
;---------------------------------------------------------------------------------------------------
      
                        ;===================
                        ;== Vector Reset  ==
                        ;===================
                        org 0000h;
vec_reset               goto prog_prin;
;-------------------------------------------------------------------------------------------------
                        ;==================================
                        ;== Subrutina de Interrupciones  ==
                        ;==================================
                        org 0004h;   
vec_int                 movwf pushw;
                        movf STATUS,W;
                        movwf pushs;
                        clrf STATUS;
                        movf PCLATH,W;
                        movwf pspclath;
                        movf FSR,w;   
                        movwf puhfsr;

                        btfsc INTCON,T0IF;
                        call opera_led;

                        movlw .6;
                        movwf TMR0;

                        movf puhfsr,w;
                        movwf FSR;
                        movf pspclath,w;
                        movwf PCLATH;
                        movf pushs,w;           
                        movwf STATUS;
                        movf pushw,w;

                        retfie;
;--------------------------------------------------------------------------------------------------
                        ;===================================
                        ;==  Subrutina de control de led  ==
                        ;===================================
opera_led               incf milis,f;
                        
                        movlw .1;
                        subwf milis,w;
                        btfsc STATUS,Z;
                        goto sig_int;
                        goto saled;

sig_int                 clrf milis;
                        incf ent_milis,f;
                        movlw .1;
                        subwf ent_milis,w;
                        btfss STATUS,Z;
                        goto saled;
                        clrf milis;
                        clrf ent_milis;
                        incf con_milis,f;
                        bsf banderas_int,tim_0;
                                              
saled                   bcf INTCON,T0IF;

                        return;
;--------------------------------------------------------------------------------------------------

                        ;========================================
                        ;== Subrutina de Ini. de Reg. del Pic  ==
                        ;========================================
prog_ini                bsf STATUS,RP0; Ponte en el banco 1 de ram.
                        movlw 0x81;                       
                        movwf OPTION_REG ^0x80;
                        movlw proga;                       
                        movwf TRISA ^0x80;
                        movlw progb;                       
                        movwf TRISB ^0x80;
                        movlw progc;                       
                        movwf TRISC ^0x80;
                        movlw progd;                       
                        movwf TRISD ^0x80;
                        movlw proge;                       
                        movwf TRISE ^0x80;
                        movlw 0x06;                       
                        movwf ADCON1 ^0x80;
                        bcf STATUS,RP0; Ponte en el banco 0 de ram.
                                                
                        clrf STATUS;

                        clrf PORTC;
                        bsf PORTC,TX_dataBit;

                        clrf ent_milis;
                        movlw .5;
                        movwf n_x_milis;
                        movlw .6;
                        movwf TMR0;
                        movlw 0xa0;
                        movwf INTCON;

                        return;
;--------------------------------------------------------------------------------------------------

                        ;=========================
                        ;== Programa principal  ==
                        ;=========================
prog_prin               call prog_ini;

loop_prin               nop;
                        call RX_Data;
                        ;call retardo_2;
                        movf Dato_rx,w;
                        movwf Dato_tx;
                        movwf var_car;
                        ;call TX_Data;
                        call conv_Asciimatriz;
                        goto loop_prin;
;--------------------------------------------------------------------------------------------------

                        ;===============================
                        ;== Subrutina de RX de Datos  ==
                        ;===============================
RX_Data                 nop;
                        btfsc PORTC,RX_dataBit;
                        goto RX_Data;
                        call retardo_2;

                        bcf INTCON,GIE;   

                        movlw .8;
                        movwf Contador3;
sig_RxDato              btfss PORTC,RX_dataBit;
                        goto bit_enCero;
                        bsf STATUS,C;
                        goto rota_dato;
bit_enCero              bcf STATUS,C;
rota_dato               rrf Dato_rx,f;
                        call retardo;
                        decfsz Contador3,f;
                        goto sig_RxDato;
 
                        bsf INTCON,GIE;   

                        call retardo;

                        return;
;--------------------------------------------------------------------------------------------------

                        ;===============================================
                        ;==  Subrutina que conv. Ascii a 7 segmentos  ==
                        ;===============================================
conv_Asciimatriz        movlw 'A';
                        subwf var_car,w;
                        btfsc STATUS,Z;
                        goto fue_A;

                        movlw 'B';
                        subwf var_car,w;
                        btfsc STATUS,Z;   
                        goto fue_B;

                        movlw 'C';
                        subwf var_car,w;
                        btfsc STATUS,Z;   
                        goto fue_C;

                        movlw 'D';
                        subwf var_car,w;
                        btfsc STATUS,Z;     
                        goto fue_D;

                        movlw 'E';
                        subwf var_car,w;
                        btfsc STATUS,Z;   
                        goto fue_E;

                        movlw 'F';
                        subwf var_car,w;
                        btfsc STATUS,Z;     
                        goto fue_F;

                        movlw 'G';
                        subwf var_car,w;
                        btfsc STATUS,Z;     
                        goto fue_G;

                        movlw 'H';
                        subwf var_car,w;
                        btfsc STATUS,Z;     
                        goto fue_H;

                        movlw 'I';
                        subwf var_car,w;
                        btfsc STATUS,Z;     
                        goto fue_I;

                        movlw 'J';
                        subwf var_car,w;
                        btfsc STATUS,Z;   
                        goto fue_J;

                        movlw 'K';
                        subwf var_car,w;
                        btfsc STATUS,Z; 
                        goto fue_K;

                        movlw 'L';
                        subwf var_car,w;
                        btfsc STATUS,Z; 
                        goto fue_L;   

                        return;

;===================================================================
;=============   MUESTRA EL CARACTER EN UNA MATRIZ DE 7X5   ========
;===================================================================
fue_A           movlw d'30';
                movwf contador1;               
loopA1          clrf apuntador;
                clrf contador;
loopA           movlw 0x08;
                movwf PCLATH;
                call tabla_carA;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                movlw 0x08;
                movwf PCLATH;
                call tabla_carA;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopA;
                decfsz contador1,f;
                goto loopA1
                return;
                goto salte_conv;
                

fue_B           movlw d'30';
                movwf contador1;               
loopB1          clrf apuntador;
                clrf contador;
loopB           movlw 0x08;
                movwf PCLATH;
                call tabla_carB;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                movlw 0x08;
                movwf PCLATH;
                call tabla_carB;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopB;
                decfsz contador1,f;
                goto loopB1
                return;
                goto salte_conv;


fue_C           movlw d'30';
                movwf contador1;               
loopC1          clrf apuntador;
                clrf contador;
loopC           movlw 0x08;
                movwf PCLATH;
                call tabla_carC;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                movlw 0x08;
                movwf PCLATH;
                call tabla_carC;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopC;
                decfsz contador1,f;
                goto loopC1
                return;
                goto salte_conv;

fue_D           movlw d'30';
                movwf contador1;               
loopD1          clrf apuntador;
                clrf contador;
loopD           movlw 0x08;
                movwf PCLATH;
                call tabla_carD;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                movlw 0x08;
                movwf PCLATH;
                call tabla_carD;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopD;
                decfsz contador1,f;
                goto loopD1
                return;
                goto salte_conv;


fue_E           movlw d'30';
                movwf contador1;               
loopE1          clrf apuntador;
                clrf contador;
loopE           movlw 0x08;
                movwf PCLATH;
                call tabla_carE;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                movlw 0x08;
                movwf PCLATH;
                call tabla_carE;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopE;
                decfsz contador1,f;
                goto loopE1
                return;
                goto salte_conv;



fue_F           movlw d'30';
                movwf contador1;               
loopF1          clrf apuntador;
                clrf contador;
loopF           nop;
                pageselw tabla_carF
                pagesel tabla_carF
                call tabla_carF;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                pageselw tabla_carF
                pagesel tabla_carF
                call tabla_carF;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopF;
                decfsz contador1,f;
                goto loopF1
                return;
                goto salte_conv;



fue_G           movlw d'30';
                movwf contador1;               
loopG1          clrf apuntador;
                clrf contador;
loopG           nop;
                pageselw tabla_carG
                pagesel tabla_carG
                call tabla_carG;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                pageselw tabla_carG
                pagesel tabla_carG
                call tabla_carG;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopG;
                decfsz contador1,f;
                goto loopG1
                return;
                goto salte_conv;



fue_H           movlw d'30';
                movwf contador1;               
loopH1          clrf apuntador;
                clrf contador;
loopH           nop;
                pageselw tabla_carH
                pagesel tabla_carH
                call tabla_carH;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                pageselw tabla_carH
                pagesel tabla_carH
                call tabla_carH;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopH;
                decfsz contador1,f;
                goto loopH1
                return;
                goto salte_conv;


fue_I           movlw d'30';
                movwf contador1;               
loopI1          clrf apuntador;
                clrf contador;
loopI           nop;
                pageselw tabla_carI
                pagesel tabla_carI
                call tabla_carI;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                pageselw tabla_carI
                pagesel tabla_carI
                call tabla_carI;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopI;
                decfsz contador1,f;
                goto loopI1
                return;
                goto salte_conv;

fue_J           movlw d'30';
                movwf contador1;               
loopJ1          clrf apuntador;
                clrf contador;
loopJ           nop;
                pageselw tabla_carJ
                pagesel tabla_carJ
                call tabla_carJ;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                pageselw tabla_carJ
                pagesel tabla_carJ
                call tabla_carJ;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopJ;
                decfsz contador1,f;
                goto loopJ1
                return;
                goto salte_conv;


fue_K           movlw d'30';
                movwf contador1;               
loopK1          clrf apuntador;
                clrf contador;
loopK           nop;
                pageselw tabla_carK
                pagesel tabla_carK
                call tabla_carK;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                pageselw tabla_carK
                pagesel tabla_carK
                call tabla_carK;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopK;
                decfsz contador1,f;
                goto loopK1
                return;
                goto salte_conv;


fue_L           movlw d'30';
                movwf contador1;               
loopL1          clrf apuntador;
                clrf contador;
loopL           nop;
                bsf PCLATH, 3;
                call tabla_carL;
                bcf PCLATH, 3;
                movwf PORTD;
                incf apuntador,f;
                bsf PCLATH, 3;
                call tabla_carL;
                bcf PCLATH, 3;
                movwf PORTB;
                call delay_4ms;
                clrf PORTB;
                incf apuntador,f;
                incf contador,f;
                movlw .5;
                subwf contador,w;
                btfss STATUS,Z;
                goto loopL;
                decfsz contador1,f;
                goto loopL1
                return;
                goto salte_conv;



salte_conv              return;

;--------------------------------------------------------------------------------------------------
                        ;====================================================================
                        ;== Subrutina de retardo de 416.6 useg. para un baud rate de 2400  ==
                        ;====================================================================
retardo                 movlw .137;   137     ts.         ts = (1/fo)4 = (1/4000000)4 = 1 us.
                        movwf Contador1;      ts.         tr = ts + ts + (ts + 2ts)M + 2ts
loop1                   decfsz Contador1,f;   ts o 2ts.   tr = 4ts + 3Mts
                        goto loop1;           2ts.        tr = (4 + 3M)ts     M = 137
                                  ;                       tr = 415 us.
                        return;
;--------------------------------------------------------------------------------------------------

                        ;=========================================================
                        ;== Subrutina de retardo de bit y medio de 624.9 useg.  ==
                        ;=========================================================
retardo_2               movlw .206;           ts.         ts = (1/fo)4 = (1/4000000)4 = 1 us.
                        movwf Contador1;      ts.         tr = ts + ts + (ts + 2ts)M + 2ts
loop11                  decfsz Contador1,f;   ts o 2ts.   tr = 4ts + 3Mts
                        goto loop11;          2ts.        tr = (4 + 3M)ts     M = 206

                        return;
;--------------------------------------------------------------------------------------------------

                        ;=====================================
                        ;== Subrutina de retardo de 40ms  ====
                        ;=====================================
retardo_milis           clrf con_milis;
                        movlw .40; Carga valor en milisegundos
esp_milis               subwf con_milis,w;
                        btfss STATUS,Z;
                        goto esp_milis;

                        ;=====================================
                        ;== Subrutina de retardo de 4ms  ====
                        ;=====================================
delay_4ms                  movlw Q;           
                         movwf Contador6;
Loop6                      movlw U;           
                        movwf Contador5;
Loop5                      movlw O;           
                         movwf Contador4;

Loop4                    decfsz Contador4, f;
                        goto Loop4;
                        decfsz Contador5, f;
                        goto Loop5;
                         decfsz Contador6, f;
                          goto Loop6;
                        return;

;==============================================================
;=====================     PAGINA 2    ========================
;==============================================================

org 0x800
tabla_carA      movf apuntador, w;
                addwf PCL,f;
                dt .3,.1,.233,.2,.236,.4,.233,.8,.3,.16;

tabla_carB      movf apuntador, w;
                addwf PCL,f;
                dt .0,.1,.54,.2,.54,.4,.54,.8,.73,.16;

tabla_carC      movf apuntador, w;
                addwf PCL,f;
                dt .0,.1,.62,.2,.62,.4,.62,.8,.93,.16; 

tabla_carD      movf apuntador, w;
                addwf PCL,f;
                dt .0,.1,.62,.2,.62,.4,.62,.8,.65,.16;

tabla_carE      movf apuntador, w;
                addwf PCL,f;
                dt .0,.1,.54,.2,.54,.4,.62,.8,.62,.16;

tabla_carF      movf apuntador, w;
                addwf PCL,f;
                dt .0,.1,0XF6,.2,0XF6,.4,0XF6,.8,0XF6,.16;

tabla_carG      movf apuntador, w;
                addwf PCL,f;
                dt .3,.1,0XBD,.2,0XAE,.4,0XAE,.8,0X8E,.16;

tabla_carH      movf apuntador, w;
                addwf PCL,f;
                dt .0,.1,.119,.2,.119,.4,.119,.8,.0,.16;     

tabla_carI      movf apuntador, w;
                addwf PCL,f;
                dt .255,.1,.62,.2,.0,.4,.62,.8,.255,.16;

tabla_carJ      movf apuntador, w;
                addwf PCL,f;
                dt 0X0F,.1,0X3F,.2,0X3F,.4,0X3F,.8,0X00,.16;

tabla_carK      movf apuntador, w;
                addwf PCL,f;
                dt .0,.1,.119,.2,.107,.4,.28,.8,.255,.16;

tabla_carL      movf apuntador, w;
                addwf PCL,f;
                dt .0,.1,.191,.2,.191,.4,.191,.8,.191,.16;


end;
 
Hola. Hace años que ya no programo en asm. Recuerdo que cuando lo hacía y tenía este tipo de problemas usaba el simulador integrado del mplab y ponía los registros y contador de programa para poder encontrar los errores. Tmb use en varias oportunidades el simulador de código incluido en proteja. Haciendo el step by step y viendo los valores de los registros. Es una manera de ver dónde estás equivocado.
 
Hola Alangon116 lo que te paso no es tanto una cuestión teórica sino mas bien un descuido no tan obvio.

Resulta que en un momento mientras se esta recogiendo datos de la tabla se dispara la interrupción y se atiene
la misma con el valor del registro PCLATH cambiado, eso ocasiona que en vez de ir a la rutina opera_led se salte a
otra parte del código por tanto ya no se borra la bandera de interrupción y el programa se queda atascado en la
rutina de atención a la interrupción.
 
Atrás
Arriba