AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
04.02.2015, 12:07
|
|
Временная регистрация
Регистрация: 11.09.2007
Сообщений: 39
Сказал спасибо: 11
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
CodeVision передача в компьютер по прерыванию
Звиняюсь если вопрос покажется примитивным.
В CodeVision при работе контроллера с компьютером необходимо пересылать информацию через Сом - порт.Причём в компьютер слать как байты так и строки.И чтоб сократить время простоя контроллера решил слать их по прерываниям...В CodeWizard установил Tx Interrupt в программе появилось interrupt [USART_TXC] void usart_tx_isr(void). И тут немного не понял.При приёме я анализирую начало и конец строки что приходят в rx_buffer и как они совпали - перебрасываю данные в другой буфер очищая приёмный...Ну а там уж разбираюсь что пришло...А как работать с прерываниями в передаче ? Мне нужно что-то запихивать в tx_counter вручную и как мне это сделать из программы ?
Тоесть из программы putchar(c); или puts(string_out); автоматически будут передаваться на прерывания или нужны какие телодвижения....?
С уважением...
|
|
|
Сказали "Спасибо" andr_larr
|
|
|
04.02.2015, 12:31
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,056
Сказал спасибо: 2,562
Сказали Спасибо 11,889 раз(а) в 5,963 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
Прерывания по приему нужны для организации приема в буфер приема и к компу никак не относятся (только опосредованно).
Прерывания по передаче нужны для работы с буфером передачи - выплюнул в буфер то. что хочешь передать, а дальше голова болит у контроллера.
Посмотрите обработчики прерываний Визарда.
Видимо, надо чуть уточнить.
Опустошается буфер приема функцией чтения getchar(). При этом все счетчики работают корректно. Перед чтением байта полезно убедиться, что буфер не пустой, иначе можно зависнуть до приема байта УАРТом.
putchar(char) помещает байт в буфер передачи. Как там что-то появилось, начинается передача до опустошения буфера передачи.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
Последний раз редактировалось akegor; 04.02.2015 в 12:53.
|
|
|
|
04.02.2015, 16:49
|
|
Временная регистрация
Регистрация: 11.09.2007
Сообщений: 39
Сказал спасибо: 11
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
Сообщение от akegor
|
Прерывания по передаче нужны для работы с буфером передачи - выплюнул в буфер то. что хочешь передать, а дальше голова болит у контроллера.
|
Вот этот вопрос и непонятен."выплюнул в буфер"...это как ?Ну вот есть у меня строка в массиве или число в переменной - как правильно его в буфер передать ? Если можно пример или кусок кода....Именно передача...
С уважением....
|
|
|
Сказали "Спасибо" andr_larr
|
|
|
04.02.2015, 17:01
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,056
Сказал спасибо: 2,562
Сказали Спасибо 11,889 раз(а) в 5,963 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
Сообщение от andr_larr
|
Ну вот есть у меня строка в массиве или число в переменной - как правильно его в буфер передать ?
|
Побайтно, putchar(char). Вот здесь отвечал на подобный вопрос.
Посмотрите ту тему, на которую ссылался.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
04.02.2015, 17:43
|
|
Временная регистрация
Регистрация: 11.09.2007
Сообщений: 39
Сказал спасибо: 11
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
Посмотрите ту тему, на которую ссылался.[/QUOTE]
Во уже ближе....
"Визард используете для генерации "рыбы"?"(с)....
Именно так...рыба - самое привлекательное в Визарде....
Вот вопрос...Почти всё понятно но как-то последние шестерёнки не складываются....
У Вас настроена передача по прерыванию..
Это кусок вашей программы...
----------------------------------
i2btoa(rez, mas); // Подготовка строки
mas[4]=0; // Запись признака конца строки
putchar('?'); // Передача признака начала пакета
putstr(mas); // Передача подготовленной строки
----------------------------------------------
Когда Вы даёте команду putstr(mas); программа автоматически переходит в передачу по прерыванию ? Тоесть процессор передаст строку в tx_buffer и далее занимается своими делами а подпрограмма прерывания сама уже строку передаёт или это как-то надо организовать вручную ?
С уважением....
|
|
|
Сказали "Спасибо" andr_larr
|
|
|
04.02.2015, 18:16
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,056
Сказал спасибо: 2,562
Сказали Спасибо 11,889 раз(а) в 5,963 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
Сообщение от andr_larr
|
программа автоматически переходит в передачу по прерыванию ?
|
Как бы, не совсем так. Функция передачи строки вызывает функцию передачи байта. Эта функция (если буфер передачи пустой и УАРТ не занят) отдает байт УАРТу. Если УАРТ занят передачей, байт помещается в буфер. При освобождении UDR возникает прерывание, по которому из непустого буфера в UDR помещается следующий байт из буфера.
Таким образом, при вызове putstr(mas) первый байт идет непосредственно на передачу, а остальные помещаются в буфер и будут передаваться по прерываниям освобождения UDR.
Поэтому
Сообщение от andr_larr
|
У Вас настроена передача по прерыванию..
|
несколько не то, что Вы предполагаете. Начало передачи не связано с прерываниями.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
05.02.2015, 11:36
|
|
Временная регистрация
Регистрация: 11.09.2007
Сообщений: 39
Сказал спасибо: 11
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
Спасибо...Начинаю понимать ньюансы о которых читал но как-то не отложилось в голове...
Тоесть как я понял я вызываю функцию передачи строки,она помещает первый байт в UDR и по завершению передачи байта выставляется флаг прерываний по завершению передачи,берёт следующий и так до конца...
Если я не надоел 2 уточнения...
1.При реализации putstr(mas) вся строка передаётся в tx_buffer или частями ? Тоесть есть-ли необходимость устанавливать размер буфера как минимум более величины передаваемой строки ?
2.Перед реализации putstr(mas) есть-ли необходимость проверять пустоту UDR или функция это произведёт сама и дождавшись пустоты UDR начнёт передачу ?
С уважением...
|
|
|
Сказали "Спасибо" andr_larr
|
|
|
05.02.2015, 12:11
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,056
Сказал спасибо: 2,562
Сказали Спасибо 11,889 раз(а) в 5,963 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
1. Да. Вся строка в буфер, потому как пересылка быстрее передачи. Смотря насколько часты передачи. Если гарантируется передача полного пакета между сеансами, то можно буфер иметь равным пакету.
2. Нет. Функция сама помещает В БУФЕР при помощи putchar(...). А вот путчар уже сам ориентируется, куда всунуть байт - в пустой УДР или, если он занят, в буфер.
Не надо забывать, что putstr(mas) выводит в УАРТ СТРОКУ, т.е., строка должна заканчиваться признаком конца строки (0х00).
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
05.02.2015, 13:11
|
|
Временная регистрация
Регистрация: 11.09.2007
Сообщений: 39
Сказал спасибо: 11
Сказали Спасибо 8 раз(а) в 8 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
Понял.Спасибо.Я вывожу с помощью puts(); он автоматически добавляет конец строки - по этому символу у меня в компьютере модуль синхронизируется определяя что пришла информация...
Щас буду пробовать с использованием прерывания....Спасибо за советы...
С уважением....
|
|
|
Сказали "Спасибо" andr_larr
|
|
|
05.02.2015, 13:30
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,056
Сказал спасибо: 2,562
Сказали Спасибо 11,889 раз(а) в 5,963 сообщении(ях)
|
Re: CodeVision передача в компьютер по прерыванию
Сообщение от andr_larr
|
Я вывожу с помощью puts();
|
Есть у меня большое подозрение, что эта функция сделана из стандартного путчара. А стандартный от Визардовского отличается отсутствием буфера и, как следствие, завешиванием контроллера в ожидании передачи байта.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:58.
|
|