ATmega 32 Frecuencia de reloj

0

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);
            }
        }

    }
}
    
pregunta Ahmed M.Zahran

2 respuestas

1

No puedes usar _delay_ms para esperar tanto tiempo. De acuerdo con la descripción de AVR GCC de la función:

  

El retraso máximo posible es de 262.14 ms / F_CPU en MHz.

     

Cuando el usuario solicita un retraso que exceda el máximo posible, _delay_ms () proporciona una funcionalidad de resolución disminuida. En este modo, _delay_ms () funcionará con una resolución de 1/10 ms, proporcionando retrasos de hasta 6.5535 segundos (independientemente de la frecuencia de la CPU). El usuario no será informado sobre la resolución disminuida.

Además, debe comprobar que haya configurado CLKDIV8 y CLKSEL correctamente para su sistema.

    
respondido por el awjlogan
0

No suena como si tuvieras el fusible "dividir por el reloj del sistema por 8" configurado correctamente, que es independiente del código.

    
respondido por el CrossRoads

Lea otras preguntas en las etiquetas