Котуинко

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

И хорошо и плохо одновременно.
Показатель того, как мало информации о новых изделиях...
И соответственно отставание, которое вероятнее всего уже не наверстать...
(или весьма сложно догнать будет)
Там только главный даташит "Preliminary" на АVR128 в 619 страничек, не включая еррат и дополнений...
А ведь это не единственная новинка...
:(
Хорошо в смысле таки продвижения "старых знакомых", пусть даже уже в совершенно незнакомом виде.
8)
А вот насчет "единой IDE"... тут уже кто к чему привык.
Замена только стиля оформления документации уже штука малоприятная.
Потребуется некоторое время для того, чтобы приспособиться.
:dont_know:
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

BOB51 писал(а):соответственно отставание, которое вероятнее всего уже не наверстать...
а нужно ли наверстывать? кто все время бежит, лишь помрет вспотевшим.
BOB51 писал(а):А вот насчет "единой IDE"...
меня лишь заинтересовало, как они реализовали доступ к периферии вида PORTA.DIR - явно не gcc-шный вариант.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Воть потому, что не охота вечно бежать и грызу старые компиляторы да замшелые МК.
:twisted:
У микрочипа СВОЙ компилятор... Иногда платный...
Там разница с GCC достаточно существенная - обусловлена особенностями ПИКовых...
8)
У нас по ПИКовым больше информации у КРАМ получить можно.
:roll:
Последний раз редактировалось BOB51 Ср июн 03, 2020 23:40:03, всего редактировалось 1 раз.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Котуинко

Сообщение Мурик »

BOB51 писал(а):"The AVR128DA28/32/48/64 microcontrollers of the AVR-DA family are using the AVR® CPU with hardware multiplier,running at up to 24 MHz, with 128 KB of Flash, 16 KB of SRAM, and 512B of EEPROM in 28-, 32-, 48- or 64-pinpackages.
МК как МК. Ничего особенного. Тактовая низкая. Памяти относительно не много. Сколько они стоят?
BOB51 писал(а):Показатель того, как мало информации о новых изделиях
На них нет даташита?
BOB51 писал(а):Воть потому, что не охота вечно бежать и грызу старые компиляторы да замшелые МК.
Никто не заставляет. Пишите дальше под ATmega8.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Речь не о наличии/отсутствии даташита, а о том, что особо никто просмотром сайтов производителей не занимается.
И обзоры новинок АВР МК не наблюдаются.
Цена, ежли успели посетить сайт по ссылке, там указана - базовая от производителя.
Об осоденностях аппараьной начинки разговор отдельный (ибо до.... страничек).
Да и не одна там "новинка" - это всего лишь для примера взято.
8)
Кстати... мегой 8 я не увлекаюсь - не слишком удобный кристалл, хотя в любительских конструкциях весьма распиаренный...
:wink:
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Котуинко

Сообщение Мурик »

BOB51 писал(а):И обзоры новинок АВР МК не наблюдаются.
Видимо никому они не нужны. :dont_know:
BOB51 писал(а):стати... мегой 8 я не увлекаюсь
Ну 328. На такая уж большая разница.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

Мурик писал(а):Видимо никому они не нужны
мода...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Скорее не мода, а черезмерное усложнение периферии...
Ядро то осталось прежним, а разбираться с аппаратными вкусностями детально да в полном объёме...
Это при нынешнем объёме документации весьма сложно.
Вторая причина - изменение структуры сайта производителя и собственно оформления самой документации.
Третье - малое распространение на отдельных территориях.
8)
Причина слабой востребованности в радиолюбительском обиходе супернашпигованных аппаратной периферией МК также имеет место.
Ведь большинство рутинных бытовых задач такого обилия средств не требует.
В то же время как минимум необходимо неиспользуемые модули в обязательном порядке корректно отключать при запуске МК.
Да и цены ессно повыше.
:roll:
Относительно наиболее удачной концепции ядра...
Из имеющихся вариантов я бы отдал предпочтение подвиду PIC24, ёжли бы те МК были "более демократичны" по ценам/доступности.
:hunger:
Мурик
Я ведь не кристалл atmega328 использую, а ""DIP-микросборку" марки ардуино нано или ардуино про-мини".
Это не совсем одно и то же.
По сути такое применение равноценно использованию некоего МК с собственным набором команд и собственным компилятором.
Также кстати как и применение той же "синей пилюльки" или иных "DIP-микросборок", входящих в комплект, обрабатываемый "arduinoIDE "компилятором"".
:wink:
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Котуинко

Сообщение Мурик »

