Atmega8 + UART

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
ptacekj
Příspěvky: 6
Registrován: 19 bře 2010, 00:00

Atmega8 + UART

#1 Příspěvek 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');

}
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#2 Příspěvek od Andrea »

Takže když pošleš z PC třeba 'B', tak se ti vrátí 2x 'B' a to 'a' tam chybí?
Uživatelský avatar
ptacekj
Příspěvky: 6
Registrován: 19 bře 2010, 00:00

#3 Příspěvek od ptacekj »

Ano, přesně tak, z počítače odešlu B nazpět dostanu BB a nějaký nesmyslný znak.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#4 Příspěvek od Andrea »

Když místo

uart_putc('a');

dáš

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

tak to taky nefunguje?
Uživatelský avatar
ptacekj
Příspěvky: 6
Registrován: 19 bře 2010, 00:00

#5 Příspěvek od ptacekj »

Večer vyzkouším a dám vědět.
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#6 Příspěvek 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
Uživatelský avatar
ptacekj
Příspěvky: 6
Registrován: 19 bře 2010, 00:00

#7 Příspěvek 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š :?
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#8 Příspěvek od AB1 »

Maximální povolená chyba je 2%.
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#9 Příspěvek od Atlan »

vid datasheet
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“