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


Советы начинающим программистам микроконтроллеров / Хабр

Очень давно хотелось поделиться своим опытом, с начинающими радиолюбителями, потому что об этом пишут очень мало и разрозненно. Мой опыт не хороший, не плохой, он такой какой есть. С некоторыми утверждениями вы в праве не согласиться и это нормально, ведь у каждого свое видение ситуации. Цель данного материала, обратить внимание читателя на некоторые вещи, что то взять на заметку и сформировать собственное мнение и видение ситуации, ни в коем случае нельзя воспринимать это как истину.

1. Многие начинающие электронщики не знают с чего начать, поэтому спрашивают совета. Большинство бывалых радиолюбителей ответят, что начни собирать какую нибудь схему. Естественно в голове любого начинающего сразу мелькает LCD дисплей с jpeg картинками, какой нибудь mp3 плеер или часы, без малейшей мысли о том, что не имея базовых знаний это неподъемная задача.

Я категорически против такого подхода. Обычно это все заканчивается — либо ничем, либо забитые форумы с мольбами помочь. Даже если кому то помогают, то в 90% он больше никогда не всплывет на сайтах по электронике. В остальных 10% он так и продолжает заливать форумы мольбами, его будут сначала пинать, затем поливать грязью. Из этих 10% отсеивается еще 9%. Далее два варианта: либо таки до глупой головы доходит и все же происходит goto к началу, либо в особо запущенных вариантах, его удел копировать чужие конструкции, без единой мысли о том как это работает. Из последних зачастую рождаются ардуинщики.

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

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

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

2. Перед решением задачи, дробите ее до абсурда вплоть до «припаять резистор», это помогает, проверено. Мелкие задачи решать куда проще. Когда большая задача разбита на кучу мелких действий, то все что остается — это выполнить их. Могу привести еще один годный совет, хоть он вам и покажется бредовым — заведите блокнотик и пишите в него все что собираетесь сделать. Вы думаете, итак запомню, но нет. Допустим сегодня у меня хорошее настроение и думаю о том, как собрать плату. Запиши план действий: сходить купить резистор, подготовить провода, сделать крепление дисплея. Потом все забудешь, откроешь блокнотик и смотришь — ага сегодня настроение попилить и построгать, сделаю крепление. Или собираешь ты плату и уже осталось допаять последний компонент, но не тут то было резисторы кончились, вот записал бы перед тем как паять, то вспомнил.

3. Не пользуйтесь кодогенераторами, нестандартными фичами и прочими упрощалками, хотя бы на первых этапах. Могу привести свой личный пример. Во времена активного использования AVR я пользовался кодогеном CAVR. Меня он полностью устраивал, хотя все говорили, что он кака. Звоночки звенели постоянно, были проблемы с библиотеками, с синтаксисом, с портированием, но было тяжело от этого отказаться. Я не разбирался как это работает, просто знал где и как поставить галочки.

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

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

4. Изучайте язык Си. Эх, как же часто я слышу, как начинающие радиолюбители хвалятся, что хорошо знают сишку. Для меня это стало кормом, всегда люблю проконсультироваться у таких собеседников. Обычно сразу выясняется, что язык они совершенно не знают. Могу сказать, что не смотря на кажущуюся простоту, людей которые действительно хорошо бы его знали, встречал не так много. В основном все его знают на столько, на сколько требуется для решения задач.

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

Очень многие начинающие брезгуют изучением языка, поэтому если вы не будете как все, то сразу станете на две ступени выше остальных новичков. Так же не никакой разницы, где изучать язык. На мой взгляд, микроконтроллер для этого не очень подходит. Гораздо проще поставить какую нибудь Visual studio или Qt Creator и порешать задачки в командной строке.

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

5. Изучение ассемблера? Бояться его не нужно, равно как и боготворить. Не нужно думать, что умея написать программу на ассемблере, вы сразу станете гуру микроконтроллеров, почему то это частое заблуждение. В первую очередь это инструмент. Даже если вы не планируете использовать его, то все равно я бы настоятельно рекомендовал написать хотя бы пару программ. Это сильно упростит понимание работы микроконтроллера и внутреннего устройства программ.

