TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: T0ni0 en 18 de Noviembre de 2004, 02:10:00
-
Hola a todos, he estado buscando posts que tratasen este tema pero no he sabido encontrar.
Bueno, la cuestion es que necesito medir un tiempo por interrupción para que sea siempre igual, en teoria con el timer0 sin prescaler y a 4MHz tendría que interrumpir cada 1useg pero no sucede así, si no que consume 60useg alguien me puede explicar por q? supongo que es por el codigo C almenos espero que sea un valor fijo y q no varie segun lo que haga en el main.
#include <12F675.h>
#device adc=8
#use delay(clock=4000000,RESTART_WDT)
#fuses NOWDT,INTRC_IO, CPD, PROTECT, MCLR, NOPUT, NOBROWNOUT
#use rs232(baud=9600,parity=N,xmit=PIN_A2,bits=8)
#include <string.h>
#ZERO_RAM
//******************************************************+
// Variables globals
//******************************************************+
int pulsosrtc,pulsos1;
float X,Y;
char flag1; //flags
#int_RTCC
RTCC_isr()
{ pulsosrtc++1;
set_rtcc(0xFF);
}
#int_EXT
EXT_isr()
{
}
#int_TIMER1
TIMER1_isr()
{
}
void main()
{
setup_adc_ports(0);
setup_adc(ADC_OFF);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
disable_interrupts(INT_RTCC);
disable_interrupts(INT_EXT);
disable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
pulsosrtc=0;
set_rtcc(0xFF);
enable_interrupts(INT_RTCC);
while (TRUE) {
// printf("Hola"
;
//delay_ms(300);
}
}
-
En el proteus hay una herramienta cojonuda para medir el tiempo en
microsegundos, es el counter timer en la seccion de instruments, con eso afinas
fino fino, pero que muy fino
pruebalo
yo lo conecto al portc de 18f452
clk al osc1/clk
Ce (counter enable) al Rc0
Rst reset al Rc1
este es el codigo para medir el tiempo
//reseteo contador
output_c(0x03);
//lo ponemos a andar
output_c(0x01);
//aqui rutina se ejecuta rutina a medir el tiempo
//paramos contador
output_c(0x00);
si la operacion se va a realizar muchas veces lo mejor sera medir todo el bucle asi
el valor sera la media (mas preciso aun)
con esto y jugando un poco con los delays se puede conseguir la temporizacion
que quieras
¿todavia estan saltando?
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
-
Perdon pero no tengo ningun problema con medir el tiempo ya se cuanto tarda cada interrupción (y no utilizo Proteus ), mi pregunta es más básica, si el timer le cargo FF realiza la int en la transición FF ---> 00 interrumpira con una instrucción, si tengo un cristal de 4Mh eso seá 1useg, pero no sucede así con C puesto que he observado que tarda 60useg, como puedo arreglar eso y en el caso que no pueda a que se debe y si es estable.
No si saltar saltan pero cuanto tardan?
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
![Rebotado Rebotado]()
-
Personalmente te recomendaria que subieras tu oscilador principal de 4Mhz a 20 Mhz, veo que quieres interumpir cada 1 uS y ese es el tiempo que ese micro a ese cristal tarda en realizar una instrucción, asi que lo mejor es aumentar la velocidad y realizar la prueba y nos cuentas.
-
Pues va a ser q no puedo, puesto que utilizo el Oscilador interno del PIC, es un 12F675 y necesito todos los pines
![Payaso Payaso]()
![Payaso Payaso]()
Tengo una onda cuadrada y quiero saber el Duty Cicle, por fortuna he podido variar la onda de 1ms (periodo) a 10ms. Aun así necesito saber con la mayor exactitud que tiempo esta a high y a low.
Como lo ven ? a ver q valor puedo conseguir ![RollEyes RollEyes]()
![RollEyes RollEyes]()
-
Supongo que esos 60us se deben a que tienes una rutina de atención a la interrupción y debe ser el tiempo que le cuesta en entrar en ella.
¿Porque no usas, si puedes en tu programa, la detección del bit T0IF, sin rutina de interrupción?