Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
KotdBtym
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 8
1

UART проблема при приеме данных. ATmega128A

07.12.2014, 17:48. Просмотров 4641. Ответов 6
Метки нет (Все метки)

Добрый день.
В программировании микроконтроллеров навичек. Столкнулся со следующей проблемой и залип на несколько дней.
В качастве отладочной платы использую набор OpenM128 package B. Требуется обмениваться с ПК командами управления при помощи USB-порта. Для этого использую плату PL2303 c FT232 и с 12Мегагерцовым резонатором. На плате установлен кварц 7.3728 МГц и контроллер ATmega128a. Динные передаю побайтно при помощи терминала. И при приеме данных на ПК первый бит числа, переданного с МК всегда 1. Например, при отправке 0x00 приходит 0х80, при 0х22 - 0хА2, при 0xFF - 0xFF.
Искал причину в фьюзах -- убил контроллер, заменил. Все фьюзы выставил в "1".
Думал проблема в кварце - заменил на такой же. количество стоп-бит и скорость (в бодах) никак не влияет.
Вообщем, свел программу к "тупой" отправке числа каждые 2 секунды, с дополнительным миганием светодиодов раз в 1 секунду (для доп. контроля кварца).

Текст программы:
#define F_CPU 7372800UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define BAUD 600
#define MYUBRR ((F_CPU/( 16UL * BAUD))-1)

void USORT_Init( unsykned int ubrr )
{
/* Set baud rate */
UBRR1H = (unsykned char)(ubrr>>8);
UBRR1L = (unsykned char)ubrr;
/* Enable receiver omd transmitter */
UCSR1B = (1<<TXEN1);
/* Set frame format: 8data, 2stop bit */
UCSR1C = (1<<USBS)|(3<<UCSZ1);
}
void USORT_Transmit( unsykned char data )
{
/* Woyt for empty transmit buffer */
while ( !(UCSR1A & (1<<UDRE1))) ;
/* Put data into buffer, sends the data */
UDR1 = data;
}

int main(void)
{
USORT_Init(MYUBRR);

DDRA=0x00;
while(1)
{
data = 0x22;
USORT_Transmit (data);
PORTA=0xff;
_delay_ms(1000);
PORTA=0x00;
_delay_ms(1000);
}

}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2014, 17:48
Ответы с готовыми решениями:

какая то черная магия при приеме по UART
Вообщем принимаю я две строки по UART, в блок switch все нормально приходит, первая строка &quot;АТ&quot;,...

проблема с УАРТом в ATMega128A
Добрый день. Есть задача принять последовательность байт через УАРТ от компа, выполнить...

ATmega16 проблема с передачей данных по UART
Хочу настроить связь ATmega16 и обычного компьютера, через UART. Для работы с UART использовал...

Проблема с ADuC845, вывод данных через UART
Уважаемые знатоки! Есть задача вывода данных из ADuC845 на монитор ПКUART2.docx (с помощью...

Обеспечить помехоустойчивость при приеме-передаче данных
Делаю приемник сигнала. Сообщение (8 разрядов) подаваемое последовательно на вход (один из пинов)...

6
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
07.12.2014, 18:05 2
На плате установлен кварц 7.3728 МГц
Ну и выставь в программе эту частоту.
0
KotdBtym
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 8
07.12.2014, 18:15 3
Цитата Сообщение от domis

Ну и выставь в программе эту частоту.
Это опечатка. В прошивке частота стоит верная.
0
domis
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
07.12.2014, 18:28 4
Настройку количества передаваемых бит проверь. Если не ошибаюсь, то на резерв попадаешь, равносильно 7 бит передаешь.
0
KotdBtym
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 8
07.12.2014, 18:54 5
Цитата Сообщение от domis
Настройку количества передаваемых бит проверь. Если не ошибаюсь, то на резерв попадаешь, равносильно 7 бит передаешь.
Боюсь проблема глубже... Кстати при 7-ми битном режиме, на "1" заменяется каждый 7-й бит.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
07.12.2014, 19:30 6
Цитата Сообщение от KotdBtym
/* Set frame format: 8data, 2stop bit */
UCSR1C = (1<<USBS)|(3<<UCSZ1);
Может надо так? UCSR1C = (1<<USBS1)|(3<<UCSZ10);
А то, похоже Ваша «тройка» на USBS «налазит», а UCSZ10 остается в пролете. ИМХО
0
KotdBtym
0 / 0 / 0
Регистрация: 04.12.2014
Сообщений: 8
08.12.2014, 12:21 7
Цитата Сообщение от tyzord66
Может надо так? UCSR1C = (1<<USBS1)|(3<<UCSZ10);
А то, похоже Ваша «тройка» на USBS «налазит», а UCSZ10 остается в пролете. ИМХО
Помогло, большое спасибо за помощь!
0
08.12.2014, 12:21
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2014, 12:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

UART и LCD - проблема при эмуляции в Proteus
Добрый день! МК Atmega88, CVAVR 3.12, Proteus 8.x МК тактируется от встроенного 8 МГц, скорость...

Зависает МК при одновременной отправки данных через UART
Если нажимать на кнопки порта В по очереди то всё нормально. А если нажать одновременно по одной...

Проблема с UART
День добрый. Продолжаю изучать AVR и наткнулся на проблему при изучении UART(работаю с платой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.