Stránka 1 z 1

Atmega8 + UART

Napsal: 13 říj 2011, 09:18
od ptacekj
Zdravím, jsem začátečník, používám AVR studio, chci komunikovat s atmegou8 pres UART. Podle datasheetu nastavim komunikaci, z pocitace odeslu znak, atmega ho prijme a odesle nazpet. V pocitaci vidim vse OK. Kdyz ale chci odeslat z atmegy do PC nejaky svuj znak, v pocitaci vidim jen nesmysl. Kde mam chybu?
---------------------------------------
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

// get char
unsigned char uart_getc( void )
{
while ( !(UCSRA & (1<<RXC)) );
return UDR;
}

// send char
void uart_putc(unsigned char data )
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}


int main (void)
{
UCSRA = 0x00;
UBRRH = 0x00; // nastaveni rychlosti pro 1MHz
UBRRL = 0b00000110; //9600baud
UCSRB = 0b00011000; // povolit vysilani a prijem
UCSRC = 0b10000110; // ramec dat: 8 datovych, 1 stop bit, bez parity
UCSRB |= (1 << RXCIE); //zapnout preruseni pri prijmu USART
sei(); //zapnout globalni preruseni
_delay_ms(100);

for (;;) // Loop forever
{
}
}

ISR(USART_RXC_vect)
{
char ReceivedByte;

ReceivedByte = UDR;
while ( !( UCSRA & (1<<UDRE)) );
UDR = ReceivedByte;
while ( !( UCSRA & (1<<UDRE)) );
UDR = ReceivedByte;

//ZDE JE PROBLEM, DO POCITACE SE ZNAK NEDOSTANE, ANI PRES UART_PUTC ANI PRES UDR='a'
uart_putc('a');

}

Napsal: 13 říj 2011, 09:23
od Andrea
Takže když pošleš z PC třeba 'B', tak se ti vrátí 2x 'B' a to 'a' tam chybí?

Napsal: 13 říj 2011, 13:59
od ptacekj
Ano, přesně tak, z počítače odešlu B nazpět dostanu BB a nějaký nesmyslný znak.

Napsal: 13 říj 2011, 14:05
od Andrea
Když místo

uart_putc('a');

dáš

while ( !( UCSRA & (1<<UDRE)) );
UDR = 0x61;

tak to taky nefunguje?

Napsal: 13 říj 2011, 14:18
od ptacekj
Večer vyzkouším a dám vědět.

Napsal: 13 říj 2011, 14:43
od AB1
9600 baud při oscilátoru 1 MHz dává velkou chybu (7%).
Zkus 4800 baud a UBRR = 12.

Doporučuji stáhnout prográmek AvrBaud.exe.
http://www.rowalt.de/mc/avr/toolsd.htm

Napsal: 13 říj 2011, 19:27
od ptacekj
Děkuji za odpovědi, pomohlo nastavit 4800 baud. Jen mě překvapilo, že jsem odeslaný znak z počítače dostal vždy v pořádku nazpět a můj odeslaný znak z atmegy nikdy. Asi 7% chyba je příliš :?

Napsal: 14 říj 2011, 08:02
od AB1
Maximální povolená chyba je 2%.

Napsal: 14 říj 2011, 21:22
od Atlan
vid datasheet