|
Меню для управления через UART, на СИ |
|
|
|
Jan 23 2012, 22:10
|
Частый гость
 
Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503

|
Цитата Лирическое отступление Поиском пользовался, фак читал. Нашел пару похожих топиков, но не то. И все же... День добрый, есть AVR-ка, хотелось бы управлять через UART внутренним АЦП (on/off), ШИМ (менять значения), on/off некоторых пинов контроллера. Как лучше всего организовать/построить подобное меню? Опыт программирования у меня не большой, посему и спрашиваю. Подскажите в какую сторону копать, или простой примерчик для начинающих. ЗЫ Планирую использовать прерывание для АЦП. ЗЗЫ Подойдет ли для этого обычное case ветвление?
Сообщение отредактировал V000va - Jan 23 2012, 22:15
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jan 23 2012, 22:49
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(V000va @ Jan 24 2012, 00:10)  ЗЫ Планирую использовать прерывание для АЦП. ЗЗЫ Подойдет ли для этого обычное case ветвление? Для чего подойдёт case? просто написать в программе case - будет ошибка. Или Код unsigned char ADCChannel; #pragma vector=TCE1_OVF_vect __interrupt void Timer1_16kHz_ISR() { switch (ADCChannel) { case 0: ReadChannel(0); break; case 1: ReadChannel(1); break; case 2: ReadChannel(2); break; } Об чём речь?
|
|
|
|
|
Jan 24 2012, 13:05
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
"Сферические" задачи даются студентам для развития фантазии. Вы бы лучше сами набредили, причем поподробнее, несколько вариантов, затем, после нескольких уточнений, выбрали бы нормальный вариант. Причем, сами бы выбрали. А так - что толку заунывно начитывать: *Какой физ. уровень будет RS232 RS485/422? *Одно устройство или несколько? *Надо, чтобы любой МК понимал одинаковые команды или по принципу "указал адрес регистра, указал команду читать или записать, указал данные(если записать)" итд итп список может быть длиннее
Сообщение отредактировал _Pasha - Jan 24 2012, 13:06
|
|
|
|
|
Jan 24 2012, 16:00
|
Частый гость
 
Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503

|
Видимо я не очень ясно изложил чего хотел. Да в общем-то не так уж и много, хочу управлять ШИМ-ом через UART и считывать данные с АЦП. Нужно какое-то меню, чтоб этим всем управлять. Вот я и советуюсь, какое направление выбрать. Планирую делать меню через case. С АЦП понятно - дал команду- пошло преобразование, отбразилось в терминале. Но не знаю как вводить данные в OCR0 для управления ШИМ, а точнее как осуществить загрузку в OCR0. Загрузить не какую-то предустановленную величину из меню, а любую из доступного диапазона. На счет case я не уверен в общем-то, возможны варианты, покритикуйте если что. PS Ну а тем кому лениво/уныло читать, могут и не читать, дело-то добровольное, они либо родились уже с программированием на СИ в голове и круче Денниса Ритчи, либо забыли как сами разбирались и учились. Код while (1) { x=getchar(); delay_ms(200); switch (x) { case 'a': printf("\rRun ADC \r"); break; case 'b': printf("\rSetup PWM \r"); break; default: printf("\rError \r"); break; }; };
Сообщение отредактировал V000va - Jan 24 2012, 16:31
|
|
|
|
|
Jan 24 2012, 17:03
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Непонятно, что именно вам непонятно в данных ответах. Вы сами смутно догадываетесь, что даже если вы по 'A' запустите ЦАП, по 'B' его выключите, сами символы засунете по UART через терминал с компьютера или ещё какого источника, то изменять скважность ШИМ так запросто не выйдет - надо передавать двухбайтовое число по UART. Как - вопрос второй. Можно именно в паре байт, но тогда вы не с любого терминала наберете возможные символы, соответствующие этим кодам. Можно в десятичном представлении - но тогда придется его потом переводить в пару байт. Это и называется "разработайте протокол" управления вашими устройствами. А вы вцепились душой в этот case и очередной раз спрашиваете, поможет ли он вам. Не об этом надо думать, а о протоколе, конкретно - как передавать параметр скважности ШИМ.
|
|
|
|
|
Jan 24 2012, 17:05
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Как правило, для одного пункта меню нужно передать несколько байт, например, для шим надо передать пакет-сообщение, содержащее команду ШИМ и один-два байта заполнения шим.
Но как определить начало сообщения? Надо разработать структуру пакета. Лучше начать с пакета фиксированной длины. Итак, пакет должен состоять из заголовка, команды, данных и контрольной суммы. Предлагаю такой формат: 0x0B,0x77,CMD, data1,data2, CRC.
Здесь первые два байта - заголовок, CMD - байт команды, обычно одного байта достаточно, затем data1,data2 - два байта данных, затем два байта контрольной суммы.
Пакет пишется в циклический буфер по прерыванию уарт, разбирается в фоне. Если первые два байта, контрольная сумма и команда не соответствуют ожиданиям, то пакет игнорируется.
А то, что вы написали, вполне подойдёт для разбора принятой команды.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jan 24 2012, 18:01
|
Частый гость
 
Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503

|
_Ivana и =GM= Спасибо, вот это уже что-то! Возможно я использовал не ту терминологию и меня не поняли, но не беда. Так намного яснее! Про загрузку ШИМ, колцевой буфер, протоколо - это именно то, что нужно. Теперь яснее в чем разбираться. А именно в: 1. Кольцевой буфер 2. Пртокол
|
|
|
|
|
Jan 25 2012, 14:58
|
Частый гость
 
Группа: Участник
Сообщений: 87
Регистрация: 23-06-08
Пользователь №: 38 503

|
Цитата(XVR @ Jan 25 2012, 10:51)  Вопрос к ТС: вы своим устройством собираетесь управлять по RS232 из обычного терминала, или через какую то программу на РС? В первом случае вам нужет текстовый командно ориентированный протокол, во втором подойдет любой бинарный, главное что бы был попроще Управлять будут из внешней программы, но с возможностью ручного управления из меню терминала. Цитата(Dog Pawlowa @ Jan 25 2012, 11:16)  Желательно не в прерывании. Научитесь сначала организовывать какие-то независимые действия - измерение, прием сообщений, отправка сообщений. Пясните плз, не использовать case в прерывании RX_uart или из меню не вызывать действий приводящим к прерываниям?
|
|
|
|
|
Jan 25 2012, 15:24
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(V000va @ Jan 25 2012, 16:58)  Пясните плз, не использовать case в прерывании RX_uart или из меню не вызывать действий приводящим к прерываниям? Организовать программу по-другому: В прерывании RX_uart писать в круговой буфер; В основной программе проверять индексы буфера приёма и если буфер не пуст, обрабатывать принятые данные (case ....); АЦП запускать по таймеру или ещё как-нибудь (использовать прерывание АЦП); И тд - обеспечить псевдопаралельность исполнения всех задач, а не ждать байта в getchar.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|