BOB51 писал(а):черезмерное усложнение периферии
Даташит не читал, но судя по описанию, периферия не такая сложная. Бывает сложнее. Но какой смысл в сложной периферии при слабом ядре? Оно не успеет обрабатывать все запросы. Это все равно что в комп поставить мощную видеокарту и самый слабый процессор и 128 МБ ОЗУ. Толку от видеокарты?
Непопулярность новых PIC и AVR из-за их слабого 8-ми битного ядра. Сейчас хватает МК с более производительным ядром и периферией и при этом стоимость на уровне и дешевле новых AVR. Кто хочет платить больше, а получать меньше?
BOB51 писал(а):Ядро то осталось прежним
И это большой минус МК! Представьте что вы из мотоцикла сделали гоночный автомобиль, а двигатель остался тот же. Что получится?
BOB51 писал(а):Третье - малое распространение на отдельных территориях.
Потому что упустили рынок. На нем появились дешевые производительные МК, а у микрочипа и Atmel таких не оказалось.
BOB51 писал(а):Причина слабой востребованности в радиолюбительском обиходе супернашпигованных аппаратной периферией МК также имеет место.
Если радиолюбителям нужен мощный МК, они используют STM32. Потому что дешево, много статей, много IDE включая бесплатные. С доставаемостью сложностей нет. Очень дешевый отладчик и многое другое.
BOB51 писал(а):Ведь большинство рутинных бытовых задач такого обилия средств не требует.
У всех задачи разные. Вот к примеру если нужно решить простую задачу я возьму копеечный (0.30$) STM32, а не PIC или AVR. И многие поступят также. Почему? Во первых лучше хорошо знать МК одного производителя чем посредственно разных. Во вторых, отладка. Она экономит время. В дешевых и простых PIC и AVR ее нет. В третих IDE. Когда есть выбор примерно из 20 IDE подбираешь ту что больше подходит, а не ту что предоставил производительно МК и без альтернатив! Тоже касается компиляторов.
BOB51 писал(а):В то же время как минимум необходимо неиспользуемые модули в обязательном порядке корректно отключать при запуске МК.
Они при запуске должны быть отключены. Их необходимо включать если используются. Если это не так, то в топку такие МК!
BOB51 писал(а):Из имеющихся вариантов я бы отдал предпочтение подвиду PIC24, ёжли бы те МК были "более демократичны" по ценам/доступности.
До 32-ух бит не дотягивают, а это влияет на производительность.
BOB51 писал(а):Я ведь не кристалл atmega328 использую, а ""DIP-микросборку" марки ардуино нано или ардуино про-мини".
В чем разница? Это МК с обвязкой и не более того! Или хотите сказать что ATmega328 в ардуине отличается от оригинальной?
BOB51 писал(а):По сути такое применение равноценно использованию некоего МК с собственным набором команд и собственным компилятором.
Чего? :shock: :facepalm: Хотите скачать что в ардуине не оригинальный ATmega328 и что компилятор на GCC? :))) :facepalm:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

понеслось говно по трубам!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

:music:
Надоело уже повторять - подход к ардуиноподобным с точки зрения используемого МК в корне неверен -
мы имеем дело с DIP микросборкой имеющей выводы и определенную в референсе возможность выполнения набора команд.
А что там внутри - это уже вторично "черный ящик".
Дело пользователя - определить чего необходимо делать внешним выводам платки.
При таком подходе каждая платка/платформа всего лишь еще одна разновидность элементной базы.
8)
Второй подход - использование платки как уже изготовленного фрагмента конструкции с разработкой программы под конкретный МК, установленный на платке это уже не ардуина, а стандартная работа с обычным МК (минуя стадию первичного монтажа деталюшек).
Этот вариант и так в других темах достаточно проработан. И ничем от стандартной работы не отличается.
Но то уже не работа под ардуино, а использование заранее собранного фрагмента конструкции будет.
:beer:
Последний раз редактировалось BOB51 Чт июн 04, 2020 20:28:39, всего редактировалось 1 раз.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Котуинко

Сообщение Мурик »

ARV писал(а):понеслось говно по трубам!
Если с чем-то не согласны - конкретизируйте.
Я не то что ругаю 8-ми битники. Просто они устарели по сегодняшним меркам. Да, они позволяют решать задачи, но есть МК позволяющие их решить проще и эффективнее.
BOB51 писал(а):мы имеем дело с DIP микросборкой имеющей выводы и определенную в референсе возможность выполнения набора команд.
Это просто отладочная плата! Набор команд - асм инструкции МК.
BOB51 писал(а):А что там внутри - это уже вторично "черный ящик".
Это неэффективно. Вы не всможете использовать все возможности ограничиваясь только определенным набором команд когда платформа поддерживает значительно больше! Но дело ваше. Вы себя этим ограничиваете.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

Мурик писал(а):Вы себя этим ограничиваете
самый несчастный человек тот, перед которым бесконечный выбор вариантов. человек, который сам себя ограничил в выборе гораздо ближе к счастью.

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

Мой уютный бложик... заходите!
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Котуинко

Сообщение Мурик »

Я прошел через PIC и AVR. Писал на асме и я четко понимаю все достоинства и недостатки 8-ми битников. Переход на 32-ух битные МК значительно облегчил разработку. Так то я не просто так пишу про ограниченность и про топтание на месте. Нужно двигаться дальше, а не вцепится в МК 20-ти летней давности и отвергать современные.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Никто более навороченное не отвергает - каждому изделию свое применение.
8)
Однако не делать же простейшую автоматику на многоядерном процессоре.
:tea:
Насчет ограничений при работе с платками адуринки...
Если для решения задачи достаточно имеющегося в "черном ящике" набора средств - то это и будет оптимальным решением.
Не хватит имеющегося - тогда и будут рассматриваться иные варианты.
На сегодня я еще даже всеми заложенным в ассемблере средствами не пользовался - только из интереса пробы сделал...
Смысл доказывать преимущество, если необходимости в его применении еще не возникла?
8)
Да и как уже ранее выяснили ардуино IDE все-таки имеет элементы С++...
:wink:
Насчет "те же команды ассемблера"...
Дело тут несколько иначе рассматривать надо.
Вы ведь сторонник новых подходов, и освоения?
В случае с ардуиноподобными к сожалению многие пали жертвой стереотипа.
Возможно в немалой степени из-за "двойственности" самой идеи дуинки (недаром это в ее незвании читается).
можно с теми платформами по старинке на низкоуровневом программировании работать, а можно и иначе - отбросив начинку и низкоуровневое программирование - принять модель "черного ящика" с системой команд соответствующей референсу IDE.
Да, с точки зрения ассемблера или чистого Си в отношении конкретного МК на конкретной платке это значительное ограничение возможностей.
Но у нас ведь и подход другой. А значит никаких ограничений относительно "черного ящика" в принципе не наблюдается, как и необходимости знать что у него внутри (и как те потроха настраиваются).
Так что без лишнего фанатизма причисляем ардуиноподобные к новому "кубику" в арсенале имеющейся элементной базы.
Вопрос где и что из имеющихся ресурсов использовать - решается по мере необходимости.
:beer:
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Котуинко

Сообщение Мурик »

BOB51 писал(а):Однако не делать же простейшую автоматику на многоядерном процессоре.
Многоядерные МК конечно есть, но они пока не перешли в массовый сегмент. :dont_know: Так что подождите немножко. :)
BOB51 писал(а):Если для решения задачи достаточно имеющегося в "черном ящике" набора средств - то это и будет оптимальным решением.
Решение может быть оптимальным, а может быть "так что лишь бы работало". :facepalm: На ардуинах обычно получается второе. Чтобы было первое, нужно перейти от функций ардуины к регистрам. Не нужно привыкать к стилю "тяп-ляп и работает". Обычно это крайне не оптимально. :dont_know:
Например загляните в библиотеку работы с сервоприводами. Она требует много ресурсов МК. И это вместо того чтобы по нормальному использовать несколько десятков ШИМ в современных МК что вообще не требует участия процессора. Разницу замечаете? С остальными библиотеками также.
BOB51 писал(а):Смысл доказывать преимущество, если необходимости в его применении еще не возникла?
Не все теоретики. У многих задачи превышают возможности ардуины и начинается былосборка - несколько адруин там где при оптимальном написании кода хватило бы одной.
BOB51 писал(а):Да и как уже ранее выяснили ардуино IDE все-таки имеет элементы С++
Вообще-то если не знали у ардуины компиль GCC, т. е. язык C/C++.
BOB51 писал(а):Но у нас ведь и подход другой. А значит никаких ограничений относительно "черного ящика" в принципе не наблюдается, как и необходимости знать что у него внутри
Если писать для ARM или ESP как для AVR, в итоге получим возможности как у авра. Это так к сведению если не знали.
Проще вместо ардуины взять современные 32-ух битные МК и они станут универсальным инструментом для решения задач. Т. е. использовать одну мощную платформу по полной, чем несколько на 10%.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Котуинко

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3850428#p3850428"]
Мурик писал(а):Видимо никому они не нужны
мода...[/uquote]
Конкуренция!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Котуинко

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Котуинко

Сообщение BOB51 »

Мурик
Вот как раз "стандартное" восприятие адуринки как "просто МК на платке" при работе в рамках среды так же как и в рамках стандартного GCC "в чистом виде" и приводит к большинству ошибок.
Собственно в состав IDE введены функции использующие аппаратные модули "по собственному усмотрению" авторов IDE.
Если в такой ситуации не зная внутреннего обустройства тех настроек гнать привычный для применения в рамках "чистого GCC" код, использующий аппаратные модули по усмотрению автора конкретной конструкции конфликты неизбежны.
У большинства пользователей ессно нет необходимого опыта для подобного "глубококопания".
Вторая частовстречающаяся ошибка - отсутствие учета специфики схемотехники.
Это правда и обычных конструкций сплошь и рядом касается, но в случае "DIP-микросборки" особо заметно.
Дополнительные сложности накладывают установленные на многих платках системы распределения питания (особо в случае устаноывки USB-TTL мостов "на борту").
Описаний данных тонкостей найти весьма сложно - приходится собирать из разрозненных источников по крупицам...
Тем более, что у каждой из платформ свои нюансы, относящиеся к аппаратной начинке используемых там МК - это на случай, ежли внезапно какой "выпендреж" захочется сотворить за рамками референса.
Ежли уж о компиляторах, применяемых в ардуиноIDE вести речь, то высказывание
"...
BOB51 писал(а):
Да и как уже ранее выяснили ардуино IDE все-таки имеет элементы С++
Вообще-то если не знали у ардуины компиль GCC, т. е. язык C/C++.

