Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ MCS51, AVR, PIC, STM8, 8bit _ Микроконтроллеры для начинающих

Автор: kpv Mar 24 2005, 11:21

Atmel
Производитель: Atmel Corporation.
Сайт: http://electronix.ru/redirect.php?http://www.atmel.com/ http://electronix.ru/redirect.php?http://www.atmel.ru/
http://[banned]/
детально не изучал, но, вроде бы, достаточно полезного материала для начинающих.
http://electronix.ru/redirect.php?http://ln.com.ua/~real/avreal/index.html
http://electronix.ru/redirect.php?http://avr.nikolaew.org
Сайт Михаил Николаева, большого любителя пива и коллекционера пивных этикеток

Microchip
Производитель: Microchip Technology.
Cайт: http://electronix.ru/redirect.php?http://www.microchip.com http://electronix.ru/redirect.php?http://www.microchip.ru

http://electronix.ru/redirect.php?http://pic16f84.narod.ru/
Что такое PIC ? Программатор, проекты для PIC16xxx, ссылки на документацию.

FUJITSU
Производитель: FUJITSU
Сайт:http://electronix.ru/redirect.php?http://www.fujitsu.com/
http://electronix.ru/redirect.php?http://f2mc.nm.ru/
FAQ по микроконтроллерам MB90FXXX, MB91FXXX.
Внутрисхемный программатор микроконтроллеров семейства F2MC-16LX и FR.
[url=http://www.fujitsu.com/global/services/microelectronics/product/micom/support/faq/]FAQ Fujitsu от производителя, ENG[url]

Автор: sK0T Mar 24 2005, 21:04

Замечательный универсальный программатор — http://electronix.ru/redirect.php?http://www.lancos.com/prog.html. Умеет программировать кучу разных типов микросхем (в том числе и PIC и Atmel) и при этом прост в изготовлении. Софт работает как под FreeBSD так и под windows.

Автор: Alexandr Mar 25 2005, 08:52

Не советую PIC для начинающих. Лучше действительно начинать с ATMEL. Объясню: у PIC-ов слишком оригинальная архитектура, неудачная регистровая система, банки памяти - все это ИМХО конечно. У ATMEL-ов (AVR,51) понятная, легкая в понимании архитектура. И последующий переход на другие микроконтроллеры будет проще. Все высказанное мнение относится к вопросу изучения микроконтроллеров начинающими на оборудовании типа лабораторных стендов. При работе с реальными проектами конечно есть нюансы.

Автор: nameless Apr 6 2005, 12:06

Цитата(Alexandr @ Mar 25 2005, 11:52)
Не советую PIC для начинающих. Лучше действительно начинать с ATMEL. Объясню: у PIC-ов слишком оригинальная архитектура, неудачная регистровая система, банки памяти - все это ИМХО конечно. У ATMEL-ов (AVR,51) понятная, легкая в понимании архитектура. И последующий переход на другие микроконтроллеры будет проще. Все высказанное мнение относится к вопросу изучения микроконтроллеров начинающими на оборудовании типа лабораторных стендов. При работе с реальными проектами конечно есть нюансы.
*


Не советую AVR для начинающих. Уж куда приятнее PIC. В преподавательской практике использовал оба - PIC схватывают на лету !!!
Есть подозрение - что из-за системы команд.

Автор: _Sam_ Apr 7 2005, 12:34

Вот натолкнулся недавно http://electronix.ru/redirect.php?http://www.ntlib.chat.ru/mk.htm.

Автор: Algol Apr 8 2005, 16:22

Сам начинал с PICов, думаю не ошибся, большое количество информации как в интернет, так и книг, делает их весьма популярными. Система команд действительно довольно проста и легка в усвоении, в отличие от MCS и AVR у которых команд намного больше. Тем более если разобраться с PICом, переход на другой чип не вызовет никаких проблем, ИМХО

Автор: 4Rost Jul 3 2005, 12:16

Думаю будут полезны вот эти два сайта:
http://electronix.ru/redirect.php?http://digitchip.by.ru/
http://electronix.ru/redirect.php?http://microprocessor.by.ru/

Автор: vip6k Aug 3 2005, 13:13

Сам начинал с PIC-ов т.к. они появисились раньше всех на рынке. Потом пробовал 51 семейсво, понравилось. А сейчас работаю на AVR, у них почти во всех есть аппаратное умножение, хорошие компиляторы и отладчики. Хочу попробовать Texas Instru т.к. у них очень маленький ток потребления (встречаются задачи).

Автор: Dmitron Aug 12 2005, 06:44

Работал и с пик, и с АВР, и с МСПИ. Приходилось и с 51. В каждом контроллере есть свои уникальные особенности, которые приходится выяснять. У пиков таких особенностей меньше, у МСПИ - больше. У авров - посередине. С пиками(16F84) разбирался 2 дня, после этого с аврами неделю, после чего с мспи - на ассемблере до сих пор не пишу, только на си. Между делом и с 51.

С нашей радиолюбительской точки зрения авры обладают наилучшими характеристиками по направлению стоимость-ресурсы-удобство-быстродействие.
С нашей профессиональной точки зрения наилучшими свойствами обладает мспи.
Многие коммерческие серийные проекты делаются у нас на пик. Так что если серьёзно заниматься контроллерами - нужно уметь писать на все. А если не очень - то только на один, причём на любой. У меня таким "любым" является авр 8535 и мспи 149. при несерийном производстве они обеспечивают наибольший выйгрышь по критерию функциональность-время отладки-стоимость.

Автор: Kofey Nik Aug 21 2005, 18:35

ПРостите, а где можно надыбать компилятор с Си для MCS-51? Франклин не советуют, избыточный код мол генерирует, советуют Кейл, а даже дем версии на сайте Кейла я не нашел. Есть кряканый, но на китайском языке тот сайт.
И вообще, насколько рационально переходить на Си?

Автор: san822 Oct 26 2005, 08:19

Переход на Си - это общеохватывающая тендеция.
Вопрос лишь во времени - сейчас или позже.
Ассемблер используют обычно когда не хватает каких то ресурсов(памяти или быстродействия), но по мере развития микропроцессорной техники всё реже и реже встречаются ситуации когда ощущается нехватка ресурсов.

Да и поддержка (примеры программ) для некоторых МП сейчас даётся только на Си.

Автор: левша Oct 26 2005, 13:44

Цитата(san822 @ Oct 26 2005, 12:19)
Переход на Си - это общеохватывающая тендеция.
Вопрос лишь во времени - сейчас или позже.
Ассемблер используют обычно когда не хватает каких то ресурсов(памяти или быстродействия), но по мере развития микропроцессорной техники всё реже и реже встречаются ситуации когда ощущается нехватка ресурсов.

Да и поддержка (примеры программ)  для некоторых МП сейчас даётся только на Си.
*

Согласен во всём , но на Си все перешли ещё хрен знает скоко лет назад. Лет 5 или 10 назад гдето такsmile.gif А вообще начинать осваивать MCS с Ассемблера это по нашему. biggrin.gif

Автор: SSerge Oct 26 2005, 15:35

Цитата(nameless @ Apr 6 2005, 18:06)
Не советую AVR для начинающих. Уж куда приятнее PIC. В преподавательской практике использовал оба - PIC схватывают на лету !!!
Есть подозрение - что из-за системы команд.
*

BASIC студенты тоже на лету схватывают, однако не будем забывать классиков:“Практически невозможно научить хорошо программировать студентов, ориентированных первоначально на BASIC: как потенциальные программисты они умственно оболванены без надежды на исцеление”.

Увы, при всех достоинствах семейств PIC16 и PIC18, по силе воздействия на неокрепшие умы они в чём-то подобны пресловутому BASIC-у.
Для "первого в жизни микроконтроллера" лучшим выбором будет всё-же семейство 8051 в силу большой распространённоси, "почтенного" возраста и доступности литературы. А вторым можно и PIC, уже не страшно.

Замечено (мною) что знание хотя бы в общих чертах архитектуры нескольких сильно отличающихся друг от друга ЭВМ даёт устойчивый иммунитет против PIC-оманства и AVR-ства.

Казалось бы, ну что толку от знания архитектуры Cray-1 с его векторными регистрами в наше время? А вот - помогает.

Автор: _artem_ Oct 29 2005, 03:34

Ya dumayu chto vse taki AVR. Ne potomu chto ya sam ego ispolzuju :
On bistree i bolse po vozmoznostyam. Dopustim ya s ucosom eksperimentiruyu - 128 kb flash i 64 kbayta RAMa mne ponadobilis dlja 6 zadac. A s PICom eto delo ne proslo by. U MSP svoi ogranicheniya na RAM.
V poslednem kataloge digikey samiy deseviy avr byl po 38 centov . atmega 128 prodaetsya po 6 dollarov ili chtoto vrode togo .

Dlya interesa sravnite takze benchmarking dlja etix mikro .

No esli dannie preimusestva ne trebuyutya, to vse delo vo vkuse .)

Автор: ESL Aug 1 2006, 06:29

Я осваивать МК начал, прошу не смеяться! с 1878ве1 (вроде и давно это было - в начале 11го класса, а вроде и недавно, всего каких-то два года прошло), в принципе, сейчас, попробовав на зуб smile.gif ПИКи, АВРы, МСП430, для себя сделал вывод, что АВР и МСП430 всё-таки легче даются чем ПИКи. (По крайней мере мне).

ЗЫ. А может это из-за того что мне плата отладочная на MSP430F149 перепала? Хотя вроде под АВРы - то платы не перепадало...

И ещё, в догонку: Я начал с асма.. мне это по первости помогло понять весьма своебразную тесеевскую структуру, ИМХО если сразу начинать с С, не получиться въехать в принципы адресации и т.д. Хотя я не настолько профи чтоб об этом рассуждать свысока..

Автор: DimG Sep 5 2006, 03:07

Цитата(Kofey Nik @ Aug 22 2005, 01:35) *
ПРостите, а где можно надыбать компилятор с Си для MCS-51? Франклин не советуют, избыточный код мол генерирует, советуют Кейл, а даже дем версии на сайте Кейла я не нашел. Есть кряканый, но на китайском языке тот сайт.
И вообще, насколько рационально переходить на Си?

Работая на Си, практически не зависишь от структуры контроллера. Посмотрел регистры специальных функций и достаточно. Остальное - дело компилятора. Если очень заботит скорость, то прежде чем переходить на ассемблер, лучше глянуть в библиотечные функции. Там обычно есть функции, реализующие особенности контроллера для более быстрого выполнения. Да и структура программы получается гораздо более логичной (для начинающих) при отсутствии оператора goto.
Отсюда вывод - переходить стоит!

Автор: Serj78 Sep 12 2006, 21:16

Пик и авр- это как ислам с христанством- каждый доказывает то, во что верит...

хотя сам начал с авр, изучал пики, 51 и 430 немного, но авр остается первым и любимым smile.gif

на си - однозначно переходить стоит- если это не тини12 конечно же...

Автор: koziy_mf Jan 7 2007, 02:43

To SSerge:
Ya nachinal s BASIC programmirovat'...eshe v shkole...Tak chto ya - umstvenno otstaliy ??? Nu ne bilo na UKNCshkah i Poiskah togda drugih kompiliatorov... ABIDNO smile.gif

Автор: exSSerge Jan 7 2007, 15:20

Цитата(koziy_mf @ Jan 7 2007, 05:43) *
To SSerge:
Ya nachinal s BASIC programmirovat'...eshe v shkole...Tak chto ya - umstvenno otstaliy ??? Nu ne bilo na UKNCshkah i Poiskah togda drugih kompiliatorov... ABIDNO smile.gif

Ну почему сразу отсталый? Всего лишь оболваненный smile.gif, как и я кстати, если дословно понимать Дейкстру, это из него цитата в том сообщении. Герр проффессор просто немного сгустил краски, вот у него и получилась такая загогулина - гипербола, т.е. художественное преувеличение.

Что же до компиляторов - то их было просто вагон. На PDP под RT-11 были Фортран-4 и Фортран-77, целых два Паскаля, и два С (DECUS-овский и на основе pcc), и даже Кобол был. Вот только дисковых накопителей у УКНЦ не было.
А с SCSI-винчестером да с электронным диском, да ещё со скоростным сетевым интерфейсом - вполне можно было работать.

Автор: Alich Apr 2 2007, 12:46

Цитата(Alexandr @ Mar 25 2005, 09:52) *
Объясню: у PIC-ов слишком оригинальная архитектура, неудачная регистровая система, банки памяти - все это ИМХО конечно.


честно говоря, мне то же нравится пиковская архитектура. Хотя может просто потому, что начинал с 51. Вернее даже с 31. Но регигтровая система неудачная - первый раз слышу. Банки памяти - потому что память такая. У АВР она то же есть, но всего 32 регистра вроде. Или около того.

Если смотреть 18 серию, там уже попроще с банками. Страниц нет вообще. Кроме того, ечть 24 и dsПики.

Сам я начинал с асма. Потому что 10 лет назад не знал о компиляторах. Инета не было, а были 2 книги - одна по однокристалкам 51, второй толмут от микрочипа. Потом перешел на Си. Первое время делал асм вставки. Потом меньше и меньше. Считаю - что переход нужен.

Автор: Andy Mozzhevilov Apr 2 2007, 14:16

Попахивает очередной священной войной.
Работайте, пофиг на чём. Можно работать на любых uC. Требования к интрегированным
интерфейсным модулям первичны, и энергопотребление - для критичных к этому параметру задач.
При прочих равных применяется то, с чем больше опыта.

Автор: ptolemy Mar 27 2008, 10:00

Преподаю программирование для микроконтроллеров уже много лет. Пробовали PIC, Fujitsu, MCS51, ARM. Лучше всего для новичков прижился MCS-51. Литературы и методических материалов - море. Для "продвинутых парней" - ARM7. Язык программирования - немного ассемблера для MCS51, для затравки, дальше C. Для ARM7 - только C.

Автор: john74 Apr 17 2008, 07:11

Цитата(ptolemy @ Mar 27 2008, 13:00) *
Преподаю программирование для микроконтроллеров уже много лет


А где преподаете? Что посоветуете совсем начинающим (речь о радиокружке), есть какие-то очень доступные обучалки? Проблема вот в чем, если с обычной логикой все обычно схватывается на лету, то вот когда речь заходит о микроконтроллерах, то проблема начинается практически сразу на этапе объяснения архитектуры. Помнится в институте у нас были "чемоданы" на которых изучался асм, нет ли чего-нибудь подобного для AVR (PIC)

Автор: rimpocha Apr 17 2008, 13:53

Цитата(Kofey Nik @ Aug 22 2005, 01:35) *
Есть кряканый, но на китайском языке тот сайт.


Я знаю китайский. Давайте ссылку. ^_^

Автор: vladi1147 Apr 22 2008, 16:13

Цитата(john74 @ Apr 17 2008, 11:11) *
...Что посоветуете совсем начинающим (речь о радиокружке)...


Добрый день!

Если позволите, я хотел бы выяснить у Вас в части радиокружка - а какие интересы у радиокружковцев? Я часто советую начинать освоение микроконтроллеров с помощью программ вида FlowCode. Но у меня нет ни опыта преподавания, ни навыков ведения кружков и т.д. То есть я могу ориентироваться только на мнение других.

Если Вас не затруднит, был бы признателен за совет практика.

Автор: opolo8 Apr 26 2008, 19:59

Хотелось бы освоить программирование контроллеров AVR на языке C++, может кто - нибудь знает какую - нибудь литературу по этой теме? Столкнулся с тем что все примеры для C, и книги которые есть посвящены программированию на C. Хотелось бы узнать как компилятор C, распологает программу в памяти контроллера. Заранее благодарю за ответы( если будут).

Автор: _Ivan_33 Apr 27 2008, 07:04

будут...
читай ШПАК Ю.А. Программирование микроконтрллеров AVR и PIC на языке С.
Евстифеев Микроконтроллеры AVR семейства tINY и mEGA...(ну или чета такое в этом роде) книга есть 2004 года и 2007 года
программа CodevisionAVR компилятор и загрузчик (чета загрузчик у меня плохо работает загружаю PonyProg)
программа VMLAB - симулятор простецкий типа просто отладчик кода
программа Proteus - крутой симулятор но AVR тама мало ждемс версию 7.3
а вообще отладчиками пользоваться имхо на них не надо надеяться - в них много глюков и недочетов...

Компилятор не располагает саму программу в контроллер есть программы загрузчики PonyProg или компилятор-загрузчик CodevisionAVR...

программа AVRStudio отладчик компилятор загрузчик - вроде не наврал...

нужно сделать тестовую плату например есть например тупо повесить на порт светодиодики (для начала) потом с микросхемами тестовую - знаю ссылку могу сказать

Автор: opolo8 Apr 28 2008, 05:31

Спасибо за рекомендацию. Для отладки есть плата STK500, так что с этим проблем нет. Ю.А.Шпака просмотрел, надо будет все таки подробно почитать. Но там примеры все на C, в этом и проблема, знаю C++ и не очень хочется разбираться с особенностями C, но похоже что придется. А про память я немного другое имел ввиду, как программа располагается в пространстве памяти? Раньше программировал на ассемблере контроллеры с архитектурой MCS-51, так там все просто так как полностью сам управляешь расположением всей программы в пространстве памяти, а вот в C что то не совсем ясно.

Автор: dxp Apr 28 2008, 07:55

Цитата(opolo8 @ Apr 28 2008, 12:31) *
Спасибо за рекомендацию. Для отладки есть плата STK500, так что с этим проблем нет. Ю.А.Шпака просмотрел, надо будет все таки подробно почитать. Но там примеры все на C, в этом и проблема, знаю C++ и не очень хочется разбираться с особенностями C, но похоже что придется.

Если знаете С++, значит, знаете и С, т.к. С является подмножеством С++. Особенностей С, в которых он не совпадает с С++, очень немного - на одной руке пальцев хватит пересчитать. Еще надо обратить внимание на то, какие возможности языка поддерживаются - они, как правило, не все поддерживаются (и это часто оправдано). Например, врядли найдете 8/16-разрядный процессор, компилятор которого поддерживал бы исключения. Но в остальном все вполне пристойно - классы, наследование, полиморфизм, шаблоны, все это на сегодняшний день уже есть.

Цитата(opolo8 @ Apr 28 2008, 12:31) *
А про память я немного другое имел ввиду, как программа располагается в пространстве памяти? Раньше программировал на ассемблере контроллеры с архитектурой MCS-51, так там все просто так как полностью сам управляешь расположением всей программы в пространстве памяти, а вот в C что то не совсем ясно.

Все как обычно. И тоже все управляемо. В библиотеке есть функция startup (ее названия у всех платформ свои, но суть одна), которая выполняет инициализацию регистров процессора (указатель стека и др.), а также статическую и динамическую инициализацию, после чего передает управление функции main путем вызова ее. Эта функция (startup) размещается в памяти программ всегда, и ей передается управление при сбросе процессора - т.е. когда процессор стартует с начального адреса (у разных платформ этот адрес тоже свой в силу аппаратных особенностей). Конкретные детали реализации этого - как что размещается и т.д. - надо смотреть документацию на используемую платформу. Как правило данные и код мапятся на именованные сегменты памяти, а сами сегменты размещаются в памяти в соответствии с директивами линкеру, задаваемыми в линкерном скрипте. Обычно пакет поставляется уже в таком виде, что там все как-то настроено по умолчанию, и уже можно начать сразу что-то писать. При желании можно разобраться, что к чему, и "перезаточить" под свои нужды/вкусы.

Автор: opolo8 Apr 28 2008, 08:27

Болшое спасибо за исчерпывающий ответ. Осталось только разобраться какие классы и функции существуют для работы с контроллерами AVR.

Автор: zltigo Apr 28 2008, 09:33

Цитата(opolo8 @ Apr 28 2008, 10:27) *
Осталось только разобраться какие классы и функции существуют для работы с контроллерами AVR.

Осталось понять, что весь Ваш опыт "программирования" приложений под Windows (угадал sad.gif полагаю) не стоит и выеденного яйца. Здесь нет Windows API, MFC, драйверов от производителя периферийного железа, халявных DLL и прочего прочего прочего...

Автор: opolo8 Apr 28 2008, 12:08

Вообще я не программист и тема форума Микроконтроллеры для начинающих, незнаю откуда у начинающих может быть опыт. Я только учусь программировать контроллеры на С++, по этому и задаю тут вопросы. 07.gif

Автор: zltigo Apr 28 2008, 13:23

Цитата(opolo8 @ Apr 28 2008, 14:08) *
..по этому и задаю тут вопросы. 07.gif

Продолжайте задавать здесь - с местом расположения темы никаих проблем нет.

Автор: Сергей Борщ Apr 28 2008, 15:41

Цитата(opolo8 @ Apr 28 2008, 11:27) *
какие классы и функции существуют для работы с контроллерами AVR.
Классов, специально заточенных для AVR нет. Есть некоторое подмножество стандартной библиотеки (в разных компиляторах разное), но весьма сомнительно, что вам она понадобится - памяти у этих контроллеров маловато.
Специальные (intrinsic) функции есть в некоторых компиляторах для выполнения некоторых специфичных действий, как, например, разрешение прерываний. В других компиляторах такие действия могут выполняться вставками на инлайн-ассемблере. Это описано в документации на компилятор.

Автор: MrYuran Apr 28 2008, 16:12

Цитата(SSerge @ Oct 26 2005, 18:35) *
BASIC студенты тоже на лету схватывают, однако не будем забывать классиков:“Практически невозможно научить хорошо программировать студентов, ориентированных первоначально на BASIC: как потенциальные программисты они умственно оболванены без надежды на исцеление”.

Не, я всё-таки начинаю исцеляться, спустя 15 лет.
Даже пару классов на с++ нарисовал.

А вцелом согласен - бейсик - для домохозяек (хоть даже и вижуал)

Автор: ZLOI Apr 29 2008, 08:50

Цитата(MrYuran @ Apr 29 2008, 01:12) *
Не, я всё-таки начинаю исцеляться, спустя 15 лет.
Даже пару классов на с++ нарисовал.

А вцелом согласен - бейсик - для домохозяек (хоть даже и вижуал)

А я наоборот получается деградирую :D.
в 11 классе писал на VBA и VB 6.0
на 1 курсе Borland Pascal и Delphi 6.0
на 2 курсе Pascal+ASM и TASM
на 3 курсе MASM и MPASM
на 4 курсе С и С++
, а потом Java, PHP и последний мой проект, за который мне заплатили, больше чем за все предыдущие на
VBA smile.gif

На самом деле в автокаде иногда не обойтись без VBA. Хотя есть люди, которые считают, что в автокаде надо на LISPе. smile.gif (Кстати, некоторые вещи лучше на нём)

Начинать изучать (ради изучать) лучшего с чего-то универсального и перспективного.
Думаю, что 16 семейство уже отжило свой век, их существование это консервативизм некоторых, хотя я когда-то начал именно с них.
Расскажу забавный случай, про консервативизм.
Есть в Новосибирске контора одна они делают свои контроллеры для АСУ ТП на мотороловских камнях, помоему с ядром MC68000.
Из характеристик этого проца можно взять 8 MIPS, 1 Ethernet, CAN. Ну да и ещё 4000 рублей стоимость smile.gif Забавно, что тот же AT32AP7000 имеет 210 DMIPS, 2 ethernetа, USB 2.0 Hi-Speed, да и вообще кучу всего и стоит 350 рублей. Мне посмеялись в лицо когда я спросил почему им не поменять мозги их контроллеров. Подумаешь производительность в >26 раз выше и экономия >3500 , у заказчика деньги есть, на кой чёрт менять.

