Avr studio примери за програми на асемблер. Практическо програмиране на микроконтролери Atmel AVR на асемблер

ВЪВЕДЕНИЕ Микроконтролери, тяхното възникване и приложение
История на микроконтролерите
Електроника в гръцки стил
Защо AVR?
Какво следва?

ЧАСТ I. ОБЩИ ПРИНЦИПИ НА ДИЗАЙН И ФУНКЦИОНИРАНЕ НА ATMEL AVR

Глава 1 Преглед на микроконтролерите Atmel AVR

AVR семейства
Особености практическа употреба MK AVR

Глава 2. Обща подредба, организация на паметта, тактоване, нулиране

Програмна памет
Памет за данни (RAM, SRAM)
Енергонезависима памет за данни (EEPROM)
Методи за часовник
Нулиране
Характеристики на свързване на допълнителна външна памет за данни

Глава 3. Въведение в периферните устройства

I/O портове
Таймери-броячи
Аналогово-цифров преобразувател
Серийни портове
UART
SPI интерфейс
TWI интерфейс (12C)
Универсален сериен интерфейс USI

Глава 4 Прекъсвания и режими за пестене на енергия

Прекъсва
Видове прекъсвания
Енергоспестяващи режими
Консумация MK AVR
Режими на консумация и пестене на енергия на MK AYR

ЧАСТ II. ПРОГРАМИРАНЕ НА МИКРОКОНТРОЛЕРИ ATMEL AVR

Глава 5. Общи принципи на програмиране на MK семейство AVR

Асемблер или C?
Начини и средства за програмиране на AVR
Редактор на код
Относно AVR Studio
Подреждане на асемблера
програмисти
Относно шестнадесетичните файлове
Команди, инструкции и нотация за сглобяване на AVR
Числа и изрази
Директиви и функции
Обща структура на AVR програма
Обработка на прекъсвания
НУЛИРАНЕ
Най-простата програма
Закъснение
Програма за брояч
Използване на прекъсвания
Закъснение на таймера
Програма за брояч на прекъсвания
Относно конфигурационните битове

Глава 6 AVR командна система

Команди за прехвърляне на контрол и регистър SREG
Команди за проверка и пропуск
Логически команди
Инструкции за преместване и битови операции
Команди за аритметични операции
Команди за трансфер на данни
Системни контролни команди
Изпълнение на типични процедури в асемблер
Относно стека, локалните и глобалните променливи

Глава 7 Аритметични операции

Стандартни аритметични операции
Умножение на многоцифрени числа
Многоцифрено деление
Действия с дробни числа
Генератор на случайни числа
Операции с числа във формат BCD
Отрицателни числа в MK

Глава 8 Програмиране на таймери

8 и 16 битови таймери
Формиране зададена стойностчестоти
обратно броене
Точна корекция на времето
Честотомер и периодомер
Честотомер
Периодометър
Динамичен контрол на индикацията
LED индикатори и тяхното свързване
Програмиране динамична индикация
Таймери в режим PWM

Глава 9 Използване на EEPROM

Още веднъж за безопасността на данните в EEPROM
Пишете и четете EEPROM
Съхраняване на константи в EEPROM

Глава 10 Аналогов компаратор и ADC

Аналогово-цифрови операции и техните грешки
Работа с аналогов компаратор
Интегриране на ADC на компаратор
Принцип на действие и формули за изчисление
Интегриране на ADC програма
Вграден ADC
Пример за ADC
програма

Глава 11 SPI програмиране

Основни операции чрез SPI
Хардуерна опция
Софтуерна опция
За разновидностите на енергонезависимата памет
Записвайте и четете флаш памет чрез SPI
Програма за обмен на памет 45DB011B чрез SPI
Писане и четене на флаш карти
Свързване на MMS карти
Издаване на команди и инициализиране на MMC
Писане и четене на MMS

Глава 12. TWI интерфейс (12C) и практическото му използване

Основен протокол 12C
Софтуерна емулация на протокола 12C
Записване на данни във външна енергонезависима памет
Режими на обмен с памет AT24
програма
Часовник с интерфейс 12C
Записване на данни
Четене на данни

Глава 13 UART/USART програмиране

Инициализация на UART
Изпращане и получаване на данни
Пример за настройка на часовника DS1307 с помощта на UART
Техники за защита срещу комуникационни повреди
Равен паритет
Как да организираме правилния обмен
Допълнителни функции USART
Внедряване на интерфейси RS-232 и RS-485
Конвертори на ниво за RS-232
RS-485

