Actualmente estoy usando un dispositivo ATmega32 con una velocidad de reloj externo de 16 MHz. El problema cuando uso un retraso de, por ejemplo, 16,000 ms en el software, en realidad solo demora 1000 ms en el mundo real. Me refiero a que la CPU de uC divide el tiempo de retardo por la frecuencia de reloj en MHz para hacer el retardo (16,000 ms / 16 MHz). Además, cuando uso un reloj de 8 MHz con la misma cantidad de retraso, se generaría un retraso de 2,000 ms. ¿Cuál sería la razón para eso?
Editar "Aquí está mi código"
include avr/io.h>
include util/delay.h>
include stdio.h>
include stdlib.h>
define F_CPU 16000000
define BAUD 9600
define BRC ((F_CPU/BAUD/16)-1)
void USART_Init(unsigned int brc)
{
// set baud rate
UBRRH = (unsigned char) (brc >> 8) ;
UBRRL = (unsigned char) brc ;
UCSRB = (1 << TXEN ) | (1 << RXEN) ; // enable receiver and transmitter
UCSRC = (0 << UMSEL); // setting Asynchronous mode
UCSRC = (1 << UCSZ1) | (1 << UCSZ0); // set communication number of bits (8 in this case)
}
int main(void)
{
USART_Init(BRC) ;
while(1)
{
char c;
_delay_ms(32000);
for (int i=0 ; i<=3 ; i++)
{
if (UCSRA & (1 << UDRE))
{
UDR = i;
_delay_ms(8000);
}
}
}
}