Retardo de gran alcance a media frecuencia para MC

2

Tengo un programa que varía el tiempo de paso y el ciclo de trabajo para una secuencia de conmutación de 6 pasos. Toma un resultado de ADC de 8 bits y lo almacena como el valor TMR0, cuando TMR0 se desborda, el ISR selecciona la siguiente secuencia.

Tengo 2 problemas:

  1. Esto solo funciona en bajas frecuencias INTOSC, donde UART no funcionará, y
  2. No obtengo un rango de pasos lo suficientemente grande.

¿Alguna idea general sobre cómo crear un retraso de mayor rango en una frecuencia más alta? Mi primera idea es usar un bucle anidado, aún usando un valor TMR0, y luego colocar dentro de un bucle los pasos al revés de TMR0 veces ...

    
pregunta alxcpa01101

1 respuesta

2

Una forma de abordar el problema sería introducir algunas variables adicionales que hagan un seguimiento del intervalo del temporizador y cuántas veces se ha llamado para que se pueda ignorar un número fijo de interrupciones. Por ejemplo, el siguiente pseudocódigo C para ralentizar el tiempo de ejecución en un factor de 10.

uint_8 ticks_left, timer_interval;

void my_isr()
{
    ticks_left--;
    if (ticks_left == 0)
    {
         disable_timer();
         // Move to next ADC etc
    } else
         setup_timer(timer_interval);
    }
}

void main()
{
    timer_interval = your_calculated_value;
    ticks_left = 10;
    setup_timer(timer_interval);
}

No será perfectamente exacto debido a que se está configurando el retraso de la instrucción (probablemente de menos de 10 ciclos) entre la interrupción y el nuevo valor del temporizador, aunque si esa es una preocupación, puede verificar la salida del ensamblador para encontrar el número de ciclos Tomará y restablecerá el temporizador a un valor ligeramente inferior en el ISR si es probable que sea un problema.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas