Тактовую частоту ограничивает тольео техпроцесс изготовления кристалла. AVR выполняет команды за 1-2 такта, PIC - за 4-8 тактов. Если сравнивать контроллеры построенные на одном техпроцессе, потолок производительности AVR гораздо выше. О каких мегагерцах вообще речь? Мегагерцы растут... но контроллер выполняющий команды за большее число тактов всегда работать будет медленней. Хотя конечно напрямую сравнивать нельзя - система команд слишком разная.
Можно легко сравнить только куски кода выполняющие аналогичные функции. и посчитать их по тактам.
Я когда-то делал одно устройство на AVR и такое же на PIC - последний потребовал частоту тактирования в 2 раза больше для аналогичной производительности.
Гуру помогите пожалуйста разобраться с USART. Задача вот какая:
1. Ведущее ус-во отправляет байт 01010101.
2. Затем ждет "байта ответа" от ведомого ус-ва (тоже 01010101, типа я на линии включено и все такое.)
3. если от ведомого нет отклика, то через небольшой промежуток времени отправить снова 01010101.(позвать ведомое) и так в цикле
4. По приему ответа - перейти к основной программе.
писал программу - гонял её в протеусе, отправлять отправляет, а вот с приемом что-то никак не получается(причем писал также для ведомого, чтобы отправлял байт, она работала и в протеусе их друг на друга завернул). я хотел использовать прерывание по переполнению таймера(там около 2-х секунд должно пройти). пытался разобраться в АВР по шагам - чето никак мозг не ловит где я просчитался - зацикливается в процедуре приема байта по USART и все тут. Вообще можно использовать прерывание по таймеру при работе USART?
p.s. прилагаю листинг. плиз, сильно не пинать - я начинающий, там все как в книжках пишут
зацикливается... так ведь ты сам зацикливаешь прием байта пока что-то не поступит? По крайней мере такая подпрограмма приема байта описана в даташите, если ты её не менял - итог очевиден.
Тебе надо просто в основном цикле программы проверять бит приема UART - если он активен, значит считать байт. Или же это все засунуть в прерывание по приему UART.
Alexeyslav писал(а):надо просто в основном цикле программы проверять бит приема UART - если он активен, значит считать байт. Или же это все засунуть в прерывание по приему UART.
Спасибо,стало быть USART независимо может работать, как таймер? если может, то как этот процесс запустить... как называется этот бит приема USART?
USART_Receive:
sbis UCSRA, RXC
rjmp USART_Receive
in R17, UDR
ret
Первая строчка - проверка наличия принятого байта, если он есть - следующая команда пропускается.
Вторая строчка - зацикливает на проверке, пока не будет принят байт - дальше не пустит.
третья строчка - собственно прием самого байта...
Alexeyslav, я использую именно эту процедуру по приему. мне нужно через интервал времени повторить передачу(2 сек, собственно неважно какой интенрвал) если не принят байт ответа ведомого. а так он циклится и все, как быть?
Циклится в основной программе - проверять, если прием есть - сохранить байт, и выполнять дальше программу, иначе - просто выполнять дальше программу. Либо доработать первые две строчки, чтобы они были со счетчиком времени - но тогда программа затормозится на 2 сек, если байт не будет принят.
Весь алгоритм обработки данных запихни в прерывание по приему байта с UART. я уже говорил, кажется. А так не получится чтобы в одном месте проверить а в другом принимать - могут быть коллизии и нужна будет синхронизация.
Чтобы не вышло ситуации когда после проверки наличия байта где-то в другом месте байт будет принят, приемник UART пуст и тут очередь доходит до алгоритма который был вызван после проверки приема - он полагает что приемник не пуст, что-то там читает но там оказывается мусор.
Проверять и читать надо в одном месте. Если все это делать в прерывании, нужны какие-то семафоры-признаки чтобы основная программа знала что там что-то принято и сохранено в определенное место, или просто в виде бита-признака "верно-не верно".
Вобщем там уже большой простор реализации алгоритма работы программы, но чаще всего этот алгоритм описывается по теории "конечных автоматов" с фиксированными состояниями.
Сегодня уже суббота и какой никакой а праздник.
Решил разобрать свои закрома и обнаружил микросхемы, которые мне в принципе в ближайшем обозримом будущем не понадобятся.
Продать - смысла нет , подарить тоже , в моём ближайшем окружении они большенству "по барабану".
Поэтому решил объявить конкурс для тех кто этим увлечён. Тому кто первый поймёт , что выполняет ниже приведённый код, мной будут высланы следующие призы ATMEGA164P -2 шт. ATMEGA48- 2шт Attiny2313-1 шт Atmega1281-2 шт.
Он не сложен для понимания и выполняет строго определённую функцию, написал , что бы побыстрее и не заморачиваться с двумя известными Application - это в качестве подсказки.
Отсылка приза за мой счёт.
Сложение двух чисел. Цифры чисел в виде байтов, в диапазоне 0-9 (типа BCD).
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучше бы применение контроллерам нашли
Я на них(TINY13) сделал гирлянду полноцветную, все никак статейку не забодяжу - лень матушка. вот туда как раз и пригодится некоторое количество контроллеров, которое зависит от здравого смысла и фантазии.
Kavka писал(а):Сложение двух чисел. Цифры чисел в виде байтов, в диапазоне 0-9 (типа BCD).
Совершенно верно. Это сложение двух десятичных цифр . Слагаемые могут иметь произвольное количество цифр - объём выделенной памяти для каждого.
Тут потребовалось складывать два BCD числа по 3 (max) знака в каждом и так не хотелось заморачиваться и переводом BCD-HEX-BCD и выводить на дисплей вот и написал.
Уважаемый Kavka, Плиз в личку Ваши почтовые координаты . И ждите обещанный приз.
аватарчик поменяли, чет сразу не узнал
Этот аватар у меня , честно говоря ,помоему больше 10 лет
Я на них(TINY13) сделал гирлянду полноцветную, все никак статейку не забодяжу
Давайте быстрее , скоро уже Новый Год! И аппокалипсис отменили в очередной раз.
Кстати тоже надо будет отметить.
Это правда... 6 месяцев пролетят очень быстро.
Но и другая правда состоит в том что я даже не знаю как ЗДЕСЬ писать статьи... вроде бы нет такой кнопки как "создать статью" чтобы можно было её дописывать постоянно держа в виде черновика, а потом по окончанию "выложить".
Помогите вот с каким вопросом, господа. Решил разобраться с режимом СТС на 2313. скопипастил прогу для генерирования 20000кГц (такт.4МГЦ) на выходе РВ.3 и при компиляции АВР Студия пишет, что регистры OCR1AH и OCR1AL - неизвестные регистры (error: Invalid register). Использую 16-ти разрядный таймер. в чем дело не пойму? эти регистры что - описывать нужно вначале, как какой-нить temp?
(к МК по схеме на порт Д семь кнопок повешены и при нажатии любой должно на выходе РВ.3 сигнал выдавать.)
з.ы. прикладываю прогу, может быть я в ней где-то очень сильно ошибся.