Под задачу всё должно выбираться. Лучше начинать решать задачи какие-то, а под них уже железо выбирать.

Извиняюсь за сумбурность, тороплюсь.

Автор: Old_Jedi Apr 29 2008, 15:41

Я новичок в работе с микроконтроллерами и мне нужна помощь по выбору контролера для устройства обработки информации в датчике.

Я студент и делаю диплом, датчик отклонения от вертикали. Задача контроллера достаточно проста - на выходе датчика имееться сигнал, каждое его значение соответствует углу отклонения, нужно что бы котролер выводил на индикатор значения этого угла отклонения в соответствии входному сигналу.

В нашем университете изучают только дремучий микропроцессорный комплект КР580, а мне не хотелось бы в дипломе использовать такое старьё, к томуже прейдеться использовать кучу микросхем для реализации задачи.

Диапазон измерения 0-12градусов с чувствительностью примерно 3минуты, разрядности АЦП будет достаточно и 8, сигнал не превышает 10В.

Подскажите что я мог бы использовать. Заранее благодарен.

Автор: SIA Apr 29 2008, 17:03

Цитата(Old_Jedi @ Apr 29 2008, 18:41) *
Подскажите что я мог бы использовать. Заранее благодарен.


Почти любой микроконтроллер с АЦП на борту. Из х51 - Silabs С8051F410, из AVR - например, Mega 128. У обоих АЦП 12 бит.
Для этой задачи они даже избыточны, но для изучения - вполне.
Контроллеры на ARM (например, LPC23xx) недороги, еще мощнее, но сложнее и без возможности оперативно обратиться к уже освоившим их, в одиночку потянуть их трудно.

Автор: ZLOI Apr 29 2008, 23:49

Цитата(Old_Jedi @ Apr 30 2008, 00:41) *
Я студент и делаю диплом, датчик отклонения от вертикали. Задача контроллера достаточно проста - на выходе датчика имееться сигнал, каждое его значение соответствует углу отклонения, нужно что бы котролер выводил на индикатор значения этого угла отклонения в соответствии входному сигналу.

В процессе можете ещё прикрутить RS-232 и SD/MMC карту памяти, поверьте это не сложно.
Цитата(Old_Jedi @ Apr 30 2008, 00:41) *
В нашем университете изучают только дремучий микропроцессорный комплект КР580, а мне не хотелось бы в дипломе использовать такое старьё, к томуже прейдеться использовать кучу микросхем для реализации задачи.

Сочувствую... Правда у нас они уже сломались smile.gif
Цитата(Old_Jedi @ Apr 30 2008, 00:41) *
Диапазон измерения 0-12градусов с чувствительностью примерно 3минуты, разрядности АЦП будет достаточно и 8, сигнал не превышает 10В.

Если сигнал 10В, то на АЦП его на прямую нельзя. Советую поделить. А после делителя поставить ОУ.
Собственно схема:

Здесь сигнал от 0 до 10В. Если Вам нужен биполярный сигнал, то схему прийдётся переделывать.
На выходе сигнал от 0 до 5В, следовательно опорное напряжение у АЦП также должно быть 5В. Если опорное хотите использовать другое, то схему прийдётся переделывать.

Если не секрет в какой САПР будете проектировать печатную плату ?

Цитата(Old_Jedi @ Apr 30 2008, 00:41) *
Подскажите что я мог бы использовать. Заранее благодарен.


ATtiny2313 можно, цена должна понравится. Можно ATmega88. Программаторы есть в нете. Среда программирования IAR или AVR Studio, там же.

Автор: Old_Jedi Apr 30 2008, 07:31

Цитата(ZLOI @ Apr 30 2008, 03:49) *
Если сигнал 10В, то на АЦП его на прямую нельзя. Советую поделить. А после делителя поставить ОУ.

Если не секрет в какой САПР будете проектировать печатную плату ?


Спасибо за подсказки. По поводу сигнала в 10В это не проблема, он там специально усиливался для определенного АЦП, можно просто убрать усилитель, что еще упростит мою задачу.

А плату проектировать в P-CAD'е буду, только проблема в том, что нам его практически не преподавали crying.gif Не знаю как там это делать, прейдеться помощь искать. Так что если заинтересован кто пишите в аську smile.gif Награда гарантируется.

Автор: ZLOI Apr 30 2008, 09:06

Цитата(Old_Jedi @ Apr 30 2008, 16:31) *
А плату проектировать в P-CAD'е буду, только проблема в том, что нам его практически не преподавали crying.gif

Советую скачать eagle layout с казуса. Очень простецкая САПР и весит не много(<20 Мб).
Я пользуюсь protel DXP (165 Мб). По мне, так в тысячу раз приятнее и удобнее пикада.
Здесь на электрониксе есть форумы посвещённые САПР, можете спрашивать, что не понятно.

По поводу награды, наверное Вам уже просто поздно делать диплом, так?
Если нет, то лучше самому, любой вид интеллектуальной деятельности, в том числе разработка ПП - развивает мышление и может пригодится для других отраслей. Не однократно в этом убеждался.

Успехов.

Автор: Old_Jedi Apr 30 2008, 14:25

Цитата(ZLOI @ Apr 30 2008, 13:06) *
По поводу награды, наверное Вам уже просто поздно делать диплом, так?


да вы правы smile.gif Я из тех кто делает сам но всегда невовремя. а когда начинаю неуспевать то прошу отдельные задачки помоч кого нибуть. Но к сожалению вся наша группа необучена как и я такого рода работе, поэтому прейдеся тут искать помощи smile.gif

Автор: ZLOI Apr 30 2008, 15:51

Цитата(Old_Jedi @ Apr 30 2008, 23:25) *
да вы правы smile.gif Я из тех кто делает сам но всегда невовремя. а когда начинаю неуспевать то прошу отдельные задачки помоч кого нибуть. Но к сожалению вся наша группа необучена как и я такого рода работе, поэтому прейдеся тут искать помощи smile.gif

Скачайте игл и проблем не будет, может там не большой функционал, но разобраться 5 минут хватит.
Или проблема в самой разработке? Если так, то тут сразу нанимать и не ждать никого. Если в схемотехнике понимаете, то совет выше.

З.Ы.
Я сам ЭВМщик и у нас тоже все на САПР повесились... Ох и заработал я тогда, правда повторно желания нет на дискретах чего-то лепить.

Автор: Artem_Gusev Apr 30 2008, 16:19

Здравствуйте всем, Всем заранее благодарен smile.gif
Такой вопрос :

Задача: сделать 8 канальный АЦП..
Инструменты: PIC18F4550 на демоплате DM163025 PICDEM FS USBDemo board используя готовый проект реализации устройства USB используя библиотеку CDC..
....
о не могу понять как это все реализовать для 8ми портов и передать на комп..все что не пробовал получаеться какой то бре...если возможно помогите мне ...Как инициализировать правильно порты как будет выглядеть сам код считывания с АЦП..еще я не шарю в таймингах розличных какими они должны быть.....ВСЕ большое спасибо!!!

Moderator:
Обширные неформаторованные исходники из тела сообщения удалил. При необходимости следует воспользоваться приложением ввиде архива. Небольшие исходники - форматироваить.

Автор: ZLOI May 2 2008, 17:43

Цитата(Artem_Gusev @ May 1 2008, 01:19) *
Здравствуйте всем, Всем заранее благодарен smile.gif
Такой вопрос :
Задача: сделать 8 канальный АЦП..
Инструменты: PIC18F4550 на демоплате DM163025 PICDEM FS USBDemo board используя готовый проект реализации устройства USB используя библиотеку CDC..

Но не могу понять как это все реализовать для 8ми портов и передать на комп..все что не пробовал получаеться какой то бре...если возможно помогите мне ...Как инициализировать правильно порты как будет выглядеть сам код считывания с АЦП..еще я не шарю в таймингах розличных какими они должны быть.....ВСЕ большое спасибо!!!

Может ДШ почитать? Там вроде со страницы 261 неплохо про это расписано. Да и апликух пруд пруди.

Автор: Artem_Gusev May 3 2008, 11:05

Цитата(ZLOI @ May 2 2008, 20:43) *
Может ДШ почитать? Там вроде со страницы 261 неплохо про это расписано. Да и апликух пруд пруди.




ТЫ прав расписано там все прелесть, в теории, тока я в програмухе не сильно спец, потому и не получаться..порядок действий , ну вроде блок схему я себе то вырисовал, тока запрограммировать не получаться, поэтому и обратился за помошью...
Потому буду очень признательный за кусочек рабочего кода к этому МК а точнее PIC18F4550...

Автор: ZLOI May 3 2008, 14:56

Цитата(Artem_Gusev @ May 3 2008, 20:05) *
ТЫ прав расписано там все прелесть, в теории, тока я в програмухе не сильно спец, потому и не получаться..порядок действий , ну вроде блок схему я себе то вырисовал, тока запрограммировать не получаться, поэтому и обратился за помошью...
Потому буду очень признательный за кусочек рабочего кода к этому МК а точнее PIC18F4550...

Я же и говорю, что у http://electronix.ru/redirect.php?http://www.microchip.com есть Application notes, типа 6 канальных вольтметров с выводом на светодиодное табло, там и исходники и схема и даже проги для ПК, посмотри хорошо и вырежь чего надо.

Автор: Old_Jedi May 6 2008, 17:35

Подскажите какие нибуть ресурсы руские по AVR Mega 128 контроллерам. Мне надо срочно разобраться как его подключить к моей схеме (суть задачи смотрите выше на стр3).
Мне нужно подать свой измерительный сигнал до 2В примерно уровня на АЦП контроллера, и подключить к контроллеру какой либо индикатор который показывал бы от 0 до 10 градусов угол с точностью до минуты.
Суть проблему в том что все материалы что я смотрел по контроллеру очень подробные, что усложняет их понимание. У котроллера множество выводов, я не знаю как его изобразить на электронной схеме, что бы и лишнего не было но и все для его работы было изображено.

Еще совсем смешной вопрос - какие габариты у контролера Mega 128? что то я ни где не видел в описании.

Автор: rezident May 6 2008, 18:17

Цитата(Old_Jedi @ May 6 2008, 23:35) *
Подскажите какие нибуть ресурсы руские по AVR Mega 128 контроллерам. Мне надо срочно разобраться как его подключить к моей схеме (суть задачи смотрите выше на стр3).
Например
http://electronix.ru/redirect.php?http://www.atmel.ru/
http://electronix.ru/redirect.php?http://www.gaw.ru/avr.htm
Цитата(Old_Jedi @ May 6 2008, 23:35) *
Мне нужно подать свой измерительный сигнал до 2В примерно уровня на АЦП контроллера, и подключить к контроллеру какой либо индикатор который показывал бы от 0 до 10 градусов угол с точностью до минуты.
Для понимания и осоознания разбейте вашу задачу на несколько конечных автоматов/этапов, которые реализуются отдельно.
- Измерение физической величины с помощью АЦП.
- Преобразование полученного от АЦП кода в эквивалент измеряемой физической величины, например, в напряжение. Можно конечно этот этап пропустить, но тогда сложнее будет проконтролировать правильно ли ваш МК измеряет физическую величину.
- Преобразование напряжения в отображаемые единицы - градусы.
- Преобразование бинарного представления числа (градусов) в символьную строку.
- Вывод символьной строки на индикатор.
Цитата(Old_Jedi @ May 6 2008, 23:35) *
Еще совсем смешной вопрос - какие габариты у контролера Mega 128? что то я ни где не видел в описании.
Чертежы корпуса обычно приводятся в конце даташита. Но следует помнить, что одни и те же МК могут выпускаться в разных корпусах. Тип корпуса закодирован в полной маркировке микроконтроллера.

Автор: Old_Jedi May 7 2008, 08:08

Цитата(rezident @ May 6 2008, 22:17) *
Для понимания и осоознания разбейте вашу задачу на несколько конечных автоматов/этапов, которые реализуются отдельно.
- Измерение физической величины с помощью АЦП.
- Преобразование полученного от АЦП кода в эквивалент измеряемой физической величины, например, в напряжение. Можно конечно этот этап пропустить, но тогда сложнее будет проконтролировать правильно ли ваш МК измеряет физическую величину.
- Преобразование напряжения в отображаемые единицы - градусы.
- Преобразование бинарного представления числа (градусов) в символьную строку.
- Вывод символьной строки на индикатор.


измерять величену мою не надо. Смысл примерно такой: есть теоретическая функция преобразования преобразователя, она нелинейна, поэтому ее как бы разбиваем, что бы получить таблицу где определенной величене угла соответствовал определенный уровень выходного сигнала. Эту таблицу забиваем в память контроллера. Сигнал будет оцифровываться с помощью ацп контроллера и этот код например может служить адресом ячейки памяти, где уже храниться величена угла соответственная входному сигналу, останеться ее только вывести на индикатор. Я представляю как это все сделать на древнем МП который мы изучали smile.gif. но суровая реальность требует современных технологий, поэтому нужно как то воплотить это на совершенно незнакомом котроллере. Вот поэтому я сдесь smile.gif

Автор: ZLOI May 7 2008, 08:38

Цитата(Old_Jedi @ May 7 2008, 17:08) *
измерять величену мою не надо. Смысл примерно такой: есть теоретическая функция преобразования преобразователя, она нелинейна, поэтому ее как бы разбиваем, что бы получить таблицу где определенной величене угла соответствовал определенный уровень выходного сигнала. Эту таблицу забиваем в память контроллера. Сигнал будет оцифровываться с помощью ацп контроллера и этот код например может служить адресом ячейки памяти, где уже храниться величена угла соответственная входному сигналу, останеться ее только вывести на индикатор. Я представляю как это все сделать на древнем МП который мы изучали smile.gif. но суровая реальность требует современных технологий, поэтому нужно как то воплотить это на совершенно незнакомом котроллере. Вот поэтому я сдесь smile.gif

Вот здесь посмотрите, там и прошива и схема:
http://electronix.ru/redirect.php?http://people.overclockers.ru/NAPman/record14

А можно и так:
http://electronix.ru/redirect.php?http://www.google.ru/search?source=ig&hl=ru&rlz=&q=%D0%B2%D0%BE%D0%BB%D1%8C%D1%82%D0%BC%D0%B5%D1%82%D1%80+%D0%BD%D0%B0+atmega&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&meta=

Автор: Chado May 7 2008, 13:07

Nu надо же вопросики для начинающих 07.gif
У меня вопрос начинающего.
Пытаюсь поторить чужое рукотворное изделие, и даже спаял.
Не могу прожечь PIC. Программатор ExstraPic ни мур-мур sad.gif

Автор: rezident May 7 2008, 16:18

Цитата(Old_Jedi @ May 7 2008, 14:08) *
измерять величену мою не надо.
Не понял. Почему это не нужно? Насколько я понял у вас имеется первичный пробразователь, который угол отклонения преобразует в электрический сигнал. Этот сигнал аналоговый или уже цифровой?
Цитата(Old_Jedi @ May 7 2008, 14:08) *
Смысл примерно такой: есть теоретическая функция преобразования преобразователя, она нелинейна, поэтому ее как бы разбиваем, что бы получить таблицу где определенной величене угла соответствовал определенный уровень выходного сигнала. Эту таблицу забиваем в память контроллера. Сигнал будет оцифровываться с помощью ацп контроллера и этот код например может служить адресом ячейки памяти, где уже храниться величена угла соответственная входному сигналу, останеться ее только вывести на индикатор.
А тут про оцифровку сигнала с помощью АЦП речь идет. Ну и как понимать вашу фразу выше, о том, что сигнал оцифровывать не нужно? Кстати, а какой разрядности АЦП вы применять хотите? 10-и, 12-и, 16-и, 24-х? А теперь прикиньте-ка размер этой таблички для преобразования: например, для 24-х битного АЦП 2^24 состояний * 4 байта = 64 МегаБайта табличка получается однако! biggrin.gif Так что в аналитической форме-то формула преобразования гора-а-аздо меньше места займет. wink.gif Также при необходимости применяют таблицы аппроксимации (например, кусочно-линейной), которые опять же гораздо меньше предложенного вами способа преобразования занимают места в памяти.
Цитата(Old_Jedi @ May 7 2008, 14:08) *
Я представляю как это все сделать на древнем МП который мы изучали smile.gif. но суровая реальность требует современных технологий, поэтому нужно как то воплотить это на совершенно незнакомом котроллере. Вот поэтому я сдесь smile.gif
Тогда начинать нужно с изучения самого МК.

Автор: Old_Jedi May 8 2008, 10:15

Цитата(rezident @ May 7 2008, 20:18) *
Не понял. Почему это не нужно? Насколько я понял у вас имеется первичный пробразователь, который угол отклонения преобразует в электрический сигнал. Этот сигнал аналоговый или уже цифровой?
А тут про оцифровку сигнала с помощью АЦП речь идет. Ну и как понимать вашу фразу выше, о том, что сигнал оцифровывать не нужно? Кстати, а какой разрядности АЦП вы применять хотите? 10-и, 12-и, 16-и, 24-х? А теперь прикиньте-ка размер этой таблички для преобразования: например, для 24-х битного АЦП 2^24 состояний * 4 байта = 64 МегаБайта табличка получается однако! biggrin.gif Так что в аналитической форме-то формула преобразования гора-а-аздо меньше места займет. wink.gif Также при необходимости применяют таблицы аппроксимации (например, кусочно-линейной), которые опять же гораздо меньше предложенного вами способа преобразования занимают места в памяти.
Тогда начинать нужно с изучения самого МК.

Меня понять сложно, я же совсем не прошареный в научных делах smile.gif Говоря что величену не нужно измерять это я имел ввиду, что контролер сам не вычисляет эту величену. Да сигнал надо оцифрововать, и не помню что я говорил обратное. Я вроде конкретно ставил задачу, что ацп использую базовое Меги128, оно 10разрядное, вообще не понимаю зачем 24 разряда ) Я что то не уверен что моя таблица чисел, вернее это не таблица а набор чисел, будет занимать столько места в памяти, используя вашу же формулу подсчета - памяти нужно 4кбайта, а у меги128 на барту 128 кбайт встроеная память. Зато програмно такай способ помоему не напряжен, я вообще не программист ни грамма, но думаю все будет выглядить просто.
Спасибо за ссылки и коментарии, иногда это помогает избежать критических ошибок. Но я буду надеяться на незнание нашими препадами данного микроконтроллера, что затруднит проверку правильности моих решений smile.gif

Автор: r_dot May 10 2008, 03:56

Цитата(Chado @ May 7 2008, 17:07) *
... Не могу прожечь PIC. Программатор ExstraPic ни мур-мур sad.gif


Какой PIC? Прожигаешь в схеме или отдельно чип?

Автор: Chado May 10 2008, 05:59

Цитата(r_dot @ May 10 2008, 07:56) *
Какой PIC? Прожигаешь в схеме или отдельно чип?


Отдельно чип!
Винда грузит прогу (IcProg) и ни мур-мур. В списке процессов вижу прогу и ресурс проца на её. неделю бодаюсь с компом. Не дайте лоб расшибить! twak.gif

Автор: vladi1147 May 12 2008, 10:09

Цитата(Chado @ May 10 2008, 09:59) *
Отдельно чип!
Винда грузит прогу (IcProg) и ни мур-мур. В списке процессов вижу прогу и ресурс проца на её. неделю бодаюсь с компом. Не дайте лоб расшибить! twak.gif


Добрый день,

я пользовался, хотя и недолго, парой ExtraPIC и программой для прошивки PIC16F628A. Проблем не встретил. Если нужно повторить, могу еще раз это попробовать, единственная проблема - Windows. Я пользуюсь Linux.

Автор: Chado May 12 2008, 12:04

в томто и бодяга.
ХР со вторым паком, то она потеряет компорт, то графику на прогу, то вдруг ресурс проца под 100%.
Выкручивался следующим образом. В оборудовании выключаю сом порт.перезагружаюсь по требованию винды. Гружу прогу от имени администратора( постоянно ругается и то немогу и это). Убиваю прогу в диспетчере задач. Включаю компорт. гружу типово. Проверяю настройки проги. всё тип топ. читаю микруху- всё по нолям. НЕЧИТАЕТ. Хотя светодиодик мерцает. Что с виндой? Пробовал на другом цомпе. тест программатора не идет самый первый пункт. хотя все режимы в норме. Дата туда, а оттуда нэмааа. Икуда девается компорт? Каждый раз выключать? В ломы!
ПОМОГИТЕ!!! smile3009.gif

Автор: vladi1147 May 12 2008, 14:48

Цитата(Chado @ May 12 2008, 16:04) *
в томто и бодяга.
ХР со вторым паком...


XP SP2. Попробую сегодня что-нибудь придумать. Как долго нужно работать с программатором, чтобы проявились проблемы?

Автор: Chado May 12 2008, 15:48

Вроде не должно быть проблем Но есть ведь.Все грехи валю на виду.Чип прожег у друга за 10 секунд.
На моем программаторе. Уже впендюрил в схему ---- ПАШЕТ!
Что с виндой непонятно!

Автор: vladi1147 May 12 2008, 16:48

Цитата(Chado @ May 12 2008, 19:48) *
...Что с виндой непонятно!


Windows XP SP2, кажется со всеми последними обновлениями. После настройки по инструкции (уже забыл, что надо настраивать) появлялись ошибки. После установки задержки до 40 (процессор 2.2ГГц), вроде бы, пропали ошибки. Раз 5-6 в режиме Прочитать-Стереть-Программировать и т.д.

Возможно, проблема не столько с Windows, сколько с быстрым процессором? Может быть задержики и в 40 не хватает?

Автор: Chado May 14 2008, 09:13

smile.gif Ситуяция похожа на то, что брандмауэр гасит экранную часть проги по образу и подобию антивирусника нод32. В любом случае пога не в полном обЪёме загрузилась там где используются функции винды остается пустое место. Вызова функций АПИ просто нету. Что делать?Это гдето видимо в реестре вколочено. Хренаськи найдешь сотня мег реестр. или грохнуть всю винду и потом медленно и вернопоставить весь свой арсенал задач smile3046.gif cranky.gif

Автор: vladi1147 May 14 2008, 10:11

Цитата(Chado @ May 14 2008, 13:13) *
... В любом случае пога не в полном обЪёме загрузилась там где используются функции винды остается пустое место. Вызова функций АПИ просто нету. Что делать?Это гдето видимо в реестре вколочено. Хренаськи найдешь сотня мег реестр. или грохнуть всю винду и потом медленно и вернопоставить весь свой арсенал задач smile3046.gif cranky.gif


Грохнуть все, это никогда не поздно. А Вы точно выполнили все рекомендации по настройке IC-PROG при первом запуске? Я забыл о настройках, попытался запустить и все было очень странно, пришлось прочитать файл pdf, который был на диске и тупо повторить все, что там касалось предварительной настройки. К сожалению, я уже псчти забыл Windows. Но, если мешает брэндмауэр, то, может быть, попробовать его отключить? Извините, если сказал глупость.

Я уже запамятовал, но мне кажется, что я пробовал использовать EXTRA-PIC в Linux с программами KTechlab и Piklab. Если это мне не приснилось, то вполне удачно. Хотя больше я использовал самодельный простейший программатор.

Автор: Chado May 15 2008, 11:50

Но, если мешает брэндмауэр, то, может быть, попробовать его отключить?

Отключиь брэндмауэр система не дает в сервис паках довески это ресекают сразу. Поступаю проще ВЫБРАСЫВАЮ IcProg к какойто маме. И шпандорим на проге Winpic800 она умеет распознавать чип. Шью пики 84, 628, 628А, 716, 874. Время на прошиву затрачивает чуть больше 10 сек. Одной рутинной работой меньше. так что тема бум говорить снята. Нехочет винда Icprog - и я не сильно то хотел. wink.gif 08.gif

