Estoy intentando lograr un retraso de 1us para poder conducir un bus de 1 cable. Mi proceso está trabajando en 10Mhz PCLK, así que intenté usar la función de temporizador con desbordamiento en el 10º ciclo. Por alguna razón me da una resolución de 6,2ish. No sé por qué ...
void _delay_us (int a_us)
{
LPC_TIM_TypeDef *timer = LPC_TIM0;
timer->MCR=0X0000000A;
timer->TCR=0x02; //reset timer
timer->TC=0;
timer->PC=0;
timer->PR = 0x00000000;
timer->MR0=a_us;
timer->TCR=0x01; //start timer
while(timer->TC!=timer->MR0); //wait here up to match
}
La siguiente prueba fue "desperdiciar" 10 ciclos con asm nop (que por documentación debería tomar 1 instrucción de 32 bits), pero eso tampoco funcionó (el ejemplo es solo 3 nops, lo que toma alrededor de 0.6us, independientemente del número de nops) ... Ahora, eso es un rompecabezas. para bucle debe tomar 4 ciclos para a_us = 1? ¿De dónde vinieron otros 2?
void _delay_us (int a_us)
{
int i;
for(i=0; i<a_us; ++i){
__asm__ volatile (
"nop\n\t"
"nop\n\t"
"nop\n\t" );
}
}
Pero el compilador parece optimizar los nop sin tomar ningún ciclo de proceso ...
Lo que hice es este bucle:
void _delay_us (int a_us)
{
int i;
int a, b;
for(i=0; i<a_us; ++i){
for (a=0;a<6;a++){
b++;
}
}
}
Este es un enfoque totalmente heurístico, medido por un osciloscopio. Si lo cuento bien, debería hacer 21 operaciones (supongo que 16 bits), por lo que debería ser de alrededor de 10 ciclos. Da alrededor de 1us de retraso, pero no me gusta ...
¿Hay alguna forma mejor de lograr un retraso en el uso?