BOB51 писал(а):
Но у нас ведь и подход другой. А значит никаких ограничений относительно "черного ящика" в принципе не наблюдается, как и необходимости знать что у него внутри
Если писать для ARM или ESP как для AVR, в итоге получим возможности как у авра. Это так к сведению если не знали.
..."
противоречит самому себе - ибо в arduinoIDE для каждого семейства применяется соответствующий компилятор и дополнительные инструменты - т.е. для АРМ платформ используются АРМ компиляторы, для ESP - свои инструпенты (и весьма навороченные).
В рамках IDE ВСЕ платформы оцениваются КАК РАЗНОВИДНОСТЬ УСТРОЙСТВА (платформы, DIP-микросборки) семейства АРДУИНО, а не как АВР, АРМ или иные МК в рамках разницы между семействами МК имеющейся.
Поэтому де факто во всех случаях мы должны получить результат с ВОЗМОЖНОСТЯМИ КАК У АРДУИНО, а не "как у АВР"или "как у АРМ" или иных МК, в рамках ПЛАТФОРМ использующихся.
Это более аналогия универсальной ОС, одинаково работающей на разных ПК, ноутах и прочих устройствах.
8)
Кстати... а чего Вы можете высказать насчет моих мыслей по работе с директивами условного ассемблирования (avrasm2/c51asm)?
Диапазон видимости, разница между директивами с префиксами в виде точки(.) и слэша(#)?
Это начиная отсюда
https://radiokot.ru/forum/viewtopic.php ... 3#p3849033
и по
https://radiokot.ru/forum/viewtopic.php ... 3#p3849603
включительно?
Возможно приходилось встречаться с подобными вопросами при работе под ассемблером с "большими проектами"...
:roll:
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Котуинко

Сообщение Мурик »

BOB51 писал(а):Вот как раз "стандартное" восприятие адуринки как "просто МК на платке" при работе в рамках среды так же как и в рамках стандартного GCC "в чистом виде" и приводит к большинству ошибок.
Все наоборот. Незнание МК и компилятора приводит к ошибкам и не оптимальному коду. Но вы можете верить в свою правоту если хотите, но правы от этого вы не станете. :dont_know:
BOB51 писал(а):Собственно в состав IDE введены функции использующие аппаратные модули "по собственному усмотрению" авторов IDE.
Куча кривых и не оптимальных функций. Смотрите как устроена функция digitalWrite. :shock:

Код: Выделить всё

const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
	// TIMERS		
	// -------------------------------------------		
	NOT_ON_TIMER	, // PE 0 ** 0 ** USART0_RX	
	NOT_ON_TIMER	, // PE 1 ** 1 ** USART0_TX	
	TIMER3B	, // PE 4 ** 2 ** PWM2	
	TIMER3C	, // PE 5 ** 3 ** PWM3	
	TIMER0B	, // PG 5 ** 4 ** PWM4	
	TIMER3A	, // PE 3 ** 5 ** PWM5	
	TIMER4A	, // PH 3 ** 6 ** PWM6	
	TIMER4B	, // PH 4 ** 7 ** PWM7	
	TIMER4C	, // PH 5 ** 8 ** PWM8	
	TIMER2B	, // PH 6 ** 9 ** PWM9	
	TIMER2A	, // PB 4 ** 10 ** PWM10	
	TIMER1A	, // PB 5 ** 11 ** PWM11	
	TIMER1B	, // PB 6 ** 12 ** PWM12	
	TIMER0A	, // PB 7 ** 13 ** PWM13	
	NOT_ON_TIMER	, // PJ 1 ** 14 ** USART3_TX	
	NOT_ON_TIMER	, // PJ 0 ** 15 ** USART3_RX	
	NOT_ON_TIMER	, // PH 1 ** 16 ** USART2_TX	
	NOT_ON_TIMER	, // PH 0 ** 17 ** USART2_RX	
	NOT_ON_TIMER	, // PD 3 ** 18 ** USART1_TX	
	NOT_ON_TIMER	, // PD 2 ** 19 ** USART1_RX	
	NOT_ON_TIMER	, // PD 1 ** 20 ** I2C_SDA	
	NOT_ON_TIMER	, // PD 0 ** 21 ** I2C_SCL	
	NOT_ON_TIMER	, // PA 0 ** 22 ** D22	
	NOT_ON_TIMER	, // PA 1 ** 23 ** D23	
	NOT_ON_TIMER	, // PA 2 ** 24 ** D24	
	NOT_ON_TIMER	, // PA 3 ** 25 ** D25	
	NOT_ON_TIMER	, // PA 4 ** 26 ** D26	
	NOT_ON_TIMER	, // PA 5 ** 27 ** D27	
	NOT_ON_TIMER	, // PA 6 ** 28 ** D28	
	NOT_ON_TIMER	, // PA 7 ** 29 ** D29	
	NOT_ON_TIMER	, // PC 7 ** 30 ** D30	
	NOT_ON_TIMER	, // PC 6 ** 31 ** D31	
	NOT_ON_TIMER	, // PC 5 ** 32 ** D32	
	NOT_ON_TIMER	, // PC 4 ** 33 ** D33	
	NOT_ON_TIMER	, // PC 3 ** 34 ** D34	
	NOT_ON_TIMER	, // PC 2 ** 35 ** D35	
	NOT_ON_TIMER	, // PC 1 ** 36 ** D36	
	NOT_ON_TIMER	, // PC 0 ** 37 ** D37	
	NOT_ON_TIMER	, // PD 7 ** 38 ** D38	
	NOT_ON_TIMER	, // PG 2 ** 39 ** D39	
	NOT_ON_TIMER	, // PG 1 ** 40 ** D40	
	NOT_ON_TIMER	, // PG 0 ** 41 ** D41	
	NOT_ON_TIMER	, // PL 7 ** 42 ** D42	
	NOT_ON_TIMER	, // PL 6 ** 43 ** D43	
	TIMER5C	, // PL 5 ** 44 ** D44	
	TIMER5B	, // PL 4 ** 45 ** D45	
	TIMER5A	, // PL 3 ** 46 ** D46	
	NOT_ON_TIMER	, // PL 2 ** 47 ** D47	
	NOT_ON_TIMER	, // PL 1 ** 48 ** D48	
	NOT_ON_TIMER	, // PL 0 ** 49 ** D49	
	NOT_ON_TIMER	, // PB 3 ** 50 ** SPI_MISO	
	NOT_ON_TIMER	, // PB 2 ** 51 ** SPI_MOSI	
	NOT_ON_TIMER	, // PB 1 ** 52 ** SPI_SCK	
	NOT_ON_TIMER	, // PB 0 ** 53 ** SPI_SS	
	NOT_ON_TIMER	, // PF 0 ** 54 ** A0	
	NOT_ON_TIMER	, // PF 1 ** 55 ** A1	
	NOT_ON_TIMER	, // PF 2 ** 56 ** A2	
	NOT_ON_TIMER	, // PF 3 ** 57 ** A3	
	NOT_ON_TIMER	, // PF 4 ** 58 ** A4	
	NOT_ON_TIMER	, // PF 5 ** 59 ** A5	
	NOT_ON_TIMER	, // PF 6 ** 60 ** A6	
	NOT_ON_TIMER	, // PF 7 ** 61 ** A7	
	NOT_ON_TIMER	, // PK 0 ** 62 ** A8	
	NOT_ON_TIMER	, // PK 1 ** 63 ** A9	
	NOT_ON_TIMER	, // PK 2 ** 64 ** A10	
	NOT_ON_TIMER	, // PK 3 ** 65 ** A11	
	NOT_ON_TIMER	, // PK 4 ** 66 ** A12	
	NOT_ON_TIMER	, // PK 5 ** 67 ** A13	
	NOT_ON_TIMER	, // PK 6 ** 68 ** A14	
	NOT_ON_TIMER	, // PK 7 ** 69 ** A15	
};