Глава 14 Режими за пестене на енергия и таймер за наблюдение

Програмиране за пестене на енергия
Пример за захранван с батерии инструмент
Усъвършенстване на програмата
Използване на таймера за наблюдение

ПРИЛОЖЕНИЯ

Приложение 1. Основни параметри на микроконтролерите Atmel AVR

Приложение 2 Atmel AVR команди
Аритметични и логически инструкции
Команди за битови операции
Команди за сравнение
Команди за прехвърляне на контрол
Инструкции за безусловно прескачане и извикване на подпрограма
Пропускане на проверка и условни инструкции за разклоняване
Команди за трансфер на данни
Системни контролни команди

Приложение 3 Програмни текстове
45DB011B демонстрационна програма за комуникация с флаш памет чрез SPI интерфейс
Процедури за обмен на 12C интерфейс

Приложение 4 Комуникация с персонален компютъри програми за отстраняване на грешки чрез UART
Работа с COM порт в Delphi
COM порт и Windows API
Работа с COM чрез готови компоненти
Инсталиране на линията RTS в DOS и Windows
Програма COM2000
Отстраняване на грешки в програми с терминална програма

Приложение 5 Речник на често срещаните съкращения и термини
Съответствие на термини на руски с превода им на английски
Съответствие на термини на английски с превода им на руски

Литература
Предметен индекс


Така че, надявам се, че съвестният читател вече е сглобил програмист, експериментална платка, а също така е инсталирал и конфигурирал необходимия софтуер.

Сега, след като написах първата статия от поредицата, разбирам, че малко се развълнувах и направих същата грешка като моите предшественици, поставяйки фразата "за начинаещи". Би било по-правилно да се формулира темата „За начинаещи да програмират на асемблер“, тоест предполагам, че читателят вече има поне повърхностна представа за това какво е микроконтролер, в противен случай ще ни отнеме много време, за да се запознаете с тази тема. За тези, които не са напълно запознати с тях, мога да препоръчам поредица от статии на S. Ryumik "AVR Microcontrollers", която е абсолютно прекрасна според мен, публикувана в списание Radioamator (№ 1-11 за 2005 г.). В този цикъл ATmega8 е избран като основен контролер, но като общ функционални единицигорният контролер и ATtiny13 са практически еднакви.

За да се запознаете директно с микроконтролера ATtiny13, препоръчвам книгата на A.V. Евстифеева "Микроконтролери AVR от малкото семейство. Ръководство за потребителя" (Москва: Издателство Додека-XXI, 2007. - 432 с.). Той съдържа преведени и систематизирани таблици с данни за цялата гама от малки контролери и, по мое мнение, трябва да бъде десктоп за тези, които се занимават с програмиране на микроконтролери.

Въпреки това, докато историята напредва, ще дам малко информация за онези контролни възли и модули, които ще бъдат използвани в написаните програми.

Но всичко това е лирично отклонение. Да се ​​върнем веднага на историята.

Контролерът ATtiny13, въпреки малкия си размер, е много добър функционални характеристики. И малък брой заключения е повече от компенсиран от броя на функциите, които всеки от тях изпълнява. Разпределението и описанието на щифтовете е представено по-долу:

Таблицата е взета от гореспоменатата книга на A.V. Евстифеева.

Както можете да видите, всеки изход може да изпълнява поне три функции и дори много повече. Първоначално няма да разглеждаме алтернативни функции, а само основната - цифров вход / изход.

Както може да се види от фигурата и таблицата, всички изходи, с изключение на изходите за мощност, имат името PB, последвано от сериен номер. Какво означава това? Всички изходи на контролера са обединени от 8 броя за удобство при работа с тях, като за всяка група от 8 изхода са разпределени три специални входно-изходни регистъра. Като цяло концепцията за регистрите е ключова при работа с контролери, особено в асемблера. Нека разгледаме по-подробно всеки от трите гореспоменати регистъра. Всички те са еднобайтови клетки в паметта на контролера. Всеки бит от тях съответства на един от изходите на контролера, а номерът на бита в регистъра съвпада с номера на изхода (например 0-ият бит отговаря за изхода на PB0, 1-вият - за PB1 и т.н.). Всички регистри имат собствено име, с което се наричат ​​при писане на програми. Какви са тези имена?

1. Регистърът DDRB отговаря за посоката на трансфера на информация на всеки изход на контролера. Ако някой бит от този регистър е равен на "0", тогава съответният щифт ще бъде вход, а ако "1" - тогава изход. Освен това всеки изход се конфигурира индивидуално и навсякъде в програмата. Това означава, че при различни условия или по различно време един и същ щифт може да бъде конфигуриран като вход или като изход и независимо от другите щифтове.

2. ПИНБ регистърът съдържа Сегашно състояниевсички изходи: ако към изхода е приложено напрежение, тогава в съответния бит се записва логическа "1", ако няма напрежение, се записва логическа "0". Този регистър се използва главно за четене на състоянието на щифт, който е в режим на въвеждане.

3. Регистър PORTB изпълнява двойна функция в зависимост от посоката на предаване на информацията. Ако един щифт работи като цифров изход, записването на "1" на всеки бит от регистъра PORTB води до появяване на напрежение на съответния щифт, а записването на "0" води до изчезване на напрежението. Така в изходен режим именно този регистър определя състоянието на всеки изход. В режим цифров входписането на логическа "1" на всеки бит кара вградения изтеглящ резистор да бъде свързан към съответния щифт и записването на "0" за изключването му. Какво е това нещо - "pull-up resistor", и за какво служи? Ако щифтът действа като цифров вход, тогава съпротивлението на входния буфер е достатъчно високо и входният ток е много нисък. Следователно всяка електрическа намеса може да доведе до спонтанно превключване на изхода в произволно състояние. За да не се случи това, между входа и източника на захранване е свързан резистор със съпротивление от няколко десетки килоома, който "издърпва" входния потенциал до захранващото напрежение (оттук и името). Токът, протичащ през този резистор, е достатъчно малък, за да не пречи на останалата част от веригата, но достатъчно голям, за да предотврати случайно превключване на щифтовете. Често ще използваме издърпващи резистори при работа с бутони, тъй като когато не са натиснати, изводите, към които са свързани, всъщност "висят" във въздуха и са подложени на бръмчене.

Трябва да се спомене, че при включване на захранването всички регистри се нулират на 0 и всеки щифт функционира като цифров вход без издърпващ резистор.

Сега, след като имаме някаква представа КАКВО е необходимо за работа с контролерни входове, време е да научим КАК да работим с тях.

Нека напишем нашия първи работна програмав асемблер. Първо, ще дам пълен алгоритъм за създаване на нов проект, но в бъдеще ще го пропусна, спирайки се само върху самия програмен текст.

1. Отидете в папката asm, създайте нова папка в нея. Преименувайте на удобно за нас име. За по-категорично ще ги нарека с номера на нашата стъпка. В този случай "стъпка 2".

2. Кликнете с десния бутонщракнете върху файла build.bat и променете пътя на изходния файл към новосъздадената папка (стъпка 2). След това съдържанието ми изглежда така:

"F:\Prog\AVR\asm\avrasm32 -fI %F:\Prog\AVR\asm\step2\main.asm
пауза"

Може да се различава за вас в зависимост от това къде сте разопаковали архива.

3. Отидете в папката Asmedit и стартирайте програмата ASM_Ed.exe

4. В прозореца, който се отваря, напишете текста на програмата. Ще се спра на тази точка по-подробно, тъй като тя е основната в нашия урок днес, както и в следващите.

Какъв е текстът на асемблерна програма? Може да включва няколко елемента, написани съгласно определени правила:

Инструкции за асемблиране със или без операнди, в зависимост от синтаксиса на инструкцията. Между името на командата и първия операнд трябва да има или интервал, или табулация, или произволен брой от двете. Операндите се разделят със запетая, преди и след която може да има произволен брой интервали или раздели;

Директиви, всяка от които започва със знака ".";

Етикети, които са места в програмата, произволно наименувани от потребителя, до които може да се наложи навигация. Всеки етикет завършва със знак ":";

Коментари, започващи с ";". Целият текст от началото на коментара до края на реда се игнорира при създаването на шестнадесетичния файл и може да бъде напълно произволен;

Празни редове за по-добра структура и четливост на програмата.

Може да има най-много една команда на ред. Допуска се обаче едновременното присъствие на етикет в ред с последваща команда и коментар.

Използвайки тези правила, ще напишем програма, която ще включва LED2, докато бутонът SB1 е натиснат, и ще го изключва, ако бутонът бъде освободен. Текстът на програмата е показан по-долу:

.include "F:\Prog\AVR\asm\Appnotes\tn13def.inc"
sbi DDRB, 4 ;РВ4 - изход (LED2)
sbi PORTB, 2; Включете изтеглящия резистор на PB2 (бутон SB1)
sbic PINB, 2 ; Ако PB2=0 (натиснат бутон), пропуснете следващия. низ
sbi PORTB, 4 ; PB4 настроен на 1 (LED изключен)
sbis PINB, 2 ; Ако PB2=1 (бутонът е освободен), пропуснете следващия. низ
cbi PORTB, 4 ; Настройте PB4 на 0 (LED включен)

Нека го анализираме по-подробно. Първият ред съдържа директивата "include", написана според горните правила с точка в началото. Неговата цел е да включи посочения след него файл в текста на програмата. Както казах в първата стъпка, имаме нужда от файла "tn13def.inc". На този ред ще трябва да промените пътя до местоположението на папката Appnotes на вашия компютър. Защо трябва да включим този файл? Любознателният читател може да го разгледа и да прочете съдържанието му, но най-вероятно първоначално ще разбере малко там. Междувременно ще кажа, че съдържа съответствието на имената на регистрите, които асемблерът не знае по подразбиране, с техните физически адреси в контролера.

Следващите редове са команди на асемблер. Внимателният читател ще забележи, че са четири различни отбори. Нека да разгледаме целта на всеки.

Инструкцията sbi има два операнда: първият е името на регистъра, вторият е номерът на бита. В резултат на неговото изпълнение зададеният бит в посочения регистър се установява на "1".

Командата cbi е подобна по синтаксис на горната и изпълнява точно обратната функция - нулира указания бит в посочения регистър на "0".

Командата sbis също е подобна по синтаксис на горната. Но за разлика от тях, той не извършва никакви операции с регистрите, а само проверява състоянието на зададения бит в посочения регистър и ако е равен на "1", пропуска реда след командата. В противен случай се изпълнява редът след него, както и всички останали след него.

Командата sbis е противоположна на командата sbis. Той пропуска следващия ред, ако указаният регистърен бит е "0".

Сега, обобщавайки всичко по-горе, нека се опитаме да разберем алгоритъма на програмата. Като начало ще го направя буквално ред по ред.

1 ред. Директивата за включване включва файла tn13def.inc, съдържащ дефиниции на регистри.

2 линия. Командата sbi задава "1" в бит 4 на регистъра DDRB, като по този начин превключва щифта PB4 към изхода. Ако погледнете диаграмата на платката (фиг. 1 от предишната стъпка), можете да видите, че LED2 е свързан към този щифт. След командата и знака ";" е написан коментар, който накратко обяснява смисъла на действията, извършени в реда.

3 линия. Същата команда sbi задава "1" в бит 2 на регистъра PORTB, свързвайки вътрешния издърпващ резистор към щифта PB2, към който е свързан бутонът SB1. Тъй като не променихме състоянието на бит 2 от регистъра DDRB, този щифт ще остане вход, което е точно това, от което се нуждаем.

4 ред. Командата sbic проверява за наличието на логическа "0" на входа PB2, използвайки PINB регистъра. Ако погледнете внимателно диаграмата, можете да видите, че бутоните, когато са натиснати, затварят съответния изход с общ проводник. Това е стандартна техника, тъй като при отпускане на бутона на изхода има логическа "1" поради изтеглящия резистор, а при натискане на бутона се появява логическа "0" поради връзката на изход към общия проводник. Така че, ако има логическа "0" на изхода на PB2, тоест бутонът е натиснат, прескачаме следващия ред и ако бутонът е освободен, тогава го изпълняваме.

5 ред. В него командата sbi задава логическа "1" в бит 4 на регистъра PORTB, като по този начин изключва LED2. Корозивният читател може да се чуди защо светодиодът се изключва, ако подадем напрежение към изхода. Отговорът се крие в диаграмата. Анодът на светодиода е свързан към захранващия проводник, а катодът към изхода на контролера. Следователно, ако към изхода се приложи напрежение, тогава потенциалите на анода и катода ще се изравнят и светодиодът ще изгасне. Ако на изхода е дадена логическа "0", тогава към светодиода ще бъде приложено напрежение и той ще светне. По този начин двойка линии 4 и 5 изключва светодиода LED2, когато бутонът бъде освободен.

6 ред. Противоположно по значение на 4. Командата sbis проверява за наличието на логическа "1" на входа PB2, тоест проверява дали бутонът е отпуснат. Ако бутонът бъде освободен, следващият ред се пропуска и се преминава към следващия ред. Но тъй като 7-ми ред е последният, той прескача на 2-ри ред. При натискане на бутона се изпълнява ред 7.

7 ред. Срещу 5-ти. С командата cbi, бит 4 от регистъра PORTB се нулира на "0", като по този начин се включва LED2. По този начин двойка линии 6 и 7 включва светодиода LED2 при натискане на бутона SB1.

Както виждате, не направихме нищо особено трудно. Използвайки познания само за 3 регистъра и 4 инструкции, написахме първата си програма. Какво да правя с нея по-нататък. Ако не сте забравили, ние продължаваме да пишем алгоритъма за създаване на програма.

5. След като напишете текста на програмата в прозореца на редактора, изберете елемента от менюто "Файл" и в списъка, който се отваря, щракнете върху "Запазване като ...". В прозореца за запазване на файла изберете папката step2, която създадохме, и посочете името на файла "main", тъй като това име беше посочено от нас във файла "build.bat"

След запазване прозорецът на програмата трябва да изглежда така:

6. Създайте шестнадесетичен файл. За да направите това, натиснете бутона "II" на лентата с инструменти. Трябва да се появи следният прозорец:

Уведомява ни, че сглобяването е преминало без грешки и е създаден файлът на фърмуера "main.hex" с обем от 6 думи, тоест 12 байта. Отбелязвам, че подобна програма на C би имала поне 5 пъти повече обем.

7. След като влезем в папката step2, намираме в нея добавка под формата на новосъздадения main.hex файл, който вече може да бъде зашит в контролера от всеки програмист, което трябва да се направи, за да се видят резултатите от програма, която сме написали. След мигане на контролера, ако веригата е сглобена правилно, всичко трябва да работи според разработения от нас алгоритъм: когато бутоните са освободени, светодиодът LED2 трябва да е изключен и докато бутонът SB1 е натиснат, той трябва да свети.

Преди следващата стъпка предлагам да изпълните следните задачи:

1. Добавете към програмата обработката на натискане на бутон SB2 с обратен алгоритъм: при отпускане на бутона SB2 светодиодът LED1 трябва да свети, а при натискане трябва да изгасне.

2. Напишете програма за управление на LED2 с двата бутона. При натискане на бутона SB1 светодиодът трябва да светне и да свети до натискане на бутона SB2, което го изключва до натискане на следващия SB1.

Всеки добър вечер! Излъчвам от уютен свят, наречен "монтажник". Нека поясня за какво е темата. AVR микроконтролери- и все още не знам дали тази публикация ще бъде полезна за тези, които искат да използват асемблер за друга задача. Факт е, че само преди няколко дни започнах да уча асемблер от нулата - трябва да направите едно устройство - и реших да направя всичко в него сам. И така, един ден го осъзнах ученето на асемблер е абсолютно безполезно!Асемблер може само да се разбере! Тоест, за всички, които искат да програмират на асемблер, силно препоръчвам да разберат подробно как работи ФИЗИЧЕСКИ микроконтролерът и след това да проучат тънкостите на командите.
Така че вероятно ще започна малка поредица от статии, в които ще разкажа от самото начало как точноРазбрах някои неща в програмирането на асемблер - мисля, че за тези, които изобщо не разбират какво е ASM, ще бъда точно такъв „преводач“ от езика на онези, които се справят много добре по този въпрос.

