Generando 1 segundo con avr y temporizador 0 para Atmega32A

1

queridos: Tenemos que generar 1 segundo con el software atmega32A y mikrobasic. así que he configurado el temporizador 0 y avr de esta manera:

const _THRESHOLD = 250 
TCCR0=0x04
TCNT0=0x06
OCR0=0x00
' // Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01

y función de desbordamiento:

sub procedure Timer0Overflow_ISR iv IVT_ADDR_TIMER0_OVF
' // Reinitialize Timer 0 value
TCNT0=0x06
if (counter1 >= _THRESHOLD) then
counter1 = 0 

así que con TCCR0=0x04 NOSOTROS UTILIZAMOS 256 presqale con reloj externo 16MHz que:

16MHz/256=62500 

que significa que el temporizador 0 reloj es 1/62500=0.000016 Segundo que TCNT0=0x06 timer 0 sobre el reloj de flujo es 256-6=250 que toman 0.000016*250=0.004 Second para un desbordamiento del temporizador 0 con TCNT0=0x06 .

así que para crear 1 segundo, fue necesario contar el desbordamiento del temporizador0 para 1/0.004=250 turno del desbordamiento del temporizador0. Los códigos anteriores están escritos basados en este cálculo. Entonces, cuando programamos estos códigos en atmega32A, durante 5 minutos el reloj se retrasa durante 5 segundos.

  

Cambios basados en nuevo comentario.

     

He cambiado TCNT0 = 0x07 para 249 reloj de timer0 y 1 reloj para   Sobrecarga ti, valores er. pero todavía contrarrestado por 5 segundos a 5   minutos.

ayúdame a corregir mis códigos.

Muchas gracias.

    
pregunta Soheil Paper

1 respuesta

2

¿Se compila o interpreta "mikrobasic"? El sitio web lo llama "compilador", pero he encontrado que los proveedores juegan rápido y suelto con la distinción en estos días. A veces, el código fuente se compila en una representación intermedia de "bytecode", que luego se interpreta.

Tiene un cronómetro que cuenta cada 16 µs, lo que significa que el ISR debe actualizar el registro TCNT0 dentro de ese tiempo para que sus cálculos sean correctos.

Me pregunto si el ISR realmente escribe al TCNT0 antes de que ya se haya incrementado varias veces, lo que explicaría el error de aproximadamente 1 parte en 60 que estás viendo.

Un experimento sería ver si obtienes el tiempo correcto al aumentar aún más el valor TCNT0 . Intente configurar TCNT0 = 0x0B en su ISR. Si esto le da algo más cercano a la sincronización correcta, eso significa que hay un retraso en el orden de 64 µs entre cuando se produce la interrupción de desbordamiento y cuando se produce la escritura en TCNT0 . Esto no sería desconocido en el código interpretado.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas