Товарищи Коты, помогите разобраться, облазил весь интернет и жутко запутался. Мне нужно через COM порт в МК mega8515 передавать данные, я понял что для этого необходимо использовать UART или USART (кстати так и не пойму в чем разница). Я скачал примеры с сайта atmel, но все равно не понял. Не могли бы вы подробно объяснить, что к чему во вложенных файлах, и какие особенности UART и USART. Заранее спасибо.
PS: Долго ползал в поисковике по форуму, но нужного мне ничего не нашел, если чего проглядел не ругайтесь .
Я на Вашем месте занялся не реализацией кода, а разработкой протокола обмена. Ибо только когда будут обозначены такие характеристики как:
1) Что надо передать в ПК от МК?
2) Что надо принять МК от ПК?
3) Как эти посылки будут взаимодействовать?
4) Как часто будет производиться обмен?
5) Что будет инициализировать обмен, ПК или МК?
Можно будет перейти к мыслям о том какбудут представлены данные в обоих направлениях и уже после определить на какой скорости, какой контроль, сколько стоповых бит. Ну и тогда милости просим код.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Пример чтения из ком порта -
char buf = 0;
buf = getchar();
Пример записи аналогичен консольному вводу выводу на сях
если кодите на КодВижн АВР то просто мастером создайте себе буфферизированный ввод и вывод по прерываниям и получите полный рабочий пример работы
УАРТ - это стандарт
УСАРТ - это модуль в МКшке который можно настроить поразному
Очень рекомендую хотя бы чтение делать буфферизированно....
в принципе вам не нужно вдаваться в подробности достаточно просто взять типовую кинфигурацию этого модуля в МК и соответствующим образом настроить компьютер....самое главное что нужно помнить на выводах компьютера сзади логические уровни не те что надо МК (+-15 вольт) поэтому нужна буфферная микрушка преобразования уровней - МАХ 232 её клонов у каждого производителя предостаточно, главное не запутаться в том что ТХ у мк должен идти на РХ компа ибо иначе получите два канала слушающих друг друга и два канала ломающих друг дргуа на свой уровень
Ммм... Ладно, наверно будет проще если изложу задачу.
Задача МК: принять посланную через COM порт цифру и в соответствие с ней мигнуть светодиодом, а затем перейти в ожидание новой передачи.
Пример: послали 7, МК принял эту цифру, 7 раз мигнул светодиодом и стал опрашивать COM порт.
Вот у меня и возникла проблема, с написанием кода для получения по COM порту цифры. Так что если можно напишите пожалуйста как это правильно делать, от инициализации до чтения.
Все что я понял на данный момент прочитав тонну информации, что в итоге присланная цифра должна быть в UDR записана в соответствии с ASCII.
Да, а визард выдает только следующее
UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F; а чего совсем этим добром делать дальше не понятно.
я конкретно по вашему МК не знаю..я только работал с АТМегой 8-16-32
но это судя по всему конфиругационные регистры чтоб настроить модуль!!!
Вы же загляните в даташит на микроконтроллер в раздел УСАРТ модуля - там каждый бит (из 8-ми) в каждом из этих регистров многое значит!
Понимаете ли...ком порт это не просто так....тут много есть параметров связи ... есть синхронный режим(который используется очень редко) есть асинхронный, в асинхронном режиме МК отслеживает изменения уровней по определённым временным интервалам и записывает это последовательно в входной буффер.....чтоб всё работало нужно знать с какой скоростью передаёт компьютер данные, сколько стоп битов, есть ли бит четности и сколько вообще бит в посылке - всё это необходимо чтоб модуль МК понял ту какофонию импульсов что выстрелит ему компьютер....если Вы пишите на КодВижнАВР то поставьте галочкинапротив прерывания на приём и выставьте буффер в 8 байт - а дальше в постоянном цикле проверяйте переменную Receive - в ней записано количество неотработанных но принятых в буффер данных(байт) и если она не 0 то в буффере чтото есть - есть же и альтернативная функция getchar()которая будет вычитывать следующий байт из буффера или ждать нового пока не прийдёт
J.Joker писал(а):Задача МК: принять посланную через COM порт цифру и в соответствие с ней мигнуть светодиодом, а затем перейти в ожидание новой передачи.
Все что я понял на данный момент прочитав тонну информации, что в итоге присланная цифра должна быть в UDR записана в соответствии с ASCII.
Аски коды цифр принимают значения от 0х30 до 0х39 (десятичные)
Если правильно понял, то Вы ожидаете прием одного байта, со значением от 0х30 до 0х39. В данном случае можно рекомендовать такой вариант:
1) Настраиваем на прием. Сбрасываем флаг "принят байт". Ждем байт, с настроенным адресом ОЗУ (тело программы).Пока флаг пуст - гоняем вечный цикл.
2) Приняв байт записываем его по адресу ОЗУ (обработка прерывания), ставим флаг "принят байт". Выходим из прерывания.
3) Возвращаемся в основное тело, и по флагу переходим к функции "моргания", со сбросом флага.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
clawham писал(а):УСАРТ - это модуль в МКшке который можно настроить поразному
Разве у AVR есть аппаратный USART?
никогда не слышал чтоб у АВР были какие-либо проблемы с периферией.....с объемом оперативки да....с частотой да....но не с периферией.....я именно изза их богатой периферии с ними и работаю....ну что ни возьми что ни придумай всё есть и в таким избытке что никаким извратом не придумать задачу чтоб нельзя было б её решить не программно а запрограммировав правильно периферию естественно реч идёт об АТ Мегах потому они и меги
Аски коды цифр принимают значения от 0х30 до 0х39 (десятичные)
Если правильно понял, то Вы ожидаете прием одного байта, со значением от 0х30 до 0х39. В данном случае можно рекомендовать такой вариант:
1) Настраиваем на прием. Сбрасываем флаг "принят байт". Ждем байт, с настроенным адресом ОЗУ (тело программы).Пока флаг пуст - гоняем вечный цикл.
2) Приняв байт записываем его по адресу ОЗУ (обработка прерывания), ставим флаг "принят байт". Выходим из прерывания.
3) Возвращаемся в основное тело, и по флагу переходим к функции "моргания", со сбросом флага.
собственно говоря прочитав мой пример вы обнаружите что там это именно так и организовано только всё вынесено красиво в отдельные блоки и организован обработчик прерывания по факту завершения приёма - так более правильно.
clawham писал(а):
всё остальное - результат работы визарда
Да, я это уже понял, когда поставил крякнутую версию, потому что у меня Evolution такое не делал . Правда вот столкнулся с тем, что при эмуляции в AVR Studio4 все зависает на строчке
дак оно и должно было там зависнуть
почему? rx_counter - переменная количества принятых но неотработанных байт
если вы только что запустили микроконтроллер или отработали все байты - оно будет там висеть вечно...пока прерывание на окончание приёма не прийдёт. Обработчик перывания запишет в буффер принятый символ, увеличит счетчик принятых байт на 1 и вернет управление этому вечному ожиданию...а оно-то как-раз уже и не оправдается - там уже 1 будет и пойдёт программа дальше
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
Я не пойму это рабочий вариант, или туда надо еще чего-то дописать?
где вы видели в этой функции прерывание? прерывание висящее в вечном цикле?
это аналог моей функции гетчар только небуфферизированно!
А вообще на мк можно одну и ту же функцию реализовать сотней тысач милионов рабочих способов...только в каждом будут свои плюсы и минусы универсального нету!
А вот еще вопрос, скажите пожалуйста какую скорость на прием\передачу лучше сделать при кварце в 7.372800 MHz, стояла у меня 9600, сейчас переделал на 115200, так как прочел что компам тяжеловато на малых скоростях передачи работать.