Веднага трябва да кажа, че повече или по-малко влязох в тази тема по предложение на DIHALT - следователно тези статии ще бъдат вид превод от езика на супер-дупер-сглобяване-микроконтролер на език, разбираем за повечето хора. Е, надявам се гурутата да ме коригират в хода на пиесата и ако изведнъж обясня нещо неправилно, те ще ме коригират.
Така че първите изводи за асемблера, които направих преди няколко дни, ме шокираха до дъното - и седях над статиите на DI HALT от 23:00 до 5 сутринта - след което си легнах доволен и щастлив.Разбрах същността на програмиране на асемблер за микроконтролери.
Как може това да се обясни още по-просто? Мисля, че трябва да започнем от сърцевината.
***
Първоначално няма да навлизаме в технически подробности (ще говорим за тях в следващата статия) - просто представете си, че има 3 знака:
1. Микроконтролер -това е англичанинът Стив, който дойде при руснака. Той знае перфектно английски език, но на руски изобщо не разбира - нито една дума. Само на английски. Той загуби спора и се задължи да направи безусловно всичко, което руснакът поиска от него.
2. Асемблер -това е преводачът Вася, чиято майка е англичанка, а баща е руснак. Владее перфектно английски и руски.
3. Ние -това е руснак посетен от англичанин. Е, това е, ние сме ние =) В същото време знаем перфектно руския език и (!!!) малко английски - съвсем малко, с речник.
***
Представете си тази ситуация - англичанин седи в стаята ви на стол. И вие седите пред компютъра си и четете тази публикация, когато изведнъж прозорецът ви се отваря! Това е лош късмет! Вятърът духа, завесата се превърна в платно… Би било хубаво да я затворите! Но в края на краищата колко мързеливо е да станете от стола, да свалите краката си от системния блок, да ги напъхате в чехли, да оставите настрана чаша кафе (бира) и да отидете да се борите с елементите. И тогава изведнъж осъзнавате, че имаме заложен англичанин в стаята, когото е време да караме! И ти му казваш толкова мило: „Приятелю! Затворете прозореца, моля, и тогава можете да седнете отново на стола! а той седи, гледа те с недоумение и нищо не прави! Можете, разбира се, да ударите зелевата супа - но тогава той пак няма да ви разбере! След това викате вашия приятел-преводач Василий - той идва и сяда до англичанина на един стол. И вие казвате - Превод: "Стив, иди и затвори прозореца, а след това се облегни на стола!" Преводачът превежда на английски - англичанинът разбира и отива да затвори прозореца, а след това идва и сяда на един стол.
На този етап просто трябва да разберете ролята на асемблера в тази верига „Ние-асемблер-контролер“
Тоест как всеки ще разбере какво е асемблер? След това четем.
***

И така, представяме такава ситуация. Казваш на Вася - „Слушай, добре, накратко, такова нещо - забравих калкулатора вкъщи, раздели 56983 на 2 и кажи на Стив да прави лицеви опори на юмруците си толкова пъти“ и Вася разчита на калкулатора и казва на Стив на английски „Избутайте юмруците си 28491 пъти“ Нарича се "ДИРЕКТИВА"- с други думи, директивата е задача за Вася, резултатът от която е действието на Стив.

Има и друга ситуация - казвате на Вася "Кажи на Стив да направи 28491 лицеви опори" и Вася просто превежда думите ти на английски. Нарича се ОПЕРАТОР

Всичко е просто - има директива и има оператор. Операторът е вашата директна инструкция какво да правите със Стив - тук Вася само превежда вашето искане на английски. А Директивата е задача за самия Вася - и Вася първо прави това, което си му казал, а след това, в зависимост от резултата, казва нещо на Стив.

Сега ще измъчваме редовно англичанина! Но първо трябва да опознаете по-добре нашия преводач Вася. Трябва да знаете следното - Вася винаги ви се подчинява безпрекословно - каквото му се каже, това прави. Калкулаторът на Вася няма десетични знаци - ако погледнете примера с лицеви опори, тогава 56983 \ 2 = 28491,5 - но Вася отрязва всичко след десетичната запетая - и той вижда само цяло число - и няма значение дали ще е 28491.000001 или ще има 28491.9999999 - за Вася това е една смокиня и в двата случая ще е 28491. Нищо не е закръглено. Още важна информацияотносно Вася. Вася е жесток - не го интересува, че Стив се изморява да прави лицеви опори двадесет и осем хиляди пъти. Казаха му - Вася преведе. И не само преведен - но и принуден да направи това, което сте поискали. Така че, ако Стив умре на двадесет и три хиляди петстотин и тринадесета лицева опора, вината ще бъде изцяло ваша.

Всъщност това е всичко за сега. В следващата публикация ще копаем по-дълбоко - засега е достатъчно само да го разберем. Просто си представете тази ситуация и разберете какво е какво, кой каква роля играе и как директивата се различава от оператора.
И тогава ще се опитаме да наречем всичко с правилното му име и грубо да разберем как асемблерът работи с микроконтролера по възрастен начин.

Клонинг на известния Tetris, написан на асемблер. Той се побира изцяло в 512 байта сектор за зареждане (необходими са му само 446 байта пространство, което е само максималният размер на буутлоудъра в MBR).

MBR - раздел, съдържащ кода и данните, необходими за последващото зареждане на операционната система и разположен в първите физически сектори. Първите 446 байта от диска се дават на кода на буутлоудъра. Именно на това място е записан TetrOS.

Естествено, поради такива свойства, той се зарежда преди всички операционна система- не изисква никаква ОС, работи сам. Да, чухте правилно, TetrOS е собствен буутлоудър.

Ето как изглежда на екрана:

И източникът в сектора за зареждане изглежда така:

И да, така е цялотоизточник. Помните ли, че тежи само 446 байта?

Можете да стартирате тази "чудотворна операционна система" под qemu или дори да я инсталирате реално в дяла за зареждане на диск или флаш устройство.

стартиране

Просто инсталирайте qemu:

sudo apt-get инсталирайте qemu

и стартирайте:

Изтегляне на флашка

Копирайте изображението на флашка. Да кажем, че ако флаш устройството е монтирано като /dev/sde, трябва да изпълните следната команда, за да запишете TetrOS в неговия сектор за зареждане:

sudo dd if=tetros.img of=/dev/sde

Описание на играта

Разработчикът успя да натъпче не най-скучния дизайн само в 512 байта памет. Всяка тухла в играта има свой собствен цвят, управлението се извършва с бутони, в случай на поражение играта приключва, тухлите се генерират на случаен принцип... BolgenOS дори не беше близо!

За съжаление, поради размера, някои функции трябваше да бъдат изоставени. В играта няма точкуване, рестартиране на играта без презареждане и показване на това коя ще бъде следващата тухла.

Име:Практическо програмиране на микроконтролери Atmel AVR на асемблер 2 издание

Издател:"БХВ-Петербург"

Година на издаване: 2011

Страници: 354

език:Руски

формат: DjVu

Размерът: 12,2 MB

Наложени са принципите на функциониране, особеностите на архитектурата и техниките за програмиране на микроконтролерите Atmel AVR.

Дадени са готови рецепти за програмиране на основните функции на съвременното микроелектронно оборудване: от реакцията на натискане на бутон или изграждане на динамична индикация до сложни протоколи за запис на данни във външна памет или характеристиките на свързване на часовник в реално време. Специално вниманиее даден обмен на данни на микроелектронни устройства с персонален компютър, дадени са примери за програми. Характеристиките на книгата модерни модели AVR и свързани чипове от последните години на пускане.
Приложението съдържа основните параметри на микроконтролерите AVR, списък с команди и текстове. Приложенията съдържат основните параметри на микроконтролерите AVR, списък с команди и програмни текстове за тях, както и списък с използваните термини и съкращения.
За студенти, инженери и радиолюбители

