Zdravím, mám problém s usartem na atmega162. kod viz nize.
#include<avr/io.h>
#include<avr/iom162.h>
#define F_CPU 16000000UL
#include<util/delay.h>
#define buffer_size 8
#define BAUDratePC 19200
volatile unsigned char tx_buffer[buffer_size] = {1,2,3,4,5,6,7,8};
void usartPC_transmmit(unsigned char data)
{
while (!(UCSR0A & (1<<UDRE0)));
UDR0 = data;
}
int main(void)
{
CLKPR = 0x80;
CLKPR = 0x00;
UCSR0B |= (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);
UCSR0C |= (1<<URSEL0) | (1<<UCSZ00) | (1<<UCSZ01);
UBRR0L = F_CPU/16/BAUDratePC - 1;
while(1)
{
for(int i = 0; i < 8; i++)
{
//_delay_us(800);
usartPC_transmmit(tx_buffer*);
}
_delay_ms(200);
}
}
jde o to, že když tam mam to zpozdeni 800us, tak me dojde do PC spravne 1,2,3,4,5,6,7,8.
Ovsem v pripade ze to zpozdeni odstranim, chodi me 1,130,32,80,200,232,132,252.
700 us uz chodi zase to co nema.
Jako prevodnik pouzivam FT232RL zapojene presne podle datasheetu a navic s odpory 10k na Tx a Rx.
Pokud jsem si udelal funkci (nize) na poslani celeho retecce tak me chodilo taky neco jineho.
void usart_comm(char *data)
{
while(*data)
{
usartPC_transmmit(*data);
data++;
}
}
A jeste jedna vec, nez jsem zapojil externi krystal tak jsem zkousel usart na vnitrnim rc. Jel jsem na 8MHz, to me neposilal usart ani po jednom znaku dobre, zkousel ruzne moznosti. Zajimave je, ze pokud jsem jel na 8Mhz a rychlosti 4200 baudu tak me to posilalo nesmysly, ale kdyz jsem kmitocet vydelil osmi (CLKPR=0x80;CLKPR=0x03;) na 1 Mhz, samozrekme po te upravil nastaveni usartu na 4200 tak me to pak chodilo dobre, tak nevim jestli treba nebude vadny procak.
Dik za nazory.*