Hola Suki, En eso estaba. Estaba quitando toda la porqueria que sobraba,
Fijate. Si lo dejas asi atiende la interrupcion perfectamente de RB0, pero la temporizacion no es la misma. EDITOOOOO!!! Me acaba de saltar una chispa entre neuronas y recorde el tan usado durante mis estudios "stopwatch". Parece ser que el problema es de proteus, y no del programa.
Aqui os lo dejo: Parece que ya puedo encarar el tacometro propiamente dicho. (ahora tan solo es un contador con una interrupcion por el medio que parpadea un led de rb3)
//Device/Fuses/Etc.---------------------------------
#INCLUDE <16F88.H> //Usamos un 16F88
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Con oscilador a cristal...
#use delay(clock=4000000) //..de 4MHz.
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //No protegemos el codigo.
#FUSES NOBROWNOUT //No Brownout Reset
#FUSES NOLVP //No low voltage prgming
#FUSES NOCPD //No EE protection
#use standard_io(B)
#use standard_io(A)
/*TABLA
7segmentos Decimal
0 252
1 96
2 218
3 242
4 102
5 182
6 190
7 224
8 255
9 230
*/
char i=0,j=0,w=0,z=0,flag=0,var=20;
int m=0;
//////////////////////////////////////////////////////////////////////////////////////////////////
void escribo(int8 aux){
int m;
for (m=0;m<8;m++) { // "m" irá de 0 a 7, de 1 en 1.
//Si el bit es "0", escribo un "0".
if (bit_test(aux,m) == 0) {
output_low(PIN_B2); //Pongo "0" en DATA7...
output_low(PIN_B1); //Pongo el CLOCK en bajo...
output_high(PIN_B1); //...y de nuevo en alto. Listo!
}
//Si el bit es "1", escribo un "1".
if (bit_test(aux,m) == 1) {
output_high(PIN_B2); //Pongo "1" en DATA7...
output_low(PIN_B1); //Pongo el CLOCK en bajo...
output_high(PIN_B1); //...y de nuevo en alto. Listo!
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void borro_display(void){
int m;
for (m=1;m<33;m++) { // "m" irá de 1 a 32, de 1 en 1.
output_low(PIN_B2); //Pongo "0" en DATA7...
output_low(PIN_B1); //Pongo el CLOCK en bajo...
output_high(PIN_B1); //...y de nuevo en alto. Listo!
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
#int_EXT
void Start_isr(void)
{
disable_interrupts(int_EXT); //deshabilidatos la interrupcion
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
delay_ms(100);
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
enable_interrupts(int_EXT); //deshabilidatos la interrupcion
clear_interrupt(int_EXT);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 1 segundo?
var--; //SI -> decremento var...
if(var<18)
var=20; //...ajuste fino de 1s
flag=0; //reset flag para contar 1s
if(i>8){ //¿se ha mostrado por 1º 7seg digito 9?
i=0; //SI -> i=0 (muestra digito 0) (*)
j++; //incremento indice j
if(j>9){ //¿se ha mostrado por 2º 7seg digito 9?
j=0; //SI -> j=0 (muestra digito 0)
w++; //incremento indice w
if(w>9){ //¿se ha mostrado por 3º 7seg digito 9?
w=0; //SI -> w=0 (muestra digito 0)
z++; //incremento indice z
if(z>9) //¿se ha mostrado por 4º 7seg digito 9?
z=0; //SI -> z=0 (muestra digito 0)
}
}
}
else{ //(*) NO -> incrementa i
i++;}
}
set_timer0(61); //reset TMR0
flag++; //incremento variable flag
}
////////////////////////////////////////////////////////////////////////////////////////////////////
void main(void){
int tab7seg[10]={252,96,218,242,102,182,190,224,255,230}; //7seg Dec 0-9
set_tris_b(0b11111001); //1=ENTRADA, 0=SALIDA
borro_display();
enable_interrupts(INT_RB);
enable_interrupts(int_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(INT_TIMER0);
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
set_timer0(61);
enable_interrupts(GLOBAL);
clear_interrupt(int_EXT);
do{
escribo(tab7seg[ i ]);
escribo(tab7seg[ j ]);
escribo(tab7seg[ w ]);
escribo(tab7seg[ z ]);
delay_ms(1000); // delay para mostrar correctamente en la simulacion. En la vida real no existe para eliminar parpadeo (multiplexado)
}while(TRUE);
}
Un saludo y decirme que fallos le veis en funcionamiento (si teneis tiempo de simularlo claro)