Suky,
He buscado muchas veces en el buscador y no lo había encontrado, está muy bien explicado.
Por qué pones ""setup_adc(ADC_OFF);"" al finalizar la lectura? En mi programa debo usar 3 ADCs y leer contínuamente, por lo que no tengo que poner "setup_adc(ADC_OFF);", no? Y la lectura le tengo que poner dentro del "while(1){", no?
Ahora mismo tengo el ultimo código que he colgado y funcionan correctamente.
Mi problema ahora es la interrupción. Lo de que la he programado a 10ms es correcto, ya que:
T(timer0)=4*(1/Fosc)*PREESCALER*(256-PRECARGA)
Donde 256=valor máximo que se puede representar con los 8 bits del timer0.
Entonces:
0,010=4*(1/20e6)*256*(256-61)
Así que
PREESCALER=256
PRECARGA=61
Y la interrupción la obtengo cada 10ms (COMPROBADO CON OSCILOSCOPIO).
El problema que tengo es que cuando pongo el contador como dice jhozate el tiempo que quiero no es correcto:
#int_timer0
void timer0_isr()
{
i++;
if(i==2) // verificas si ya pasaron dos interrupciones de 50mS
{
....aqui lo q quieres hacer
}
set_timer(cargar_del_timer);
}
Si pongo un contador que llegue hasta 200, en teoría 200*0.010s = 2 segundos, y calculado en plan chapucero este tiempo con un cronómetro (calculando la media) obtengo un tiempo de 2,468 aproximadamente. Me sobran 0.468 segundos que no sé si es el tiempo que tarda el PIC en hacer la comparación del contador, pero creo que esto es una bestialidad!
A continuación pongo el código del programa para la interrupción cada 2 segundos, y lo único que debe hacer es cambiar el estado del puerto B cuando el contador llega a 200. Qué hago mal?
#include <16f877.h>
#fuses NOPROTECT,HS,NOCPD,NOLVP,NOWDT,PUT //Configuracion de timers, reloj, proteccion de datos...
#use fast_io (A) //Input y output sin reprogramar los pines, como lo haria el #use standard_io
#use fast_io (B)
#use delay(clock=20000000) //Reloj de 4MHz
#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#use standard_io(E)
byte puerto_b;
int comptador;
#int_rtcc //rutina que até a interrupció
void timer0_interrupcion()
{
comptador++;
if(comptador==200)
{
puerto_b=~puerto_b;
output_b(puerto_b);
set_RTCC(61);
comptador=0;
}
}
void main()
{
set_tris_b(0x00);
puerto_b=0x00;
output_b(puerto_b);
setup_counters (RTCC_INTERNAL, RTCC_DIV_256); //programació timer0
set_RTCC(61);
enable_interrupts(INT_RTCC); // Habilita interrupcion timer0.
enable_interrupts(GLOBAL); // Habilita todas las interrupciones.
comptador=0;
while(1)
{
}
}