реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Atmega128 проблемы с USART
Nekromant
сообщение Nov 18 2008, 15:04
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-03-07
Пользователь №: 26 369



Доброго времени суток!
help.gif Суть проблемы в том, что впервые пытаюсь запустить USART (ранее опыта работы не было). провел инициализацию и просто пытаюсь по прерыванию вывести на дисплей бессмысленную строчку. Дело в том, что на дисплее я эту строку ни разу так и не увидел(попытка помигать светодиодами приводи к тому же самому результату). help.gif
вот код инициализации и прерываний:
oid TDebugUSART::InitUSART(uint32_t baudrate)
{
/* Enable receiver, transmitter and interrupts */
UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);

/* 8 bit data */


UCSR1C = (1 << UCSZ11) | (1 << UCSZ10);

/* high byte of UART speed */
UBRR1H = (F_CPU /(baudrate * 8L) - 1) >> 8;
/* low byte of UART speed */
UBRR1L = (uint8_t)(F_CPU / (baudrate * 8L)-1);

}
//-----------------------------
ISR(USART1_RX_vect)
{

Lcd.WriteInt(987654321);


}

ISR(USART1_UDRE_vect)
{
Lcd.WriteInt(123456789);


}
Сами функции Lcd.WriteInt точно рабочие, они взяты из библиотеки моих же предыдущих проектов и еще не подводили.
Заранее благодарен...
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Nov 18 2008, 16:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



А у Вас фьюз "М103С" случайно не установлен?
Go to the top of the page
 
+Quote Post
Laptop
сообщение Nov 18 2008, 17:03
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 19-11-05
Пользователь №: 11 103



А putchar у Вас где? Фунции низкого уровня надо самим написать.
putchar, getchar желательно сделать буферизованными.
Насчет прерываний не помню, они вроде как в первый раз сами и не сработают если ничего в порт не отправить.

Компилятор то хоть какой?
Go to the top of the page
 
+Quote Post
Nekromant
сообщение Nov 18 2008, 17:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-03-07
Пользователь №: 26 369



1)фьюз м103 не установлен-я сним много шишек набил прежде чем понял его работу.
2)putchar и getchar в данном случае просто не использую пока, нужно для начала вообще хоть какую то реакцию увидеть и научить реагировать.
3)Компилятор использую который идет с WinAVR-20071221.
Go to the top of the page
 
+Quote Post
Laptop
сообщение Nov 18 2008, 17:45
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 142
Регистрация: 19-11-05
Пользователь №: 11 103



Цитата(Nekromant @ Nov 18 2008, 20:09) *
1)фьюз м103 не установлен-я сним много шишек набил прежде чем понял его работу.
2)putchar и getchar в данном случае просто не использую пока, нужно для начала вообще хоть какую то реакцию увидеть и научить реагировать.
3)Компилятор использую который идет с WinAVR-20071221.

Ну хоть 1 символ в УАРТ запиши и при этом не забудь еще прерывания разрешить.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 18 2008, 17:57
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А Lcd.WriteInt(123456789); - там случайно не используется какая-нибудь таймерная задержка со счётчиком на прерываниях?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
smac
сообщение Nov 18 2008, 18:21
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Nekromant @ Nov 18 2008, 18:04) *
...
}
//-----------------------------
ISR(USART1_RX_vect)
{

Lcd.WriteInt(987654321);
}
....
Сами функции Lcd.WriteInt точно рабочие, они взяты из библиотеки моих же предыдущих проектов и еще не подводили.
Заранее благодарен...

При приеме байта надо UDR вычитывать, чтобы флаг прерывания сбросился, хотя может быть компилятор сам это делает, я не в курсе.
Go to the top of the page
 
+Quote Post
Nekromant
сообщение Nov 19 2008, 02:15
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-03-07
Пользователь №: 26 369



Цитата(AHTOXA @ Nov 18 2008, 20:57) *
А Lcd.WriteInt(123456789); - там случайно не используется какая-нибудь таймерная задержка со счётчиком на прерываниях?

нет никакой таймерной задержки, только что еще раз просмотрел, да и дело всего скорее не в этой функции, так как попытка просто мигнуть диодом в прерывании тоже ничем не увенчалась.
Принимая во внимания все советы, постараюсь сегодня организовать запись в порт и получившийся код выложу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2008, 09:11
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Nekromant @ Nov 18 2008, 17:04) *
вот код инициализации и прерываний:
А сами прерывания глобально разрешены? Программа в main() живет?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Nekromant
сообщение Nov 19 2008, 10:12
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-03-07
Пользователь №: 26 369