const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
	// PIN IN PORT		
	// -------------------------------------------		
	_BV( 0 )	, // PE 0 ** 0 ** USART0_RX	
	_BV( 1 )	, // PE 1 ** 1 ** USART0_TX	
	_BV( 4 )	, // PE 4 ** 2 ** PWM2	
	_BV( 5 )	, // PE 5 ** 3 ** PWM3	
	_BV( 5 )	, // PG 5 ** 4 ** PWM4	
	_BV( 3 )	, // PE 3 ** 5 ** PWM5	
	_BV( 3 )	, // PH 3 ** 6 ** PWM6	
	_BV( 4 )	, // PH 4 ** 7 ** PWM7	
	_BV( 5 )	, // PH 5 ** 8 ** PWM8	
	_BV( 6 )	, // PH 6 ** 9 ** PWM9	
	_BV( 4 )	, // PB 4 ** 10 ** PWM10	
	_BV( 5 )	, // PB 5 ** 11 ** PWM11	
	_BV( 6 )	, // PB 6 ** 12 ** PWM12	
	_BV( 7 )	, // PB 7 ** 13 ** PWM13	
	_BV( 1 )	, // PJ 1 ** 14 ** USART3_TX	
	_BV( 0 )	, // PJ 0 ** 15 ** USART3_RX	
	_BV( 1 )	, // PH 1 ** 16 ** USART2_TX	
	_BV( 0 )	, // PH 0 ** 17 ** USART2_RX	
	_BV( 3 )	, // PD 3 ** 18 ** USART1_TX	
	_BV( 2 )	, // PD 2 ** 19 ** USART1_RX	
	_BV( 1 )	, // PD 1 ** 20 ** I2C_SDA	
	_BV( 0 )	, // PD 0 ** 21 ** I2C_SCL	
	_BV( 0 )	, // PA 0 ** 22 ** D22	
	_BV( 1 )	, // PA 1 ** 23 ** D23	
	_BV( 2 )	, // PA 2 ** 24 ** D24	
	_BV( 3 )	, // PA 3 ** 25 ** D25	
	_BV( 4 )	, // PA 4 ** 26 ** D26	
	_BV( 5 )	, // PA 5 ** 27 ** D27	
	_BV( 6 )	, // PA 6 ** 28 ** D28	
	_BV( 7 )	, // PA 7 ** 29 ** D29	
	_BV( 7 )	, // PC 7 ** 30 ** D30	
	_BV( 6 )	, // PC 6 ** 31 ** D31	
	_BV( 5 )	, // PC 5 ** 32 ** D32	
	_BV( 4 )	, // PC 4 ** 33 ** D33	
	_BV( 3 )	, // PC 3 ** 34 ** D34	
	_BV( 2 )	, // PC 2 ** 35 ** D35	
	_BV( 1 )	, // PC 1 ** 36 ** D36	
	_BV( 0 )	, // PC 0 ** 37 ** D37	
	_BV( 7 )	, // PD 7 ** 38 ** D38	
	_BV( 2 )	, // PG 2 ** 39 ** D39	
	_BV( 1 )	, // PG 1 ** 40 ** D40	
	_BV( 0 )	, // PG 0 ** 41 ** D41	
	_BV( 7 )	, // PL 7 ** 42 ** D42	
	_BV( 6 )	, // PL 6 ** 43 ** D43	
	_BV( 5 )	, // PL 5 ** 44 ** D44	
	_BV( 4 )	, // PL 4 ** 45 ** D45	
	_BV( 3 )	, // PL 3 ** 46 ** D46	
	_BV( 2 )	, // PL 2 ** 47 ** D47	
	_BV( 1 )	, // PL 1 ** 48 ** D48	
	_BV( 0 )	, // PL 0 ** 49 ** D49	
	_BV( 3 )	, // PB 3 ** 50 ** SPI_MISO	
	_BV( 2 )	, // PB 2 ** 51 ** SPI_MOSI	
	_BV( 1 )	, // PB 1 ** 52 ** SPI_SCK	
	_BV( 0 )	, // PB 0 ** 53 ** SPI_SS	
	_BV( 0 )	, // PF 0 ** 54 ** A0	
	_BV( 1 )	, // PF 1 ** 55 ** A1	
	_BV( 2 )	, // PF 2 ** 56 ** A2	
	_BV( 3 )	, // PF 3 ** 57 ** A3	
	_BV( 4 )	, // PF 4 ** 58 ** A4	
	_BV( 5 )	, // PF 5 ** 59 ** A5	
	_BV( 6 )	, // PF 6 ** 60 ** A6	
	_BV( 7 )	, // PF 7 ** 61 ** A7	
	_BV( 0 )	, // PK 0 ** 62 ** A8	
	_BV( 1 )	, // PK 1 ** 63 ** A9	
	_BV( 2 )	, // PK 2 ** 64 ** A10	
	_BV( 3 )	, // PK 3 ** 65 ** A11	
	_BV( 4 )	, // PK 4 ** 66 ** A12	
	_BV( 5 )	, // PK 5 ** 67 ** A13	
	_BV( 6 )	, // PK 6 ** 68 ** A14	
	_BV( 7 )	, // PK 7 ** 69 ** A15	
};