6. Читайте даташит. Многие разработчики, пренебрегают этим. Изучая даташит вы будете на две ступени выше тех разработчиков. Делать это крайне полезно, во первых это первоисточник, какие бы сайты вы не читали, в большинстве случаев они повторяют информацию из даташита, зачастую с ошибками и недосказанностями. Кроме того, там может находиться информация, о которой вы не задумываетесь сейчас, но которая может пригодиться в будущем. Может статься так, что вылезет какая то ошибка и вы вспомните что да, в даташите об этом было сказано. Если ваша цель стать хорошим разработчиком, то этого этапа не избежать, читать даташиты придется, чем раньше вы начнете это делать, тем быстрее пойдет рост.

7. Часто народ просит прислать даташит на русском. Даташит — это то, что должно восприниматься как истина, самая верная информация. Даже там не исключены ошибки. Если к этому добавятся ошибки переводчика, он ведь тоже человек, может даже не нарочно, просто опечататься. Либо у него свое видение, может что-то упустить, на его взгляд не важное, но возможно крайне важное для вас. Особенно смешной становится ситуация, когда нужно найти документацию на не сильно популярные компоненты.

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

Мною был проведен эксперимент: в наличии был студент, даташит и гугл переводчик. Эксперимент №1: студенту вручен даташит и дано задание самостоятельно найти нужные значения, результат — «да как я смогу», «да я не знаю английский», «я ничего не нашел/я не понял» типичные фразы, говорящие о том, что он даже не пытался. Эксперимент №2: тому же студенту, вручен все тот же даташит и тоже задание, с той разницей, что я сел рядом. Результат — через 5 минут он сам нашел все нужные значения, абсолютно без моего участия, без знания английского.

8. Изобретайте велосипед. Например, изучаете какую то новую штуку, допустим транзистор, дядька Хоровиц со страниц своей книги авторитетно заявляет, что транзистор усиливает, всегда говорите — НЕ ВЕРЮ. Берем в руки транзистор включаем его в схему и убеждаемся что это действительно так. Есть целый пласт проблем и тонкостей, которые не описываются в книгах. Прочувствовать их можно только, когда возьмешь в руки и попробуешь собрать. При этом получаем кучу попутных знаний, узнаем тонкости. Кроме того, любая теория без практики забудется намного быстрее.

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

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

9. А как бы я сделал это, если бы находился на месте разработчиков? Могу ли я сделать лучше? Каждый раз задавайте себе эти вопросы, это очень хорошо помогает продвигаться в обучении. Например, изучите интерфейсы 1wire, i2c, spi, uart, а потом подумайте чем они отличаются, можно ли было сделать лучше, это поможет осознать почему все именно так, а не иначе. Так же вы будете осознавать, когда и какой лучше применить.

10. Не ограничивайтесь в технологиях. Важно что этот совет имеет очень тонкую грань. Был этап в жизни, когда из каждой подворотни доносилось «надо бы знать ПЛИС», «а вот на ПЛИС то можно сделать». Формально у меня не было целей изучать ПЛИСины, но и пройти мимо было никак нельзя. Этому вопросу было выделено немного времени на ознакомление. Время не прошло зря, у меня был целый ряд вопросов, касаемых внутреннего устройства микроконтроллеров, именно после общения с плисинами я получил ответы на них. Подобных примеров много, все знания, которые я приобретал в том или ином виде, рано или поздно пригодились. У меня нет ни единого бесполезного примера.

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

11. Если спросить начинающего радиолюбителя, что ему больше нравится программирование или схемотехника, то с вероятностью 99% ответ будет программирование. При этом большую часть времени эти программисты тратят на изготовление плат ЛУТом/фоторезистом. Причины в общем то понятны, но довольно часто это переходит в некий маразм, который состоит в изготовлении плат ради изготовления плат.

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

12. Следующий совет, особенно болезненный, мне очень не хочется его обсуждать, но надо. Часто мне пишут, мол ххх руб за ууу дорого, где бы подешевле достать. Вроде бы обычный вопрос, но обычно я сразу напрягаюсь от него, так как зачастую он переходит в бесконечные жалобы на отсутствие денег. У меня всегда возникает вопрос: почему бы не оторвать пятую точку и не пойти работать? Хоть в тот же макдак, хоть на стройку, потерпеть месяц, зато потом можно приобрести парочку плат, которых хватит на ближайший год. Да я знаю, что маленьких городах и селах сложно найти работу, переезжайте в большой город. Работайте на удаленке, в общем нужно крутиться. Просто жаловаться нет смысла, выход из ситуации есть, кто ищет его тот находит.

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