Автор: Obama May 16 2008, 07:38

Вот красивый проект для начинающих от новичка - LCD графический MT12864 - 128x64 точки. исходники для CVAVR и симуляция в PROTEUS - Прекрасно компилируется и симулируется. Можно симулировать в PROTEUS без компиляции - все файлы в архиве есть.

 LCD_MT1264.rar ( 49.5 килобайт ) : 219
 

Автор: sKWO May 25 2008, 16:18

что такое BCD и для чего оно нужно

BCD - Binary Coded Decimal -- это десятичное кодированное двоичным
Binay Coded Decimal- это кодирование которое упрощает хранение,доступ к ним и конвертацию данных для вывода к примеру на ЖКИ.
В результате конвертации мы в байте (8-bit) будем иметь два нибла (4-bit) каждый из которых будет содержать число
в размере от 0 до 16.Таким образом это позволяет нам хранить в каждом нибле десятичное число от 0 до 9 и два в одном
байте, тоесть в оном байте два десятичных числа.
Пример конвертации десятичного числа переменной mybyte если её значение находится в пределах от 0 до 99:

Код
char mybyte = 78;

Объявим переменную для значения старшего нибла.
Код
char upper_nibble = 0;
//Подсчитаем колличество десятков в переменной mybyte.
while (mybyte >= 10)
{
upper_nibble++;
mybyte -= 10;
}

После таких преобразований в переменной mybyte осталось число 8, а upper_nibble равно 7.
Чтобы получить сконвертированный байт объединим старший и младший ниблы:
Код
char result = (upper_nibble << 4) | mybyte;

Такой алгоритм исспользуется для конвертации в программе функции CHAR2BCD2.
Код
char CHAR2BCD2(char input)
{
    char high = 0;
    
    
    while (input >= 10)                 // Подсчитаем десятки
    {
        high++;
        input -= 10;
    }

    return  (high << 4) | input;        // Добавляем единицы и возвращаем результат
}

Если входное значение находится в пределах от 0 до 255 то исспользуют следующую функцию
Код
unsigned int CHAR2BCD3(char input)
{
    int high = 0;
        
    while (input >= 100)                // Подсчитаем сотни
    {
        high++;
        input -= 100;
    }

    high <<= 4;
    
    while (input >= 10)                 // Подсчитаем десятки
    {
        high++;
        input -= 10;
    }

    return  (high << 4) | input;        //  Добавляем единицы и возвращаем результат
}

Ещё один маленький пример ковертации байта в эквивалентное значение ASCII
с исспользованием BCD.
К примеру мы имеем байт Number размерностью от 0 до 99 который нужно сконвертировать BCD
в два эквивалентных кодировке ASCII значениям.
Код
char Tens = 0;     // десятки
char Ones = 0;     // единицы
char Number = 93; // значение для конвертации

Переведём десятичное значение в BCD исспользуя вышеописсаную функцию:
Код
Tens = CHAR2BCD2(Number);

Теперь переменная Tens в старшем нибле содержит десятки а в младшем - единицы. Дальше всё
очень просто, только необходимо помнить что ASCII ‘0’ - это 48, ‘9’ - это 48+9=57,‘3’ - это 48+3=51,
и наоборот 57 это десятичное значение ASCII ‘9’,51 это десятичное значение ASCII ‘3’.Таким образом конвертация десятичного значения в его эквивалентное ASCII значение - это простое суммирование десятичного значения и 48. Поскольку функция CHAR2BCD2 загрузила десятки и единицы переменной Number в Tens то мы должны сначала извлечь переменные Tens и Ones и добавляя 48 получить эквивалентные ASCII значения для Number.
Код
Ones = Tens;
Ones = (Ones & 0x0F) + '0';

Десятые мы получаем сдвигом на 4 и добавим 48.
Код
Tens = (Tens >> 4) + '0';

Теперь можно посимвольно выводить значения на ЖКИ, передавать в компютер и т.п.Пользуйтесь, это удобно. В общем может где-то есть и другая инфа на русском, я её не нашол, разобрался сам и решил другим помочь. Всё вышеперечиссленное тестировалось в компиляторе ИАР вер.5.10А.
Если будут найдены ошибки прощу исправить

Автор: Anub May 26 2008, 17:20

Добрый день, решил заняться программированием МК, купил программатор ChipProg-40. Программатор полностью устраивает, все прошивает на отлично, но вот контроллер работать отказывается. Работаю с atmega8535. Вопрос - он действительно работает без внешнего кварца, или может как то нужно активировать внутренний? При установке в схему контроллер заметно греется, что наводит меня на мысль о том что проблема вовсе не в программаторе или самом контроллере а в программе, ибо походу контроллер работает а вот программу выполнять отказывается. Программу компилировал в Programmers Notepad 2, в makefile соответственно вписал atmega8535. Если кому не сложно, сделайте элементарный пример для этого контроллера(например что бы на PA0 горел светодиод).

Автор: Kuzmi4 May 27 2008, 15:51

2 Anub - зря вы потратились. СТК200/300 - вот это вЭщ!
По теме -
Меги имеют встроенный РЦ-генератор - вроде с заводи идут с тактированием 1МГц(Читайте ДШ раздел ФУЗЫ).
Если при установке в схему камень греется - это не програмам а скорей всего(99%) монтажка - проверяйте схему.
Пример с миганием:

Код
int main (void)
{
    DDRA=0x01;// устанавливаем 0-й пин порта А на вывод
    while (1)//типа бесконечный цикл
    {
        PORTA =0x01;//установка "1" на 0-ю лапу
        //тут надо вставить задержку - юзаю стандартную, там либу подрубать нужно- delay.h вроде - а вы сами определитесь что и где вам нужно
        _delay_ms(200);
        PORTA =0x00;// установка "0" на все лапы
        _delay_ms(200);// аналогично , а то мигать не будет
    }

    return 1;//пусть будет - варнингов меньше..
}

Автор: zltigo May 27 2008, 16:30

Цитата(Obama @ May 16 2008, 09:38) *
Вот красивый проект для начинающих от новичка

Пороект вполне банальный,действительно уровень новичка. А с учетом прикладывания к нему рук, и особенно ссылок, воинствующего ламера 123 я бы вообще более, чем скептически рекомендовал ко всему написанному относиться.
Moderator:
Приложение слегка почистил от наглой саморекламы присоседившегося 123.

Автор: ysb Jun 18 2008, 10:33

добрый день!
подскажите, пожалуйста, как железно(без прошивки) проверить МК AVR на работоспособность? программатор выдает communication error(

Автор: ysb Jun 18 2008, 13:20

такой вопрос: если в CVAVR при прошивке стоит галочка Program Fuse Bits, но ниодного фьюза в списке не выбрано, то это он их всех сделал '1'? т.е CKSEL[3..0] = 1111 => работа от внешнего клока?? (mega16)
ситуация такая: один раз прошивается норм, потом МК не отвечает программатору... подскажите, куда смотреть пожалуста

Автор: vet Jun 20 2008, 04:33

Цитата(ysb @ Jun 18 2008, 17:20) *
такой вопрос: если в CVAVR при прошивке стоит галочка Program Fuse Bits, но ниодного фьюза в списке не выбрано, то это он их всех сделал '1'? т.е CKSEL[3..0] = 1111 => работа от внешнего клока?? (mega16)
ситуация такая: один раз прошивается норм, потом МК не отвечает программатору... подскажите, куда смотреть пожалуста

галка означает фьюз, запрограммированный в 0, а её отсутствие - 1.
Таким образом, чтобы зашить режим работы от кварца, нужно снять все галки CKSELn.

Автор: radiofill Jun 24 2008, 17:51

Цитата(nameless @ Apr 6 2005, 16:06) *
Не советую AVR для начинающих. Уж куда приятнее PIC. В преподавательской практике использовал оба - PIC схватывают на лету !!!
Есть подозрение - что из-за системы команд.


Всё гораздо проще. Для PIC есть много литературы на руссоком языке. Для AVR в основном только документация с минимумом примеров.

Автор: Пётр Толкачёв Jun 24 2008, 18:16

Я осваивать начал и,собственно,пока там и остался, с Мультикоров..и вот думаю,что мне просто не повезло...кто сталкивался-поймёт..конечно RISC+DSP сходу - это не совсем верно,но ситуация обязывала. Впринципе, неплохо,но глюки есть и они добивают,в основном, они в среде разработки(ПО слетает и если к этому не привыкнуть,то забросишь сразу же)..возможно предвзятость это,потому как отечественный...полезно знать,что наши пытаются.Если верить анонсам,то на них стоит обратить внимание,в мощности они прибавляют. smile.gif

Автор: Hitako Jun 28 2008, 23:09

Тут много полезного программы, литература. http://electronix.ru/redirect.php?http://www.forum.ocp.su/

Автор: марат Jun 30 2008, 16:44

Добрый вечер. Подскажите пожалуйста, Как сделать секундомер на ATmega103 длительностью до 5 минут на Code VisionAVR C ?

Заранее большое спасибо!!

Автор: Kuzmi4 Jul 1 2008, 08:04

2 марат - вам нужно в интерупте по таймеру инкрементировать дабл например (если дискретность таймера маленькая -2х байт может не хватить ) - зная период таймера легко вычислить какое значение дабла будет по прошествию 5 минут wink.gif

Автор: марат Jul 1 2008, 14:12

Алгоритм и структурная схема находятся тут : http://electronix.ru/forum/index.php?showtopic=49762&st=0&gopid=433443&#entry433443

Автор: Tiny Jul 13 2008, 09:21

Такой вопрос.
CodeVision, пример из пакета \cvavreval\examples\DS1820
Термометр с использованием Dallas Semiconductor DS1820, кварц 3.6864MHz
В программе используются библиотеки для работы с DS1820. Насколько я поинмаю, для обработки получаемых данных от DS1820 нужны определенные интервалы времени.
Я сделал проектик на Mega 16. Такого кварца у меня нет. Есть 4МГц, 4,5МГц и выше. Внутренние частоты МК - 1, 2, 4, 8. Попробывал в Протеусе симуляцию на 4 МГц. Работает. Но в реальном устройстве - нет.
Попробывал подключить внешнюю RC-цепь (4,2К 22пФ), выставив соответсвующие фюзы. Опять же на индикаторах ерунда.
Есть ли выход из данного положения? Можно ли обойтись без кварца на 3.6864MHz?

Автор: Tiny Jul 13 2008, 18:01

Разобрался. Забыл проинвертировать управление транзисторами, которые коммутируют сегменты. Работает и от внутреннего 4МГц и от внешней RC цепи.

Автор: DeVOuR Jul 24 2008, 19:08

простенькй вопросик)

Первая моя прога на АТмелах. Атмега8.

последоательный порт (USART). принцип приема с прерыванием каков?

Система такова:
1. прием определенного байта, который соотв. 1му из 3х определенных последующих действий мк.
а) выслать по юарт одни данные
б) выслать по юарт другие данные
в) приготовится принять данные

с передачей проблемм нет, а как организовать прием?
я пока что сделал так:
1. принимается байт - срабатывает прерывание - прерываемся - смотрим, какой байт получили - переходим к нужной проце - и тут же, не выходя из прерывания всю процу и выполняем.
с трансмиттом то так и будет, а вот с приемом номально? или все же следует както организовать прерывания таким образом, чтобы выходить из него после каждого принятого байта?

спс за ответ.

Автор: Kuzmi4 Jul 25 2008, 09:35

Приём/передача по прерываниям.
При чём лучше передавать пакетом данные - тогда разбор полётов можно засунуть сразу в прерывание + ошибок меньше будет в зашумлённых условиях.
Работа приблизительно такова - в ресив интерупте декодировался пакет -> есть комманада и данные - тогда выставляем определённый семафор и системный манагер (можна на таймер какой либо прицепить) по наступлению тика обрабатывает нужный запрос.
Передача - забиваете в буффер данные и кол-во для передачи - выставляете флаок и пошли интерупты клацать wink.gif

Автор: DeVOuR Jul 25 2008, 18:27

Kuzmi4,
спасибо.
передачу переделал на пакетную, прием тоже сделал красиво.
в симуляторе работает как часики..
надо дописать ПО под виндоз, тогда посмотрим, че там получится)


и, есть ли смысл считать контрольную сумму? или это все зависит от частот и скоростей?

Автор: bureau Jul 26 2008, 11:00

2 DeVOuR - вё зависит от зашумлённости среды в которой будет идти провод smile.gif

Автор: Олег Хохлов Aug 15 2008, 21:37

Цитата(bureau @ Jul 26 2008, 14:00) *
2 DeVOuR - вё зависит от зашумлённости среды в которой будет идти провод smile.gif


Мне так видится, все зависит прежде всего от тяжести последствий приема и обработки искаженного пакета smile.gif Потому что вероятность приема искаженных данных существует всегда (и причины могут быть самые разные). Особенно если одной из обменивающихся сторон является ПК с виндой smile.gif
Фактически, в протоколе обмена типа "пакет запроса - пакет ответа" контрольные суммы нужны всегда.
Во избежание пусть очень редко случающихся, но весьма неприятных и непредсказуемых глюков smile.gif Даже простая арифметическая сумма или XOR байт пакета куда лучше чем ничего.
Ну а по-правильному - CRC8, CRC16 или CRC32 в зависимости от длин пакета и предполагаемой вероятности искажения данных. В качестве прикидки (где-то когда-то что-то такое слышал): CRC16 в типичном канале с BER (Bit Error Rate - вероятностью приема сбойного бита) = 10^-3 (один на тысячу) гарантирует обнаружение ошибки в пакетах с длиной, ограниченной на уровне 256 байт.

Автор: Integral Aug 16 2008, 03:27

Для работы от внешнего кварца снял все галки CKSELn. Другие галки не трогал. Поставил внешний кварц. После чего МК перестал отвечать програматору. В чем проблема? может нужно было еще какието фьюзы поменять? Как теперь запустить МК? (мега16)

Кажется я понял в чем проблема.... по дефолту CKSELn=0001. А в моей проге для програматора по дефолту стояла только 1 галка в CKSELn, соотвецтвенно в этой проге идет наоборот.... галка - 1, нету галки - 0.
Таким образом получилось у мну CKSELn=0000. angry.gif

Как запустить теперь МК и выставить фьюзы как положено?

Автор: SSerge Aug 16 2008, 12:18

Цитата(Integral @ Aug 16 2008, 10:27) *
Как запустить теперь МК и выставить фьюзы как положено?

Подать на МК внешний клок от любого источника.
При использовании адаптеров типа STK200/300 или Altera ByteBlaster клок можно генерить самим адаптером, если, конечно, программа программатора это умеет.
Например http://electronix.ru/redirect.php?http://www.ln.com.ua/~real/avreal/index.html умеет.

Автор: Integral Aug 16 2008, 13:31

Будем пробывать... на К155ЛА3 генератор склипаю...
Частота порядка 100КГц - 1МГц покатит?

Автор: SSerge Aug 17 2008, 21:45

Цитата(Integral @ Aug 16 2008, 20:31) *
Будем пробывать... на К155ЛА3 генератор склипаю...
Частота порядка 100КГц - 1МГц покатит?

Должно при одном условии. Частота тактирования процессора должна быть в несколько раз выше частоты сигнала SCK при программировании.

конкретно для Мега16:
Depending on CKSEL Fuses, a valid clock must be present. The minimum low and high periods
for the serial clock (SCK) input are defined as follows:
Low:> 2 CPU clock cycles for fck < 12 MHz, 3 CPU clock cycles for fck ≥ 12 MHz
High:> аналогично.

т.е. низкий и высокий уровень на ноге SCK должны удерживаться не менее 2 (или даже 3) периодов тактирования процессора.
Быстрее одного раза за микросекунду порт принтера обычно не переключается, так что частоты от 2МГц точно хватит, немного более низкой - скорее всего хватит.

Автор: Integral Aug 17 2008, 21:52

заработал на частоте 1.6МГц, програмируется у меня через СОМ порт.

Удивительно то что при напряжении 12В которое подавалось на питание МК около 30сек. он не накрылся... 07.gif (сгорел сволочь стабилизатор 7805)

Автор: monos Aug 24 2008, 13:07

Столкнулся с такой задачей:
Необходимо было оцифровать сигнал с потенциометра и затем отмаштабировать цифровой результат. Как это сделать я так и не придумал, поэтому пришлось масштабировать аналоговый сигнал. Хотелось бы все таки делать это (масштабирование) программно. Камень использовал пик16ф886. Подскажите начинающему.

Автор: Sergey Reva Aug 24 2008, 13:19

т.е нужно умножить, например на 0,12345? можно сделать так, умножить на 12345, разделить на 100000, при этом тип данных должен быть соответствующий, long например.

Автор: monos Aug 24 2008, 14:05

Спасибо. Если не затруднит, дайте примерчик на си для понимания, как правильно задать этот (long) тип данных.
А как сделать "смещение нуля" программно? Так, как нужно, чтобы отмаштабированный сигнал имел заданные минимальное и максимальное значения.

Автор: Sergey Reva Aug 24 2008, 14:39

Код
long value;

const long offset=-10;  // -10 adc попугаев
const long mul= 12345; // 0,12345
const long div=100000;

value=readADC();

value+=offset;
value*=mul;
value/=div;

showOnLcdLong(value);
showOnLcdByte((char)value);


вот собственно и полный пример: http://electronix.ru/forum/index.php?act=Attach&type=post&id=16863

Автор: monos Aug 24 2008, 20:47

Видимо, я сильно начинающийsmile.gif : понял принцип, а как применить к моему случаю-- понял не совсем.
У меня задача следующая: необходимо результат ацп поместить 8-разрядный регистр PR (он задает длительность импульса шим модуля ССР). При этом, 8<PR<48. У пиков ацп 10-разрядное (результат ацп читается из спаренного 16-разрядного регистра- старший байт и младший байт) т.е. результат будет в диапазоне 0...1024. В Вашем примере задается 32-разрядный тип данных, надо ли это в моем случае? Помогите разобраться.

Автор: Sergey Reva Aug 24 2008, 22:35

ну тогда можно просто делить на 25, без округления
1023/25=40,92 = 40
0/25=0
добавить смещение 8 и готово, в результате 8 ~ 48, тогда хватит и 16 бит, если есть возможность перевести АЦП в 8 бит режим, то наверное можно ещё проще, но это уже сами считайте smile.gif

з.ы.
только что заметил... больше 8, меньше 48... значит смещение 9, коэф соотв тоже надо пересчитать.. но смысл тот же

 calculation.pdf ( 75.72 килобайт ) : 316
 

Автор: monos Aug 25 2008, 08:12

Принцип понял, спасибо. Вы правы, наверное, будет лучше не читать два младших бита ацп и оперировать восьмиразрядным словом: такая возможность есть. Надо только продумать, как оперативно изменять мин и мах значения при наладке железа. А в пэдээфке, как понял, три варианта вычисления?

Автор: Sergey Reva Aug 25 2008, 09:13

сначала идёт расчёт коэф, потом 3 варианта расчёта, 1й с типом double, 2й через целочисленную арифметику с округлением, 3й - то же что и 2й (только через 1/к) но без округления

Автор: monos Aug 25 2008, 12:51

2Sergey Reva
Спасибо.

Автор: _Ie0nid Sep 22 2008, 01:27

Спасибо всем кто помог с регистрами USART. Подскажите пожалуйста еще один такой нюансик. Я пытался подключитть клавиатуру к УСАРТУ в синхронном режиме, у него есть стробирующие импульсы - 11 штук, идут они одновременно с данными, следовательно получается нужные 11 бит. (1 стартовый, стоповый, бит четности, и 8 бит данных). Естественно у меня ни чего не получилось. Такой вопрос, УСАРТ принимает очередной бит данных каким образом? По каждому стробу? И следующее, данные, я так понимаю, он считывает по уровню при появлению фронта строба.

Автор: Kuzmi4 Sep 22 2008, 10:10

На ресиве не спроста 1 висит а потом в 0 проваливается - это как раз стартовый бит - сигнал того, что началася транзакция.
Кстати, а что это за клаиватура что через UART работает ? Клавы ж на PS/2 интерфейсе...

Автор: _Ie0nid Sep 23 2008, 01:21

короче штука такая. РС/2 - клавиатура имеет всего 4 провода, питание, земля, строб, и данные. Я конечно мог сделать через вход прерывания ИНТ0, посаженную на строб клавиатуры, и коротенькую функцию которая во время прерывания считывает один из входов атмела.
НО у меня тогда приемник вообще мертвый получается. Ведь вроде все также, один стартовый, один стоповый, бит четности, 8 бит данных, все проверил, скорость устанавливать не стал, строб на ХСК, данные к УСАРТУ на прием. Но почему-то не принимает, кто подскажет, в чем дело?

Вот коротенький листинг программы.

INTERRUPT(SIG_UART0_RECV)
{
PORTA = UDR;
_delay_loop_2(10000000000);
}


int main (void) //начало программы
{
DDRA = 0xFF; // A выход

UCSRB = 0x90; // регистр состояния UARt. RXEN=1б D.1-вых, d.0-вход, в соотвествующие состояние, передача 8 бит данных
UCSRC = 0x46;//синхронный режим, спадающий фронт сигнала. формат посылок восьмибитный, что соответствуют клавиатуре.
UCSRA = 0x00;//режим работы USART
sei(); // разрешаем общие прерывания

while (1);

}

Автор: Kuzmi4 Sep 23 2008, 08:42

Да.. извращение есчё то....
По теме:
во первых

Код
_delay_loop_2(10000000000);

в прерывании не есть гут.

Во вторых - вы думаете там от хорошей жизни линия клока существует ?

И вообсче - попробуйте осцилом посмотреть на сигналы..
А после измерте на какой частоте идёт передача.. UART то настраивается на определённый Baudrate - а не на фронт.. Ниспадающим фронтом только ловится сатртовый бит..

Автор: _Ie0nid Sep 24 2008, 01:26

ДОбрый день, я смотрел осцилогрофом, и вроде все так и должнно быть. Попробую рисунок вставить.
рисунок загрузить не получилось. 07.gif
Но я смотрел осцилом. Там, предположим, идет 11 импульсов строба, и штук 5 данных разной длительности. Я нажимал разные клавиши, при этом скан код данных, относительно фронта строба, действительно меняется. Так что, вроде все в порядке. картинка, один в один по книжке АТМЕЛОВ.
Но вот, что по стробу он считывает лишь стартовый бит, это новость. Насколько она достоверна? ГДе можно почитать, прошу, подскажите.
И еще, если он читает лишь стартовый бит по стробу, как же все остальные, они синхрятся от внутреннегго ЗГ, или как?
Заранее благодарю.

Автор: Kuzmi4 Sep 24 2008, 08:47

2 _Ie0nid - делаете *.GIF и грузите сколько душе угодно wink.gif
Касательно

Цитата
по стробу он считывает лишь стартовый бит

Я такого не говорил -> я говорил что ниспадающий фронт на RX в UART`е и нужен для детектирования так сказать начала транзакции.

Касательно того как устроен UART - попытайтесь его на каком нить HDL`е реализовать - реальная реализация не сильно будет отличаться wink.gif ..
Цитата
..вроде все в порядке. картинка, один в один по книжке АТМЕЛОВ.

Так а в чём вопрос то ??

Автор: _Ie0nid Sep 25 2008, 01:57

Ладно, попробую реализовать приемник на другом примере.
Но теперь у меня другой вопрос? lol.gif
РЕшил запаять кварц в 16 мегу на 11 мегагериков, выставил все биты конфигурации, опять же, как по книжке. 1011 СКSEL (еще пробовал 1111), и SUT 11. МК дурит по страшному, работает не так как надо, но всегда одинаково, причем если биты менять, его дурь также меняется. У меня такое уже было, и мне пришлось ставить кварц на 400 кГц. Заранее благодарю.
На всякий случай, записываю я МК с генератором на 1 МГц.