const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
	// PORTLIST		
	// -------------------------------------------		
	PE	, // PE 0 ** 0 ** USART0_RX	
	PE	, // PE 1 ** 1 ** USART0_TX	
	PE	, // PE 4 ** 2 ** PWM2	
	PE	, // PE 5 ** 3 ** PWM3	
	PG	, // PG 5 ** 4 ** PWM4	
	PE	, // PE 3 ** 5 ** PWM5	
	PH	, // PH 3 ** 6 ** PWM6	
	PH	, // PH 4 ** 7 ** PWM7	
	PH	, // PH 5 ** 8 ** PWM8	
	PH	, // PH 6 ** 9 ** PWM9	
	PB	, // PB 4 ** 10 ** PWM10	
	PB	, // PB 5 ** 11 ** PWM11	
	PB	, // PB 6 ** 12 ** PWM12	
	PB	, // PB 7 ** 13 ** PWM13	
	PJ	, // PJ 1 ** 14 ** USART3_TX	
	PJ	, // PJ 0 ** 15 ** USART3_RX	
	PH	, // PH 1 ** 16 ** USART2_TX	
	PH	, // PH 0 ** 17 ** USART2_RX	
	PD	, // PD 3 ** 18 ** USART1_TX	
	PD	, // PD 2 ** 19 ** USART1_RX	
	PD	, // PD 1 ** 20 ** I2C_SDA	
	PD	, // PD 0 ** 21 ** I2C_SCL	
	PA	, // PA 0 ** 22 ** D22	
	PA	, // PA 1 ** 23 ** D23	
	PA	, // PA 2 ** 24 ** D24	
	PA	, // PA 3 ** 25 ** D25	
	PA	, // PA 4 ** 26 ** D26	
	PA	, // PA 5 ** 27 ** D27	
	PA	, // PA 6 ** 28 ** D28	
	PA	, // PA 7 ** 29 ** D29	
	PC	, // PC 7 ** 30 ** D30	
	PC	, // PC 6 ** 31 ** D31	
	PC	, // PC 5 ** 32 ** D32	
	PC	, // PC 4 ** 33 ** D33	
	PC	, // PC 3 ** 34 ** D34	
	PC	, // PC 2 ** 35 ** D35	
	PC	, // PC 1 ** 36 ** D36	
	PC	, // PC 0 ** 37 ** D37	
	PD	, // PD 7 ** 38 ** D38	
	PG	, // PG 2 ** 39 ** D39	
	PG	, // PG 1 ** 40 ** D40	
	PG	, // PG 0 ** 41 ** D41	
	PL	, // PL 7 ** 42 ** D42	
	PL	, // PL 6 ** 43 ** D43	
	PL	, // PL 5 ** 44 ** D44	
	PL	, // PL 4 ** 45 ** D45	
	PL	, // PL 3 ** 46 ** D46	
	PL	, // PL 2 ** 47 ** D47	
	PL	, // PL 1 ** 48 ** D48	
	PL	, // PL 0 ** 49 ** D49	
	PB	, // PB 3 ** 50 ** SPI_MISO	
	PB	, // PB 2 ** 51 ** SPI_MOSI	
	PB	, // PB 1 ** 52 ** SPI_SCK	
	PB	, // PB 0 ** 53 ** SPI_SS	
	PF	, // PF 0 ** 54 ** A0	
	PF	, // PF 1 ** 55 ** A1	
	PF	, // PF 2 ** 56 ** A2	
	PF	, // PF 3 ** 57 ** A3	
	PF	, // PF 4 ** 58 ** A4	
	PF	, // PF 5 ** 59 ** A5	
	PF	, // PF 6 ** 60 ** A6	
	PF	, // PF 7 ** 61 ** A7	
	PK	, // PK 0 ** 62 ** A8	
	PK	, // PK 1 ** 63 ** A9	
	PK	, // PK 2 ** 64 ** A10	
	PK	, // PK 3 ** 65 ** A11	
	PK	, // PK 4 ** 66 ** A12	
	PK	, // PK 5 ** 67 ** A13	
	PK	, // PK 6 ** 68 ** A14	
	PK	, // PK 7 ** 69 ** A15	
};

