Buenas tardes a todos, sigo intentando aprender C con los ejemplos propuestos por nuestro colega VSZENER, pero no logro entender como están anidadas las distintas funciones "if" de su ejemplo que expongo a continuación. Además he intentado ver en distintos hilos de este foro como funciona la interrupción del timer0 pero tampoco la entiendo, por lo tanto si alguien puede ayudarme con estas dos dudas para comprender el ejemplo y seguir avanzando se lo agradecería.
////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR'05
// 22/Agosto/05
// vszener@gmail.com
// Programa: Contador del 00 al 99 y viceversa automaticamente
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.20 Simulador: Proteus 6.7sp3
//
// Notas: Contador del 00 al 99 cada 1s y vuelta a empezar. Tener en cuenta
// que hay que poner la directiva NOLVP para que el pin B4 sea de salida.
// Se utiliza variables locales:
// * i -> indice tabla 7seg para mostrar digito por 1º 7seg
// * j -> indice tabla 7seg para mostrar digito por 2º 7seg
// * flag -> variable que cuenta 1s
// * var -> ajuste fino para que desborde cada segundo
// * cuenta -> cuenta=0 -> Contador ascendente ; cuenta=1 -> Contador descendente
// Utilizamos la funcion de interrupcion para actualizar indices de la
// tabla de 7seg para mostrar el digito correspondiente en el respectivo
// 7seg, para ello el TMR0 se desborda cada 1s, para ello debe ser cargado
// con 61(equivale a un desbordamiento cada 50ms mas o menos), para obtener
// un desbordamiento de 1s utilizamos una variable(flag) que no entra en
// la actualizacion de indices hasta transcurrido 1s. Configuramos una
// variable tipo short,bit, llamada 'cuenta' que si vale 1 significa que
// el contador es descendente y si vale 0 significa que el contador es ascendente.
// Conexiones:
// · RA0 -> Display 1º 7seg
// · RA1 -> Display 2º 7seg
// · RB0 -> a 7seg
// · RB1 -> b 7seg
// · RB2 -> c 7seg
// · RB3 -> d 7seg
// · RB4 -> e 7seg
// · RB5 -> f 7seg
// · RB6 -> g 7seg
//////////////////////////////////////////////////////////////////////////////////
#include <16f648a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use standard_io(B)
#use fixed_io(a_outputs=PIN_A0,PIN_A1) //A0,A1 como salidas en porta
//VARIABLES GLOBALES
signed char i=0,j=0; //indices(se tiene en cuenta signo para comprobaciones de fin tab7seg)
char flag=0,var=20;
short cuenta=0; //cuenta=0 -> Contador ascendente ; cuenta=1 -> Contador descendente
///LLAMADA FUNCION INTERRUPCION
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 1 segundo?rutina:actualizar indices y contador ascendente/descendente
var--; //SI -> decremento var...
if(var<18)
var=20; //...ajuste fino de 1s
flag=0; //reset flag para contar 1s
if(cuenta==0){ //¿Contador ascendente?
if(i>
{ //SI -> ¿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 digito 99?
cuenta=1; //SI -> contador descendente...
j=9; //restauro...
i=8; //...indices
}
}
else{ //(*) NO -> incrementa i
i++;}
}
else{ //Contador descendente
i--; //decremento indice i
if(i<0){ //¿fin tab7seg en indice i?
i=9; //SI -> restauro i
j--; //decremento indice j
if(j<0){ //¿fin tab7seg en indice j 00?
cuenta=0; //SI -> Contador descendente
i=1; //restauro...
j=0; //...indices
}
}
}
} //fin actualizar indices y contador ascendente/descendente
set_timer0(61); //reset TMR0
flag++; //incremento variable flag
}
///PROGRAMA
void main(void)
{
int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; //7seg hex 0-9
set_tris_b(0x00); //portb como salida
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256); //configuracion interrupcion TMR0
set_timer0(61); //carga TMR0
enable_interrupts(GLOBAL); //activadas interrupciones
do{ //bucle...
output_high(PIN_A1); //2º 7seg off
output_low(PIN_A0); //1º 7seg on
delay_ms(150);
output_b(tab7seg
); //muestra por portb digito 7 segmentos
output_low(PIN_A1); //2º 7seg on
output_high(PIN_A0); //1º 7seg off
delay_ms(150);
output_b(tab7seg[j]); //muestra por portb digito 7 segmentos
}while(TRUE); //...infi nito
}
de nuevo os doy las gracias a todos por vuestra colaboración