Автор: _Ie0nid Sep 25 2008, 03:19

Хотя все, разобрался, проблема в PONY PROG, оказалась.

Автор: garbuz Oct 14 2008, 04:47

прошивайте проги из CVAVR (он 2 Мб всего) и в нем же их разрабатывайте - проблем будет МАЛО совсем.

Автор: jeka7 Nov 13 2008, 13:22

Написал программу для настройки портов AVR.  PORT_AVR.rar ( 44.01 килобайт ) : 219

Автор: shuks Nov 15 2008, 06:56

Все преподаватели с которыми я общался мне не советовали писать в CodeVisionAVR с его всевозможными "мастерами", т.к. за тебя всю настройку и инициализацию периферии делает программа, а если будет какая-либо ошибка в настройках, то её трудно будет обнаружить, потому как ты сам по сути нифига не знаешь (за тебя всю настройку производил мастер CVAVR).
p.s. - сам пишу на ассемблере в AVRStudio и пока проблем не испытывал, главное внимательно даташит читать.

Автор: jeka7 Dec 10 2008, 09:30

Программа для расчета времени таймеров на AVR. Для asm.  ________________________AVR.rar ( 56.63 килобайт ) : 184

Автор: drozd Jan 7 2009, 04:56

Цитата(shuks @ Nov 15 2008, 09:56) *
Все преподаватели с которыми я общался мне не советовали писать в CodeVisionAVR с его всевозможными "мастерами", т.к. за тебя всю настройку и инициализацию периферии делает программа, а если будет какая-либо ошибка в настройках, то её трудно будет обнаружить, потому как ты сам по сути нифига не знаешь (за тебя всю настройку производил мастер CVAVR).
p.s. - сам пишу на ассемблере в AVRStudio и пока проблем не испытывал, главное внимательно даташит читать.

CodeVision - хорошая тема. Богатый инструментарий. Может, я подотстал, но когда-то в нем обнаружилась неприятность. Компилятор при входе в прерывание не сохраняет статусный регистр. Если делать это самому программно, то CodeVision - хорошая тема. Без шуток.

Автор: VladimirYU Jan 7 2009, 06:52

Цитата(drozd @ Jan 7 2009, 07:56) *
CodeVision - хорошая тема. Богатый инструментарий. Может, я подотстал, но когда-то в нем обнаружилась неприятность. Компилятор при входе в прерывание не сохраняет статусный регистр. Если делать это самому программно, то CodeVision - хорошая тема. Без шуток.

Инструментарий, может быть и богатый, но...
1. язык "похожий на С"
2. не ++
3. не предсказуем в дальнейшем (см п.1)

На этапе ознакомления, м. б. и имеет смысл с CV поработать, но не подсесть на него, ИМХО.

Автор: jeka7 Feb 21 2009, 15:16

Программа для настройки АЦП AVR для Atiny15 Atmega8,16,32,64 для asm.  ACD.rar ( 58.71 килобайт ) : 187

Автор: Иван_Я Apr 25 2009, 14:21

Если рассматривать вопрос какой МК универсальнее, то я думаю, что все таки ПИКи!!! Хотя они и проигрывают в скорости ( команда за два такта генератора), зато периферия по богаче будет и, что не маловажно, практически все доступны в корпусах DIP. Например ПИК24 имеет до нескольких компараторов: два, три, а то и четыре. Аналогичная ситуация с таймерами. А что у АТМЕЛ? У Атмел в основном по 1 компаратору во всех семействах исключение составляет МЕГА ( и то не все) где и то их 2 не более.

Ближайшим аналогом к ПИК24 видится ХМЕГА, но ХМЕГА не выпускается в корпусах DIP в отличии от ПИК24....вроде большинство применяют АТМЕЛ, но мне лично кажется,что даже если и ПИК24 не такой быстродействующий, зато аппаратные функции имеются - тот же аппаратный делитель! Если на АВР это делать программно, то в принципе их возможности уравняются.....

Конечно все определяется задачей...

И потом, АТМЕЛ не производит чипов подобных dsPIC!!! Это тоже имеет значение, если приложение разрабатываемое имеет хоть какие-то мало мальские вычисления. Например тот же контроль переполнения, в АВР это надо делать программно!

Автор: SasaVitebsk Apr 29 2009, 21:30

Цитата(Иван_Я @ Apr 25 2009, 17:21) *
Если рассматривать вопрос какой МК универсальнее, то я думаю, что все таки ПИКи!!! Хотя они и проигрывают в скорости ( команда за два такта генератора), зато периферия по богаче будет и, что не маловажно, практически все доступны в корпусах DIP.

Практически, с точностью "до наоборот".
1. Atmel в своём семействе AVR пошли по пути универсальности. То есть малая номенклатура кристаллов с богатой переферией. Microchip - богатая номенклатура кристаллов с разной переферией.
2. Не следил за последними кристаллами PIC, но у первых 16 было 4 такта на команду. По-моему сейчас применяется умножитель тактовой, что обеспечивает производительность по тактам сопоставимую с ядром AVR. Грубо говоря это кристаллы одного уровня. И находятся в одной нише.
3. Некоторый проигрыш в скорости на определённых задачах (как правило математике) возникает из-за значительно более слабой системы комманд. При этом есть задачи, на которых проявляется выигрыш Пиков.
4. Вообще говорить об универсальности МК практически бессмысленно. Они все достаточно универсальны. Сопоставимое изделие можно реализовать как та том, так и на этом. В то же время они неуниверсальны по своему назначению. Это не центральный процессор. Каждый обладает своей переферией и корпусом.
5. Корпус DIP скоро уйдёт в прошлое как таковой. Даже для радиолюбительства. Даже в поделках в единичном изделии лазерно-утюжным методом легко ложатся микрухи типа ATMEGA8. Хотя есть и дипы, но я применяю PLCC. Кроме того, совершенно непонятно чего вам не хватает у AVR по корпусам? В дипе есть кристаллы DIP8 (ATTiny25), DIP14 (ATTiny24), DIP20 (ATTiny2313), DIP28 (ATMega8), DIP40 (ATMega16). Я по одному кристаллу приводил для примера, на самом деле их море. Так какого дип кристалла вам не хватает???

Цитата
Например ПИК24 имеет до нескольких компараторов: два, три, а то и четыре. Аналогичная ситуация с таймерами. А что у АТМЕЛ? У Атмел в основном по 1 компаратору во всех семействах исключение составляет МЕГА ( и то не все) где и то их 2 не более.

За всю мою практику я единожды применил компаратор. Было это правда на семействе x51 ещё до AVR. smile.gif
С моей точки зрения абсолютно бесполезная переферия. Во-первых всё равно в пределах AVCC работает, что ограничивает а во вторых 2 ноги занимает. На AVR можете юзать ADC от 8 входов и порог регулировать цифровым способом и предварительную обработку делать.

Цитата
Ближайшим аналогом к ПИК24 видится ХМЕГА, но ХМЕГА не выпускается в корпусах DIP в отличии от ПИК24....вроде большинство применяют АТМЕЛ, но мне лично кажется,что даже если и ПИК24 не такой быстродействующий, зато аппаратные функции имеются - тот же аппаратный делитель! Если на АВР это делать программно, то в принципе их возможности уравняются.....

Конечно все определяется задачей...

Ну к примеру у ATMega640 при очень удобном корпусе TQFP100 = 86 свободных портов, 16 каналов АЦП, 4 16-битных таймера, 2 8-ми битных, 16 каналов PWM, 2 SPI, I2C, 4 USART.
Мега8 - малый корпус (PDIP28, tqfp32) 23 порта, 6/8 АЦП, 1 16таймер, 2 8таймер, 3PWM, 1SPI, 1UART. Цена меньше 1$
xMega16a4(слабенький) 34 порта, 5 16таймер, 16PWM, 2SPI, 2I2C, 5UART, 12 12-ти битных АЦП, 2 12-ти битных ЦАП, 4DMA + куча разной хрени типа частота тактирования таймеров превышает тактовую что даёт высокоскоростной PWM и прочее.

Назовите сопоставимые кристаллы у микрочип.

Цитата
И потом, АТМЕЛ не производит чипов подобных dsPIC!!! Это тоже имеет значение, если приложение разрабатываемое имеет хоть какие-то мало мальские вычисления. Например тот же контроль переполнения, в АВР это надо делать программно!

Atmel производит и производила кучу кристалов, подобных которым microchip никогда не производила. Например кристаллы семейств ARM7, ARM9, ARM920T. Плюс кучу спец микрух типа радиоканала и т.п., но какое это имеет отношение к обсуждаемым вопросам? dsPIC с пиками роднит только имя. Кристалл хороший. Но совершенно из другой оперы. В этой нише у него целая куча конкурентов среди других фирм кроме Atmel.

А подытоживая - применяйте то, что вам удобно и то что вам нравится. И не надо это обосновывать, а то впросак попадёте. smile.gif

Автор: _Pasha Apr 29 2009, 22:59

Цитата(Иван_Я @ Apr 25 2009, 17:21) *
Конечно все определяется задачей...

Маркетинговые изЫски шутят над нами злую шутку, потому что все продумано так, что на 100% ни один камень на задачу не идет. Везде будут компромиссы, иногда весьма некрасивые. Либо избыточное решение (лично мне тоже не нравится, хоть это и несовременная точка зрения). Это я к тому, что сравнивать PIC vs AVR итд уж поднадоело до зеленого п.ца.

Автор: SasaVitebsk Apr 30 2009, 07:17

bb-offtopic.gif

Цитата(_Pasha @ Apr 30 2009, 01:59) *
Маркетинговые изЫски шутят над нами злую шутку, потому что все продумано так, что на 100% ни один камень на задачу не идет.

biggrin.gif
Кстати я бы отнёс эту формулировку не только к кристаллам, а .... ко всему спектру товаров продаваемому на прилавках. Раньше был один хлеб - "хлеб обычный". smile.gif Теперь 15 модификаций, в каждом 15 наполнителей, ни одного с нормальным вкусом. smile.gif "Хлеб с зелёным чаем".... это зачем?

Автор: swagger Jun 25 2009, 13:35

Добрый день!
Начал осваивать С и начал с CCS. проработал книгу шпака , вроде получается. Теперь стоит задача сделать модбас устройство. Надо опрашивать по мобдас слейв по 485 и принимать ответ с него. Подскажите выложены ли живые примеры похожие. Кристалл PIC16F876A уарт апарартный. Или может есть примеры приема передачи нескольких байт для начала.

В примерах нашел драйвера для 485 и модбаса. Вопрос: компилятор вырезает ли неиспользуемые фукнкции из откомплированнго файла?

Автор: x736C Aug 14 2009, 02:35

Цитата(jeka7 @ Dec 10 2008, 13:30) *
Программа для расчета времени таймеров на AVR. Для asm.

Похвально, конечно, да не особо нужно. Компиляторы с этим прекрасно справляются.
Код
.equ    Time  = 100;ms
.equ    FClk  = 10000000;Hz
.equ    Pre   = 1024
.equ    Timer = 0xFFFF - (Time * (FClk / Pre) / 1000)
    outiw TCNT1,Timer

Автор: jeka7 Aug 19 2009, 06:20

 AVR_asm_Pad.rar ( 53.98 килобайт ) : 213
Текстовый блокнот для написания программ для AVR на ассемблере с подсветкой синтаксиса и завершение автодополнения.

Автор: injener Nov 10 2009, 11:50

Доброго всем! Прошу помощи. Поставлена задача написания программы для СИФУ управляемого выпрямителя (3 фазы, мостовая схема, стабилизация тока, синхронизация). Выбор элементной базы не критичен. Опыт программирования только АВР, но совсем на начальном уровне. Где можно прочесть по поводу построения СИФУ? Может кто-то поделится алгоритмом? Заранее спасибо

Автор: Caruso Dec 16 2009, 14:45

Всем привет. Начал осваивать МК ATmega16.
Написал первую программу в AVR studio.
После подачи питания на МК запускается счетчик Т1 После того случается совпадение В, генерируется прерывание. Оно запускает АЦП. Когда АЦП закончило преобразование, оно тоже генерирует прерывание. Далее сохраняем результат и пытаемся его выдать по SPI. После того как последний байт передан все повторяется сначала. Но где - то что - то не работает. Вот сам код программы


CODE
.INCLUDE "m16def.inc"

;*********Определяем макрос*********
.MACRO OUTI
LDI R25,@1
OUT @0,R25
.ENDMACRO

;*********Определяем константы*********
.equ SettingsADC_1 = 0x8A
.equ SettingsADC_2 = 0x60
.equ SettingsADC_3 = 0xB0
.equ SetPortCOut = 0xFF
.equ SetFirstStatePortC = 0xFF
.equ SetPortBOut = 0xFF
.equ SetFirstStatePortB = 0x00
.equ SettingsTimT1_1 = 0x00
.equ SettingsTimT1_2 = 0x0D
.equ SettingsTimT1_3 = 0x0C
.equ SettingsSPI_1 = 0x10
.equ SettingsSPI_2 = 0x00

.equ SetTimeWaitT1_H = 0xFF; Сравнение в Т1 по этому значению
.equ SetTimeWaitT1_L = 0xFF; Сравнение в Т1 по этому значению

;*********Назначим новые имена для регистров*********
.def acc_1 = r16;Назначаем аккумулятор 1
.def acc_2 = r17;Назначаем аккумулятор 2

;*********Начальный адрес*********
.CSEG
.org $0000;Начальный адрес
jmp RESET;Перепрыгиваем таблицу векторов

;*********Описание векторов прерываний*********
.ORG INT0addr ; External Interrupt Request 0
RETI
.ORG INT1addr ; External Interrupt Request 1
RETI
.ORG OC2addr ; Timer/Counter2 Compare Match
RETI
.ORG OVF2addr ; Timer/Counter2 Overflow
RETI
.ORG ICP1addr ; Timer/Counter1 Capture Event
RETI
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RETI
.ORG OC1Baddr ; Timer/Counter1 Compare Match B
rjmp START_ADC
.ORG OVF1addr ; Timer/Counter1 Overflow
RETI
.ORG OVF0addr ; Timer/Counter0 Overflow
RETI
.ORG SPIaddr ; Serial Transfer Complete
RETI
.ORG URXCaddr ; USART, Rx Complete
RETI
.ORG UDREaddr ; USART Data Register Empty
RETI
.ORG UTXCaddr ; USART, Tx Complete
RETI
.ORG ADCCaddr ; ADC Conversion Complete
rjmp OUTDATA
.ORG ERDYaddr ; EEPROM Ready
RETI
.ORG ACIaddr ; Analog Comparator
RETI
.ORG TWIaddr ; 2-wire Serial Interface
RETI
.ORG INT2addr ; External Interrupt Request 2
RETI
.ORG OC0addr ; Timer/Counter0 Compare Match
RETI
.ORG SPMRaddr ; Store Program Memory Ready
RETI


;*********Начало основной программы*********
.ORG INT_VECTORS_SIZE; отсюда пошла сама программа
RESET:
OUTI SPL,low(RAMEND) ; Это мы загружаем в двубайтный регистр указателя
OUTI SPH,High(RAMEND); стека SPH:SPL адрес конца оперативной памяти

;*********Инициализация АЦП*********
OUTI ADCSRA,SettingsADC_1
OUTI ADMUX,SettingsADC_2
OUTI SFIOR,SettingsADC_3

;*********Инициализация портов*********
OUTI DDRC,SetPortCOut ;Конфигурируем порт C как выход
OUTI PORTC,SetFirstStatePortC;Начальное состояние порта 0
OUTI DDRB,SetPortBOut ;Конфигурируем порт B
OUTI PORTB,SetFirstStatePortB;Начальное состояние порта 0



;*********Инициализация таймера/счетчика Т1*********
OUTI TCCR1A,SettingsTimT1_1
OUTI TCCR1B,SettingsTimT1_2
OUTI TIMSK,SettingsTimT1_3

OUTI OCR1AH,SetTimeWaitT1_H; С этим надо разобраться, без этих строк счетчик несчитает
OUTI OCR1AL,SetTimeWaitT1_L

OUTI OCR1BH,SetTimeWaitT1_H
OUTI OCR1BL,SetTimeWaitT1_L

;*********Инициализация SPI*********
;OUTI SPCR,SettingsSPI_1;



MAIN:
sei ; Общее разрешение прерываний
nop
rjmp MAIN

START_ADC:
sei ; Общее разрешение прерываний
sbi ADCSRA,ADSC
WAIT:
nop
rjmp WAIT

OUTDATA:
in acc_1,ADCH
in acc_2,ADCL
sbi SPCR,SPE
sbi SPCR,MSTR
out SPDR, acc_1
WAIT_TR_DATA_1:
SBIS SPSR,SPIF
rjmp WAIT_TR_DATA_1
out SPDR, acc_2
WAIT_TR_DATA_2:
SBIS SPSR,SPIF
rjmp WAIT_TR_DATA_2
rjmp MAIN

Если не трудно покритикуйте

Автор: Палыч Dec 16 2009, 16:25

Цитата(Caruso @ Dec 16 2009, 17:45) *
Но где - то что - то не работает. Вот сам код программы

Может быть - оно и будет работать... Но, недолго! Так, как это делаете Вы, работать с прерываниями - нельзя. Обработчик прерывания должен заканчиваться командой reti, иначе стек быстро переполниться: по каждому прерыванию в него заносится адрес возврата из прерывания!
Цитата
OUTI OCR1AH,SetTimeWaitT1_H; С этим надо разобраться, без этих строк счетчик несчитает
OUTI OCR1AL,SetTimeWaitT1_L

Выбран режим счетчика 4. В этом режиме счетчик считает до значения OCR1A, сбрасывается в ноль и взводится флаг переполнения. Поэтому занести в регистр OCR1A что-то обязательно нужно. Воспользоваться лучше прерыванием по переполнению, а не по сравнению.
Ещё совет. Посмотрите как в примерах записывают в регистры значения при инициализации устройств МК и придерживайтесь такого же стиля: вместо Вашего
Код
OUTI TCCR1B,SettingsTimT1_2

гораздо удобнее запись
Код
OUTI TCCR1B, (1<<WGM12)|(1<<CS12)|(1<<CS10)

во всяком случае - удобнее для тех, кто захочет Вам помочь и посмотреть Вашу программу: не надо прыгать по программе вверх-вниз и заглядывать в документацию на МК.

Автор: Caruso Dec 22 2009, 07:19

Палыч, спасибо за ответ!!! Сам пишу программу первый раз, много не знаю. Вот второй вариант той же программы. Вроде как работает. Но мне не понятно, как формировать сигнал SS (SPI), или сигнал SS должен сам формироваться т. е. аппаратно. И как в этом режиме (SPI) передать сразу несколько байт, т. е. передать за одну посылку, или аппаратно контроллер такого сделать не может?

CODE


.INCLUDE "m16def.inc"

;*********Определяем макрос*********
.MACRO OUTI
LDI R25,@1
OUT @0,R25
.ENDMACRO

.MACRO SETBIT
IN R25,@0
SBR R25,(1<<@1)
OUT @0,R25
.ENDMACRO


;*********Определяем константы*********
.equ TimeWait_H = 0x00
.equ TimeWait_L = 0x00
.equ SettingsSPI_1 = 0x10
.equ SettingsSPI_2 = 0x00

;*********Назначим новые имена для регистров*********
.def acc_1 = r16 ;Назначаем аккумулятор 1
.def acc_2 = r17 ;Назначаем аккумулятор 2

;*********Начальный адрес*********
.CSEG
.org $0000 ;Начальный адрес
JMP RESET ;Перепрыгиваем таблицу векторов

;*********Описание векторов прерываний*********
.ORG INT0addr ; External Interrupt Request 0
RETI
.ORG INT1addr ; External Interrupt Request 1
RETI
.ORG OC2addr ; Timer/Counter2 Compare Match
RETI
.ORG OVF2addr ; Timer/Counter2 Overflow
RETI
.ORG ICP1addr ; Timer/Counter1 Capture Event
RETI
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RETI
.ORG OC1Baddr ; Timer/Counter1 Compare Match B
RETI
.ORG OVF1addr ; Timer/Counter1 Overflow
RJMP STARTADC
.ORG OVF0addr ; Timer/Counter0 Overflow
RETI
.ORG SPIaddr ; Serial Transfer Complete
RJMP TRANSMISSIONSPI2BYTE
.ORG URXCaddr ; USART, Rx Complete
RETI
.ORG UDREaddr ; USART Data Register Empty
RETI
.ORG UTXCaddr ; USART, Tx Complete
RETI
.ORG ADCCaddr ; ADC Conversion Complete
RJMP TRANSMISSIONSPI1BYTE
.ORG ERDYaddr ; EEPROM Ready
RETI
.ORG ACIaddr ; Analog Comparator
RETI
.ORG TWIaddr ; 2-wire Serial Interface
RETI
.ORG INT2addr ; External Interrupt Request 2
RETI
.ORG OC0addr ; Timer/Counter0 Compare Match
RETI
.ORG SPMRaddr ; Store Program Memory Ready
RETI


;*********Начало основной программы*********
.ORG INT_VECTORS_SIZE ; отсюда пошла сама программа
RESET:
OUTI SPL,low(RAMEND) ; Это мы загружаем в двубайтный регистр указателя
OUTI SPH,High(RAMEND) ; стека SPH:SPL адрес конца оперативной памяти

;*********Инициализация АЦП*********

