Witam!
Chciałem nieco poeksperymentować z moją atmegą i dorzuciłem kwarc. Ustawiłem fuse bity (hFuse: C9, lFuse: FF, Lock bit: 3F) i niestety troszeczkę się coś posypało. Obsługa USARTa, która wcześniej działała teraz jakoś gorzej sobie radzi bez względu na ustawioną prędkość. Testowałem nawet kilka 'gotowych' kodów i zawsze lecą mi jakieś krzaczki. Obecny kod wygląda następująco:
Oczywiście po stronie komputera ustawiam odpowiednią prędkość. I tak swoją drogą - czy wraz ze wzrostem częstotliwości taktowania maleje możliwa wielkość opóźnienia przez _delay_ms()? Bo jakoś specjalnie nie widzę różnicy jak zwiększam jego wartość poprzez dodanie kilku dodatkowych opóźnień.
Chciałem nieco poeksperymentować z moją atmegą i dorzuciłem kwarc. Ustawiłem fuse bity (hFuse: C9, lFuse: FF, Lock bit: 3F) i niestety troszeczkę się coś posypało. Obsługa USARTa, która wcześniej działała teraz jakoś gorzej sobie radzi bez względu na ustawioną prędkość. Testowałem nawet kilka 'gotowych' kodów i zawsze lecą mi jakieś krzaczki. Obecny kod wygląda następująco:
#define F_CPU 11000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define sbi(add,bit) add |= _BV(bit);
#define cbi(add,bit) add &= ~_BV(bit);
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
void USART_Init( unsigned int ubrr )
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
void US_TRA( unsigned char data )
{
while(!(UCSRA & (1<<UDRE)));
UDR=data;
}
void writeTextUSART( char * s )
{
while(*s)
{
US_TRA(*s);
s++;
}
}
int main( void )
{
USART_Init(MYUBRR);
sei();
while(1)
{
writeTextUSART("Test\n\r");
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
}
}
Oczywiście po stronie komputera ustawiam odpowiednią prędkość. I tak swoją drogą - czy wraz ze wzrostem częstotliwości taktowania maleje możliwa wielkość opóźnienia przez _delay_ms()? Bo jakoś specjalnie nie widzę różnicy jak zwiększam jego wartość poprzez dodanie kilku dodatkowych opóźnień.