Hola a todos, estaba leyendo y buscando y creo que es aquí donde es adecuado postear mi duda... pues trata casi de lo mismo...
ya tengo un codigo con 2 interrupciones activas.... una PSP (que es la atencion a una comunicacion en bus paralelo, muy buena para comunicarme con un 8051 que tengo operando como cerebro de un sistema y el pic funge como periferico) y una interrupcion del timer0... voy a poner aqui el codigo y luego lo explico
#include <16F877A.h>
#FUSES NOWDT //Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=4000000)
#priority psp,rtcc
int8 j;
int8 valor,salida[4]={0x0A,0x0A,0x0A,0x0A};
//*************************************************************************
//*************************************************************************
#INT_PSP //Interrupcion del Parallel Slave Port
void Adquierelo()
{
disable_interrupts(GLOBAL);
valor=psp_data;
switch(Valor&0x0F)
{
case 0x00:
salida[3]=(valor&0xF0)/0x10;
break;
case 0x04:
salida[2]=(valor&0xF0)/0x10;
break;
case 0x08:
salida[1]=(valor&0xF0)/0x10;
break;
case 0x0C:
salida[0]=(valor&0xF0)/0x10;
break;
case 0x0F:
salida[0]=0x0A;
salida[1]=0x0A;
salida[2]=0x0A;
salida[3]=0x0A;
break;
}
enable_interrupts(GLOBAL);
}
//*************************************************************************
#int_TIMER0
void muestralo()
{
int8 Numeros[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x00,0x00,0x20,0x00,0x00};
/*
Numero\Equi B7 B6 B5 B4 B3 B2 B1 B0 | B0 ---
0 0 0 1 1 1 1 1 1 0x3F | B6 B1 | |
1 0 0 0 0 0 1 1 0 0x06 | B5 ---
2 0 1 0 1 1 0 1 1 0x5B | B4 B2 | |
3 0 1 0 0 1 1 1 1 0x4F | B3 ---
4 0 1 1 0 0 1 1 0 0x66 |
5 0 1 1 0 1 1 0 1 0x6D
6 0 1 1 1 1 1 0 1 0x7D
7 0 0 0 0 0 1 1 1 0x07
8 0 1 1 1 1 1 1 1 0x7F
9 0 1 1 0 1 1 1 1 0x6F
A 0 0 0 0 0 0 0 0 0x00
*/
int8 i;
Output_B(0x00);
switch(i)
{
case 0:
output_high(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
output_B(Numeros[salida[0]]);
break;
case 1:
output_low(PIN_A0);
output_high(PIN_A1);
output_low(PIN_A2);
output_low(PIN_A3);
output_B(Numeros[salida[1]]);
break;
case 2:
output_low(PIN_A0);
output_low(PIN_A1);
output_high(PIN_A2);
output_low(PIN_A3);
output_B(Numeros[salida[2]]);
break;
case 3:
output_low(PIN_A0);
output_low(PIN_A1);
output_low(PIN_A2);
output_high(PIN_A3);
output_B(Numeros[salida[3]]);
}
i++;
if(i>3)
i=0;
set_timer0(0xE0);
}
//============================================================================
//////////////////////////////////////////////////////////////////////////////
void main()
{
for(j=1;j<7;j++)
{
output_high(PIN_B7);
delay_ms(100);
output_low(PIN_B7);
delay_ms(100);
}
setup_psp(PSP_ENABLED);
setup_adc_ports(NO_ANALOGS);
enable_interrupts(GLOBAL);
enable_interrupts(INT_PSP);
enable_interrupts(INT_TIMER0);
output_low(PIN_B7);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
port_b_pullups(TRUE);
set_timer0(255);
while(1)
{
;
}
}
Bueno, lo tipico, fuses y cabecera...
Luego, esta el procedimiento del PSP... esto implica que el Intel8051 quiere escribirle datos al PIC, y lo activa por medio del CS1... (si desean les cuento la configuracion) bueno, el hecho es que la parte alta del valor de 8 bit escrito trae el dato como tal... (un numero del 0 al F) y la parte baja indica cual tipo de valor se esta recibiendo (dato Tipo 0=0x00, Dato tipo 1=0x04 (0100),dato tipo 2=0x08 (1000) o dato tipo 3=0x0C (1100)) allí el PIC decide en qué posicion de un arreglo lo guarda... por ejemplo, si envio desde el 8051 un valor 0x48 ---> en la posicion 2 del arreglo escribo un 0x04... eso es lo que pasa en la interrupcion....
En el siguiente procedimiento, tomo el arreglo cada vez que se activa el timer0, coloco ese dato en un 7 segmentos que tengo conectado al puerto B (excepto B7), con esto logro el multiplexado en el tiempo de la informacion de 4 siete segmentos... cada vez que se activa el timer 0... cuando se activa e "i"=0 enciendo el catodo comun del primer 7seg y coloco el dato Arreglo[0], en la siguiente vez, i=1, enciendo el segundo 7 seg y coloco en el el el dato correspondiente (Arreglo[1]) y así... repito por siempre
En el main configuro las interrupciones pero antes hago una rutinita de encender y apagar un led conectado a B7 unas cuantas veces, solo para verificar, al encender el sistema completo, que el periferico inicio correctamente
todo funciona bien cuando prendo.. led titila y se apaga ritmicamente y se pone en espera (apagado)... luego mando una cifra completa y la muestra en el 7 segmentos... AHORA SE PREGUNTARAN DONDE DEMONIOS ESTA EL DRAMA?
pues aqui al ratico, el led empieza a prender como loco, irregularmente, es como que el PIC se reinicia y se reinicia constantemente, tanto que no termina la rutina de encendido y se ve una secuencia totalmente loca en el led, se queda prendido, se apaga milisegundos, se vuelve a prender y apagar.... una locura.... se que debe ser un problema de las interrupciones pues si deshabilito las interrupciones al entrar en cada una, y las rehabilito al salir, el problema se resuelve, solo que no se mantiene el valor visualizado en los 7 segmentos...
Si alguien tiene alguna idea.....