OUTI ADCSRA, (1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ;АЦП разрешен, прерывание от него тоже,
;коэффициент делитедя 128
OUTI ADMUX, (1<<REFS0)|(1<<ADLAR) ;AVcc - источник опорного напряжения,
;результат преобразования выравниваем влево
OUTI SFIOR, (1<<ADHSM) ;Увеличиваем скорость АЦП

;*********Инициализация портов*********

OUTI PORTC, (1<<PORTC0)|(1<<PORTC1)|(1<<PORTC2)|(1<<PORTC3)|(1<<PORTC4)|(1<<PORTC5)|(1<<PORTC6)|(1<<PORTC7) ;Начальное состояние порта C 1
OUTI DDRC, (1<<DDC0)|(1<<DDC1)|(1<<DDC2)|(1<<DDC3)|(1<<DDC4)|(1<<DDC5)|(1<<DDC6)|(1<<DDC7) ;Конфигурируем порт C как выход
OUTI PORTB, (1<<PORTB0)|(1<<PORTB1)|(1<<PORTB2)|(1<<PORTB3)|(1<<PORTB4)|(1<<PORTB5)|(1<<PORTB6)|(1<<PORTB7) ;Начальное состояние порта B 1
OUTI DDRB, (1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3)|(1<<DDB4)|(1<<DDB5)|(1<<DDB6)|(1<<DDB7) ;Конфигурируем порт B как выход

;*********Инициализация таймера/счетчика Т1*********
OUTI TCCR1B, (1<<CS11) ;Режим работы 0 (Normal), частоту делим на 8

OUTI TIMSK, (1<<TOIE1) ;Разрешение прерывания таймера Т1 по переполнению

OUTI TCNT1H, TimeWait_H ;задаем начальное значение счетчика (старший байт)
OUTI TCNT1L, TimeWait_L ;задаем начальное значение счетчика (младший байт)

;*********Инициализация SPI*********
OUTI SPCR, (1<<SPIE)|(1<<MSTR)|(1<<SPI2X)|(1<<SPR1)|(1<<SPR0) ;Разрешаем прерывание SPI, выбран режим мастера, скорость передачи делим на 64


;*********Сама программа*********

SEI
MAIN:
NOP
RJMP MAIN

STARTADC:
SETBIT ADCSRA,ADSC ;Старт АЦП
OUTI TCNT1H, TimeWait_H ;повторно задаем начальное значение счетчика (старший байт) для синхронизации
OUTI TCNT1L, TimeWait_L ;повторно задаем начальное значение счетчика (младший байт)
SEI ;разрешаем прерывания
RETI

TRANSMISSIONSPI1BYTE:
IN acc_1,ADCH ;Сохраняем значение АЦП (старший байт)
IN acc_2,ADCL ;Сохраняем значение АЦП (младший байт)
SETBIT SPCR,SPE ;Включение SPI
OUT SPDR,acc_1 ;Заносим в регистр данных старший байт АЦП
OUTI TCNT1H, TimeWait_H ;повторно задаем начальное значение счетчика (старший байт) для синхронизации
OUTI TCNT1L, TimeWait_L ;повторно задаем начальное значение счетчика (младший байт)
SEI
RETI

TRANSMISSIONSPI2BYTE:
SETBIT SPCR,SPE ;Включение SPI
OUT SPDR,acc_2 ;Заносим в регистр данных младщий байт АЦП
OUTI TCNT1H, TimeWait_H ;повторно задаем начальное значение счетчика (старший байт) для синхронизации
OUTI TCNT1L, TimeWait_L ;повторно задаем начальное значение счетчика (младший байт)
SEI
RETI


Автор: demiurg_spb Dec 22 2009, 18:17

1. sei перед reti - не нужно
2. в обработчиках прерываний принято сохранять в стеке регистры, используемые в этом обработчике.
ведь ваша фоновая программ не будет пустой как сейчас, а ваши макросы используют r25, поэтому как минимум надо было писать так

Код
ISR_XXX:
    push r25
    ....
    pop r25
    reti

Цитата(Caruso @ Dec 22 2009, 10:19) *
Вроде как работает. Но мне не понятно, как формировать сигнал SS (SPI), или сигнал SS должен сам формироваться т. е. аппаратно. И как в этом режиме (SPI) передать сразу несколько байт, т. е. передать за одну посылку, или аппаратно контроллер такого сделать не может?
SS формирует мастер. Настройте эту ножку на ввод от греха подальше (я не шучу).
Аппаратный интерфейс SPI у AVR может работать только с байтами.
Поэтому для передачи других данных, больших чем байт, программист должен немного подумать над тем, как их передать побайтно.

Автор: Палыч Dec 23 2009, 08:27

Цитата(Caruso @ Dec 22 2009, 10:19) *
Но мне не понятно, как формировать сигнал SS (SPI), или сигнал SS должен сам формироваться т. е. аппаратно.
Сигнал SS в МК используется при работе SPI в режиме Slave. Поскольку у Вас SPI - в режиме Master, то эту ножку Вы можете использовать по своему усмотрению как Вам нужно/удобно. Если, соединённое с МК по SPI устройство требует определённого состояния сигнала на своей ноге SS, то необходимо подключить её к свободной ноге МК (не обязательно к SS МК), настроить её (ногу МК) на вывод и программно формировать на ней необходимый сигнал.
Цитата(Caruso @ Dec 22 2009, 10:19) *
И как в этом режиме (SPI) передать сразу несколько байт, т. е. передать за одну посылку, или аппаратно контроллер такого сделать не может?
В SPI: одна посылка - один байт. Для передачи нескольких байт, обычно, организуют буфер, в который складывают байты готовые для передачи, и, по мере их передачи - последовательно выбирают их из буфера. Можно считать, что у Вас такой буфер из двух байт уже есть: acc_1 и acc_2. Необходимо завести некие указатели/флаги, по состоянию которых можно было бы судить в прерывании от SPI о том, что уже сделано и что нужно сделать (например, флаги: "передавался первый байт из двух", "вывод байтов закончен" или что-то подобное; или реализавать очередь типа FIFO с указателями на начало и конец очереди).

Цитата(demiurg_spb @ Dec 22 2009, 21:17) *
2. в обработчиках прерываний принято сохранять в стеке регистры, используемые в этом обработчике.
Добавлю, что помимо General Purpose Working Registers принято также сохранять регистр SREG...

Автор: demiurg_spb Dec 23 2009, 09:57

Цитата(Палыч @ Dec 23 2009, 11:27) *
Добавлю, что помимо General Purpose Working Registers принято также сохранять регистр SREG...
Ой, как же я забыл об этом упомянуть. Нет мне прощенияsmile.gif

Автор: Prevan Jun 13 2010, 05:54

Зравствуйте! Подскажите как присвоить значение отдельным битам порта содержимое какой-нибудь переменной?
например:

out PORTD,temp ;будет просто установлено значение переменной temp в порт D

а мне надо в порт С на 3ю ножку установить значение такое же как на 6м бите перменной temp и таким же образом раскидать другие переменные.

И наоборот. Как можно сделать обратную операцию, т.е. из разных битов портов составить содержимое переменной temp?
например:

in temp,PINC ;будет просто скопировано значение состояния порта С переменную temp

Дело в том, что мне необходимо "мягко" изменить код программы, не прибегаю к полному переписанию кода программы. Переменные, указанные в программе работают со старым подключением проводов к ножкам МК.
т.е. мне надо будет изменить следующий код:

out PORTD,scancod
clc
ldi rots,4
in temp,PINC

где:
PD0 <->PD4
PD1 <->PD5
PD4 <->PC0
PD5 <->PC1
PD6 <->PC2
PD7 <->PC3


Автор: PDA Jul 27 2010, 12:32

Есть плата, похожая на программатор - на плате есть FT232BM и установлен Attiny2313. При установке драйверов FT232BM появляется USB Serial Converter и виртуальный COM-порт.

Микросхема FT232BM по линиям от контактов #25 TXD и #24 RXD связана с Attiny2313 к контактам #2 PD0(RXD) и #3 PD1(TDX), через которые и собственно организован обмен данными. Вопрос: можно ли прошить МК через FT232BM, используя эти линии (похоже на UART?) - то есть ли возможность перепрошивать МК без подключения программатора (к SPI выводам МК), а только программными средствами по имеющимся линиям UART?

Автор: Дмитрий К. Jul 27 2010, 12:48

Цитата(PDA @ Jul 27 2010, 16:32) *
Вопрос: можно ли прошить МК через FT232BM, используя эти линии (похоже на UART?) - то есть ли возможность перепрошивать МК без подключения программатора (к SPI выводам МК), а только программными средствами по имеющимся линиям UART?

в обычном режиме невозможно перепрошивать МК через TXD/RXD,
теоретически для этого необходимо написать для Attiny2313 загрузчик flash через UART,
т.е. Вы посылаете через FT232BM байты , МК их получает и сам себя перепрошивает

Автор: PDA Jul 27 2010, 12:53

Я правильно понимаю, что обещание, что устройство будет программироваться только через USB, не выполнимо, то есть при производстве устройства всё равно придется хоть раз программировать МК по SPI каналу, а потом скреплять корпус?

update:

Цитата(Дмитрий К. @ Jul 27 2010, 16:48) *
в обычном режиме невозможно перепрошивать МК через TXD/RXD,
теоретически для этого необходимо написать для Attiny2313 загрузчик flash через UART,
т.е. Вы посылаете через FT232BM байты , МК их получает и сам себя перепрошивает
разве у Attiny2313 есть возможность создания лодера? всего 2К памяти, насколько я понял описание

Автор: Дмитрий К. Jul 27 2010, 13:35

Цитата(PDA @ Jul 27 2010, 16:53) *
Я правильно понимаю, что обещание, что устройство будет программироваться только через USB, не выполнимо, то есть при производстве устройства всё равно придется хоть раз программировать МК по SPI каналу, а потом скреплять корпус?

первый раз конечно по SPI
Цитата(PDA @ Jul 27 2010, 16:53) *
update:разве у Attiny2313 есть возможность создания лодера? всего 2К памяти, насколько я понял описание

"The device provides a Self-Programming mechanism for downloading and uploading program code by the MCU itself."
2k мало, но вроде возможно

Автор: PDA Jul 27 2010, 14:37

Цитата
первый раз конечно по SPI
Тогда подскажите, возможно ли такая ситуация, что микросхема уже имеет какой-либо загрузчик? В моем случае, например, что микросхема уже имеет в себе загрузчик по UART?

Автор: Savrik Jul 27 2010, 14:52

Attiny2313 флеша маловато.. Есть ли на плате какие-либо кнопки? Если есть, можно попробовать зажать ее, перезапустить МК, и смотреть в терминал(или записать туда что-то), возможно, увидите бутлоадер.
Как вариант можно создать свой. Я использую(правда, для Mega AVR)AVR911, загружаю через Avr-Osp II. Очень удобно, код для меги16 занимает около 1кб.

Автор: MMMika Feb 2 2011, 09:55

Господа специалисты.
Помогите новичку!
Имеется блок с PIC18F6520, который после сбоя по питанию
ЧАСТИЧНО перестал нормально функционировать.
На блоке есть разъем (DB9), далее MAX232, дальше USART2 выводы контроллера (6;8;5;4).
Мои попытки связаться с контроллером из различных программ (MPLAB, PCWHD Compiler)
с ноутбука безрезультатны. (пишет нет связи, или проверьте кабель)
Кабель и MAX232 исправны.
В блоке есть возможность установки нескольких перемычек, возможно какие-то
использовались для организации связи через USART2.
Помогите установить связь с ноутбука с PIC18F6520.
С уважением Mika


Автор: Marto Mar 14 2011, 13:16

1 - не тот раздел.
2 - а через какой интерфейс связываетесь?
3 - что за блок такой секретный?

Автор: Claw Mar 22 2011, 11:39

А для чего нужны подтягивающие резисторы на портах в PIC?

Автор: Tanya Mar 22 2011, 12:32

Цитата(Claw @ Mar 22 2011, 14:39) *
А для чего нужны подтягивающие резисторы на портах в PIC?

Внутренние - для того, чтобы не ставить внешние.

Автор: Claw Mar 22 2011, 12:40

Как я понимаю они нужны для работы портов в режиме output?

Автор: Tanya Mar 22 2011, 12:58

Цитата(Claw @ Mar 22 2011, 15:40) *
Как я понимаю они нужны для работы портов в режиме output?

Нет. Совсем наоборот. Уменьшают помехочувствительность входов.

Автор: Claw Mar 22 2011, 13:14

Ясно,спасибо,а в принципе их обязательно подключать или нет? у меня просто стоит задача позажигать светодиоды и я ещё не разобралась как мне собственно это сделать 05.gif

Автор: Tanya Mar 22 2011, 13:28

Цитата(Claw @ Mar 22 2011, 16:14) *
стоит задача позажигать светодиоды и я ещё не разобралась как мне собственно это сделать 05.gif

Красивая задача -
-----------------------------
Послушайте!
Ведь, если звезды зажигают -
значит - это кому-нибудь нужно?
Значит - кто-то хочет, чтобы они были?
Значит - кто-то называет эти плевочки
жемчужиной?
--------------------------
Жаль только, что подтяжки не будут тут нужны.

Автор: Claw Mar 22 2011, 13:47

Цитата
Послушайте!
Ведь, если звезды зажигают -
значит - это кому-нибудь нужно?
Значит - кто-то хочет, чтобы они были?
Значит - кто-то называет эти плевочки
жемчужиной?

Это всё для меня?Спасибо biggrin.gif

А вот если у нас есть 8 портов RB,можно использовать 4е из них как кнопки, а оставшиеся как светодиоды или тут надо использовать ещё проты RA? И вообще в чём отличие между RA и RB?

Автор: sargein Mar 22 2011, 13:56

Цитата(Claw @ Mar 22 2011, 15:47) *
Это всё для меня?Спасибо biggrin.gif

А вот если у нас есть 8 портов RB,можно использовать 4е из них как кнопки, а оставшиеся как светодиоды или тут надо использовать ещё проты RA? И вообще в чём отличие между RA и RB?


Можно только RB, на RA еще аналоговая периферия висит, чтобы использовать RA как кнопку нужно дополнительно выключить все аналоговые модули.

Автор: Tanya Mar 22 2011, 13:59

Цитата(Claw @ Mar 22 2011, 16:47) *
Это всё для меня?Спасибо biggrin.gif

А вот если у нас есть 8 портов RB,можно использовать 4е из них как кнопки, а оставшиеся как светодиоды или тут надо использовать ещё проты RA? И вообще в чём отличие между RA и RB?

Можно только PORTB. Только нужно даташит читать на конкретный контроллер. Там все должно быть написано.

Автор: Claw Mar 22 2011, 14:16

А нужно использовать регистры ANSEL,ANSELH?Насколько я поняла они используются для переключения цифровых I/O в аналоговые?

Автор: sargein Mar 22 2011, 14:51

Все зависит от конкретного мк, надо даташит читать.

Автор: Claw Mar 22 2011, 15:39

А зачем нужен предварительный делитель?

Автор: Tanya Mar 22 2011, 15:43

Цитата(Claw @ Mar 22 2011, 18:39) *
А зачем нужен предварительный делитель?


Для предварительного деления. Читайте лучше английский вариант даташита.

Автор: SKov Mar 22 2011, 16:25

Цитата(Claw @ Mar 22 2011, 18:39) *
А зачем нужен предварительный делитель?

Вам надо почитать какую-нибудь литературу на русском.
Суда по вашим вопросам, читать даташиты на английском пока рано.
Посмотрите, например, вот это.

 PIC_________________.rar ( 2.26 мегабайт ) : 95
 

Автор: Claw Mar 26 2011, 21:03

А если мы,к примеру, запрограммировали порт B на вход,там получается в битах стоят единицы, а когда мы нажимаем кнопку, подключенную к этому входу, что изменяется?в этот бит записывается 0?просто непонятно как проверить состояние входов при нажатой кнопке 05.gif

Автор: ViKo Mar 26 2011, 21:30

Цитата(Claw @ Mar 26 2011, 23:03) *
просто непонятно как проверить состояние входов при нажатой кнопке

Прочитать порт.
Можно читать периодически, по прерыванию от таймера, например. Сравнивать с прошлым, запомненным. Находить изменение, и так определять кнопку.
Можно настроить прерывание по изменению состояния порта, и по этому прерыванию прочитать новое состояние.

Автор: Claw Mar 29 2011, 14:09

А какой командой можно проверить весь байт на наличие к примеру 1?что-то наподобие команды BTFSS f,b?

Автор: Марк_Я Mar 30 2011, 10:51

XOR - исключающее ИЛИ
При совпадении разряда переменной и маски в этом разряде результата будет 0, а при несовпадении - 1

Автор: Claw Apr 19 2011, 12:30

можно сделать так, чтобы команда btfss f,b(проверяет бит b в регистре f и пропускает следующиую команду, если результат 1) пропускала при выполнении условия не одну команду, а несколько,заданное количество?

Автор: Сергей Борщ Apr 19 2011, 13:01

QUOTE (Claw @ Apr 19 2011, 15:30) *
можно сделать так, чтобы команда btfss f,b(проверяет бит b в регистре f и пропускает следующиую команду, если результат 1) пропускала при выполнении условия не одну команду, а несколько,заданное количество?
Нет, нельзя. Но можно использовать команду btfsc f,b которая будет пропускать следующую команду goto, которая, в свою очередь, "пропускает не одну команду, а несколько,заданное количество".

Автор: Claw Apr 19 2011, 20:10

MOVLW B'11111111'
MOVWF TRISC;
....
....
....

MOVLW B'11111111'
XORWF PORTC,0
BTFSC STATUS,Z
NOP
BSF PORTB,0


Последний кусочек кода делает:
1.пересылает константу в аккумулятор
2.сравнивает константу с состоянием битов в порте С,сохраняет результат в аккумуляторе и меняет(не меняет) состояние флага Z
3.если значение флага Z=0(нашлось различие в битах между сравниваемыми регистрами),то устанавливаем нулевой бит в порте B и далее по кругу,если нет,то задержка
Я правильно понимаю?Просто программа у меня по "моей логике" не работает,значит я понимаю может быть не совсем правильно или совсем неправильно...помогите blush.gif

Автор: нечитатель Apr 20 2011, 01:41

Цитата(Claw @ Apr 20 2011, 00:10) *
3.если значение флага Z=0(нашлось различие в битах между сравниваемыми регистрами),то устанавливаем нулевой бит в порте B
... а если Z=1, то ничего не делаем, а потом точно так же устанавливаем нулевой бит в порте B. Просто задержка, да.
Очень маленькая такая задержечка... чем наблюдается она, как выяснено "не работает?"
Цитата
и далее по кругу
прописать "по кругу" * надо в программе, а не на форуме.

* любая программа должна так или иначе бесконечно зацикливаться в любом случае.
(не спящий) процессор всегда выполняет какую-то инструкцию; "всё сделать и остановиться" нельзя.
это мало ли вдруг.

Автор: Claw Apr 26 2011, 13:56

а как реализуется задержка с помощью tmr0?может есть какие-нибудь примеры на асме?

Автор: tzirulnicov Jul 19 2011, 18:33

MCC18 бесплатная версия. Начинаю изучать Си под пики. Не понимаю как пользоваться строковыми функциями и ф-ями вида memst().

include "p18f14k50.h"
#include "string.h"
unsigned char RS232_Out_Data[15]="45a0";
void main(void)
{
memset(RS232_Out_Data, '\0', 15);
strcpy(RS232_Out_Data,"543");
RS232_Out_Data[0]='4';
RS232_Out_Data[1]='5';
RS232_Out_Data[0]='\0';
}

- почему memset вначале забивает все нулями, а потом снова возвращает все как было? Почему strcpy ничего не копирует в RS232_Out_Data ? Посимвольное копирование (4,5,\0) - работает нормально.

Автор: Qb1024 Jul 24 2011, 10:48

Хочу начать знакомится с контролерами, уже есть ATmega8A, всвязи с чем возникли вопросы:
1) Можно ли ипользовать программатор Громова для прошивки?
2) Где найти уроки со схемами и написанием кода для мигания светодиодами и более сложными задачами?

Автор: ILYAUL Jul 25 2011, 04:19

Цитата(Qb1024 @ Jul 24 2011, 14:48) *
Хочу начать знакомится с контролерами, уже есть ATmega8A, всвязи с чем возникли вопросы:
1) Можно ли ипользовать программатор Громова для прошивки?
2) Где найти уроки со схемами и написанием кода для мигания светодиодами и более сложными задачами?

В книгах например:

Вольфганг Трамперт "AVR-RISC микроконтроллеры"
Джон Мортан " Микроконтроллеры AVR"

Наберите в инете Самоучитель по AVR

Автор: paskal Sep 23 2011, 18:07

Цитата(Qb1024 @ Jul 24 2011, 14:48) *
1) Можно ли ипользовать программатор Громова для прошивки?

Есть знакомые, которые использовали программатор Громова для LPT и пожгли порт этим программатором. Соединять напрямую пины LPT и целевое устройство это слишком рискованно. Надо чтоб хоть буфер был как у байтбластера. Для нормальной работы можно пользоваться байтбластер + софт AVREAL.

Автор: mig-11101 Nov 12 2011, 07:52

Цитата(Qb1024 @ Jul 24 2011, 13:48) *
Хочу начать знакомится с контролерами, уже есть ATmega8A, всвязи с чем возникли вопросы:
1) Можно ли ипользовать программатор Громова для прошивки?
2) Где найти уроки со схемами и написанием кода для мигания светодиодами и более сложными задачами?


1. Можно, но имхо лучше попробуйте через COM порт. http://electronix.ru/redirect.php?http://easyelectronics.ru/avr-shag-pervyj-programmator.html Вот к примеру - элементарное решение через COM.
2. Для ассамблера есть внятные уроки здесь - http://electronix.ru/redirect.php?http://radiokot.ru/start/mcu_fpga/avr/. Там уроки не для atmega8a, но суть это не меняет, проблем не должно возникнуть.

Автор: Игорь Кочет Nov 21 2011, 08:57

Подскажите, как в TMR1 перенести число из int переменной ?

из С в дизасемблере выглядит так :

TMR1H:TMR1L=T_next;

Код
  00E7    0879     MOVF 0x79, W
  00E8    008E     MOVWF 0xe


т.е переносится 1 байт.

UPD. так что ли ?:

TMR1L=T_next;
TMR1H=T_next>>8;


Код
144:                   TMR1L=T_next;
  00E7    0879     MOVF 0x79, W
  00E8    008E     MOVWF 0xe
145:                   TMR1H=T_next>>8;
  00E9    087A     MOVF 0x7a, W
  00EA    008F     MOVWF 0xf

Автор: maksimp Nov 25 2011, 05:20

Цитата(Игорь Кочет @ Nov 21 2011, 12:57) *
TMR1H:TMR1L=T_next;

Такого присваивания в языке C нет.
Здесь получилось что TMR1H определилась как метка для оператора goto, а присваивание только TMR1L=T_next;
Цитата(Игорь Кочет @ Nov 21 2011, 12:57) *
TMR1L=T_next;
TMR1H=T_next>>8;

Да.

Автор: Araxnid Dec 3 2011, 15:30

Уже во всем разобрался, пичаль с смыслом команд, использовал лоад вместо sts и наоборот =\

Автор: Vladimir_Sn Jan 17 2012, 10:04

Здравствуйте!
Посмотрите пожалуйста пид регулятор. Написал его на микоС, этот язык только начал осваивать, раньше асм использовал. Пишу для PIC16877A.
Я думаю с ПИДом может возникнуть много заморочек, прошу откликнуться. Ваши комментарии.
//**************** PID *******************************************************
delta_0 = setpoint - Vout; // vi4islenie o6ibki = zadannoe zna4enie - tekuchee
prop_res = delta_0 * Kp; // proporcion-ya sost-ya = o6ibka * Kp

dif_res = (delta_1 - delta_0) * Kd; // prediduchaya o6ibka - tekuchaya o6ibka
// mnozennoe na Kd eto est' diff-ya sost-ya
delta_1 = delta_0; // teper' tekuchaja o6ibka v sledujuchem
// cikle budet prediduchej o6ibkoj
int_res += Ki * delta_0; // integral'naja sostavlyajuchaya summiruet
// vse o6ibki, mnozennie na koefficient Ki
if (int_res > int_max) // esli integr-ya sost-ya too big, togda ograni4ivaju
int_res = int_max; // ee dal'nej6ij rost na urovne int_max
else if (int_res < int_min) // esli integr-ya sost-ya too small, togda ograni4ivaju
int_res = int_min; // ee dal'nej6ee umen'6enie na urovne int_min

control = int_res + dif_res + prop_res; // control eto upravlyajuchee
// vozdejst-e soderz i,d,p sost-e
if (control > control_max) // esli control too big, togda ograni4ivaju
control = control_max; // ego dal'nej6ij rost na urovne control_max
else if (control < control_min) // esli control too small, togda ograni4ivaju
control = control_min; // ego dal'nej6ee umen'6enie na urovne control_min
// teper' peremenneya control soderzit upravlyajuchee vozdejstvie, kotoroe
// trebuetsya otpravit' v module PWM.
//****************************************************************************

Автор: nick60 Jan 21 2012, 08:43

Доброго времени суток.
Не знаю куда постучаться, начну отсюда, а там куда вывезет ...
Начал что-то делать с AVR-ами, у меня их целых (пока) 2 шт. tiny2313 и mega8, одна mega8 сгорела не выдержав directly подключения
светодиодного индикатора, теперь - только через ограничивающие резисторы.
Повторил несколько чужих конструкций, на стенде, громко сказал sm.gif, и в реале.
Пора начать делать что-то своё.