Не говорю что дешевое = плохое, нет — все зависит от ситуации. Вернусь к примеру кримпера, было время когда обжимал чем попало, поэтому часто возникали проблемы. Особенно неприятно, когда заводишь плату и она не работает, после долгих поисков ошибки понимаешь что из-за плохо обжатого проводочка, обидно. С тех пор как появилась нормальная обжимка этих проблем нет. Да внутренняя жаба и квакала, и душилась от ее стоимости, но ни разу не пожалел об этом решении. Все что я хочу сказать, что поработав с нормальным инструментом, совершенно не хочется возвращаться к плохому, даже не хочется обсуждать это. Как показывает практика, лучше не экономить на инструментах, если сомневаетесь — возьмите у кого нибудь потестить, почитайте отзывы, обзоры.

14. Заведите сайт, можно писать на нем, что угодно, просто как записки. Практика показывает, что работодатели все равно его не читают, но сам факт производит большой эффект.

15. Тонкий вопрос: профильное высшее образование, нужно ли оно? Мне известны не единичные случаи, когда люди работали абсолютно без образования и по опыту и знаниям они могли дать прикурить любому дипломированному специалисту. Собственно, у меня нет профильного образования, испытываю ли я от этого дискомфорт? В определенной степени да.

Еще в самом начале, когда микроконтроллеры были для меня хобби, я много помогал с курсовыми и дипломами разных вузов, просто чтобы оценить свой уровень. Могу сказать уверенно, что уровень в целом невысок вне зависимости от имени вуза. Учиться несколько лет, для того чтобы написать такой диплом, совершенно необязательно. Достигнуть этого можно самостоятельно за весьма короткий срок. И все же зачастую бывали моменты, когда студенты знали какой то предмет, который они проходили на 2-3 курсе, а я этого не знал. Хоть все эти знания и компенсировались самообразованием, но все же лучше было бы не тратить на это время.

Вуз ради бумажки. Могу сказать, что были и такие ситуации, когда предлагали работу, которая требовала обязательного наличия образования и было обидно, что именно в тот момент бумажки не было. Но в целом, история показывает, что большинству работодателей наплевать на вашу бумажку.

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

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

Если подытожить то совет таков: если есть хоть малейшая возможность — нужно идти учиться, обязательно по профилю, если есть хоть какие то шансы, то лезть везде, а не отсиживать штаны на задней парте. Заводить знакомства, параллельно дома самому практиковаться, развиваться.

16. Поздно ли начинать программировать в 20, 30, 40, 50 лет? Практика других людей показывает, что возраст вообще не помеха. Многие почему то не учитывают то, что есть целый пласт работы, которую молодые в силу своих амбиций не хотят делать. Поэтому работодатели предпочитают брать тех, кто будет ее тащить. Это ваш шанс зацепиться, а дальше все зависит только от вас.

И последний совет. Многие радиолюбители необщительные, сердитые и раздражительные — считайте это спецификой работы. Излучайте добро и позитив, будьте хорошим человеком.

embedded - Насколько сложно разработчику программного обеспечения научиться программировать микроконтроллер?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

Руководство для начинающих по микроконтроллерам

от Джона Уайлдера

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

Эта статья не пытается рассказать о каком-либо конкретном микроконтроллере / микропроцессоре, но представляет собой скорее учебник, объясняющий общие концепции, применимые ко всем микроконтроллерам / микропроцессорам.

Во-первых, давайте ... зададим себе пару вопросов. Первый вопрос -

Что такое микроконтроллер?
Микроконтроллер - это крошечный микрокомпьютер на микросхеме. Он имеет ЦП, ОЗУ (оперативное запоминающее устройство), регистры специальных функций, память ПЗУ программ, память ПЗУ данных, от одного до нескольких портов параллельного ввода / вывода (ввода / вывода) и может иметь множество встроенных периферийных устройств, включая но не ограничиваясь аналого-цифровой преобразователь (АЦП), цифро-аналоговый преобразователь (ЦАП), Serial UART, один или несколько таймеров, / на источник опорного напряжения чипа, захвата / сравнения / ШИМ (широтно-импульсная модуляция) модуля компараторов , Главный синхронный последовательный порт для связи SPI (последовательный периферийный интерфейс) / I2C (меж интегральная схема), порт USB, порт Ethernet, встроенные генераторы, а также множество других периферийных устройств.

Что такое микропроцессор (подождите, вы имеете в виду, что разница действительно есть)?
Микропроцессор - это все, чем является микроконтроллер, но без программного ПЗУ на кристалле. Программный код находится вне кристалла в отдельной внешней микросхеме EPROM.

