Всем добрый день.
Пишу вроде бы простейшую прогу для ATmega128A в Atmel Studio 6.1. Просто передаю в комп 1 байт по UART.
Сначала делаю следующим образом:
Код
#include <avr/io.h>
#define UBRR_9600 47
unsigned char s[1] = "A";
int main(void)
{
UBRR0H = 0;
UBRR0L = UBRR_9600;
UCSR0B = (1<<TXEN0);
UCSR0C = (1<<USBS0)|(1<<UCSZ00);
UDR0 = s[0];
while(1)
{
}
}
Всё нормально, но вместо символа "A" (0x41) в окне терминала (Advanced Serial Port Monitor) вижу "Б" (0xC1)

Почему-то устанавливается в 1 старший бит.
А теперь то же самое, но через прерывание:
Код
#include <avr/io.h>
#include <avr/interrupt.h>
#define UBRR_9600 47
unsigned char s[1] = "A";
int main(void)
{
UBRR0H = 0;
UBRR0L = UBRR_9600;
UCSR0B = (1<<UDRIE0)|(1<< TXEN0);
UCSR0C = (1<<USBS0)|(1<<UCSZ00);
sei();
while(1)
{
}
}
ISR(USART0_UDRE_vect)
{
UDR0 = s[0];
}
Здесь в терминале вообще ничего не вижу, хотя, по идее, должна быть бесконечная посылка символа "A".
Ассемблерный код в обоих случаях одинаковый и, вроде бы, правильный:
Код
UDR0 = s[0];
LDS R24, 0x0100
OUT 0x0C, R24
Может кто-то сталкивался? Можете что-нибудь подсказать?
Сообщение отредактировал IgorKossak - May 19 2015, 17:13
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!