Вопросов несколько :
1.Как подружиться с AVR Studio 4.18.716 и WinAVR-20100110, не смог скомпилировать ни одного проекта - ошибка
make: *** [termom8.o] Error -1073741819
когда есть синтаксические ошибки, всё выдает адекватно, а когда всё исправишь - ошибка.
Работаю под WinXP, SET переменные установлены правильно, имена файлов/каталогов - 8.3
2.В CodeVisionAVR (пока работаю в нем) есть "волшебник", который делает базовую программу и инициализирует всё! на МК,
а есть ли необходимость в такой инициализации, ведь МК как-то настроен "по-молчанию", достаточно только скорректировать то,
что нужно для определенной работы, делал тестовый секундомер, настроил входы/выходы для индикатора и таймер для прерывания и
работало. Меньше строк программы - меньше ошибок исправлять sm.gif
Вот собственно вопрос - где-нибудь есть сводная информация как настроен МК "по-молчанию",
т.е. с завода или после полного стирания ?
Некоторые настройки сбивают fuses, когда разбирался с чужим проектом, семь потов сошло sad.gif
Пока почерпнул только, что порты настроены на вход с отключенными подтягивающими резисторами, хотя тоже не уверен, потому как есть
общее управление всеми резисторами сразу, внутренний генератор работает на 8MHz с делением на 8, т.е 1MHz - эти настройки и повторяет
"волшебник"
Что там с таймерами и прерываниями ещё "не въехал".
С английским дружу через словарь, в документации много всего, а выудить нужное пока не смог.

Сейчас есть желание сделать на tiny2313 многоточечный термометр (на DS18B20) с выводом на многострочный LCD, подобные конструкции есть,
но они расходуют практически всю программную память МК, а мне нужно еще дополнить функциональности, потому нужно максимально оптимизировать программу, переходить на mega8 не хочется, 8 ножек даром болтаться будут sm.gif

Автор: maksimp Jan 26 2012, 10:12

Цитата(nick60 @ Jan 21 2012, 12:43) *
но они расходуют практически всю программную память МК, а мне нужно еще дополнить функциональности, потому нужно максимально оптимизировать программу, переходить на mega8 не хочется, 8 ножек даром болтаться будут sm.gif

Возьмите mega8 и не обращайте внимание на то что ноги даром болтаются.

Автор: редактор Jan 27 2012, 05:33

"Значения по умолчанию" возникают в контроллере каждый раз после сигнала RESET. Эти состояния всегда описываются в документации.

Автор: MaxiMuz Feb 8 2012, 12:10

Цитата(nick60 @ Jan 21 2012, 11:43) *
Вот собственно вопрос - где-нибудь есть сводная информация как настроен МК "по-молчанию",
т.е. с завода или после полного стирания ?

после сигнала сброс регистры МК переходят в начальное состояние которое вы можете узнать прочитав соответствующий раздел описания МК внизу под названием регистра(любого) и описания его битов есть строка Initial value. Тоже самое fuse bits описывается в графе Default value.

Автор: nick60 Mar 1 2012, 07:40

Я так понял, что систематизированной информации по предустановленому состоянию МК ни у кого нет.
Ладно, будем копошиться в документации дальше самостоятельно.
Эксперименты изучения МК и его программирования продолжаются ... sm.gif
Удачи всем!

C AVRStudio 4 подружился, оказалось, что дома и на работе у меня установлено что-то, что ломает компилятор.
Потому на компьютере сделал виртуальную машину с помошью VMWare, поставил чистую XP от MS в пробном режиме, установил AVRStudio 4 и все работает.
Почему не работало - копать не буду, потому как времени жалко и можно попасть на ситуацию, что нужный и полезный для работы софт окажется виновником нестыковки.
Так что, выход есть и Слава Богу.


Автор: Сергей Борщ Mar 1 2012, 08:25

QUOTE (nick60 @ Mar 1 2012, 09:40) *
Я так понял, что систематизированной информации по предустановленому состоянию МК ни у кого нет.
Даташит. Систематезированнее некуда. Это во-первых. А во-вторых - лучше не полагаться на на значения по-умолчанию, а прописывать явно все регистры используемой периферии. В большинстве случаем это даже дает меньший код, чем наложение масок по "ИЛИ" и "И".

QUOTE (nick60 @ Mar 1 2012, 09:40) *
C AVRStudio 4 подружился, оказалось, что дома и на работе у меня установлено что-то, что ломает компилятор.
Телепатируем: "ломает компилятор" - при попытке компиляции make ругается на команды в makefile. Версия: установлен один из проектов Борланда, поэтому при компиляции вызывается его make.exe, который совершенно несовместим по формату makefile c GNU make. Диагонстика: Start->Programs->Acessories->Command line prompt, в командной строке ввести make --version, убедиться, что вызывается make от Борланда.

Когда надоест виртуальная машина - поставьте в path путь к WinAVR/utils на первое место, т.е. до пути к Борланду.

Автор: MaxiMuz Mar 4 2012, 12:23

Цитата(nick60 @ Mar 1 2012, 10:40) *
C AVRStudio 4 подружился, оказалось, что дома и на работе у меня установлено что-то, что ломает компилятор.

У меня ни дома ни на работе ни на др.компах небыло проблем с AVRStudio , и Борланд у меня какоето время стоял. У вас ХР стоят ?

Автор: Alex-sh Mar 7 2012, 17:17

Люди, помогите пожалуйста. У меня скоро ГОСы. И в вопросах присутствуют задания по программированию микроконтроллеров PIC на Ассемблере. Может кто-нибудь сможет помочь. Задания такие: 1) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую функцию логического И регистров 20h и 21h, и вызов подпрограммы PRG1, если результат равен нулю. 2) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую логическую функцию исключающего ИЛИ портов А и В и вывод результата в порт С, если он не равен нулю. 3) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую множественное ветвление программы по условию установки в единицу бит 0-3 регистра 20h, с приоритетом от младшего разряда к старшему. 4) Составить алгоритм и программу на языке Ассемблер, реализующую временную задержку t= 10 мкс. для МП типа PIC16C55 при тактовой частоте f = 20МГц. Я понимаю что все задания будет в лом писать. Но хотя бы одно. Заранее спасибо

Автор: Cosmojam Mar 7 2012, 18:45

Цитата(Alex-sh @ Mar 7 2012, 20:17) *
Люди, помогите пожалуйста. У меня скоро ГОСы. И в вопросах присутствуют задания по программированию микроконтроллеров PIC на Ассемблере. Может кто-нибудь сможет помочь. Задания такие: 1) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую функцию логического И регистров 20h и 21h, и вызов подпрограммы PRG1, если результат равен нулю. 2) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую логическую функцию исключающего ИЛИ портов А и В и вывод результата в порт С, если он не равен нулю. 3) Составить алгоритм и программу на языке Ассемблер для МП типа PIC16C55, реализующую множественное ветвление программы по условию установки в единицу бит 0-3 регистра 20h, с приоритетом от младшего разряда к старшему. 4) Составить алгоритм и программу на языке Ассемблер, реализующую временную задержку t= 10 мкс. для МП типа PIC16C55 при тактовой частоте f = 20МГц. Я понимаю что все задания будет в лом писать. Но хотя бы одно. Заранее спасибо

#1
Код
    list        p=16c55    
    #include    <p16c55.inc>
    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

reg1        EQU    0x20
reg2        EQU    0x21

ORG 0x000      
goto main

main  
movf reg1, 0
andwf !!!Чтобы увидеть продолжение отправь смс с текстом "я обещаю никогда не пытаться устроиться на работу по специальности в дипломе" на номер 1234

Автор: paperplane Apr 7 2012, 07:34

Здравствуйте. Недавно начал изучать AVR, почти сразу понадобилось практическое применение. Вот такой вот таймер для мини-оранжереи:
http://electronix.ru/redirect.php?http://www.radikal.ru
Собственно должен выполняться алгоритм:
http://electronix.ru/redirect.php?http://www.radikal.ru
Единственная проблема с кодом, это то, как сделать такие большие задержки. Проще всего думаю пропускать нужное количество тактов за час, то есть если частота мк 1МГц, восемь часов ожидания будут выглядить так:

Код
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);
__delay_cycles(3600000000);

Но наверное это глупо и нецелесообразно. Подскажите, как это можно реализовать на таймерах мк, и насколько большая погрешность у внутреннего генератора мк. Заранее спасибо.

Автор: _Артём_ Apr 7 2012, 12:05

Цитата(paperplane @ Apr 7 2012, 10:34) *
Но наверное это глупо и нецелесообразно.

Да. Нецелесообразно.


Код
#define FREQUENCY 11059200
unsigned short MilliSeconds;
unsigned short Seconds;
unsigned char Hour;
#pragma vector=TIMER0_OVF_vect
__interrupt void timer_1khz_isr(void)
{
    if (++Milliseconds>=1000) {
        Milliseconds=0;
        if (++Seconds>=3600) {
            Hour++;
        }
    }
}
void timer1_init(void)
/*
TIMER1 initialize - prescale:1
WGM: 4) CTC, TOP=OCRnA
desired value: 9996Hz
actual value: 9999,277Hz (0,0%)
*/
{
    TCCR1B = 0x00; //stop
    TCNT1H = 0xFB; //setup
    TCNT1L = 0xAF;
    OCR1AH = 0x04;
    OCR1AL = 0x51;
    OCR1BH = 0x04;
    OCR1BL = 0x51;
    OCR1CH = 0x04;
    OCR1CL = 0x51;
    ICR1H  = 0x04;
    ICR1L  = 0x51;
    TCCR1A = 0x00;
    TCCR1B = 0x09; //start Timer
    TIMSK |= (1 << OCIE1A);
}
int main()
{
    timer1_init();
    __enable_interrupt();
    while (1) {
    }
}

Цитата(paperplane @ Apr 7 2012, 10:34) *
насколько большая погрешность у внутреннего генератора мк.

Навеное единицы процентов. Смотрите в datasheet.

Автор: Александр Куличок May 11 2012, 22:08

Цитата
восемь часов ожидания будут выглядить так...

или так:
Код
for(int h = 0; h<8; h++) __delay_cycles(3600000000);

Если контроллер других функций не выполняет, то при данном алгоритме абсолютно все равно, на чем делать задержки. Но для корректной работы Вашего алгоритма нужно передергивать питание почти каждый раз после изменения положения s1 (Для примера, рассмотрите ситуацию: ставим s1 на 7 ногу, включаем питание, и, скажем, через секунду, переводим s1 на 9ю ногу. Через 16 часов реле выключится на 8 часов, хотя при этом положение s1 показывает на "включено постоянно") Так что, как мне кажется, алгоритм придется все-таки поменять (хотя, может, все именно так и задуманно).

По поводу схемы. Для корректной работы в железе придется либо притянуть ноги 7,8,9 резисторами к земле для обеспечения "0" на неподключенном выводе. Но, на мой взгляд, проще на этих выводах разрешить pull-up резисторы (DDR = 0, PORT = 1), а переключателем s1 коммутировать выводы на "землю". При этом на выбранном выводе будет лог. "0", на остальных - лог. "1". Соответственно, нужно подкорректировать условия ветвления в алгоритме.

Автор: well solid Nov 15 2012, 03:49

А можно вопрос от совсем начинающего?
С какого контролера начинать?
Какой для него USB програматор купить, готовый к работе?
Какую макетку купить для сборки устройства (может есть готовые с распаяными контролерами и обвесом)?
Какой именно для предложеных вариантов нужен софт?
Рассматривать ли ARDUINO?

Автор: Kopa Nov 15 2012, 19:26

Цитата(well solid @ Nov 15 2012, 07:49) *
А можно вопрос от совсем начинающего?

Возьму смелость посоветовать такой путь
http://electronix.ru/redirect.php?http://we.easyelectronics.ru/msp430/virtualnaya-mashina-i-skriptovoy-dvizhok-v-msp430g2553-prosche-parenoy-repy-4e4th-ti-launchpad.html#cut
http://electronix.ru/redirect.php?http://we.easyelectronics.ru/msp430/4e4th-ti-launchpad-osnovy-yazyka-forth.html#cut
http://electronix.ru/redirect.php?http://we.easyelectronics.ru/forth/4e4th-ti-launchpad-v-nachale-bylo-slovo.html#cut
пока автор, по этой тематике сделал 3-и статьи

P.S.Данный подход и его разветвления применим и применяется к любым существующим контроллером.

Автор: well solid Nov 16 2012, 01:21

Интересная ссылка, спасибо.
Если я правильно понял покупается плата, подключается по USB, программируется, а затем используется как самостоятельное устройство - так?
Кто покупал на оф сайте TI, поделитесь инфой.
Есть ли для этого девайса готовые библиотеки программ (как например для Атмела)?
Для новичка важно. Ведь опыта самостоятельного написания никакого.

Автор: Kopa Nov 16 2012, 15:34

Цитата(well solid @ Nov 16 2012, 04:21) *
Интересная ссылка, спасибо.
Если я правильно понял покупается плата, подключается по USB, программируется, а затем используется как самостоятельное устройство - так?
Кто покупал на оф сайте TI, поделитесь инфой.
Есть ли для этого девайса готовые библиотеки программ (как например для Атмела)?
Для новичка важно. Ведь опыта самостоятельного написания никакого.

Наличие библиотек, при данном подходе знать почти не требуется, главное задавать
себе вопросы по ходу проникновения в базис. Конретных библиотек для данного контроллера
может не быть, но Форта много в разных контроллерах и это снимает "первоначальные" проблемы,
а дальше приходит некоторый опыт и возможность его наращивать на имеющемся базисе
в различных вариантах. Это средний уровень начального старта, но не ограничены в дальнейшем продвижении.

Автор: Kopa Nov 16 2012, 15:34

Цитата(well solid @ Nov 16 2012, 04:21) *
Интересная ссылка, спасибо.
Если я правильно понял покупается плата, подключается по USB, программируется, а затем используется как самостоятельное устройство - так?
Кто покупал на оф сайте TI, поделитесь инфой.
Есть ли для этого девайса готовые библиотеки программ (как например для Атмела)?
Для новичка важно. Ведь опыта самостоятельного написания никакого.

Наличие библиотек, при данном подходе знать почти не требуется, главное задавать
себе вопросы по ходу проникновения в базис. Конретных библиотек для данного контроллера
может не быть, но Форта много в разных контроллерах и это снимает "первоначальные" проблемы,
а дальше приходит некоторый опыт и возможность его наращивать на имеющемся базисе
в различных вариантах. Это средний уровень начального старта, но не ограничевает дальнейший прогресс..

P.S. Даже не новички в embedded тематике, изучают и пробуют к ипользованию существующие возможности в этом направлении.
Доставка от TI вроде без проблем и бесплатна., в подобных случаях.

Автор: kt368 Nov 16 2012, 16:27

Цитата(well solid @ Nov 16 2012, 03:21) *
Кто покупал на оф сайте TI, поделитесь инфой.
Я покупал, именно LaunchPad, доставка бесплатная, привезли за 2 недели (мож чуть меньше, не помню уже).

Автор: well solid Nov 18 2012, 03:41

Боюсь даже спросить.
Можно-ли заливать программы написанные для Атмела в LaunchPad? laughing.gif

Автор: Kopa Nov 18 2012, 05:24

Цитата(well solid @ Nov 18 2012, 06:41) *
Боюсь даже спросить.
Можно-ли заливать программы написанные для Атмела в LaunchPad? laughing.gif

Какие программы? Если на Форт, то "обобщённо" да. также и как на Си.
Для Аtmela тоже есть разные варианты Форт систем.

Автор: well solid Nov 19 2012, 02:25

Пол дела сделано, на работе нашли програматор Phyton ChipProg-40, приходил с какимтом-то оборудованием. Говорят даже работает.
Так что буду начинать с ATmela!

Автор: San_75 Apr 5 2013, 03:16

Цитата(well solid @ Nov 19 2012, 12:25) *
Пол дела сделано, на работе нашли програматор Phyton ChipProg-40, приходил с какимтом-то оборудованием. Говорят даже работает.
Так что буду начинать с ATmela!


http://electronix.ru/redirect.php?http://habrastorage.org/storage2/322/9da/cb1/3229dacb1a66c3605638e895818bd80c.png
я вот такой штукой контроллеры шью, на старом компе с лпт портом и 128 мб оперативки. Шить можно программой Uniprof

Автор: пай-мальчик Mar 29 2014, 13:35

Здравствуйте! Кто-нибудь знает, AT90CAN32 должен шиться USBASP-ом? Купил на алибабе 10 штук, их программатор не видит.
Это мой первый TQFP, но сомневаюсь, что дело в кривой схеме.
На первую плату все детали напаял - не работает. На вторую только атмегу и 100нф конденсаторы с резистором 10к на ресете. То же самое. Всё протестил, контакт есть, питание на плате есть, а usbasp пишет, что пусто.
Другие контроллеры, например, atmega328p им шью.

Может у нового чипа ISP быть отключенным? А JTAG при этом может быть тоже выключен? :-o

Вот плата в виде картинки
http://electronix.ru/redirect.php?http://robo-home.ru/pict.png

Схема, если интересно.
http://electronix.ru/redirect.php?http://robo-home.ru/sch.lay6

Чип на самом деле at90can32, на схеме atmega128, т.к. макрос нашёлся такой.

Автор: Xenia Mar 29 2014, 14:27

Вот тут был аналогичный случай (первая часть сообщения):

Цитата(coolbassnik @ Mar 13 2014, 10:35) *
1) Если у Вас USBASP может работать в режиме пониженной частоты CLK - установите этот режим (это может быть джампер или перемычка LOWCLK на программаторе). Т.к. все контроллеры с завода тактируются от внутреннего генератора на низкой частоте, то нужно понизить тактовую на программаторе чтобы микроконтроллер "увиделся".
2) "Подтяните" вывод RESET на микроконтроллере к питанию через резистор около 10 кОм, чтобы помехи не "держали" микроконтроллер в сброшенном состоянии.


Автор: пай-мальчик Mar 30 2014, 11:06

Странно, это касается именно at90canX? К сожалению, не могу найти в даташите где пишут частоту по умолчанию, с теми контроллерами AVR, с которыми уже ковырялся, было 8мгц (может с прескейлером 1/8) от внутреннего тактового генератора, даже у tiny.

Перемычки такой на китайском usbasp-е, конечно, нет sad.gif Есть план Б? sm.gif

Автор: Jury093 Mar 30 2014, 12:34

Цитата(пай-мальчик @ Mar 30 2014, 15:06) *
Перемычки такой на китайском usbasp-е, конечно, нет sad.gif Есть план Б? sm.gif

конечно есть - на дискретах собираете генератор на нужную частоту и подключаете вместо штатного тактирования..

но сдается мне, что вы слегка попутали контакты в "схеме" (в следующий раз выкладывайте не в экзотическом формате и не в виде печатки, а в pdf или картинку схемы) - для ISP нужны не MISO/MOSI, а PDI/PDO (PE0/PE1) - имхо, классическая ошибка

и по монтажке - я бы делал дорожку питания раза в 2-3 шире..

Цитата
К сожалению, не могу найти в даташите где пишут частоту по умолчанию, с теми контроллерами AVR, с которыми уже ковырялся, было 8мгц

и тут те же 8 МГц:

Код
5.6 Calibrated Internal RC Oscillator
CKSEL3..0 0010 8.0 MHz
Note: 1. The device is shipped with this option selected

Автор: пай-мальчик Mar 31 2014, 12:00

Спасибо большое за советы. У avrdude обнаружил волшебный ключик, -B5 и скорость стала якобы 187500 Hz.

И с miso/mosi я конечно ошибся. Переключил на PDI/PDO сообщение другое получаю.
При этом, если "перепутать" провода, то старое сообщение:

error: programm enable: target doesn't answer

А теперь у девайса id неправильный:

avrdude: Device signature = 0xffffff
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.