const uint16_t PROGMEM port_to_output_PGM[] = {
	NOT_A_PORT,
	(uint16_t) &PORTA,
	(uint16_t) &PORTB,
	(uint16_t) &PORTC,
	(uint16_t) &PORTD,
	(uint16_t) &PORTE,
	(uint16_t) &PORTF,
	(uint16_t) &PORTG,
	(uint16_t) &PORTH,
	NOT_A_PORT,
	(uint16_t) &PORTJ,
	(uint16_t) &PORTK,
	(uint16_t) &PORTL,
}

#define pgm_read_byte(addr) (*(const unsigned char *)(addr))

#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )
#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) )
#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) )
#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) )

static void turnOffPWM(uint8_t timer)
{
	switch (timer)
	{
		#if defined(TCCR1A) && defined(COM1A1)
		case TIMER1A:   cbi(TCCR1A, COM1A1);    break;
		#endif
		#if defined(TCCR1A) && defined(COM1B1)
		case TIMER1B:   cbi(TCCR1A, COM1B1);    break;
		#endif
		#if defined(TCCR1A) && defined(COM1C1)
		case TIMER1C:   cbi(TCCR1A, COM1C1);    break;
		#endif
		
		#if defined(TCCR2) && defined(COM21)
		case  TIMER2:   cbi(TCCR2, COM21);      break;
		#endif
		
		#if defined(TCCR0A) && defined(COM0A1)
		case  TIMER0A:  cbi(TCCR0A, COM0A1);    break;
		#endif
		
		#if defined(TCCR0A) && defined(COM0B1)
		case  TIMER0B:  cbi(TCCR0A, COM0B1);    break;
		#endif
		#if defined(TCCR2A) && defined(COM2A1)
		case  TIMER2A:  cbi(TCCR2A, COM2A1);    break;
		#endif
		#if defined(TCCR2A) && defined(COM2B1)
		case  TIMER2B:  cbi(TCCR2A, COM2B1);    break;
		#endif
		
		#if defined(TCCR3A) && defined(COM3A1)
		case  TIMER3A:  cbi(TCCR3A, COM3A1);    break;
		#endif
		#if defined(TCCR3A) && defined(COM3B1)
		case  TIMER3B:  cbi(TCCR3A, COM3B1);    break;
		#endif
		#if defined(TCCR3A) && defined(COM3C1)
		case  TIMER3C:  cbi(TCCR3A, COM3C1);    break;
		#endif

		#if defined(TCCR4A) && defined(COM4A1)
		case  TIMER4A:  cbi(TCCR4A, COM4A1);    break;
		#endif					
		#if defined(TCCR4A) && defined(COM4B1)
		case  TIMER4B:  cbi(TCCR4A, COM4B1);    break;
		#endif
		#if defined(TCCR4A) && defined(COM4C1)
		case  TIMER4C:  cbi(TCCR4A, COM4C1);    break;
		#endif			
		#if defined(TCCR4C) && defined(COM4D1)
		case TIMER4D:	cbi(TCCR4C, COM4D1);	break;
		#endif			
			
		#if defined(TCCR5A)
		case  TIMER5A:  cbi(TCCR5A, COM5A1);    break;
		case  TIMER5B:  cbi(TCCR5A, COM5B1);    break;
		case  TIMER5C:  cbi(TCCR5A, COM5C1);    break;
		#endif
	}
}

void digitalWrite(uint8_t pin, uint8_t val)
{
	uint8_t timer = digitalPinToTimer(pin);
	uint8_t bit = digitalPinToBitMask(pin);
	uint8_t port = digitalPinToPort(pin);
	volatile uint8_t *out;

	if (port == NOT_A_PIN) return;

	// If the pin that support PWM output, we need to turn it off
	// before doing a digital write.
	if (timer != NOT_ON_TIMER) turnOffPWM(timer);

	out = portOutputRegister(port);

	uint8_t oldSREG = SREG;
	cli();

	if (val == LOW) {
		*out &= ~bit;
	} else {
		*out |= bit;
	}

	SREG = oldSREG;
}
Как считаете не слишком много кода чтобы изменить стояние вывода? По нормальному это требует пары асм инструкций. А код ардиуны потребует на несколько порядков больше! Но вы можете и дальше твердить про "черный ящик" совершенно не представляя какой былокод в нем! :dont_know: :facepalm:
Ответить

Вернуться в «Разные вопросы по МК»