7. Микроконтролери, тяхното възникване и приложение
8. Предистория на микроконтролерите
10. Електроника в гръцки стил
12. Защо AVR?
14. Какво следва?
17. ЧАСТ L ОБЩИ ПРИНЦИПИ НА ДИЗАЙН И ФУНКЦИОНИРАНЕ НА ATMEL AVR
19. Глава 1. Преглед на микроконтролерите Atmel AVR
21. Семейства AVR
23. Характеристики на практическото използване на MK AVR
23. Консумация
25. Някои характеристики на използването на AVR в схеми
27. Глава 2. Общо устройство, организация на паметта, тактоване, нулиране
27. Програмна памет
29. Памет за данни (RAM, SRAM)
31. Енергонезависима памет за данни (EEPROM)
32. Методи за определяне на времето
34. Нулиране
37. Глава 3. Въведение в периферните устройства
38. I/O портове
39. Таймери-броячи
41. Аналогово-цифров преобразувател
42. Серийни портове
43. UART
46. ​​​​SPI интерфейс
50. TWI интерфейс (I2C)
50. USI универсален сериен интерфейс
53. Глава 4. Прекъсвания и енергоспестяващи режими
53. Прекъсва
57. Разновидности на прекъсванията
58. Енергоспестяващи режими
61. ЧАСТ II. ПРОГРАМИРАНЕ НА МИКРОКОНТРОЛЕРИ ATMELAVR
63. Глава 5. Общи принципи на програмиране на MK семейство AVR
63. Асемблер или C?
67. Начини и средства за програмиране на AVR
67. Редактор на код
68. За AVR Studio
70. Подреждане на асемблера
71. Програмисти
75. Относно шестнадесетичните файлове
78. Команди, инструкции и нотация на AVR асемблер
79. Числа и изрази
80. Директиви и функции
84. Обща структура на AVR програма
85. Обработка на прекъсвания
89. НУЛИРАНЕ
90. Най-простата програма
92. Забавяне
94. Програма за брояч
96. Използване на прекъсвания
97. Таймер за забавяне
98. Програма за брояч, използваща прекъсвания
101. Относно конфигурационните битове
105. Глава 6, AVR командна система
105. Команди за трансфер на управление и регистър SREG
111. Команди за проверка и пропуск
113. Команди за логически операции
114. Инструкции за преместване и битови операции
116. Команди за аритметични операции
118. Команди за пренос на данни
122. Команди за управление на системата
123. Изпълнение на типични процедури в асемблер
125. За стека, локалните и глобалните променливи
127. Глава 7. Аритметични операции
128. Стандартни аритметични действия
129. Умножение на многоцифрени числа
131. Деление на многоцифрени числа
134. Действия с дробни числа
136. Генератор на случайни числа
138. Операции с числа във формат BCD
143. Отрицателни числа в МК
147. Глава 8. Програмиране на таймери
147. 8 и 16 битови таймери
149. Формиране на зададената стойност на честотата
153. Обратно броене
158. Корекция на точен час
160. Честотомер и периодомер
160. Честотомер
164. Периодометър
167. Динамично управление на индикацията
168. Светодиодни индикатори и тяхното свързване
171. Програмиране на динамична индикация
174. Таймери в режим ШИМ
179. Глава 9. Използване на EEPROM
179. Още веднъж за безопасността на данните в EEPROM
181. Пишете и четете EEPROM
183. Съхраняване на константи в EEPROM
187. Глава 10. Аналогов компаратор и ADC
187. Аналогово-цифрови операции и техните грешки
190. Работа с аналогов компаратор
193. Интегриране на ADC на компаратор
194. Принцип на действие и формули за изчисление
198. Интегрираща ADC програма
201. Вграден ADC
204. Пример за използване на ADC
206. Програма
215. Глава 11 SPI програмиране
215. Основни операции през SPI
216. Хардуерен вариант
218. Програмен вариант
219. За разновидностите на енергонезависимата памет
221. Запис и четене на флаш-памет през SP!
224. Програма за обмен с памет 45DB011B през SPI
225. Писане и четене на флаш карти
225. Свързване на MMS карти
228. Подаване на команди и инициализиране на MMC
232. Писане и четене на MMC
237. Глава 12. TW1 (I2C) интерфейс и неговото практическо използване
237. Основен протокол 1 2 C
240. Софтуерна емулация на I 2 C протокола
241. Записване на данни във външна енергонезависима памет
241. Режими на обмен с памет AT24
243. Програма
247. Часовник с интерфейс I 2 C
255. Записване на данни
259. Четене на данни
261. Глава 13. Програмиране UART/USART
262. Инициализация на UART
263. Изпращане и получаване на данни
266. Пример за настройка на часовника DS1307 с помощта на UART
271. Техники за защита срещу комуникационни повреди
271. Проверка на четност
273. Как да организираме правилен обмен
274. Допълнителни функции на USART
276. Реализиране на интерфейси RS-232 и RS-485
280. Конвертори на ниво за RS-232
283.RS-485
285. Глава 14. Режими за пестене на енергия и таймер за наблюдение
286. Програмиране на енергоспестяващ режим
287. Пример за инструмент, захранван с батерии
289. Усъвършенстване на програмата
293. Използване на таймера за наблюдение
299. ПРИЛОЖЕНИЯ
301. Приложение 1. Основни параметри на микроконтролерите Atmel AVR
309 Приложение 2 Atmel AVR команди
310. Аритметични и логически команди
311. Команди за битови операции
312. Команди за сравнение
313. Команди за прехвърляне на контрол
313. Инструкции за безусловен скок и извикване на подпрограми
314. Команди за проверка и пропускане и команди за условен преход
315. Команди за пренос на данни
316. Команди за управление на системата
317. Приложение 3. Текстове на програми
317. Демонстрационна програма за обмен на данни с флаш-памет 45DB011B през SPI интерфейс
321. Процедури за обмен през интерфейса I2C
329. Приложение 4. Обмен на данни с персонален компютър и програми за отстраняване на грешки чрез UART
329. Работа с COM порт в Delphi
335. Инсталиране на линията RTS в DOS и Windows
337. Програма COM2000
339. Отстраняване на грешки в програми с терминален емулатор
341. Приложение 5. Речник на често срещаните съкращения и термини
347. Литература
349. Предметен указател