ПЗУ программ и ПЗУ данных
Встроенная память ПЗУ (постоянное запоминающее устройство) микроконтроллера подобна жесткому диску микроконтроллера. Имеет две перегородки. Один раздел зарезервирован для хранения программного кода, а другой раздел зарезервирован для постоянного хранения данных, которые используются микросхемой во время нормального выполнения программы.На данном микроконтроллере PIC, имеющем, скажем, 8 Кбайт программного пространства, программное пространство будет занимать адреса ПЗУ 0x0000 - 0x1FFF (или 0-8191 в десятичном виде). Пространство данных начнется с адреса ПЗУ программы 0x2100. Если бы пространство ПЗУ данных было 256 байтов, оно занимало бы адреса ПЗУ 0x2100 - 0x21FF (или 8448-8704 в десятичной системе).

CPU
CPU означает центральный процессор. По сути, это «мозг» микроконтроллера. Это то, что извлекает инструкции из памяти кода и выполняет полученные инструкции.

ОЗУ данных
ОЗУ данных (оперативное запоминающее устройство) - это пространство данных, которое используется для временного хранения значений констант и переменных, которые используются микроконтроллером во время нормального выполнения программы. Объем физического пространства RAM на данном микроконтроллере варьируется от одного микроконтроллера к другому. ОЗУ данных на микроконтроллере организовано в несколько «регистров», каждый из которых имеет свой уникальный «адрес». Регистр RAM на 8-битном микроконтроллере может содержать всего 8 бит или один байт данных.Типичная спецификация пространства ОЗУ может указывать, что оно составляет 256 x 8. Это означает, что всего в ОЗУ 256 регистров, и эти регистры могут содержать 8 бит каждый.

Регистр - это просто место в памяти, в которое вы можете записывать или читать данные. Некоторые из нас называют регистры «местонахождением».

Регистры специальных функций
Регистры специальных функций (или просто SFR) в микроконтроллере аналогичны регистрам в ОЗУ данных. Вы можете записывать в них данные, а также читать из них данные.Они отличаются тем, что некоторые SFR напрямую управляют аппаратным обеспечением микроконтроллера, а другие управляются аппаратным обеспечением микроконтроллера.

Каждый бит в SFR назначается функции. В SFR у вас есть биты управления и биты флагов. Управляющие биты подобны «переключателям», которые включают или выключают функцию в зависимости от того, записываете ли вы 1 или 0 в эту битовую позицию в SFR. Биты флагов похожи на «световые индикаторы», которые указывают, существует ли данное условие, в зависимости от того, равен ли бит флага 1 или 0.Биты управления напрямую управляют оборудованием. Биты флагов контролируются оборудованием. В любой данной программе мы обычно записываем в управляющие биты, пока читаем биты флагов (некоторые биты флагов должны быть очищены вручную путем записи в них, в зависимости от микроконтроллера… подробнее об этом позже).

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

Конфигурационные биты
Большинство микроконтроллеров имеют специальные биты, известные как «биты конфигурации». Эти биты настраивают специальные параметры микроконтроллера, включая, помимо прочего, -

.

* Тип осциллятора
* Сторожевой таймер Вкл. / Выкл.
* Таймер включения / Выкл.
* Сброс при пониженном напряжении Вкл. / Выкл.
* Вкл. / Выкл. Программирование низкого напряжения Вкл. / Выкл.

В микроконтроллере PIC есть даже биты конфигурации для защиты программного кода и защиты кода данных.Эти биты предотвращают чтение программы или пространств данных внешним программным оборудованием, чтобы другие не могли украсть ваш код. На микросхеме Atmel AT89S (производной от 8051) это устанавливается так называемыми «битами блокировки».

Некоторые называют биты конфигурации «битами предохранителя». Это происходит из-за старых микропроцессоров, у которых были настоящие «предохранители» на микросхеме, которые перегорали, если были отключены определенные функции управления битами предохранителей. Эти предохранители были «программируемыми один раз»… после того, как они перегорели, их невозможно было «отключить».Однако с появлением флэш-памяти, доступной на современных микроконтроллерах, на микросхеме больше нет буквальных «предохранителей». Но сам термин перенесен из-за того, что биты конфигурации по существу обеспечивают тот же контроль, что и биты предохранителей.

АЛУ (Арифметико-логический блок)
Этот аппаратный компонент по существу отвечает за все математические и логические операции, выполняемые микроконтроллером. На большинстве микроконтроллеров с ALU будет связано 3 битовых флага -

* Нулевой бит - Этот бит флага устанавливается в 1 аппаратным обеспечением, когда математическая операция приводит к нулевому результату.Он будет сброшен на 0 оборудованием, когда математическая операция даст ненулевой результат.

* Бит переноса / заимствования - этот бит флага работает как бит переноса для операций сложения, а также как флаг заимствования для операций вычитания. «Перенос» происходит, когда результат операции сложения приводит к значению, превышающему то, что регистр может хранить. 8-битный регистр может содержать максимальное значение 255 (FF в шестнадцатеричном формате или 11111111 в двоичном).

Если операция сложения приводит к результату больше 255, флаг переноса устанавливается в 1.Если в результате операции сложения результат меньше 255, перенос не происходит, поэтому флаг переноса сбрасывается до 0.

Для операций вычитания вместо этого флаг переноса работает как флаг заимствования. Флаг заимствования работает наоборот, чем флаг переноса. Если операция вычитания приводит к отрицательному результату, флаг заимствования сбрасывается до 0. Если операция вычитания дает положительный результат, флаг заимствования устанавливается на 1.

* Бит переноса / заимствования цифр - этот бит флага выполняет то же действие, что и флаг переноса / заимствования, но работает только для указания того, происходит ли перенос / заимствование только между битами 3 и 4.

Биты флага ALU могут быть прочитаны в любое время, чтобы узнать, были ли результаты математических операций нулевыми, положительными / отрицательными, больше / меньше и т. Д. И т. Д.

Нулевой бит - это удобный флаговый бит, который позволяет нам сравнивать два значения, чтобы увидеть, равны ли они / не равны. Если мы возьмем два числа и вычтем их, результат будет равен нулю, если они равны, и ненулевым, если не равны. Итак, чтобы сравнить два значения, чтобы увидеть, равны ли они / не равны, мы вычитаем их, затем читаем / проверяем нулевой бит, чтобы узнать, равен ли бит 1 или 0.Если нулевой бит = 1, результат вычитания равен нулю, что означает, что два значения равны. Если нулевой бит = 0, результат вычитания не равен нулю, что означает, что два значения не равны.

Бит переноса / заимствования - это удобный флаг, который позволяет нам сравнивать два значения, чтобы увидеть, больше или меньше одно значение другого. Пример… у нас есть два значения: VALUE1 и VALUE2. В коде выполняем эту операцию -

VALUE1 - VALUE2 = VALUE3

После выполнения операции вычитания мы считываем / проверяем высокое / низкое состояние бита переноса / заимствования.

Если VALUE2 больше VALUE1, результат вычитания будет отрицательным, что сбросит бит переноса / заимствования в 0. Если VALUE2 меньше VALUE1, результат вычитания будет положительным, что установит перенос / одолжить бит до 1.

Обратитесь к таблице данных, чтобы узнать, какой SFR содержит эти биты. На микроконтроллерах PIC биты флага ALU находятся в STATUS SFR. В MCS-51 они находятся в PSW SFR (слове состояния программы).

Программный счетчик
Программный счетчик - это «адресный указатель», который сообщает CPU, где найти следующую инструкцию для выполнения в программном ПЗУ.ЦП получит инструкцию, которая находится по адресу ПЗУ программы, загруженному в текущий момент в счетчик программ.

Когда микроконтроллер перезагружается, счетчик программ устанавливается на 0x0000. ЦП получит инструкцию, которая находится по адресу ПЗУ программы 0x0000. После получения этой инструкции счетчик программ автоматически увеличивается до значения 0x0001. Счетчик программ непрерывно автоматически увеличивается на значение 1, что заставляет ЦП последовательно обращаться к содержимому каждой ячейки регистра в программном ПЗУ.Это продолжается до тех пор, пока ЦП не получит и не выполнит инструкцию, которая изменяет значение счетчика программ. Такими инструкциями, которые делают это, являются инструкции перехода (ajmp и ljmp на MCS-51, goto на PIC), вызовы подпрограмм (acall и lcall на MCS-51, вызов на PIC) и любые инструкции, которые добавляют или вычитают значение из или из счетчик программ.

Стек
Стек в микроконтроллере в основном используется во время вызовов подпрограмм и переходов к обработчику прерывания.Это буфер «Последний вошел - первым ушел», который используется для хранения адресов возврата. Во время вызова подпрограммы адрес текущего программного счетчика «помещается» в стек с добавлением к нему +1 смещения, затем программный счетчик изменяется на значение адреса, в котором находится вызываемая подпрограмма. Это заставляет счетчик программы переходить к коду подпрограммы для выполнения подпрограммы.

В конце подпрограммы будет инструкция «возврата» (возврат на MCS-51, возврат на PIC). После выполнения инструкции возврата стек «выталкивается», и последнее значение адреса ПЗУ, которое было помещено в стек, выталкивается из стека и возвращается в счетчик программ.Это заставляет счетчик программ вернуться к инструкции, которая находится после инструкции, которая вызвала подпрограмму (отсюда необходимость смещения +1 в то время, когда адрес ПК помещается в стек), и выполнение программы продолжается с того места, где оно было остановлено. перед вызовом подпрограммы.

Некоторые микроконтроллеры имеют «программный стек» (MCS-51). Программный стек использует часть внутренней памяти микроконтроллера в качестве пространства стека. Другие микроконтроллеры имеют аппаратный стек (PIC).В аппаратном стеке стек представляет собой собственное выделенное пространство, отдельное от всех остальных пространств памяти кристалла.

На некоторых микроконтроллерах стек доступен для записи. Это позволяет нам использовать стек для временного резервного копирования критических регистров во время вызовов подпрограмм и выполнения обработчика прерываний. Перед выполнением подпрограммы или обработчика прерывания содержимое регистров для резервного копирования помещается в стек. Затем, непосредственно перед возвратом из подпрограммы или обработчика прерывания, содержимое, которое мы поместили в стек в начале подпрограммы, извлекается из стека по одному, а затем восстанавливается в исходное положение в обратном порядке по сравнению с тем, как они были помещены в стек (помните… Последним пришел - первым ушел).

Хорошим примером этого может быть резервное копирование аккумулятора и регистров PSW на MCS-51 во время выполнения подпрограммы обработчика прерывания -

Код (текст):

push ACC; резервное копирование аккумулятора в стек
push PSW; резервное копирование слова состояния программы в стек

; здесь выполнить код обработчика прерывания

pop PSW; восстановить слово состояния программы
pop ACC; восстановить аккумулятор
reti; вернуться к основному коду из прерывания

Как видите, мы сначала помещаем содержимое аккумулятора в стек, а затем помещаем содержимое PSW в стек после него.Затем выполняется код обработчика прерывания.

После выполнения кода обработчика прерывания PSW сначала извлекается из стека, затем аккумулятор извлекается из стека после него… в порядке, обратном тому, как они были вытолкнуты.

Типичный SFR
Типичный SFR настроен, как показано ниже.

Код (текст):

| ПОРТ 1 SFR |
———————————————————
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

Это SFR защелки порта на микроконтроллере MCS-51 для параллельного порта 1. Каждый порт MCS-51 является 8-битным параллельным портом, и каждый бит в SFR порта назначен каждому контакту порта. P1.0 будет контактом 0 порта 1, P1.1 будет контактом 1 порта 1, P1.2 будет контактом 2 порта 1 и т. Д. И т. Д.

Как показано, у нас есть все нули, записанные в каждый бит в SFR защелки порта 1.Это переведет все контакты порта 1 в состояние низкого уровня (0 вольт). Если бы мы записали единицы в любой из битов SFR порта, это установит контакт, связанный с позицией бита, в которую мы записываем «1», в состояние высокого уровня (+ 5В).

Пример, давайте запишем значение 01010101 в SFR порта 1 -

Код (текст):

| ПОРТ 1 SFR |
———————————————————
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |

Как показано, это переведет контакты P1.0, P1.2, P1.4 и P1.6 в состояние высокого уровня, а контакты P1.1, P1.3, P1.5 и P1.7 - в состояние низкого уровня.

Несколько слов о таблицах данных ... и почему они так важны
Не все микроконтроллеры созданы равными. Каждый из них разработан с использованием определенного оборудования на кристалле. Все микроконтроллеры разных производителей имеют разную архитектуру.Вы обнаружите, что микроконтроллеры PIC сильно отличаются от микроконтроллеров MCS-51, так же как MCS-51 сильно отличается от, скажем, Motorola 65xx в том, как реализованы SFR, как организована ОЗУ данных, набор команд, конфигурационное слово, как параллельные порты работают и т.д. и т.п.

ЕДИНСТВЕННЫЙ способ точно узнать, как работать с микроконтроллером и его оборудованием, - это просмотреть его техническое описание. В таблице данных объясняется каждый SFR, каждая часть встроенного оборудования, абсолютные максимальные электрические характеристики, организация памяти программ / данных, как подключены параллельные порты и как они работают, сводка набора инструкций (для тех из вас, кто кодирует на ассемблере). язык) и т. д.Практически все, что вам, как программисту, необходимо знать о своем микроконтроллере, находится в его техническом описании.

Большинство из них находятся в свободном доступе в Интернете с помощью простого поиска в Google (я еще не нашел ни одного, которого нет). Заявление о том, что вы не смогли найти таблицу, не является приемлемым оправданием, когда дело доходит до этого. ЕДИНСТВЕННАЯ причина, по которой кто-либо откажется просматривать таблицу, - это либо то, что он слишком ленив, либо он не понимает их, но не хочет, чтобы другие знали, что они этого не делают.Я скажу прямо сейчас ... на большинство вопросов форума, касающихся микроконтроллеров, можно было бы ответить самостоятельно, если бы человек нашел время, чтобы найти ответ в таблице данных.

Даташиты являются обязательными. Без них вы не сможете написать собственный код.

Об авторе
Джон Уайлдер - внештатный инженер-электронщик и энтузиаст электроники более 20 лет. Он четыре года проработал в ВМС США в качестве специалиста по авиационной электронике.Джон также играет на гитаре с 13 лет и начал интегрировать электронику и музыку с 15 лет. Джон построил свой первый ламповый усилитель в 17 лет. «Музыкальная электроника», - говорит Джон, - его любовь и страсть.

Джон также является частым участником и страстным членом инженерного сообщества Electro-Tech-Online. В Electro-Tech-Online вы можете задавать вопросы и получать ответы от своих коллег-инженеров по всему, от микроконтроллеров, возобновляемых источников энергии и автомобильной электроники до моделирования схем и проектирования.Кроме того, существуют форумы для микроконтроллеров 8051/8951, AVR, ARM, Arduino, Oshonsoft Project, а также репозиторий кода, где участники обмениваются фрагментами кода.

Следуйте за Джоном в Twitter: @PICmcuguy.

.Учебники по микроконтроллерам

- станьте экспертом в программировании микроконтроллеров и цифровой электронике!

*** Новое эксклюзивное руководство ***

Получите знания первым. Подробно узнайте, как общаться и программировать I2C / TWI (двухпроводной интерфейс). Вы станете экспертом и сможете создавать свои собственные библиотеки с этим видео.

Учебное пособие по микроконтроллеру

для начинающих

Если вы новичок и хотите получить знания о микроконтроллерах, вы можете найти что эта серия руководств идеально подходит.В этом руководстве исследуются различные использует и особенности популярного микроконтроллера AVR Atmega32. В руководстве показано реальные программы пишутся и объясняются с помощью разработки схем. Базовый и средний концепции программирования и способы их использования также предоставляются. Через множество примеры, вы можете быстро стать экспертом во встроенных системах.

Микроконтроллер - Введение

Изучите основные функции микроконтроллера AVR Atmega32 и некоторую информацию об использовании каждого контакта.Также кратко объясняется программирование чипа (получение программы на чипе).

Программист MCU 1

Пачкаем руки и создаем удобный интерфейс для программатора ключа к соответствующим выводам микроконтроллера.

Программист MCU 2

Установлен драйвер для программатора, который используется для передачи кода на микроконтроллер.Процесс установки совместим с операционной системой Windows 7, а также с предыдущими версиями Windows.

Установка MCU WinAVR

Драйвер и интерфейс готовы, но требуется среда программирования, чтобы фактически писать программы и передавать их в микроконтроллер. В этом руководстве мы создали среду программирования AVR-GCC под названием winavr.

MCU Добавить светодиод и тест

Узнайте больше о светодиоде (светоизлучающем диоде) и о том, как подключить его к микроконтроллеру, чем вы, наверное, все хотели знать.

Первая программа MCU

Напишите первую программу микроконтроллера, которая будет что-то делать со светодиодом и передать ее микроконтроллеру.Это настоящий тест, чтобы убедиться, что все предварительные настройки работают.

Мигает светодиод MCU

Мы еще немного углубимся в программирование микроконтроллера и заставим светодиод мигать.

Установка Atmel Studio 6

Узнайте, как установить Atmel Studio 6 и настроить функции программирования микроконтроллера.

MCU Добавить кнопку

В этом руководстве мы добавляем возможность взаимодействия человека с микроконтроллером. Добавлена ​​кнопка для изменения скорости мигания светодиода.

Отключение кнопки

Очень важная тема, которую необходимо решить с помощью кнопок и их взаимодействия с микроконтроллером.

Программное обеспечение Debounce

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

Игра в кнопку

Теперь мы выводим светодиоды и кнопки на совершенно новый уровень и создаем игру с микроконтроллером.

Создание библиотеки кнопок

Абстрагирование кода кнопки и программного обеспечения в библиотеке, чтобы программирование основного микроконтроллера было более компактным.

Таймеры Счетчики Базовые

тик-так, тик-так.Узнайте, как микроконтроллер считает и время. Узнайте, как запрограммировать микроконтроллер для управления таймером и счетчиком.

Введение в прерывания

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

Подключение к ЖК-дисплею

ЖК-дисплеи (жидкокристаллический дисплей) - отличный способ увидеть, что происходит, предоставляют информативный способ вывода данных с микроконтроллера.

Первая ЖК-программа

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

ЖК-дисплей и струны

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

Цифры на ЖК-дисплее

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

Разделение ЖК-кода

Пришло время разгрузить код main.c и перенести все процедуры ЖК-дисплея в их собственную библиотеку, чтобы файл main.c был более читабельным. Это сделает программирование микроконтроллера намного более увлекательным.

Функция отображения целых чисел

Создайте новую функцию в библиотеке MrLCD для отображения целого числа в указанном месте.Программирование микроконтроллера станет немного более читаемым, а общее количество строк кода для основной программы микроконтроллера будет уменьшено.

Источники энергии

Вам интересно, как включить микроконтроллер без помощи USB-порта компьютера? В этом руководстве будет показано, как использовать батареи, сетевой адаптер или порт USB для питания микроконтроллера.

Изготовление соединителей

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

Потенциометры

Вы действительно знаете, как работает потенциометр? Вы знаете, как сделать из него супер крутой делитель напряжения? Узнайте, как использовать потенциометр для получения переменного напряжения, чтобы его можно было использовать в АЦП (аналого-цифровой преобразователь) на микроконтроллере.

Введение в АЦП

Узнайте, как работает АЦП (аналого-цифровой преобразователь), и дайте несколько советов по поддержанию вашего аналогового сигнала и вашего микроконтроллера.

ADC - Первая программа

Давайте напишем нашу первую программу АЦП и пусть микроконтроллер считывает напряжение, поступающее с потенциометра.

АЦП и 10-битные

Увеличьте разрешение АЦП микроконтроллера, зафиксировав 10-битный результат (результат будет в диапазоне от 0 до 1023).

Акселерометры / АЦП

Узнайте об акселерометрах и о том, как конкретная разновидность связана с микроконтроллером.

Измерьте шум АЦП

Вы постоянно слышите шум от АЦП, и это сводит вас с ума? Это руководство покажет вам, как измерить этот шум и увидеть, как результаты измерений падают, когда к сигналу и микроконтроллеру применяются методы шумоподавления.

Несколько каналов АЦП

Итак, одного датчика или устройства, подключенного к АЦП микроконтроллера, недостаточно? Что ж, посмотрим, как использовать другие каналы АЦП.

Введение в сервоприводы Hobby

Сделайте ход с сервоприводами и приготовьтесь узнать, как подключить эти устройства к микроконтроллерам.

Введение в ШИМ

Изучите детали ШИМ (широтно-импульсной модуляции) и узнайте, что нам нужно знать, чтобы начать вывод сигналов ШИМ с микроконтроллера на различные устройства.

Управление сервоприводом с помощью ШИМ

Теперь, когда у нас есть понимание некоторых концепций ШИМ, давайте управлять сервоприводом с микроконтроллера! Мы углубимся в суть настоящего понимания ШИМ и того, как ШИМ сможет управлять рогом сервопривода для хобби.

Детали UART и USART

Использование микроконтроллера для связи с функциями UART и USART.

UART One Way Comm.

Использование UART для связи от передающего микроконтроллера к принимающему микроконтроллеру.

Программирование I2C (Эксклюзив)

Получите подробные инструкции о том, как кодировать I2C / TWI (двухпроводной интерфейс) с помощью микроконтроллера Atmega 324p.В этом эксклюзивном видео мы будем общаться с ускорителем ADXL.

.

c - Какой язык выучить для программирования микроконтроллеров?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
.

Смотрите также