%(

Автор: Jury093 Apr 2 2014, 06:35

Цитата(пай-мальчик @ Mar 31 2014, 16:00) *
А теперь у девайса id неправильный:

а что у вас с питанием на плате, есть чем померять? 5в присутствуют?
не знаю, что за LDO стоит для 12->5, но для такого типа корпуса обычно делают соединение фланцевого контакта и центрального - уточнить можно, найдя даташит на чип стабилизатора и посмотреть там типовую схему включения..
для проверки можно отпаять LDO и запитать от внешнего источника на 5В

Автор: dan_p Nov 17 2014, 17:54

Добрый день.

Разрабатываю плату для преобразования показаний с датчика давления и последующей передачи по UART. Выбрал следующую схему АЦП-attiny-UART. Скажите, пожалуйста, можно, допустим, снимать через SPI данные с АЦП в обычном режиме, а в режиме прошивки через те же ножки прошивать что-нибудь вроде attiny441? Или лучше взять attiny с двумя SPI (например, 167)?

Заранее спасибо

Ещё интересует следующий вопрос: сколько примерно максимально может потреблять attiny?

Автор: Xenia Nov 17 2014, 22:01

Цитата(dan_p @ Nov 17 2014, 20:54) *
Скажите, пожалуйста, можно, допустим, снимать через SPI данные с АЦП в обычном режиме, а в режиме прошивки через те же ножки прошивать что-нибудь вроде attiny441? Или лучше взять attiny с двумя SPI (например, 167)?

Одного SPI достаточно. К разъему программатора ведете линии MISO и MOSI напрямую, а их же с АЦП соединяете через резисторы 1 Ком (на SCK резистор ставить не надо). Тогда АЦП не помешает прошивать МК, и сам от этой процедуры не пострадает. А ко времени работы с АЦП програматор будет уже отключен и тоже не помешает его работе.

Цитата(dan_p @ Nov 17 2014, 20:54) *
Ещё интересует следующий вопрос: сколько примерно максимально может потреблять attiny?

Даташит надо смотреть, там есть график тока от напряжения питания (сильно зависит!). А кто же кроме вас, может знать, каким напряжением вы собираетесь питать Тиньку?

Автор: chipstar.ru Nov 28 2014, 10:06

Цитата(nameless @ Apr 6 2005, 15:06) *
Не советую AVR для начинающих. Уж куда приятнее PIC. В преподавательской практике использовал оба - PIC схватывают на лету !!!
Есть подозрение - что из-за системы команд.

Согласен. AVR вышел после PIC. Некоторые просчеты архетектуры ранних PIC там устранили. В PIC, начиная с PIC18 то-же никаких трудностей с регистрами нет, но в целом PIC более привлекательны и понятны.

Автор: Gorby Nov 28 2014, 10:28

Цитата(chipstar.ru @ Nov 28 2014, 13:06) *
Согласен. AVR вышел после PIC. Некоторые просчеты архетектуры ранних PIC там устранили. В PIC, начиная с PIC18 то-же никаких трудностей с регистрами нет, но в целом PIC более привлекательны и понятны.

Дружище, проснитесь! Уж десять лет прошло. Расклад поменялся.
И даже тогда ПИКи рассматривались отдельно как недо-МК (по причине кривости системы команд и регистров, ограниченности ресурсов, невозможности программирования на Си).
А АВРы сразу позиционировались как замена i51 (легендарный 8515). Ну и до кучи мелкий 1200-й "заткнуть ПИКи".
Ну и не забываем, что Атмел "взял" всех своей флешовой версией i51. А 89С55й с 64К флеша!?

А про 18-е ПИКи не надо. Может и хороши они, да поздновато появились.

Автор: jhm Jan 9 2015, 08:21

Цитата(Gorby @ Nov 28 2014, 14:28) *
Дружище, проснитесь! Уж десять лет прошло. Расклад поменялся.
И даже тогда ПИКи рассматривались отдельно как недо-МК (по причине кривости системы команд и регистров, ограниченности ресурсов, невозможности программирования на Си).
А АВРы сразу позиционировались как замена i51 (легендарный 8515). Ну и до кучи мелкий 1200-й "заткнуть ПИКи".
Ну и не забываем, что Атмел "взял" всех своей флешовой версией i51. А 89С55й с 64К флеша!?
А про 18-е ПИКи не надо. Может и хороши они, да поздновато появились.

Учить 8-битники сейчас нет смысла. Их время уходит. Хотя я сам их часто ипользую ввиду простоты и удобства для небольших задач.
Нужно начинать сразу с Cortex M0, самого простого 32бит контроллера. Таким образом сразу привыкать к мейнстриму.

Автор: paskal Aug 17 2015, 17:48

Очень интересует, поддерживает ли CodeVisionAVR язык C++?

Автор: Сергей Борщ Aug 17 2015, 18:30

Цитата(paskal @ Aug 17 2015, 20:48) *
Очень интересует, поддерживает ли CodeVisionAVR язык C++?
Он и простой С не поддерживает. Он компилит со своего языка, похожего на C.

Автор: paskal Aug 17 2015, 18:54

А присутствует ли у него стандартная библиотека Си?

Автор: Сергей Борщ Aug 18 2015, 17:54

www.google.com->"codevisionavr manual"

Автор: Tonotuh Sep 21 2015, 10:53

Подскажите где можно посмотреть соответствие настроек #pragma config? Проблемма такая Нужно настроить PIC18f97j94 на работус проэктом USB Keyboard (из примера микрочипа) от кварца 12МГц. Для этого надо поставить предделитель на 3, но в настройках прописано

CODE

#pragma config STVREN = ON // Stack overflow reset
#pragma config XINST = OFF // Extended instruction set
#pragma config BOREN = ON // BOR Enabled
#pragma config BORV = 0 // BOR Set to "2.0V" nominal setting
#pragma config CP0 = OFF // Code protect disabled
#pragma config FOSC = FRCPLL // Firmware should also enable active clock tuning for this setting
#pragma config SOSCSEL = LOW // SOSC circuit configured for crystal driver mode
#pragma config CLKOEN = OFF // Disable clock output on RA6
#pragma config IESO = OFF // Internal External (clock) Switchover
#pragma config PLLDIV = NODIV // 4 MHz input (from 8MHz FRC / 2) provided to PLL circuit
#pragma config POSCMD = NONE // Primary osc disabled, using FRC
#pragma config FSCM = CSECMD // Clock switching enabled, fail safe clock monitor disabled
#pragma config WPDIS = WPDIS // Program memory not write protected
#pragma config WPCFG = WPCFGDIS // Config word page of program memory not write protected
#pragma config IOL1WAY = OFF // IOLOCK can be set/cleared as needed with unlock sequence
#pragma config LS48MHZ = SYSX2 // Low Speed USB clock divider
#pragma config WDTCLK = LPRC // WDT always uses INTOSC/LPRC oscillator
#pragma config WDTEN = OFF // WDT disabled; SWDTEN can control WDT
#pragma config WINDIS = WDTSTD // Normal non-window mode WDT.
#pragma config VBTBOR = OFF

строчка #pragma config PLLDIV = NODIV не совсем понятна, где найти соответствие NODIV, где искать остальные возможные варианты? Пробовал поставить делитель цифрами, выдает ошибку ([1225] configuration value '3' not recognized for configuration setting 'PLLDIV'), поставил DIV3, ошибку не выдал, но то что это соответствует делителю 3 нет уверенности. Тоже самое и с настройкой FOSC = FRCPLL (для работы от 12МГц надо перенастроить)

Автор: Ruslan1 Sep 22 2015, 12:07

Цитата(Tonotuh @ Sep 21 2015, 13:53) *
Подскажите где можно посмотреть соответствие настроек #pragma config?

В хелпе к оболочке.
B MPLAB IDE 8.** это лежит (менюшки в оболочке): Help->Topics->PIC18 Config settings->PIC18F9xxx -> PIC18F97J94

В пристегнутом файле оно.
 PIC18F97J94_config.pdf ( 96.25 килобайт ) : 706



Автор: Tonotuh Sep 23 2015, 09:31

Спасибо. Сегодня нашел этот хелп, после переустановки новой версии пакета.

Автор: lyric Jan 29 2016, 03:30

Здравствуйте.
Начинаю изучать программирование AVR, есть много глупых вопросов, и лучшей темы чтобы их задать я не нашёл. Так вот, сначала некоторое описание ситуации, потом вопросы:

Работать буду с Atmega644. Писать собираюсь на С, специально для этих целей начал его учить, а язык ассемблера при этом не знаю.
Есть в железе собранный прибор(назовём его прибор А), построенный на этих МК, надо сделать на него программу, - это есть цель.
Есть другой прибор, который производится и продаётся (назовём его прибор Б), построенный на этом же МК, и есть к нему программа, написанная в CodeVisionAVR.

Читаю даташит на Atmega644, дошёл до 24-й страницы, где есть примеры кода записи и чтения EEPROM. В общих чертах эти механизмы работы с EEPROM понятны. Там показаны операции с регистрами МК, как на языке ассемблера, так и на С.

Так вот, после этого смотрю в программу на прибор Б, на подпрограммы чтения и записи EEPROM, и не вижу там ни одного названия регистра. Чтение с EEPROM там строится присвоением значений EEPROM-переменных к обычным, - просто копируются в оперативную память, как я понимаю. Точно так же строится запись, только наоборот, присвоением значений изменённых переменных EEPROM-переменным, и на этом всё, никаких регистров не упоминается. И вообще в программе в принципе нет упоминаний регистров МК, везде только переменные.
В связи с чем я не понимаю за счёт чего осуществляются операции работы с EEPROM.
Соответственно, все остальные примеры кода из даташита будут вызывать такой же вопрос.

Вопрос №1: Чтение/запись памяти и другие операции, требующие непосредственной работы с регистрами МК осуществляются в каких-то подключаемых библиотеках?

В этой программе (на прибор Б) подключены следующие библиотеки:
<mega644.h>
<delay.h>
<stdlib.h>
<lcd.h>

На первую библиотеку из списка описания не нашёл (ткните носом, если где-то есть), а в других вышеназванных библиотеках функций работы с EEPROM не увидел.

Вопрос №2: Что за тип данных такой bit в CodeVisionAVR? В языке С ведь нет типа boolean...

Вопрос №3: Посоветуйте среду разработки. Сомневаюсь между древней CodeVisionAVR 1.25.8 и Atmel Studio 6.1.

Автор: SlavaV Jan 29 2016, 05:53

Зачем придумывать велосипед при использовании AVR, есть же Atmel Studio (на данный момент 7) в ней всё уже имеется (ASF) работа с прерываниями, портами, задержками и т.д. хороший help
главное в вашем случае подкорректировать board.h.

Автор: sovas Jul 23 2016, 21:14

Доброй ночи прошу не пинать только учусь не могу понять как считать логарифм помогите разобраться .
#include <util/delay.h>
#include "lcd_lib.h"
#include <math.h>
#include <stdio.h>

// объявляем глобальные переменные
char lcd_buffer[16];
float val;


int main()
{
LCDinit();
while(1)
{

val=log10(5);
sprintf(lcd_buffer, "otvet%i", val);
LCDclr();
LCDGotoXY(0,0);
LCDstring(lcd_buffer, 16);

_delay_ms(300);
}
}

Автор: Dog Pawlowa Jul 27 2016, 18:57

Цитата(sovas @ Jul 24 2016, 00:14) *
помогите разобраться .

И? пример работает?
Что не работает?

Автор: esaulenka Jul 28 2016, 11:14

Цитата(Dog Pawlowa @ Jul 27 2016, 21:57) *
И? пример работает?
Что не работает?

Как минимум, printf("%i") ждёт int, а не float.
Но тогда бы мы услышали "работает, но какую-то ерунду выводит".

Автор: sovas Jul 29 2016, 21:40

sprintf(lcd_buffer, "otvet%f", val); Даже если так пишу выводит знак вопроса и все , помогите разобраться как вывести корректно .

Автор: esaulenka Aug 1 2016, 06:25

Больше самостоятельности!

LCDstring("1234567890123456", 16); - работает?
sprintf (lcd_buf, "1234567890123456"); LCDstring(lcd_buf, 16); - работает? (кстати, почитайте про sprintf - буфер нужен чуть больше: в конец ещё нолик пишется)
int a = 10; sprintf (lcd_buf, "%d", a); LCDstring(lcd_buf, 16); - работает?
float b = 12.34; sprintf (lcd_buf, "%f", cool.gif; LCDstring(lcd_buf, 16); - работает?

И только потом смотреть на логарифмы...

Ну и код этого самого LCDstring() вместе со всем, что оно вызывает, надо смотреть.

Автор: DASM Aug 3 2016, 23:56

мне ваще вот эт не нра val=log10(5);
напишите val=log10(5.); с точкой или printf ("%f\r\n", (float)5); (что уже некрасиво делать)

Автор: skripach Aug 10 2016, 17:43

Цитата(sovas @ Jul 30 2016, 00:40) *
sprintf(lcd_buffer, "otvet%f", val); Даже если так пишу выводит знак вопроса и все , помогите разобраться как вывести корректно .

Нужно убедится (включить в настройках компилятора) что sprintf умеет глотать float.
Ну и модификатор, что-нибудь вроде: sprintf(lcd_buffer, "otvet%9.3f", val);

Автор: lyric Mar 10 2017, 09:36

Здравствуйте.
Я только начинаю вникать в AVR.

Есть атмега644, стоит в простенькой самодельной отладочной плате,. Сейчас к атмеге этой подключен только один светодиод, заставляем его моргать.
В качестве программатора-отладчика используется JTAG ICE MK2, в качестве среды разработки - Atmel Studio 6.1.

Сделана простейшая программа, которая на секунду включает светодиод, потом секунду держит его отключенным и так далее.

Проблема в том, что временной интервал в 1 секунду выдерживается только когда в проекте частоту F_CPU указываю 1000000. Если указываю 8000000, - то 1 секунда превращается в 8 секунд. Когда ставлю частоту 16000000 - то получается 16 секунд интервал. Для задания временного интервала используется библиотека util/delay.h.

Но ведь эта библиотека должна обеспечивать всегда одинаковую, указанную ей задержку, а не увеличивать её пропорционально частоте МК, верно? В чём тут проблема может быть?

Я залазил в этот h-файл библиотеки delay, ставил там свою частоту нужную, вместо 1000000 - но это ничего не изменило.

_____________________________________________

Вторая проблема - программатор-отладчик мой при внутрисхемной отладке по шагам доходя до строки с упоминанием delay - из текста программы переходит в библиотеку и всё, дальше отладку можно только прервать, обратно из библиотеки он уже не выходит никак. Подскажиет что я делаю не так?

код программы:

#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>


void preset()
{
DDRD = 0b11111111; // 0xFF
}


int main(void)
{
preset();
while(1)
{PORTD = 0b11111111;
_delay_ms(1000);
PORTD = 0b00000000;
_delay_ms(1000);
}

}

Автор: sigmaN Mar 10 2017, 10:22

Частота задается программированием фьюзов
В #define F_CPU 16000000 ваша задача поместить РЕАЛЬНОЕ значение частьты. Сейчас ваша мега работает на частоте 1МГц и поэтому задержка сходится только когда вы не врете компилятору и делаете F_CPU 1000000

Цитата
Я залазил в этот h-файл библиотеки delay,
Никогда не лазьте в библиотеки и ничего там не правьте!

Программировать фьюзы тут



При неправильной установке тактирования контроллер перестанет выходить на связь с программтором. Будьте осторожны!(восстановить потом можно, но это потребует дополнительного шаманства с аппаратной частью, что для новичка может быть сложно)

Автор: Lagman Mar 10 2017, 10:25

Цитата(lyric @ Mar 10 2017, 12:36) *
Проблема в том, что временной интервал в 1 секунду выдерживается только когда в проекте частоту F_CPU указываю 1000000.

может и не правильно но ...
http://electronix.ru/redirect.php?http://radiokot.ru/forum/viewtopic.php?p=1540750&sid=f0ea18c8743b22b0baaa8149534f75ff#p1540750

Автор: sigmaN Mar 11 2017, 09:32

Предложенный способ задефайнить глобально F_CPU с помощью командной строки компилятора конечно-же правильный.
Однако вариант
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>

тоже вполне рабочий т.к. #define F_CPU расположен ПЕРЕД include.

Автор: lyric Mar 14 2017, 02:35

Цитата(sigmaN @ Mar 10 2017, 17:22) *
Частота задается программированием фьюзов
В #define F_CPU 16000000 ваша задача поместить РЕАЛЬНОЕ значение частьты. Сейчас ваша мега работает на частоте 1МГц и поэтому задержка сходится только когда вы не врете компилятору и делаете F_CPU 1000000


Спасибо! Всё кратко, чётко и ясно.
А то сколько смотрел видео по AVR, сколько статей находил - нигде эту, казалось бы, простую инфу, не встречал: все сразу учат как мигать светодиодом, будто это основное, что нужно уметь в работе с МК)


Цитата(sigmaN @ Mar 10 2017, 17:22) *
Программировать фьюзы тут



При неправильной установке тактирования контроллер перестанет выходить на связь с программтором. Будьте осторожны!(восстановить потом можно, но это потребует дополнительного шаманства с аппаратной частью, что для новичка может быть сложно)


Да, я находил это окно. На Вашем скриншоте всё подробно описано, а в моей студии 6.1 в строке SUT_CKSEL сейчас написано "INTRCOSC_6CK_65MS".
Я так понимаю что чтобы использовать собственный RC, нужно чтобы это волшебное слово начиналось с букв "INT", - таких строк, начинающихся с "INT", всего в списке 6, и частота указана только в трёх из них, и везде одинаковая, - 128 килогерц. Как при этом выставить свою частоту - непонятно. Разве что без Atmel Studio 6.1, используя сторонний программатор для этого.

Цитата(Lagman @ Mar 10 2017, 17:25) *
может и не правильно но ...
http://electronix.ru/redirect.php?http://radiokot.ru/forum/viewtopic.php?p=1540750&sid=f0ea18c8743b22b0baaa8149534f75ff#p1540750


Да, я был в этой теме, делал всё, как там, но результата не было, т.к. не в курсе был что нужно корректировать фьюзы для смены частоты.

Автор: sigmaN Mar 14 2017, 08:58

Не понимаю почему вы сидите на студии 6.1, когда есть студия 7 из которой я и сделал скриншот.

Фьюзы и их значения в конце концов описаны в даташите и вы можете ввести данные прям в окошечки LOW и HIGH которые вы видете внизу этого окошка.. Короче разберетесь

Автор: EugeNNe Apr 22 2017, 07:09

Куда в 7 Студии запрятали установку частоты МК?

Автор: lyric Sep 22 2017, 06:03

Привет всем. Наверняка уже много раз этот вопрос поднимался, но не знаю как и где искать.

Программирую атмегу по интерфейсу JTAG. В программе я могу эти 4 ноги, занятые JTAGом, использовать как обычные входы/выходы?

Автор: Smoky Sep 22 2017, 06:56

Цитата(lyric @ Sep 22 2017, 12:03) *
Привет всем. Наверняка уже много раз этот вопрос поднимался, но не знаю как и где искать.

Программирую атмегу по интерфейсу JTAG. В программе я могу эти 4 ноги, занятые JTAGом, использовать как обычные входы/выходы?


При отладке программ нельзя, а в рабочем режиме имеется возможность. В регистрах MCUCSR или MCUCR имеется хитрый бит JTD, переключением которого можно эти порты использовать в рабочем режиме. Правда его переключение довольно своеобразное, как пишут в руководстве необходимо произвести запись бита дважды за четыре такта...

Автор: lyric Sep 22 2017, 07:22

Цитата(Smoky @ Sep 22 2017, 13:56) *
При отладке программ нельзя, а в рабочем режиме имеется возможность. В регистрах MCUCSR или MCUCR имеется хитрый бит JTD, переключением которого можно эти порты использовать в рабочем режиме. Правда его переключение довольно своеобразное, как пишут в руководстве необходимо произвести запись бита дважды за четыре такта...


Спасибо, попробую beer.gif

Автор: lyric Oct 6 2017, 11:22

Здравствуйте, снова есть смешной (для сколь-нибудь опытных разработчиков) вопрос:

Снова про AVR, работаю в атмел студии 7.
Ниже привожу проект, который должен включать Порт B на 10 секунд, потом вЫключать на 10 секунд, снова включать и так далее.
Использую для этого таймер1 (16 бит).

Задача - понять как правильно использовать аппаратный таймер для создания, допустим, 30 своих независимых друг от друга программных таймеров с произвольными моментами включения и сброса для каждого из них в зависимости от состояния, допустим, какой-либо переменной в программе. Пока экспериментирую с одной переменной. МК работает на частоте 8МГц, от внутреннего источника, - как был, я его не калибровал и не знаю как это делать и надо ли вообще.. Делитель 256.

Код
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

unsigned int n_count=0;

void preset()
{
    DDRB = 0b11111111; // 0xFF
    PORTB = 0b11111111; // 0x00
    
        DDRD = 0b00001111; // 0xFF
        PORTD = 0b00000000; // 0x00
    
    DDRA = 0b00000000;
    PORTA = 0b11111111; // 0x00
}

void timer_ini(void)    //функция инициализации таймера
{
    TCCR1B |= (1<<WGM12); //установка режима работы CTC (сброс по совпадению)
    TIMSK1 |= (1<<OCIE1A); //устанавливаем бит разрешения прерывания первого счётчика по совпадению с OCIR1A (H и L)
    OCR1AH = 0b00001100; //записываем в регистр OCR1A число 3125 (при работе на частоте 8 МГц это будет давать прерывание каждые 0,1 сек)
    OCR1AL = 0b00110101; //
    TCCR1B |= (1<<CS12); //установка делителя 256
    
}

ISR(TIMER1_COMPA_vect) //Прерывание по достижению таймером значения регистра OCR1A (H и L)
{
n_count++;
if (n_count>=200)    {n_count=0;}
}

int main(void)
{
    preset();
    timer_ini();    
    sei(); //глобальное разрешение прерываний
    
    while(1)
    {
        if ((n_count>0)&&(n_count<100)) {PORTB = 0b11111111;}
else
    if ((n_count>100)&&(n_count<=200)) {PORTB = 0b00000000;};        
    }
}


И вот мой Порт В включается и выключается, - ДА, примерно каждые 10 секунд. Как измерил? - положил рядом с включаемым светодиодом свой телефон с запущенным секундомером. И Вот такой подсчёт времени в микроконтроллере даёт погрешность примерно 1 секунду в минуту. А за 4 минуты - МК уже врёт на 4 секунды - убегает вперёд относительно времени, которое на смартфоне...

Тогда я переставил код из бесконечного цикла в тело прерывания. Так МК убегает вперёд на 12 секунд за 10 минут... Это слишком большая погрешность.. Как быть? Это нормально и вызвана непостоянностью рабочей частоты? Погрешность эту можно как-то сократить? А если я 30 таких таймеров запилю - мне их все в этом же прерывании обрабатывать будет нормально или они, возможно, не будут успевать обрабатываться за прерывание?

Буду рад, примеру простого но более или менее точного программного таймера.

И ещё вопрос из фьюзов кроме CKDIV8 ещё какие-то влияют на рабочую частоту МК, если он работает от внутреннего генератора? То есть в моём случае есть всего 2 варианта частоты, - с включенным CKDIV8 это 1МГц, а с выключенным CKDIV8 это 8МГц и третьего не дано? Атмега644, если это важно.

Автор: Smoky Oct 6 2017, 15:41

Я бы не стал слишком сильно доверять телефонному секундомеру... Но если вы хотите опираться на него как на эталон, попробуйте поварьировать данные в регистре OCR1A. Одна единица этого регистра изменит ваши 10 сек на 3,2 мсек.

Автор: x736C Oct 6 2017, 17:33

Возможно, у вас лишняя единица где-то еще.

Значение для таймера считается без единицы. В вашем случае:
timer_value = ([10] мс * 8000 [кГц] / 256) - 1 = 3124.
Эта ошибка уже добавляет лишние 320 мкс на одну секунду или 192 мс на 10 минут.

Вероятно, на следующем уровне иерархии, когда обрабатываете свои счетчики, допускаете ту же ошибку.

Цитата(lyric @ Oct 6 2017, 14:22) *
Как быть? Это нормально и вызвана непостоянностью рабочей частоты? Погрешность эту можно как-то сократить?

Такой погрешности быть не должно. То есть на глаз, если положить рядом секундомер, интервалы должны быть неотличимы.
Но это в том случае, если используете внешний кварцевый резонатор или генератор. Если внутренний RC-генератор, то все может быть иначе. Но проверить можно в AtmelStudio в режиме симуляции. Там есть возможность замерить интервалы работы участков кода. Только необходимо упростить пример, уменьшив значение, загружаемое в счетчик. Накопление погрешностей можно отследить. Все остальное будет из-за несовершенства RC-генератора. Его можно откалибровать, насколько помню. См. документацию.

Цитата(lyric @ Oct 6 2017, 14:22) *
А если я 30 таких таймеров запилю - мне их все в этом же прерывании обрабатывать будет нормально или они, возможно, не будут успевать обрабатываться за прерывание?

Это надо проверять, кто ж вам ответит. Но перегрузить прерывание, происходящее раз в 100 мс — это надо очень постараться.


Цитата(lyric @ Oct 6 2017, 14:22) *
И ещё вопрос из фьюзов кроме CKDIV8 ещё какие-то влияют на рабочую частоту МК, если он работает от внутреннего генератора? То есть в моём случае есть всего 2 варианта частоты, - с включенным CKDIV8 это 1МГц, а с выключенным CKDIV8 это 8МГц и третьего не дано? Атмега644, если это важно.

Далее идет делитель CLKPR, который может дальше поделить эту частоту.

Автор: lyric Oct 10 2017, 07:51

Smoky, x736C

Большое спасибо, Ваши советы и замечания помогли. Ну и кроме того я сделал прерывание каждые 5 миллисекунд (вместо каждых 100), и инкрементируемую переменную указал volatile вместо unsigned. теперь секундомер смартфона один в один бьёт с тем, что отсчитывает МК, - на глаз никак не отличить. По моим расчётам погрешность за каждую секунду теперь составляет 2 микросекунды, а за 10 минут, соответственно, - 1,2 миллисекунды. Итого удалось уменьшить погрешность примерно в 10000 раз, неплохо rolleyes.gif

Автор: lyric Aug 23 2018, 03:06

Здравствуйте.
Снова есть вопросы по AVR.

В программе сделал динамическую семисегментную индикацию через SPI, индикация вызывается в прерывании таймера каждые 2 миллисекунды.
И написал так же функцию, которая опрашивает все 8 каналов АЦП (без прерывания по окончанию преобразования). Эта функция вызывается в основном цикле, опрашивает 1 канал за такт. Для первых двух каналов АЦП в этой функции производятся довольно тяжёлые математические вычисления (оверсемплинг, фильтрация, аппроксимация по 2 точкам, коррекция) в переменных типа FLOAT. Ну и на время этих вычислений я запрещаю прерывания, соответственно индикаторы мерцают... А хотелось бы чтобы они горели с постоянной яркостью.

1а) Если НЕ запрещать прерывания, то прерывания могут испортить переменные в ОЗУ, которые в обработчике этого прерывания никак не участвуют?

1б) Если могут испортить - то, получается, мне в каждом куске основного цикла где есть работа с типами int16_t, int32_t, float - всегда запрещать прерывания?

