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

 
 
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
Nekromant
сообщение Nov 21 2008, 01:31
Сообщение #16


Участник
*

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



добрый день, извиняюсь за долгий ответ.
1) строка maker1 длиннее строки InitLcd и объявлена она так же как InitLcd-написал так, потому что начал грешить на индивидуальную непереносимость именно константы InitLcd, пытался проверить пошлет ли мне он такое же количество правильных символов как определился размер(на случай если нужно послать невесь массив а его часть).результат был тот же.
2) строку maker1 никак не копирую в InitLcd это тестовый вариант и мне по сути надо просто получить вменяемую передачу массива с МК на ПК, для начала можно любоого массива, а затем уж этопойдет в нормальную програму.
Go to the top of the page
 
+Quote Post
aesok
сообщение Nov 21 2008, 08:03
Сообщение #17


Знающий
****

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



Цитата(Nekromant @ Nov 21 2008, 04:31) *
добрый день, извиняюсь за долгий ответ.
1) строка maker1 длиннее строки InitLcd и объявлена она так же как InitLcd...


maker1 обьявленна так?
prog_char maker1[]="initialization...";

Сообщение отредактировал aesok - Nov 21 2008, 08:03
Go to the top of the page
 
+Quote Post
Nekromant
сообщение Nov 25 2008, 13:48
Сообщение #18


Участник
*

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



Добрый день, проблема решена, теперь контроллер выдает то что я его прошу и когда я его прошу, мешал цикл абсолютно не относящийся к USART, пока еще не выяснил почему, но в будущем надеюсь прояснить. Всех благодярю за ответы-они мне очень помогли с решением проблемы
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:35
Рейтинг@Mail.ru


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