Цитата(Сергей Борщ @ Nov 19 2008, 12:11) *
А сами прерывания глобально разрешены? Программа в main() живет?

Да,сами прерывания разрешены. чтоб проверить работоспосбность инициализации порта попытался с контроллера отправить букву в бесконечном цикле-вполне посылается, зато если пытаюсь в цикле послать массив:
for(i = 0; i < sizeof(InitLcd); i++)
{
while(!(UCSR1A & (1 << UDRE1)));
UDR1 = maker1[i];
}
то получаю совершенную несуразицу.
зато если просто вернуть размер массива и просто опять же посылать букву:
for(i = 0; i < sizeof(InitLcd); i++)
{
while(!(UCSR1A & (1 << UDRE1)));
UDR1 = 'X';
}
то опять все получаю вполне нормально. 05.gif
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 19 2008, 10:50
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Пожалуйста замените идеоматические выражения "вполне посылается", "совершенную несуразицу" и "вполне нормально" четкими описанием того что вы наблюдаете. Это технический форум а не литературный, или эфирная среда общества экстрасенсов.

Анатолий.

Как определено InitLcd?

Сообщение отредактировал aesok - Nov 19 2008, 11:00
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Nov 19 2008, 13:34
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Nekromant @ Nov 18 2008, 18:04) *
/* high byte of UART speed */
UBRR1H = (F_CPU /(baudrate * 8L) - 1) >> 8;
/* low byte of UART speed */
UBRR1L = (uint8_t)(F_CPU / (baudrate * 8L)-1);

Вот еще вопрос - откуда 8L взялась? Вы в каком формате baudrate передаете функции инициализации?
И зачем в функции ВЫЧИСЛЯТЬ значение регистров UBRR1x?
Я использую в хидере -
#define BAUD9600 (uint16_t)((F_CPU/(16*9600UL))-1)
Потом просто передаю это значение в функцию. Обратите внимание на расчет. Вы используете константу 8UL, которая нужна для Double Speed. А судя по неустанавливаемому биту U2X в UCSR1A используете обычный режим.
Go to the top of the page
 
+Quote Post
Nekromant
сообщение Nov 19 2008, 14:28
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 21-03-07
Пользователь №: 26 369



Цитата(aesok @ Nov 19 2008, 13:50) *
Пожалуйста замените идеоматические выражения "вполне посылается", "совершенную несуразицу" и "вполне нормально" четкими описанием того что вы наблюдаете. Это технический форум а не литературный, или эфирная среда общества экстрасенсов.

Анатолий.

Как определено InitLcd?

Извиняюсь если непонятно выразился
1) посылается означало: что отправили с контроллера то и получили на компьютере
2) несуразица выглядела различными символами ни коим образом не похожих на те символы, которые должны были быть отправлены МК на ПК.

3)prog_char InitLcd[]="initialization...";//инициализация


Цитата(Qwertty @ Nov 19 2008, 16:34) *
Вот еще вопрос - откуда 8L взялась? Вы в каком формате baudrate передаете функции инициализации?
И зачем в функции ВЫЧИСЛЯТЬ значение регистров UBRR1x?
Я использую в хидере -
#define BAUD9600 (uint16_t)((F_CPU/(16*9600UL))-1)
Потом просто передаю это значение в функцию. Обратите внимание на расчет. Вы используете константу 8UL, которая нужна для Double Speed. А судя по неустанавливаемому биту U2X в UCSR1A используете обычный режим.

Извиняюсь, когда правил чтоб выложить случайно удалил эту строчку
void TDebugUSART::InitUSART(uint32_t baudrate)
{

/* Enable double speed */
UCSR1A = (1 << U2X1);

/* Enable receiver, transmitter and interrupts */
UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);

/* 8 bit data */



UCSR1C = (1 << UCSZ11) | (1 << UCSZ10);

/* high byte of UART speed */
UBRR1H = (F_CPU /(baudrate * 8L) - 1) >> 8;
/* low byte of UART speed */
UBRR1L = (uint8_t)(F_CPU / (baudrate * 8L)-1);

}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2008, 14:48
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Nekromant @ Nov 19 2008, 16:28) *
3)prog_char InitLcd[]="initialization...";//инициализация
Размер считаете по этой строчке, а отправляете что-то совсем другое из массива marker.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 19 2008, 14:56
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(Nekromant @ Nov 19 2008, 17:28) *
3)prog_char InitLcd[]="initialization...";//инициализация


Как вы корпируете строку из InitLcd в maker1?

Анатолий.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 16:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016