2) В Atmel Studio 7, если использовать стандартные функции работы с EEPROM, то функция записи/обновления переменной в EEPROM сама отключает прерывания на время своей работы? Или это надо вручную перед вызовом этой функции запретить прерывания, а после выполнения функции - снова разрешать? В обработчике прерывания эти переменные так же не используются. Сейчас без запрета прерываний всё работает вроде, но боюсь что мне просто везёт, а хотелось бы знать наверняка. Можно ли где-то посмотреть сам текст этих стандартных функций работы с EEPROM? В хедер-файле EEPROM.h этого кода нет.

Автор: Plain Aug 23 2018, 05:43

Во-первых, прерывания сами по себе ничего не портят, это просто условное ветвление программы, а во-вторых, в прерываниях надо делать только то, что в них действительно нуждается.

Узел EEPROM — это отдельная схема на кристалле микроконтроллера, она тактируется собственным тактовым генератором, поэтому всё делает сама и не зависит ни от чего. Также, после её озадачивания записью и до завершения всех процессов она включает помпу, повышающую напряжение питания, потому что для работы с ячейками памяти такого типа требуется относительно высокое напряжение, т.е. начинает потреблять указанный в паспорте существенный и дополнительный к общему ток на указанный в паспорте же интервал.

Автор: lyric Aug 23 2018, 05:56

Plain

это значит что в моём случае запрещать прерывания не нужно ни при расчёте АЦП ни при записи EEPROM?

В обработчике прерывания таймера есть только то что касается индикации, и инкремент трёх переменных для создания программных таймеров в основном цикле.

Автор: Plain Aug 23 2018, 06:58

Цитата(lyric @ Aug 23 2018, 08:56) *
запрещать прерывания не нужно

Естественно.

Автор: Сергей Борщ Aug 23 2018, 07:55

QUOTE (lyric @ Aug 23 2018, 08:56) *
ни при записи EEPROM?
Прерывание может не только менять данные, но и нарушать временнЫе интервалы между командами. При записи в ЭСППЗУ нужно сделать две записи в регистр EECR, между которыми не должно быть больше четырех тактов процессора. Естественно, если после первой записи произойдет прерывание - ни о каких четырех тактах речь идти уже не будет. Поэтому вот именно перед первой записью в EECR прерывания должны быть запрещены, а после второй их уже можно разрешать.

Автор: lyric Aug 23 2018, 08:44

Цитата(Сергей Борщ @ Aug 23 2018, 14:55) *
Прерывание может не только менять данные, но и нарушать временнЫе интервалы между командами. При записи в ЭСППЗУ нужно сделать две записи в регистр EECR, между которыми не должно быть больше четырех тактов процессора. Естественно, если после первой записи произойдет прерывание - ни о каких четырех тактах речь идти уже не будет. Поэтому вот именно перед первой записью в EECR прерывания должны быть запрещены, а после второй их уже можно разрешать.


А если я использую стандартные функции работы с EEPROM, которые содержаться в компиляторе Атмел Студии, - всё равно вручную запрещать прерывания? Функция eeprom_update_word() сама этого не делает? Где-то можно посмотреть её код?

Автор: Сергей Борщ Aug 23 2018, 09:16

QUOTE (lyric @ Aug 23 2018, 11:44) *
А если я использую стандартные функции работы с EEPROM, которые содержаться в компиляторе Атмел Студии, - всё равно вручную запрещать прерывания?
Если она не запрещает прерывания - надо делать это вручную.
QUOTE (lyric @ Aug 23 2018, 11:44) *
Функция eeprom_update_word() сама этого не делает? Где-то можно посмотреть её код?
Самое простое - в листинге дизассемблера.

Автор: lyric Aug 23 2018, 10:55

Цитата(Сергей Борщ @ Aug 23 2018, 16:16) *
Если она не запрещает прерывания - надо делать это вручную.
Самое простое - в листинге дизассемблера.


Не запрещает. Придётся писать свою функцию записи/обновления EEPROM, видимо.
Спасибо за помощь, с EEPROM понятно a14.gif .

Подскажите пожалуйста ещё на эти вопросы:

Цитата(lyric @ Aug 23 2018, 10:06) *
1а) Если НЕ запрещать прерывания, то прерывания могут испортить переменные в ОЗУ, которые в обработчике этого прерывания никак не участвуют?

1б) Если могут испортить - то, получается, мне в каждом куске основного цикла где есть работа с типами int16_t, int32_t, float - всегда запрещать прерывания?


Какие ответы? rolleyes.gif

Автор: Plain Aug 23 2018, 11:26

Цитата(lyric @ Aug 23 2018, 11:44) *
Функция eeprom_update_word() сама этого не делает?

Если не делает, то её фактически нет, разве что какому-то программисту от микроконтроллера понадобится только его EEPROM и ничего более.

На время подачи сигнала разблокирования записи в EEPROM прерывания требуется запретить, чтобы выполнить требования по разблокирующей последовательности (у микроконтроллеров PIC, например, это последовательная запись 55 и AA в регистр разблокировки), но далее, на саму запущенную процедуру записи, любая работа программы никакого влияния не оказывает, в т.ч. и её работа в прерываниях.

Автор: lyric Sep 12 2018, 05:27

Снова здравствуйте.

AVR.

Есть 2 самописных функции.
Эти функции используют разные глобальные переменные, вообще никак не пересекаются между собой. Вызываются в оновном цикле, никак не завязаны на прерывания. В одной из них работа с SPI, в другой с АЦП.
Но при этом функция с АЦП влияет на работу функции с SPI. Нашёл 2 строчки из-за которых это происходит, но там просто математические вычисления, никакого отношения не имеющие к другой функции.

При включении любого уровня оптимизации это проявляется. На уровне -О0 всё работает нормально.

Подскажите в чём может быть дело?

Автор: DASM Sep 12 2018, 06:12

код нужен

Автор: lyric Sep 12 2018, 07:53

Цитата(DASM @ Sep 12 2018, 13:12) *
код нужен


CODE

#define F_CPU 8000000
#include <avr/io.h>
#include <stdlib.h>
#include <math.h>
#include <avr/interrupt.h>



//--------------------------------------------------------------------------------------------------------------глобальные переменные-----------------------------------------------------------------
volatile uint8_t R1=0, R2=0, R3=0, R4=0, R5=0, R6=0, R7=0, R8=0; //Переменные значений разрядов индикатора
volatile int16_t ADC_AI_1, ADC_AI_2; //Текущие значения АЦП без фильтрации
volatile float ADC_AI_1_ff, ADC_AI_2_ff, AI_1, AI_2, AI_1_fv, AI_2_fv;//Текущие значения АЦП после фильтрации, аппроксимированных значений аналоговых входов до коррекции и после
volatile int32_t accu1=0, accu2=0; //переменные для оверсемплинга АЦП
volatile uint8_t accu_count1=0, accu_count2=0; //переменные для оверсемплинга АЦП
volatile int16_t koeff_AI1=1;
volatile int16_t koeff_AI2=1;
volatile uint8_t DI_portD_Mask;
volatile uint8_t DI_portA_Mask_no_opros;
volatile uint8_t DI_portA_Mask;

uint8_t tip_AI1=1;
uint16_t calibr_ADC_min_AI1; // Калибровочное минимальное значение АЦП аналогового входа AI1
uint16_t calibr_ADC_max_AI1; // Калибровочное максимальное значение АЦП аналогового входа AI1
int16_t NPI_AI1; // Нижний предел измерения параметра с аналогового входа AI1
int16_t VPI_AI1; // Верхний предел измерения параметра с аналогового входа AI1
uint16_t koef_A_AI1; // Коэффициент коррекции А для параметра с аналогового входа AI1
int16_t koef_B_AI1; // Коэффициент коррекции B для параметра с аналогового входа AI1
uint8_t koef_filtra_AI1; // Коэффициент фильтрации параметра с AI1

uint8_t tip_AI2=2;
uint16_t calibr_ADC_min_AI2; // Калибровочное минимальное значение АЦП аналогового входа AI2
uint16_t calibr_ADC_max_AI2; // Калибровочное максимальное значение АЦП аналогового входа AI2
int16_t NPI_AI2; // Нижний предел измерения параметра с аналогового входа AI2
int16_t VPI_AI2; // Верхний предел измерения параметра с аналогового входа AI2
uint16_t koef_A_AI2; // Коэффициент коррекции А для параметра с аналогового входа AI2
int16_t koef_B_AI2; // Коэффициент коррекции B для параметра с аналогового входа AI2
uint8_t koef_filtra_AI2; // Коэффициент фильтрации параметра с AI2

//------------------------------------------------------------------------------------------------

void preset()//функция установки портов
{


//инициализация порта В
DDRB = 0b10110000; //конфигурация: 0 - вход. 1 - выход
PORTB = 0b01001111; //1 - включение подтягивающих резисторов для входов. 0 - задание выходам порта начальных значений ("отключено" - высокий уровень, "включено" - низкий уровень).
//инициализация порта C
DDRC = 0b11111111; //конфигурация: 0 - вход. 1 - выход
PORTC = 0b01111111; //1 - включение подтягивающих резисторов для входов. 0 - задание выходам порта начальных значений ("отключено" - высокий уровень, "включено" - низкий уровень).
//инициализация порта D
//конфигурация: 0 - вход:
DDRD &=~(1<<PD7); //Настраиваем ножку PD7 в режим входа
DDRD &=~(1<<PD6); //Настраиваем ножку PD6 в режим входа
DDRD &=~(1<<PD5); //Настраиваем ножку PD5 в режим входа
DDRD &=~(1<<PD4); //Настраиваем ножку PD4 в режим входа
DDRD &=~(1<<PD3); //Настраиваем ножку PD3 в режим входа
DDRD |=(1<<PD2); //Настраиваем ножку PD3 в режим вЫхода
//1 - включение подтягивающих резисторов для входов порта D:
PORTD |= (1<<PD7);
PORTD |= (1<<PD6);
PORTD |= (1<<PD5);
PORTD |= (1<<PD4);
PORTD |= (1<<PD3);
//1 - задание выходу №2 порта D начального значения "отключено" - высокий уровень:
PORTD |= (1<<PD2);
}

void symboll(uint8_t symm) //функция отображения символов на индикаторах
{
switch(symm)
{
case 1: SPDR = 0b10111011; break; //цифра 1
case 2: SPDR = 0b10001100; break; //цифра 2
case 3: SPDR = 0b10101000; break; //цифра 3
case 4: SPDR = 0b00111001; break; //цифра 4
case 5: SPDR = 0b01101000; break; //цифра 5
case 6: SPDR = 0b01001000; break; //цифра 6
case 7: SPDR = 0b10111010; break; //цифра 7
case 8: SPDR = 0b00001000; break; //цифра 8
case 9: SPDR = 0b00101000; break; //цифра 9
case 0: SPDR = 0b00001010; break; //цифра 0

case 11: SPDR = 0b10110011; break; //цифра 1 с точкой
case 12: SPDR = 0b10000100; break; //цифра 2 с точкой
case 13: SPDR = 0b10100000; break; //цифра 3 с точкой
case 14: SPDR = 0b00110001; break; //цифра 4 с точкой
case 15: SPDR = 0b01100000; break; //цифра 5 с точкой
case 16: SPDR = 0b01000000; break; //цифра 6 с точкой
case 17: SPDR = 0b10110010; break; //цифра 7 с точкой
case 18: SPDR = 0b00000000; break; //цифра 8 с точкой
case 19: SPDR = 0b00100000; break; //цифра 9 с точкой
case 10: SPDR = 0b00000010; break; //цифра 0 с точкой

case 20: SPDR = 0b00011000; break; //буква А
case 21: SPDR = 0b01001001; break; //буква B
case 22: SPDR = 0b01001110; break; //буква C
case 23: SPDR = 0b10001001; break; //буква D
case 24: SPDR = 0b01001100; break; //буква E
case 25: SPDR = 0b01001010; break; //буква G
case 26: SPDR = 0b11001110; break; //буква I
case 27: SPDR = 0b00010001; break; //буква K
case 28: SPDR = 0b01001111; break; //буква L
case 29: SPDR = 0b11011001; break; //буква N
case 30: SPDR = 0b11001001; break; //буква O
case 31: SPDR = 0b11000001; break; //буква O с точкой
case 32: SPDR = 0b00011100; break; //буква P
case 33: SPDR = 0b11101111; break; //нижнее подчёркивание
case 34: SPDR = 0b11111101; break; //минус
case 35: SPDR = 0b11111111; break; //ничего
case 36: SPDR = 0b10111110; break; //стрелка вверх
case 37: SPDR = 0b11001111; break; //стрелка вниз
case 38: SPDR = 0b11011101; break; //буква R
case 39: SPDR = 0b11010101; break; //буква R с точкой
case 40: SPDR = 0b01101000; break; //буква S
case 41: SPDR = 0b01100000; break; //буква S с точкой
case 42: SPDR = 0b01001101; break; //буква T
case 43: SPDR = 0b11001011; break; //буква U
case 44: SPDR = 0b00001011; break; //буква V
case 45: SPDR = 0b11110001; break; //буква Z
default: SPDR = 0b11111111; //ничего
}
}

void SPI_init()
{
SPCR = ((1<<SPE)|(1<<MSTR));
}

void ADC_init()
{
ADCSRA |= ((1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)); //Разрешение использования АЦП и делитель 64 (частота опроса 125кГц)
ADMUX=0;
}

void ADC_convert(void) //функция чтения каналов АЦП. Первые 2 канала - это аналогоые входы. Остальные 6 каналов - используются как дискретные входы.
{
uint16_t kod_acp=0;
uint8_t lock_0=0; //чтобы за один вызов функции выполнялось только одно преобразование АЦП, а не 0 и 7 в один раз
static float prom_out1=0, prom_out2=0;
unsigned char savee = SREG;


if (ADMUX==7)
{
ADCSRA |= (1<<ADSC); //Начинаем преобразование
while((ADCSRA & (1<<ADSC))) {}; //проверка закончилось ли аналого-цифровое преобразование
savee =SREG;
cli ();
kod_acp = (unsigned int) ADC;
if (kod_acp<300) {DI_portA_Mask_no_opros |= 0b00100000;} else {DI_portA_Mask_no_opros &= 0b11011111;}
lock_0=1;
SREG= savee;
ADMUX=0;
}

if (ADMUX==6)
{
ADCSRA |= (1<<ADSC); //Начинаем преобразование
while((ADCSRA & (1<<ADSC))) {}; //проверка закончилось ли аналого-цифровое преобразование
savee =SREG;
cli ();
kod_acp = (unsigned int) ADC;
if (kod_acp<300) {DI_portA_Mask_no_opros |= 0b00010000;} else {DI_portA_Mask_no_opros &= 0b11101111;}
SREG= savee;
ADMUX=7;
}

if (ADMUX==5)
{
ADCSRA |= (1<<ADSC); //Начинаем преобразование
while((ADCSRA & (1<<ADSC))) {}; //проверка закончилось ли аналого-цифровое преобразование
savee =SREG;
cli ();
kod_acp = (unsigned int) ADC;
if (kod_acp<300) {DI_portA_Mask_no_opros |= 0b00001000;} else {DI_portA_Mask_no_opros &= 0b11110111;}
SREG= savee;
ADMUX=6;
}

if (ADMUX==4)
{
ADCSRA |= (1<<ADSC); //Начинаем преобразование
while((ADCSRA & (1<<ADSC))) {}; //проверка закончилось ли аналого-цифровое преобразование
savee =SREG;
cli ();
kod_acp = (unsigned int) ADC;
if (kod_acp<300) {DI_portA_Mask_no_opros |= 0b00000100;} else {DI_portA_Mask_no_opros &= 0b11111011;}
SREG= savee;
ADMUX=5;
}

if (ADMUX==3)
{
ADCSRA |= (1<<ADSC); //Начинаем преобразование
while((ADCSRA & (1<<ADSC))) {}; //проверка закончилось ли аналого-цифровое преобразование
savee =SREG;
cli ();
kod_acp = (unsigned int) ADC;
if (kod_acp<300) {DI_portA_Mask_no_opros |= 0b00000010;} else {DI_portA_Mask_no_opros &= 0b11111101;}
SREG= savee;
ADMUX=4;
}

if (ADMUX==2)
{
ADCSRA |= (1<<ADSC); //Начинаем преобразование
while((ADCSRA & (1<<ADSC))) {}; //проверка закончилось ли аналого-цифровое преобразование
savee =SREG;
cli ();
kod_acp = (unsigned int) ADC;
if (kod_acp<300) {DI_portA_Mask_no_opros |= 0b00000001;} else {DI_portA_Mask_no_opros &= 0b11111110;}
SREG= savee;
ADMUX=3;
}

if (ADMUX==1)
{
ADCSRA |= (1<<ADSC); //Начинаем преобразование
while((ADCSRA & (1<<ADSC))) {}; //проверка закончилось ли аналого-цифровое преобразование
savee =SREG;
cli ();
accu2 += (int32_t) ADC;//Оверсемплинг AI2. Было 10 бит, стало 13
accu_count2++;
if (accu_count2>=64)
{
ADC_AI_2=(int16_t)(accu2/8); accu_count2=0; accu2=0;//фильтрация AI2
ADC_AI_2_ff=prom_out2+(ADC_AI_2-prom_out2)/(float)koef_filtra_AI2; //экспоненциальный фильтр
prom_out2=ADC_AI_2_ff;

if (tip_AI2==1)
{
AI_2= ((float)((ADC_AI_2_ff-calibr_ADC_min_AI2)/(calibr_ADC_max_AI2-calibr_ADC_min_AI2)) * (((float)(VPI_AI2-NPI_AI2))/koeff_AI2)+ ((float)(NPI_AI2/koeff_AI2)));//Аппроксимация AI2
AI_2_fv=AI_2*(((float)koef_A_AI2)/1000)+(float)koef_B_AI2/koeff_AI2; //Коррекция AI2
}
else {AI_2=0;AI_2_fv=0;}
}

SREG= savee;
ADMUX=2;
}

if ((ADMUX==0) && (lock_0==0))
{
ADCSRA |= (1<<ADSC); //Начинаем преобразование
while((ADCSRA & (1<<ADSC))) {}; //проверка закончилось ли аналого-цифровое преобразование
savee =SREG;
cli ();
accu1 += (int32_t) ADC; //Оверсемплинг AI1. Было 10 бит, стало 13
accu_count1++;
if (accu_count1>=64)
{
ADC_AI_1=(int16_t)(accu1/8); accu_count1=0; accu1=0;//фильтрация AI1
ADC_AI_1_ff=prom_out1+(ADC_AI_1-prom_out1)/(float)koef_filtra_AI1; //экспоненциальный фильтр
prom_out1=ADC_AI_1_ff;

if ((tip_AI1>0) && (tip_AI1<4))
{
AI_1= ((float)((ADC_AI_1_ff-calibr_ADC_min_AI1)/(calibr_ADC_max_AI1-calibr_ADC_min_AI1)) * (((float)(VPI_AI1-NPI_AI1))/koeff_AI1)+ ((float)(NPI_AI1/koeff_AI1)));//Аппроксимация AI1
AI_1_fv=AI_1*(((float)koef_A_AI1)/1000)+(float)koef_B_AI1/koeff_AI1;//Коррекция AI1

}
else
{AI_1=0;AI_1_fv=0;}
}

SREG= savee;
ADMUX=1;
}
lock_0=0;

}

void indi()
{
static char n_count=1; //Переменная для перебора посылаемых байтов-символов на разряды индикатора

if (n_count==8)
{symboll(R8);
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
SPDR =0b01111111;//выбор индикатора
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
//отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<4); // высокий уровень
PORTB &= ~(1<<4); // низкий уровень
}

if (n_count==7)
{ symboll(R7);
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
SPDR =0b10111111;//выбор индикатора
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
//отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<4); // высокий уровень
PORTB &= ~(1<<4); // низкий уровень
}

if (n_count==6)
{symboll(R6);
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
SPDR =0b11011111;//выбор индикатора
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
//отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<4); // высокий уровень
PORTB &= ~(1<<4); // низкий уровень
}

if (n_count==5)
{symboll(R5);
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
SPDR =0b11101111;//выбор индикатора
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
//отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<4); // высокий уровень
PORTB &= ~(1<<4); // низкий уровень
}

if (n_count==4)
{symboll(R4);
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
SPDR =0b11110111;//выбор индикатора
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
//отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<4); // высокий уровень
PORTB &= ~(1<<4); // низкий уровень
}

if (n_count==3)
{symboll(R3);
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
SPDR =0b11111011;//выбор индикатора
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
//отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<4); // высокий уровень
PORTB &= ~(1<<4); // низкий уровень
}

if (n_count==2)
{symboll(R2);
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
SPDR =0b11111101;//выбор индикатора
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
//отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<4); // высокий уровень
PORTB &= ~(1<<4); // низкий уровень
}

if (n_count==1)
{symboll(R1);
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
SPDR =0b11111110;//выбор индикатора
while (!(SPSR & (1<<SPIF))) {}; //ожидание, пока данные передадутся
//отрицательный фронт для записи в STORAGE REGISTER
PORTB |= (1<<4); // высокий уровень
PORTB &= ~(1<<4); // низкий уровень
}

++n_count;
if (n_count>8) {n_count=1;}

}

int main(void)
{
preset();
SPI_init();
ADC_init();
sei();
while (1)
{

ADC_convert();
R1=7;
R2=7;
R3=7;
R4=7;
R5=7;
R6=7;
R7=7;
R8=7;
indi();
}//КОНЕЦ ОСНОВНОГО ЦИКЛА while
}//КОНЕЦ ОСНОВНОЙ ФУНКЦИИ main


Функция ADC_convert() влияет на работу функции indi(). ADC_convert() - опрос 8 каналов АЦП, indi() - индикация на 8-разрядный семисегментный экран по SPI. Проблема - последний разряд (R8) мерцает, в то время как остальные разряды горят нормально.
Это не вся программа, только те её части, с которыми проблема. Код компилится (Atmel Studio 7) и проблема в нём проявляется. 2 строчки, выделенные жирным цветом - если их закомментировать, то мерцание пропадает. Какое отношение они имеют к индикации - непонятно, но влияют. Такие же две строчки есть и чуть выше в этой же функции,
только с другими переменными работают, - и они почему-то никак не влияют на работу других частей программы.

Автор: DASM Sep 12 2018, 08:28

calibr_ADC_max_AI2 - calibr_ADC_min_AI2 у вас неинициализированы, а в этих строках вы делите на их разность, оная будет равна 0, так они в стартапе обе обнуляются.

Автор: lyric Sep 12 2018, 10:05

Цитата(DASM @ Sep 12 2018, 15:28) *
calibr_ADC_max_AI2 - calibr_ADC_min_AI2 у вас неинициализированы, а в этих строках вы делите на их разность, оная будет равна 0, так они в стартапе обе обнуляются.


Все переменные инициализировал, ничего не изменилось.
Ну и прошу прощения, - ошибся:
Присмотрелся лучше к экрану - мерцания прекращаются только если ADC_convert вообще не вызывать.
Что-то не так с этой функцией (подскажите что?). И почему она портит только один разряд а не все 8 - не пойму.

Когда ADMUX=0 и ADMUX=1 функция ADC_convert выполняется дольше, потому что больше расчётов в ней происходит.
Поэтому функция indi() в эти моменты дольше НЕ выполняется.
И, видимо, эти моменты совпадают с моментами, когда должен включаться индикатор (R8).

Но между ADMUX=0 и ADMUX=1 функция indi() всё равно должна успеть выполниться 1 раз, и получается что мерцать должны 2 индикатора, а не один.
Так и есть? или это бред?

help.gif help.gif help.gif

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)