@leom
Кратко о себе

Arduino Uno, проблема со скоростью UART?

Здравствуйте!
Программирую ардуинку на си. Использовал инициализацию и пересылку по мануалу atmega328. При просмотре в терминале на заданных в коде настройках идут неверные данные, но если установить в терминале не 9600,а 19200, тогда символы выводятся нормально. Если воспользоваться стандартным примеров IDE Arduino, то все работает верно.
Прошивка
#include <avr/io.h>

#define FOSC 16000000 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

void USART_Init( unsigned int ubrr)
{
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B = 1<<TXEN0;
/* Set frame format: 8data, 1stop bit */
UCSR0C = 3<<UCSZ00;
}

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* Put data into buffer, sends the data */
UDR0 = data;
}

void main( void )
{
USART_Init(MYUBRR);
	while(1){
		USART_Transmit('b');
	}
}

На всякий случай Makefile
#Контроллер, установленный на плате. Может быть другим, например atmega328 
DEVICE     = atmega328p

#Тактовая частота 16 МГц 
CLOCK      = 16000000

#Команда запуска avrdude. Ее нужно скопировать из Arduino IDE.
AVRDUDE = C:\Users\User\Desktop\arduino-1.0.4\hardware/tools/avr/bin/avrdude -CC:\Users\User\Desktop\arduino-1.0.4\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\\.\COM3 -b115200 -D

OBJECTS    = main.o

COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

all:	main.hex

.c.o:
	$(COMPILE) -c $< -o $@

.S.o:
	$(COMPILE) -x assembler-with-cpp -c $< -o $@

.c.s:
	$(COMPILE) -S $< -o $@

flash:	all
	$(AVRDUDE) -U flash:w:main.hex:i

clean:
	rm -f main.hex main.elf $(OBJECTS)

main.elf: $(OBJECTS)
	$(COMPILE) -o main.elf $(OBJECTS)

main.hex: main.elf
	rm -f main.hex
	avr-objcopy -j .text -j .data -O ihex main.elf main.hex
	avr-size --format=avr --mcu=$(DEVICE) main.elf
  • Вопрос задан
  • 3731 просмотр
Решения вопроса 1
@leom Автор вопроса
Кратко о себе
Проблема оказалась в изначальной инициализации, в памяти регистров UCSR0A-C оказывается мусор, я же предполагал, что там нули.
Исправил код и все заработало
#include <avr/io.h>

#define FOSC 16000000 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1

void USART_Init( unsigned int ubrr)
{
/*Set baud rate */
UCSR0A = 0;
UCSR0B = 0;
UCSR0C = 0;
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B = 1<<TXEN0;
/* Set frame format: 8data, 1stop bit */
UCSR0C = 3<<UCSZ00;
}

void USART_Transmit( char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* Put data into buffer, sends the data */
UDR0 = data;
}

void main( void )
{
USART_Init(MYUBRR);
	while(1){
		USART_Transmit('a');
	}
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vilgeforce
Раздолбай и программист
А UBRR0H и иже с ними на чтение же доступны?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы