All posts by DI HALT

AVR. Учебный курс. Ветвления на индексных переходах

Таблицы переходов
Вот представь, что нам надо сделать мега CASE, когда на вход валится число от 1 до 100 и нам надо сто вариантов действий.

Как будешь делать? Если лепить сто штук CPI с последующими переходами, то можно дальше убиться головой об стену. У тебя только эти CPI/BR** сожрут половину памяти кристалла. Учитывая, что каждая CPI это два байта, а каждый BR** еще байт. А о том сколько тактов эта шняга будет выполняться я даже не упоминаю.

Делается это все круче. Помнишь я тебе рассказывал в прошлых уроках о таких командах как ICALL и IJMP. Нет, это не новомодная яблочная истерия, а индексный переход. Прикол в том, что переход (или вызов подпрограммы, не важно) осуществляется тут не по метке, а по адресу в регистре Z (о том что Z это пара R30:R31 я пожалуй больше напоминать не буду, пора бы запомнить).
(далее…)

Read More »

AVR. Учебный курс. Флаги и условные переходы

Есть в AVR (да и, пожалуй, во всех остальных процессорах) особый регистр SREG. О нем я несколько раз упоминал в прошлых статьях, но не вдавался в подробности. Чтож, пришло время рассказать, что же это же SREG такой и зачем он нужен.

SREG это регистр состояния ядра. Он так называется Status Register. В этом регистре находится независимых битов — флажков. Которые могут быть либо 1 либо 0, в зависимости от выполненных в прошлом операций.

И вот по тому какие флаги стоят, можно понять что произошло с процессором и что нам дальше делать.

Например, если флаг Z (Zero) выставлен в 1, значит в ходе вычисления предыдущей математической операции в результате образовался ноль.

А если выставлен флаг С (Carry — заем, перенос), то мы из меньшего числа отняли большее, или же прибавили такое число, что результат стал больше 255.

А теперь подробней по каждому флагу.
(далее…)

Read More »

AVR. Учебный курс. Подпрограммы и прерывания

Подпрограммы
Когда один и тот же участок кода часто повторяется, то разумно как то его вынести и использовать многократно. Это дает просто колоссальный выйгрыш по обьему кода и удобству программирования.

Вот, например, кусок кода, передающий в регистр UDR байты с некоторой выдержкой, выдержка делается за счет вращения бесконечного цикла:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
	.CSEG
	LDI R16,Low(RAMEND)	; Инициализация стека
	OUT SPL,R16		; Обязательно!!!
 
	LDI R16,High(RAMEND)
	OUT SPH,R16
 
	.equ	Byte 	= 50
	.equ 	Delay 	= 20
 
	LDI	R16,Byte	; Загрузили значение
Start:	OUT	UDR,R16		; Выдали его в порт
 
	LDI	R17,Delay	; Загрузили длительность задержки
M1:	DEC	R17		; Уменьшили на 1
	NOP			; Пустая операция
	BRNE	M1		; Длительность не равна 0? Переход если не 0
 
	OUT	UDR,R16		; Выдали значение в порт
 
	LDI	R17,Delay	; Аналогично
M2:	DEC	R17
	NOP
	BRNE	M2
 
	OUT	UDR,R16
 
	LDI	R17,Delay
M3:	DEC	R17
	NOP
	BRNE	M3
 
	RJMP	Start		; Зациклим программу

Сразу напрашивается повторяющийся участок кода вынести за скобки.

1
2
3
4
	LDI	R17,Delay
M2:	DEC	R17
	NOP
	BRNE	M2

Для этих целей есть группа команд перехода к подпрограмме CALL (ICALL, RCALL, CALL)
И команда возврата из подпрограммы RET
(далее…)

Read More »

AVR. Учебный Курс. Работа с памятью

Так, с работой ядра на предмет переходов и адресации разобрались. Пора обратить свой взор в другую область — память.

Ее тут два вида (EEPROM не в счет т.к. она вообщет переферия, а о ней потом):

  • RAM — оперативка
  • ROM — ПЗУ, она же flash, она же память программ

Так как архитектура у нас Гарвардская, то у оперативы своя адресация, а у флеша своя. В даташите можно увидеть структуру адресации ОЗУ.

Сразу обратите внимание на адреса! РОН и регистры периферии, а также ОЗУ находятся в одном адресном пространстве. Т.е. адреса с 0000 по 001F занимают наши регистры, дальше вплоть до адреса 005F идут ячейки ввода-вывода — порты. Через порты происходит конфигурирование всего, что есть на борту контроллера. И только потом, с адреса 0060 идет наше ОЗУ, которое мы можем использовать по назначению.

Причем обратите внимание, что у регистров I/O есть еще своя адресация — адресное пространство регистров ввода-вывода (от 00 до 3F), она указана на левой части рисунка. Блок IO/Register Эта адресация работает ТОЛЬКО в командах OUT и IN Из этого вытекает интересная особенность.
(далее…)

Read More »

AVR. Учебный курс. Простейшая программа.

Итак, прежде чем что то делать надо понять как вообще выполняется программа в контроллере, как работает ядро процессора. Для этого нам хватит AVR Studio и его эмулятора. Не очень интересно, может даже занудно, но если этот шаг пропустить, то дальнейшие действия будут как бег в темноте.

Поскольку в демоплате Pinboard используется процессор ATmega16, то рассматривать мы будем именно его. Впрочем, как я уже говорил, для других контроллеров AVR это также будет справедливо. Отличия, конечно, есть, но они не существенные.

Запускаем AVR Studio (далее просто студия) и в выскочившем мастере сразу же создаем проект:

Откроется окно:

Увеличить

Оно может выглядеть чуток не так. Дело в том, что интерфейс студии очень легко конфигурируется и перекраивается под себя. Так что можно перетащить панели как нам удобно. Что я и сделал.

Систему команд хорошо бы распечатать себе на листочке. Их там всего около 130, кратким списком (тип команды, что делает и какие операнды) занимает пару листов формата А4. Учить не надо, прочитать раз на десять, чтобы помнить знать что у нас есть. Даже я периодически подглядываю в систему команд, хотя пишу на ассемблере уже много лет.
Я же команды которые буду использовать буду описывать по мере появления.
(далее…)

Read More »

AVR. Учебный курс. Макроассемблер

Перед изучением системы команд микроконтроллера надо бы разобраться в инструментарии. Плох тот плотник который не знает свой топор. Основным инструментом у нас будет компилятор. У компилятора есть свой язык — макроассемблер, с помощью которого жизнь программиста упрощается в разы. Ведь гораздо проще писать и оперировать в голове командами типа MOV Counter,Default_Count вместо MOV R17,R16 и помнить что у нас R17 значит Counter, а R16 это Default_Count. Все подстановки с человеческого языка на машинный, а также многое другое делается средствами препроцессора компилятора. Его мы сейчас и рассмотрим.
(далее…)

Read More »

AVR Studio ликбез

Установка.
Сначала надо с сайта atmel.com скачать последнюю версию AVR Studio. Весит она что то около 30 метров. Можно и старые релизы использовать, не преступно, но там может не оказаться новых микроконтроллеров. AVR Studio, как и многие буржуйские программы, крайне хреново понимает русские имена и длинные пути. Поэтому ставь ее по максимально простому пути, что то вроде C:\AVR\ А сами проекты тоже держи как можно ближе к корню, У меня, например, это D:\Work\AVR — никаких имен длинней 8 символов и, конечно же, никаких русских символов. Привет родимый DOS, как говорится.

Да, если планируешь (если не планируешь, то все равно скачай и поставь, не помешает) писать на Си, то рекомендую скачать GCC aka WinAVR и установить ее ДО студии, туда же, поближе к корню. Тогда студия подхватит ее в качестве своего плагина. Если поставить после, то тоже, может быть подхватит, но возможны проблемы.
(далее…)

Read More »

AVR. Учебный курс. Архитектура.

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

Основой любого микроконтроллера является вычислительное ядро. Во всех моделях AVR оно практически одинаковое и это большой плюс. Именно единство архитектуры обеспечивает легкую переносимость кода.

Итак, что же у нас в основе микроконтроллера, взгляни на диаграмму:

Ядро состоит, в первую очередь, из памяти программ (Flash Programm Memory) и Арифметико-логического устройства (ALU), блока управления (на диаграмме не показан) и программного счетчик (Program Counter). Также есть тактовый генератор, задающий импульсы относительно которых работают блоки микроконтроллера. Тактовый генератор можно сравнить с маятником и собачкой в будильнике: маятник туда сюда, собачка тикает по одному зубчику — шестеренки крутятся. Встала собачка — встал весь будильник.

При старте микроконтроллера значение программного счетчика равно 0000 — это адрес первой команды в нашей flash ROM. Микроконтроллер хватает оттуда два байта (код команды и ее аргументы) и отдает на выполнение в декодер команд (Instruction Decoder).

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

Read More »

C vs Assembler

Если ты впервые столкнулся с микроконтроллерами, то наверняка у тебя стал выбор на чем писать.

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

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

Read More »

AVR. Учебный Курс. Вводная. Что такое микроконтроллер.

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

Но, если сильно все упростить, то основной функцией микроконтроллера является «дрыганье ножками». Т.е. у него есть несколько выводов (от 6 до нескольких десятков в зависимости от модели) и на этих выводах он может выставить либо 1 (высокий уровень напряжения, например +5вольт), либо 0 (низкий уровень напряжения, около 0.1 вольта) в зависимости от программного алгоритма зашитого в его память. Также микроконтроллер может определять состояние сигнала на своих ножках (для этого они должны быть настроены на вход) — высокое там напряжение или низкое (ноль или единица). Современные микроконтроллеры также почти поголовно имеют на борту Аналогово Цифровой Преобразователь — это штука подобная вольтметру, позволяет не просто отследить 0 или 1 на входе, а полноценно замерить напряжение от 0 до опорного (обычно опорное равно напряжению питания) и представить его в виде числа от 0 до 1024 (или 255, в зависимости от разрядности АЦП)

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

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

Read More »

Основы на пальцах. Часть 3

Диод
Так работает диод
Так работает диод

  Это такая хитрая фиговина, пропускающая ток только в одну сторону. Его можно сравнить с ниппелем. Применяется, например, в выпрямителях, когда из переменного тока делают постоянный. Или когда надо отделить обратное напряжение от прямого. Погляди в схему программатора (там где был пример с делителем). Видишь стоят диоды, как думаешь, зачем? А все просто. У микроконтроллера логические уровни это 0 и 5 вольт, а у СОМ порта единица это минус 12 вольт, а ноль плюс 12 вольт. Вот диод и отрезает этот минус 12, образуя 0 вольт. А поскольку у диода в прямом направлении проводимость не идеальная (она вообще зависит от приложенного прямого напряжения, чем оно больше, тем лучше диод проводит ток), то на его сопротивлении упадет примерно 0.5-0.7 вольта, остаток, будучи поделенным резисторами надвое, окажется примерно 5.5 вольт, что не выходит за пределы нормы контроллера.
Выводы диода называют анодом и катодом. Ток течет от анода к катоду. Запомнить где какой вывод очень просто: на условном обозначнеии стрелочка и палочка со стороны катода как бы рисуют букву К вот, смотри —К|—. К= Катод! А на детали катод обозначается полоской или точкой.

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

(далее…)

Read More »

Основы на пальцах. Часть 2

Резистор

Применение резистора
Применение резистора
  Он же сопротивление, на схеме выглядит белым узким прямоугольником (на буржуйских схемах часто обозначен угловатой пружинкой) – замечательная деталь! Отличается тем, что не делает вообще ничего. Тупо потребляет энергию и греется на этом. Основное предназначение в схеме это либо токоограничение, либо перераспределение напряжения.
  Непонятно? Сейчас поясню. Вот, например, светодиод. Ему для работы нужен мизерный ток, порядка 20 миллиампер, но вот беда – его сопротивление мало, поэтому если его воткнуть напрямую в 5 вольт, то через него ломанется ток в 400 миллиампер. От такой нагрузки бедняжка пожелтеет, позеленеет, а потом и вовсе загнется, источая вонь. Что делать? Правильно – поставить последовательно ему резистор, чтобы он ограничил ток, не пустив излишнюю мощу на хилый диодик. Даже если диод теперь тупо закоротить, то ток в цепи не превысит того, который разрешит резистор, исходя из закона Ома.
   Второе популярное применение это делители напряжения. Цель делителя — разделить входное напряжение пропорционально номиналам резисторов и подать часть этого напряжения в нужную точку схемы. Это часто приходится делать при согласовании между сигналами разных напряжений. Делитель представляет из себя два последовательно соединенных резистора. Один из которых подсоединен к точке нулевого потенциала (корпус), а второй к напряжению которое нужно поделить. Средняя точка между резисторам это выход нашего поделенного напряжения. Ток в последовательной цепи везде одинаков, а вот сопротивление разное, а значит напряжение (по закону Ома) разделится на резисторах пропорционально их сопротивлениям. Одинаковые резисторы – напряжение пополам, а если нет, то уже надо вычислять где как.

(далее…)

Read More »

AVR. Учебный курс. Постановка задачи

Этот пост можно смело считать кратким описанием того безобразия, что я называю AVR. Учебный Курс.

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

Моя основная цель — дать понять как это работает, как это использовать, как это настроить, чтобы получить хоть что-то рабочее. Поэтому я много уделяю алгоритмам, организации логики программ — классическим приемам программирования. Стараюсь не забывать и про оптимизацию.
Это, возможно, будет неинтересно тем кто учился на программистов, но вот электронщикам, изучающим программирование, это редко дают даже в ВУЗах.

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

Read More »

Основы на пальцах. Часть 1

Довелось мне однажды преподавать электронику в одной шараге. Нетривиально занятие, скажу я вам. :) Дабы облегчить усвоение материала я вводил ряд упрощений. Совершенно бредовых и антинаучных, но более менее наглядно показывающих суть процесса. Методика «канализационной электрики» успешно показала себя в полевых испытаниях, а посему будет использована и тут. Хочу лишь обратить внимание, что это всего лишь наглядное упрощение, справедливое для общего случая и конкретного момента, чтобы понять суть и к реальной физике процесса не имеющая практически никакого отношения. Зачем оно тогда? А чтобы проще запомнить, что к чему и не путать напряжение и ток и понимать как на все это влияет сопротивление, а то я от студентов такого наслушался…

Ток, напряжение, сопротивление.

Канализация как пример цепи
Канализация как пример цепи

Если сравнить электроцепь с канализацией, то источник питания это сливной бачок, текущая вода – ток, давление воды-напряжение, а несущееся по трубам говнище – полезная нагрузка. Чем выше сливной бачок, тем больше потенциальная энергия воды, находящейся в нем, и тем сильней будет напор-ток проходящий по трубам, а значит больше дерьма-нагрузки он сможет смыть.
Кроме текущего дерьма, потоку препятствует трение о стенки труб, образуя потери. Чем толще трубы тем меньше потери (гы гы гы теперь ты помнимаешь почему аудиофилы для своей мощной акустики берут провода потолще ;) ).
Итак, подведем итог. Электроцепь содержит источник, создающий между своими полюсами разность потенциалов – напряжение. Под действием этого напряжения ток устремляется через нагрузку туда, где потенциал ниже. Движению тока препятствует сопротивление, образуемое из полезной нагрузки и потерь. В результате напряжение-давление ослабевает тем сильней, чем больше сопротивление. Ну, а теперь, положим нашу канализацию в математическое русло.

(далее…)

Read More »

Паяльник CT-96

Паяльник CT-96
 

Совершенно случайно наткнулся в магазине на паяльник CT-96 от небезызвестной в узких кругах фирмы CT-Tools. Меня он подкупил приятным дизайном, возможностью регулировки температуры и весьма приятной ценой — всего 180 рублей (2006 год!).
 

Я падок на разный инструмент, вот и тут решил рискнуть, дай ка куплю, вдруг окажется что дельное. Покупка оказалась более чем удачной! Я буквально с первых же минут влюбился в новый паяльник. Отлично сидел в руке, был легкий как перышко, а главное, обладая достаточной мощностью (что то около 60Вт), позволял выбрать и поддерживать температуру жала на одном и том же уровне.
 
Регулятор температуры
 
Это оказалось возможно благодаря термодатчику в жале и управляющему ШИМ (Широтно Импульсная Модуляция) контроллеру, смонтированному в рукоятке. А еще прятным сюрпризом для меня стало то, что на этот паяльник отлично подходят жала от очень распространенной станции ZD-929, которые можно купить практически в любом радиомагазине.

Подходят жала от станций
 
Единственно, чтобы термоэлемент паяльника не упирался в жало, пришлось подложить небольшое стальное колечко между жалом и внутренним кожухом. Так что если Вам не нравится конусное жало, то можно подобрать жало практически любого профиля. И даже сделать себе микроволну для массовой запайки выводов. Фактически CT-96 является аналогом дешевой паяльной станции и своих денег стоит на 200%. Редкий случай дешевой и одновременно хорошей вещи. Рекомендую!
 
 

UPDATE0:
В данный момент СТ-96 снят с производства и купить его весьма проблематично. Но не беда, появился его брат близнец от той же конторы — СТ-2092. Разница между ними только в материале рукоятки. Во всем остальном они одинаковые.
 

UPDATE1:
Жала ZD-929, как и сама станция уже несколько лет как канули в Лету. Купить их сейчас довольно проблематично. Учтите этот факт!
 

UPDATE 2:
К сожалению у данного паяльника с годами сильно упало качество!!! Если в 2006 году это был отличнейший во всех отношениях аппарат, то сейчас, спустя 7 лет, начали под этой маркой производить откровенный китайский шлак. Во первых родное жало однозначно на выброс сразу. Во вторых они часто горят чуть ли не сразу же после покупки. Так что я бы рекомендовал крайне придирчиво все проверять, а с продавцом однозначно оговаривать гарантию и возврат. Ну и покупать в интернет магазине его уже боязно.
 

Read More »

Поехали!

Итак, проект стартовал. Он пока пуст, и я не собираюсь его раскручивать до тех пор, пока тут не будет адекватного наполнения. Но, надеюсь, за этим время не станет.
А данный пост написан для поисковых роботов. Яндекс, Фас! Гугль, Ату его! Апорт! Если же вы сюда попали случайно, то я кратко опишу проект:
Итак, что будет на этом сайте
Изначально он будет позиционироваться как страничка для начинающих. Тут я буду выкладывать подробные курсы по освоению микроконтроллеров (AVR и MSC-51), а также по электронике в целом. Также тут будут пошаговые инструкции по изготовлению разных электронных устройств, обзоры инструмента, паяльных станций, измерительных приборов.
Очень даже возможно, что будет платный контент (например некоторые прошивки буду продавать), но цену жлобить я не буду и она будет в пределах стоимости банки хорошего пива :) Однако это будет после, когда будет стабильный поток посетителей, пока все нахаляву и даром. Заинтересовало? Тогда добавляйте этот журнал в свою RSS ленту и ждите :)

Read More »