Atmega8 микроконтролери. Atmega8 програмирање за почетници. AVR микроконтролери. програмирање за почетници обука за микроконтролер atmega8

декември 2015 година

1. Предности на предложениот метод

Колата на уредите базирани на микроконтролери (MC) обично се одликуваат со комбинација од два квалитети кои тешко се комбинираат: максимална едноставност и висока функционалност. Покрај тоа, функционалноста може да се менува и прошири во иднина без да се прават никакви промени на колото - со едноставно замена на програмата (трепка). Овие карактеристики се објаснуваат со фактот дека креаторите на современите микроконтролери се обидоа да стават сè што може да му треба на развивачот на еден чип. Електронски уред- барем што е можно повеќе. Како резултат на тоа, имаше промена на акцентот од кола и склопување на софтвер. Со употребата на МК, сега е помалку потребно да се „оптоварува“ колото со детали, има помалку врски меѓу компонентите. Ова, се разбира, го прави колото попривлечно и за искусните и за почетниците електронски инженери да го повторат. Но, како и обично, треба да платите за сè. И тука не беше без тешкотии. Ако купите нов MK, инсталирајте го во коло правилно составено од делови што се сервисираат и напојувате, тогаш ништо нема да работи - уредот нема да работи. На микроконтролерот му треба програма.

Се чини дека сè е исто така едноставно со ова - на Интернет можете да најдете многу шеми со бесплатен фирмвер. Но, тука има една финта: фирмверот мора некако да се „полни“ во микроконтролерот. За некој што никогаш претходно не го направил ова, таквата задача често станува проблем и главен одбивен фактор, честопати принудувајќи го да ги напуштат шармите на користење на МК и да бараат шеми засновани на „лабава“ и ригидна логика. Но, сè не е толку тешко како што може да изгледа на прв поглед.

Откако ќе ги анализирате публикациите на Интернет, можете да видите дека овој проблем најчесто се решава на еден од двата начини: купување готов програмер или правење домашен. Во исто време, објавените шеми на домашни програмери се многу често неразумно сложени - многу покомплицирани отколку што е навистина потребно. Секако, ако треба секој ден да го трепка МК, подобро е да имаш „кул“ програмер. Но, ако потребата за таква постапка се јавува ретко, од време на време, тогаш генерално можете да направите без програмер. Не, се разбира, не се работи за учење да го правите тоа со моќта на мислата. Ова значи дека разбирајќи како програмерот комуницира со микроконтролерот кога пишува и чита информации во неговиот режим на програмирање, можеме да се справиме со достапните алатки за поширока намена. Овие алатки ќе треба да ги заменат и софтверот и хардверот на програмерот. Хардверскиот дел мора да обезбеди физичка врска со MK чипот, можност за снабдување на логичките нивоа на неговите влезови и читање податоци од неговите излези. Софтверскиот дел мора да обезбеди работа на алгоритмот кој ги контролира сите потребни процеси. Исто така забележуваме дека квалитетот на снимањето информации во МК не зависи од тоа колку е „кул“ вашиот програмер. Не постои такво нешто како „подобро“ или „полошо“. Има само две опции: „запишан“ и „незапишан“. Ова се должи на фактот дека самиот MC го контролира процесот на снимање внатре во кристалот. Потребно е само да се обезбеди висококвалитетна моќност (без пречки и бранови) и правилно да се организира интерфејсот. Ако, според резултатите од контролното читање, не се откриени грешки, тогаш сè е во ред - можете да го користите контролорот за наменетата цел.

За да напишеме програма во МК без програмер, потребен ни е конвертор на USB-RS232TTL порт и исто така. Конверторот USB-RS232TTL ви овозможува да креирате COM порта користејќи ја USB-порта, која се разликува од „вистинската“ само по тоа што логичките нивоа на TTL се користат на неговите влезови и излези, односно напон во опсег од 0 до 5 волти (за повеќе детали, видете ја статијата " "). Во секој случај, корисно е да имате таков конвертор во „домаќинството“, па ако сè уште го немате, дефинитивно треба да го купите. Што се однесува до логичките нивоа, во нашиот случај TTL е дури и предност во однос на обичната COM порта, бидејќи влезовите и излезите на таквата порта можат директно да се поврзат со кој било микроконтролер напојуван од 5 V, вклучувајќи ги и ATtiny и ATmega. Но, не обидувајте се да користите редовна COM порта - таму се користат напони во опсег од -12 до +12 V (или -15 ... + 15V). Директно поврзување со микроконтролерот во овој случај е неприфатливо!!!

Идејата за создавање скрипта за програмата „Perpetuum M“, која ги спроведува функциите на програмер, произлезе по читањето на голем број публикации на Интернет кои нудат одредени решенија за фирмверот MK. Во секој случај, беа откриени сериозни недостатоци или прекумерна сложеност. Честопати наидувавме на програмерски кола што содржат микроконтролер, а во исто време се даваа многу сериозно совети од типот: „... а за да го програмираме микроконтролерот за овој програмер, ни треба ... така е - друг програмер!“ . Тогаш беше предложено да се оди кај пријател, да се бара платена услугаи така натаму. Квалитетот на софтверот дистрибуиран на мрежата за овие цели исто така не беше импресивен - беа забележани многу проблеми и со функционалноста и со „заматувањето“ на корисничкиот интерфејс. Честопати е потребно многу време за да се разбере како да се користи програмата - мора да се научи дури и заради извршување на наједноставните дејства. Друга програма може да направи нешто долго и вредно, но корисникот ќе знае дека ништо не се пишува во МК дури откако ќе се заврши целиот фирмвер и ќе заврши последователното контролно читање. Има и таков проблем: корисникот се обидува да го избере својот MK од списокот со поддржани кристали, но го нема во списокот. Во овој случај, нема да биде можно да се користи програмата - по правило, не е обезбедено вклучување во списокот на исчезнати МК. Дополнително, мануелното избирање контролер од списокот изгледа чудно, со оглед на тоа што програмерот во многу случаи може сам да го одреди типот на МК. Сето ова е кажано не со цел да се фрла кал врз постоечките производи, туку со цел да се објасни причината за појавата на сценариото за програмата „Perpetuum M“ опишана во овој напис. Проблемот навистина постои, а тој првенствено ги засега почетниците кои не секогаш успеваат да го надминат овој „ѕид“ за да го направат првиот чекор во светот на микроконтролерите. Предложената скрипта ги зема предвид недостатоците пронајдени во другите програми. Имплементирана е максималната „транспарентност“ на алгоритмот, исклучително едноставен кориснички интерфејс кој не бара проучување и не остава шанса да се збуните и „кликнете на погрешно место“. Во отсуство на потребната МК меѓу поддржаните, можно е сами да го додадете неговиот опис, земајќи ги потребните податоци од документацијата преземена од веб-страницата на развивачот на МК. И што е најважно, сценариото е отворено за проучување и менување. Секој може, со отворање уредувач на текст, проучете го и уредувајте го по ваша дискреција, менувајќи ги постоечките функции по ваш вкус и додавајќи ги оние што недостасуваат.

Првата верзија на сценариото беше создадена во јуни 2015 година. Оваа верзија поддржува само ATtiny и ATmega MCU на Atmel со функции за пишување/читање флеш меморија, со поставени битови за конфигурација, со автоматско откривање тип на контролер. Пишувањето и читањето EEPROM не се имплементирани. Имаше планови за дополнување на функционалноста на скриптата: додавање пишување и читај EEPROM, имплементирај поддршка за PIC контролери, итн. Поради оваа причина, скриптата сè уште не е објавена. добро, беше одлучено да се објави постоечката верзија. имплементираните функции нема да бидат доволни, ве молиме не се вознемирувајте. Во овој случај, можете сами да се обидете да ја додадете саканата функција. Нема да го кријам: идејата за создавањето на оваа скрипта првично има и едукативно значење. Откако ќе го разберете алгоритмот и ќе додадете нешто свое на него, ќе можете подобро да ја разберете работата на МК во режимот на програмирање, така што во иднина ќе не се најдете во позиција на девојка пред скршен автомобил, замислено гледајќи ја неговата внатрешност и не разбирајќи зошто „не оди“.

2. MK интерфејс во режим на програмирање

Постојат неколку различни начини да го ставите контролорот во режим на програмирање и да работите со него во овој режим. Најлесно за имплементирање за контролерите на сериите ATtiny и ATmega е веројатно SPI. Ќе ги искористиме.

Но, пред да продолжиме со разгледување на сигналите неопходни за формирање на SPI, ќе направиме голем број резервации. Микроконтролерот има битови за конфигурација. Ова е нешто како преклопни прекинувачи, чие префрлување ви овозможува да промените некои својства на микроциркулата во согласност со потребите на проектот. Физички, ова се ќелии на неиспарлива меморија, како оние во кои е запишана програмата. Разликата е во тоа што ги има многу малку (до три бајти за ATmega), а не се вклучени во адресниот простор на ниедна меморија. Пишувањето и читањето на конфигурациските податоци се врши со посебни команди на режимот за програмирање MK. Сега е важно да се забележи дека некои битови за конфигурација влијаат на самата способност за користење на SPI. Со некои од нивните вредности, може да испадне дека SPI не може да се користи. Ако наидете на таков микроконтролер, тогаш методот предложен во овој напис нема да помогне. Во овој случај, или ќе треба да ги промените поставките на конфигурациските битови во програмерот, кој поддржува различен режим на програмирање, или да користите различен микроконтролер. Но, овој проблем се однесува само на искористените МК, или оние со кои некој веќе неуспешно „играл“. Факт е дека новите MK доаѓаат со поставки за конфигурациски битови кои не ја спречуваат употребата на SPI. Ова го потврдуваат резултатите од тестот на програмерската скрипта за програмата „Perpetuum M“, при што успешно блеснаа четири различни MK (ATmega8, ATmega128, ATtiny13, ATtiny44). Сите беа нови. Почетното поставување на битовите за конфигурација беше во согласност со документацијата и не пречеше во употребата на SPI.

Со оглед на горенаведеното, треба да обрнете внимание на следните битови. Битот SPIEN експлицитно ја овозможува или оневозможува употребата на SPI, затоа, во нашиот случај, неговата вредност мора да биде попустлива. Битот RSTDISBL е способен да претвори еден од излезите на микроколото (предодредено) во влезот на сигналот за „ресетирање“ или да не го претвори (во зависност од вредноста напишана на овој бит). Во нашиот случај, влезот „ресетирање“ е неопходен (ако е отсутен, нема да може да се пренесе MK во режим на програмирање преку SPI). Исто така, постојат битови од групата CKSEL кои го одредуваат изворот на сигналот на часовникот. Тие не ја спречуваат употребата на SPI, но исто така треба да се имаат на ум, бидејќи ако нема такт пулсира или ако нивната фреквенција е помала од дозволената за дадена брзина на SPI, нема да има ништо добро ниту од тоа. Вообичаено, новите MCU кои имаат внатрешен RC осцилатор имаат битови од групата CKSEL поставени да го користат. Ние сме сосема задоволни од ова - тактирањето е обезбедено без никаков дополнителен напор од наша страна. Не треба да го лемете кварцниот резонатор, ниту пак да поврзете надворешен генератор. Ако наведените битови содржат поинаква поставка, ќе треба да се грижите за тактирање во согласност со поставката. Во овој случај, може да биде неопходно да се поврзе кварцен резонатор или надворешен генератор на часовник со МК. Но, во рамките на овој напис, нема да разгледаме како се прави ова. Примерите за поврзување на MK за програмирање содржани во овој напис се дизајнирани за наједноставен случај.

Ориз. 1. SPI комуникација во режим на програмирање

Сега да се свртиме кон Слика 1, преземена од документацијата за MK ATmega128A. Го прикажува процесот на испраќање еден бајт до MCU и истовремено примање на еден бајт од MCU. И двата процеса, како што гледаме, ги користат истите такт-пулсирања кои доаѓаат од програмерот до микроконтролерот на неговиот влез SCK - еден од пиновите на микроциркутот, за кој оваа улога е доделена во режимот на програмирање SPI. Уште две сигнални линии обезбедуваат прием и пренос на податоци по еден бит по часовник. Преку влезот MOSI, податоците влегуваат во микроконтролерот, а податоците за читање се земаат од излезот MISO. Забележете ги двете точки нацртани од SCK до MISO и MOSI. Тие покажуваат во кој момент микроконтролерот го „голта“ податочниот сет на влезот MOSI и во кој момент поставува свој бит за податоци на излезот MISO. Сè е прилично едноставно. Но, за да го внесеме МК во режим на програмирање, сепак ни треба сигнал RESET. Да не заборавиме и на заедничката жица GND и напојувањето на VCC. Севкупно, излегува дека само 6 жици треба да се поврзат со микроконтролерот за да трепкаат преку SPI. Подолу ќе го анализираме ова подетално, но засега ќе додадеме дека размената на податоци со MK во режим на програмирање преку SPI се врши во пакети од 4 бајти. Првиот бајт од секој пакет е во основа целосно резервиран за кодирање на командата. Вториот бајт, во зависност од првиот, може да биде продолжение на командниот код или дел од адресата или може да има произволна вредност. Третиот бајт се користи главно за пренос на адреси, но во многу команди може да има произволна вредност. Четвртиот бајт обично носи податоци или има произволна вредност. Истовремено со преносот на четвртиот бајт, некои команди добиваат податоци кои доаѓаат од МК. Детали за секоја инструкција може да се најдат во документацијата на контролорот во табела наречена „SPI Serial Programming Instruction Set“. Засега, забележуваме само дека целата размена со контролорот е изградена од низа од 32-битни пакети, во секој од нив не се пренесуваат повеќе од еден бајт корисни информации. Ова не е многу оптимално, но генерално добро функционира.

3. Поврзување на МК за програмирање

За да се обезбеди дека сите потребни сигнали се доставени до влезовите на микроконтролерот за организирање на интерфејсот SPI и читање податоци од неговиот излез MISO, не е неопходно да се креира програмер. Ова е лесно да се направи со најчестиот USB-RS232TTL конвертор.

На Интернет, често можете да најдете информации дека таквите конвертори се инфериорни, дека ништо сериозно не може да се направи со нив. Но, за повеќето модели на конвертори, ова мислење е погрешно. Да, има конвертори за продажба кои ги немаат достапни сите влезови и излези во споредба со стандардната COM порта (на пример, само TXD и RXD), додека имаат дизајн што не може да се одвои (микроцелот е исполнет со пластика - тоа е невозможно е да се дојде до неговите заклучоци). Но, овие не вреди да се купат. Во некои случаи, можете да ги добиете влезовите и излезите на пристаништето што недостасуваат со лемење на жиците директно на микроспојот. Пример за таков „подобрен“ конвертор е прикажан на Слика 2 (Микроколо PL-2303 - повеќе за целта на неговите пинови во статијата „“). Ова е еден од најевтините модели, но има свои предности кога се користи во домашни дизајни. Каблите за адаптер со целосни функции со стандарден конектор со девет пински на крајот, како COM порта, се исто така широко распространети. Тие се разликуваат од обичната COM порта само во TTL нивоа и некомпатибилност со застарени софтвери некоја стара опрема. Може да се забележи и дека каблите базирани на чипот CH34x при различни екстремни тестови се покажуваат како многу посигурни и постабилни во споредба со конверторите базирани на PL-2303. Меѓутоа, при нормална употреба, разликата не е забележлива.

При изборот на конвертор USB-RS232TTL, треба да обрнете внимание и на компатибилноста на неговиот драјвер со верзијата на користениот оперативен систем.

Да го разгледаме подетално принципот на поврзување на микроконтролерот и конверторот USB-RS232TTL користејќи го примерот на четири различни моделиМК: ATtiny13, ATtiny44, ATmega8 и ATmega128. Слика 3 ја прикажува општата шема на таква врска. Можеби ќе ве изненади што сигналите RS232 (RTS, TXD, DTR и CTS) се злоупотребени. Но, не грижете се за тоа: програмата Perpetuum M може директно да работи со нив - поставете излезни вредности и читајте влезни состојби. Во секој случај, широко користените USB-RS232TTL конвертори базирани на чипови CH34x и PL-2303 даваат таква можност - ова е потврдено. И другите популарни конвертори не треба да бидат проблем, бидејќи стандардните функции на Windows се користат за пристап до портата.

Отпорниците прикажани на општиот дијаграм, во принцип, не можат да се инсталираат, но сепак е подобро да се инсталираат. Која е нивната цел? Користејќи ги влезовите и излезите TTL на конверторот и петволтното напојување на микроконтролерот, со тоа се ослободуваме од потребата да се совпаднеме со логичките нивоа - во секој случај сè е сосема точно. Ова значи дека врските можат да бидат директни. Но се може да се случи за време на експериментите. На пример, според законот за подлост, шрафцигер може да падне токму на местото каде што не може да падне на кој било начин и да затвори нешто што во никој случај не треба да се затвори. Во улога на " шрафцигер", се разбира, сè може да испадне. Отпорниците во овој случај понекогаш ги намалуваат последиците. Повеќе една од нивните цели е да се елиминира можниот конфликт на излезите. Факт е дека на крајот од програмирањето микроконтролерот оди во нормална работа, и може да се случи неговиот излез поврзан на излезот на конверторот (RTS, TXD или DTR) исто така да стане излез, според програма штотуку снимена во МК. Во овој случај, ќе биде многу лошо ако два директно поврзани излези " борба“ - се обидува да постави различни логички нивоа. Во таква „борба“ некој може да „изгуби“, но ова не ни треба.

Вредностите на трите отпорници се избрани на ниво од 4,3 kOhm. Ова се однесува на врските помеѓу излезот на конверторот и влезот на микроконтролерот. Точноста на отпорниците не игра улога: можете да го намалите нивниот отпор на 1 KΩ или да го зголемите на 10 KΩ (но во вториот случај, ризикот од пречки се зголемува кога користите долги жици на патот до MC). Што се однесува до врската помеѓу влезот на конверторот (CTS) и излезот на микроконтролерот (MISO), овде се користи отпорник од 100 Ohm. Ова се должи на особеностите на влезот на користениот конвертор. За време на тестовите, се користеше конвертор на чип PL-2303, чии влезови, очигледно, се повлекуваат до моќта плус со релативно низок отпор (од редот на неколку стотици оми). За да го „убијам влечењето“ морав да ставам отпорник со толку мал отпор. Сепак, не можете да го ставите воопшто. На конверторот, ова е секогаш влезот. Не може да стане излез, што значи дека нема да има конфликт на излези во каков било развој на настаните.

Ако IC има посебен AVCC пин за напојување на A/D конвертор (како што е ATmega8 или ATmega128), тој треба да се поврзе со заедничкиот игла за напојување VCC. Некои ИЦ имаат повеќе од еден VCC игла за напојување или повеќе од еден GND. На пример, ATmega128 има 3 GND пина и 2 VCC пина. Во постојан дизајн, подобро е да се поврзат заклучоците со исто име едни со други. Во нашиот случај, за време на програмирањето, можете да користите еден излез од VCC и GND.

И еве како изгледа врската ATtiny13. Сликата ги прикажува доделувањата на пиновите што се користат при програмирање преку SPI. До фотографијата - како во реалноста изгледа привремена врска.


Некој може да каже дека ова е несериозно - поврзување со жици. Но, ние сме разумни луѓе. Нашата цел е да го програмираме микроконтролерот со минимум време и други ресурси, а не да се покажуваме пред некого. Квалитетот не трпи. Методот „на објави“ во овој случај е доста ефективен и оправдан. Фирмверот на контролорот е еднократна процедура, така што нема смисла да го обесувате со "strassies". Ако во иднина би требало да се смени фирмверот без да се отстрани контролорот од колото (во готовиот производ), тогаш тоа се зема предвид при инсталацијата за време на производството на уредот. Вообичаено, за оваа намена се инсталира конектор (RESET, SCK, MOSI, MISO, GND), а MK може да трепка дури и откако ќе се инсталира на плочата. Но, ова се веќе креативни задоволства. Го разгледуваме наједноставниот случај.

Сега да преминеме на ATtiny44 MK. Сè е отприлика исто овде. Според цртежот и фотографијата, дури и почетник нема да биде тешко да ја сфати врската. Како и ATtiny44, можете да ги поврзете MK ATtiny24 и ATtiny84 - доделувањето на пиновите за ова тројство е иста.


Друг пример за привремено поврзување на контролорот за негово програмирање е ATmega8. Овде има повеќе заклучоци, но принципот е ист - неколку жици, а сега контролорот е подготвен да „пополни“ информации во него. Екстра црната жица на фотографијата, која доаѓа од пинот 13, не учествува во програмирањето. Тој е дизајниран да отстрани звучен сигнал од него откако MK ќе излезе од режимот на програмирање. Ова се должи на фактот што при дебагирањето на сценариото за „Perpetuum M“ програмата беше преземена на МК музичка кутија.


Често еден контролер е достапен во различни случаи. Во овој случај, доделувањето заклучоци за секој случај се дистрибуира на свој начин. Ако куќиштето на вашиот контролер не изгледа како она што е прикажано на сликата, наведете ја намената на пиновите според техничката документација, која може да се преземе од веб-страницата на развивачот на МК.

За да ја комплетираме сликата, да го погледнеме поврзувањето на MK чипот со голем број „нозе“. Целта на дополнителната црна жица на фотографијата која доаѓа од пинот 15 е сосема иста како и во случајот со ATmega8.


Веројатно веќе сте виделе дека сè е прилично едноставно. Кој знае како да ги брои заклучоците на микроциркулите (од ознаката во круг спротивно од стрелките на часовникот), тој ќе го сфати. И не заборавајте да бидете внимателни. Микроциркулите сакаат уредни и не простуваат невнимателен однос кон себе.

Пред да продолжите со софтверскиот дел, проверете дали е правилно инсталиран двигателот на конверторот USB-RS232TTL (проверете го Управувачот со уреди на Windows). Запомнете или запишете го бројот на виртуелната COM порта што се појавува кога ќе го поврзете конверторот. Овој број ќе треба да се внесе во текстот на сценариото, за што можете да прочитате подолу.

4. Скрипта - програмер за „Perpetuum M“

Го сфативме хардверскиот дел на „програмерот“. Тоа е веќе половина од битката. Сега останува да се занимаваме со софтверскиот дел. Неговата улога ќе ја врши програмата „Perpetuum M“ под контрола на скрипта, во која се имплементирани сите потребни функции за интеракција со микроконтролерот.

Архивата со скриптата треба да се отпакува во истата папка каде што се наоѓа програмата perpetuum.exe. Во овој случај, кога ќе ја извршите датотеката perpetuum.exe, на екранот ќе се прикаже мени со листа на инсталирани скрипти, меѓу кои ќе има линијата „MK AVR programmer“ (можеби е и единствениот). Ова е линијата што ни треба.

Скриптата се наоѓа во папката PMS во датотеката „MK Programmer AVR.pms“. Оваа датотека може да се гледа, проучува и уредува по потреба во заеднички текстуален уредувач како што е Windows Notepad. Пред да ја користите скриптата, најверојатно ќе треба да направите промени во текстот поврзан со поставката за портата. За да го направите ова, проверете го името на портата што се користи во Управувачот со уреди на Windows и, доколку е потребно, направете соодветна измена на линијата "PortName="COM4";" - наместо бројот 4, може да има друг број. Исто така, кога користите различен модел на конвертор USB-RS232TTL, може да биде неопходно да се сменат поставките за инверзија на сигналот (линиите на скрипта кои започнуваат со зборот „Високо“). Можете да ја проверите инверзијата на сигналите од конверторот USB-RS232TTL користејќи еден од примерите содржани во упатствата за програмата Perpetuum M (дел на функции за работа со портата).

Подпапката MK_AVR содржи датотеки со описи на поддржаните контролери. Ако саканиот контролер не е меѓу нив, можете сами да го додадете потребниот, постапувајќи по аналогија. Земете една од датотеките како примерок и со помош на уредувач на текст, внесете ги потребните податоци, земајќи ги од документацијата за вашиот микроконтролер. Главната работа е да се биде внимателен, внесете ги податоците без грешки, инаку МК нема да се програмира, или ќе се програмира погрешно. Оригиналната верзија поддржува 6 микроконтролери: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 и ATmega128. Скриптата имплементира автоматско препознавање на поврзаниот контролер - не треба рачно да го одредувате. Ако меѓу достапните описи нема прочитан идентификатор од МК, се прикажува порака дека контролерот не може да се препознае.

Архивата со сценариото исто така содржи дополнителни информации. Папката „AVR controllers inc files“ содржи многу корисна и обемна колекција на датотеки со опис на контролорите. Овие датотеки се користат при пишување на сопствени програми за МК. Уште четири папки „MusicBox_...“ содржат датотеки со асемблер програма и фирмвер подготвен за преземање во MK посебно за ATtiny13, ATtiny44, ATmega8 и ATmega128. Ако веќе сте приклучиле еден од овие МК за програмирање, како што е предложено во овој напис, тогаш можете да го блицнете веднаш - ќе добиете музичка кутија. Повеќе за тоа подолу.

Кога ќе ја изберете линијата „Programmer MK AVR“ во менито за скрипти, скриптата започнува да се извршува. Во исто време, ја отвора портата, испраќа команда да се префрли на режимот на програмирање во MC, добива потврда од MC за успешна транзиција, го бара идентификаторот MC и бара опис на овој MC со неговиот идентификатор меѓу достапни датотеки со описи. Доколку не го најде потребниот опис, издава соодветна порака. Ако се најде описот, тогаш се отвора главното мени на програмерот. Нејзината слика од екранот можете да ја видите на Слика 8. Не е тешко да се разбере понатаму - менито е многу едноставно.

Во првата верзија на сценариото, некои функции на полноправен програмер не се имплементирани. На пример, не постои начин да се чита и пишува на EEPROM. Но, ако ја отворите скриптата во уредувач на текст, ќе видите дека има многу мала големина, и покрај фактот што главната работа е веќе имплементирана во неа. Ова сугерира дека додавањето на функциите што недостасуваат не е толку тешко - јазикот е многу флексибилен, ви овозможува да имплементирате богата функционалност во мала програма. Но, за повеќето случаи, дури и постоечките функции ќе бидат доволни.

Некои ограничувања на функционалноста се опишани директно во текстот на скриптата:
//имплементиран запис само од адресата нула (Записот за адреса на продолжениот сегмент е игнориран, LOAD OFFSET е исто така)
//редоследот и континуитетот на записите во датотеката HEX не се проверени
//проверката не е проверена
Ова се однесува на работа со HEX-датотека, од која се зема кодот на фирмверот за MK. Ако оваа датотека не е оштетена, проверката на контролната сума нема да влијае на ништо. Ако е искривено, нема да може да се открие со помош на сценариото. Останатите ограничувања во повеќето случаи нема да наштетат, но сепак треба да ги имате на ум.

5. Музичка кутија - лесен занает за почетници

Ако имате еден од овие микроконтролери: ATtiny13, ATtiny44, ATmega8 или ATmega128, можете лесно да го претворите во музичка кутија или музичка картичка. За да го направите ова, доволно е да го напишете соодветниот фирмвер во MK - една од четирите што се наоѓаат во папките "MusicBox_..." во една архива со скриптата. Кодовите на фирмверот се зачувуваат во датотеки со екстензија „.hex“. Користењето на ATmega128 за таков занает е, се разбира, „дебело“, исто како и ATmega8. Но, тоа може да биде корисно за тестирање или експериментирање, со други зборови - за едукативни цели. Во прилог се и текстовите на програмата за асемблерот. Програмите не беа создадени од нула - програмата на музичката кутија од книгата на А.В. Белов беше земена како основа AVR микроконтролериво радиоаматерската практика". Оригиналната програма претрпе низа значајни промени:
1. приспособено за секоја од четирите МК: ATtiny13, ATtiny44, ATmega8 и ATmega128
2. копчињата се елиминирани - ништо не треба да се поврзе со контролорот, освен напојување и емитер на звук (мелодиите се репродуцираат една по друга во бескрајна јамка)
3. времетраењето на секоја нота се намалува за времетраењето на паузата помеѓу нотите за да се елиминираат нарушувањата на музичкиот ритам
4. осмата мелодија е поврзана, не се користи во верзијата на книгата
5. субјективно: некои „подобрувања“ за оптимизација и полесно согледување на алгоритмот

Во некои мелодии може да се слушне лажност, па дури и гафови, особено во „Насмевка“ - во средината. Кодовите на мелодијата се преземени од книгата (поточно, преземени од веб-страницата на авторот заедно со оригиналниот asm-датотека) и не се променети. Очигледно, има грешки во кодирањето на мелодиите. Но, ова не е проблем - оние кои се „пријатели“ со музиката лесно ќе сфатат и ќе поправат сè.

Во ATtiny13, поради недостаток на 16-битен бројач за пуштање ноти, беше неопходно да се користи 8-битен, што доведе до одредено намалување на точноста на звукот на нотите. Но, на уво тоа тешко се забележува.

За битови за конфигурација. Нивното поставување мора да одговара на состојбата на новиот микроконтролер. Ако вашиот MCU бил користен некаде претходно, треба да го проверите статусот на неговите битови за конфигурација и, доколку е потребно, да ги усогласите со поставките на новиот микроконтролер. Статусот на конфигурациските битови на новиот микроконтролер можете да го дознаете од документацијата за овој МК (дел „Битови за осигурувачи“). Исклучок е ATmega128. Овој MCU има бит M103C кој овозможува режим на компатибилност со постариот ATmega103. Активирањето на битот M103C значително ги намалува можностите на ATmega128, а овој бит е активен на новиот MK. Треба да го ресетирате M103C во неактивна состојба. За да манипулирате со битовите за конфигурација, користете го соодветниот дел од менито за скрипта за програмер.

Нема смисла да се даде дијаграм на музичката кутија: има само микроконтролер, напојување и пиезо емитер на звук. Напојувањето се напојува на ист начин како и при програмирањето на МК. Звучниот емитер е поврзан помеѓу заедничката жица (излез GND на контролерот) и еден од излезите на MK, чиј број може да се најде во датотеката со асемблер кодот на програмата (*.asm). На почетокот на текстот на програмата за секој МК во коментарите има ред: „ звучен сигналсе формира на излезот XX". Кога ќе заврши скрипт-програмерот, микроконтролерот излегува од режимот на програмирање и се префрла во нормалниот режим на работа. Мелодиите се репродуцираат веднаш. Со поврзување на емитер на звук, можете да го проверите ова. Можете да го оставите емитер на звук поврзан за време на програмирањето на кристалот само ако аудиото е преземено од пин што не се користи во SPI, во спротивно дополнителниот капацитет на пинот може да пречи на програмирањето.

Задача: Ќе развиеме програма за контролирање на една ЛЕР. Кога ќе се притисне копчето, LED свети, кога ќе се ослободи, се гаси.

За почеток, ќе развиеме шематски дијаграм на уредот. Влезните/излезни порти се користат за поврзување на сите надворешни уреди со микроконтролерот. Секоја порта е способна и за влез и за излез. Ајде да го поврземе ЛЕР со една од портите, а копчето со другата. За ова искуство, ќе користиме контролер Атмега8. Овој чип содржи 3 I/O порти, има 2 осум-битен и 1 шеснаесет-битен тајмер/бројач. Исто така, на бродот има 3-канален PWM, 6-канален 10-битен аналогно-дигитален конвертор и многу повеќе. Според мене, микроконтролерот е одличен за учење на основите на програмирањето.

За поврзување на ЛЕР, ќе ја користиме линијата PB0, а за читање информации од копчето, ќе ја користиме линијата PD0. Шемата е прикажана на сл.1.

Ориз. 1

Преку отпорникот R2, на влезот PD0 се применува плус напон на напојување, што одговара на сигналот на логичката единица. Кога копчето е затворено, напонот паѓа на нула, што одговара на логичка нула. Во иднина, R2 може да се исклучи од колото, заменувајќи го со внатрешен отпорник на оптоварување, внесувајќи ги потребните поставки во програмата. ЛЕР е поврзан со излезот на портата PB0 преку отпорник со ограничување на струјата R3. За да се запали ЛЕР, мора да се примени логички сигнал на линијата PB0. Ќе го користиме внатрешниот генератор на часовник на 4 MHz, бидејќи уредот нема високи барања за стабилност на фреквенцијата.

Сега ја пишуваме програмата. За пишување програми ја користам програмската средина Студио AVRИ винавр.Отворете го AVR Studio, се појавува прозорец за добредојде, кликнете на копчето „Креирај нов проект“ (Нов проект), потоа изберете го типот на проектот - AVR GCC, напишете го името на проектот на пример „cod1“, ставете ги двете полиња за избор „Креирај проектна папка и „Креирај датотека за иницијализација“, притиснете го копчето „Следно“, изберете „AVR Simulator“ во левиот прозорец и внесете микроконтролер „Atmega8“ во десниот прозорец, притиснете го копчето „Finish“, уредникот и дрвото на категоријата на проектот. отворено - почетните поставки се завршени.

Прво, да го додадеме стандардниот опис на текстот за Atmega8 користејќи го надворешниот оператор за прикачување на датотеки: #вклучи

директивна синтакса #вклучи

#вклучи<имя_файла.h>
#include "filename.h"

Аголни загради< и >кажи му на компајлерот да бара вклучува датотеки прво во стандардната папка WinAvr именувана include. Двојните наводници “ и “ му кажуваат на компајлерот да започне со пребарување од директориумот каде што е зачуван проектот.

Секој тип на микроконтролер има своја датотека со заглавие. За ATMega8 оваа датотека се нарекува iom8.h, за ATtiny2313 - iotn2313.h. На почетокот на секоја програма, мора да ја вклучиме датотеката за заглавие на микроконтролерот што го користиме. Но, постои и заедничка датотека за заглавие io.h. Претпроцесорот ја обработува оваа датотека и, во зависност од поставките на проектот, ја вклучува потребната датотека за заглавие во нашата програма.

За нас, првата линија од програмата ќе изгледа вака:

#вклучи

Секоја програма C мора нужно да содржи една главна функција. Го има името главно. Извршувањето на програмата секогаш започнува со извршување на главната функција. Функцијата има заглавие - int main(void) и тело - таа е ограничена виткани протези {}.

int main (празнина)
{
функционално тело
}

Ќе го додадеме нашиот код во телото на функцијата. На името на функцијата му претходи типот на повратната вредност. Ако функцијата не врати вредност, се користи клучот. празнина.

инте цел број од 2 бајти, опсегот на вредности е од - 32768 до 32767

По името на функцијата во загради () се параметрите кои се пренесуваат на функцијата кога се повикува. Ако функцијата нема параметри, се користи клучниот збор празнина. Функција главенсодржи збир на команди, системски поставки и главната програмска јамка.

Следно, конфигурирајте ја портата Ддо влезот. Режимот на работа на пристаништето се одредува според содржината на регистарот ДДРД(регистар за насока на пренос на информации). Во овој регистер го запишуваме бројот „0x00“ (0b0000000 - во бинарна форма), освен копчето, ништо не е поврзано со оваа порта, па ја поставивме целата порта D на влезот. Можете да ја конфигурирате портата малку по малку со запишување на броевите 0 или 1 (0-влез, 1-излез) во секој бит од регистарот, на пример DDRD = 0x81 (0b10000001) - првата и последната линија на портата D работат за излез, остатокот за влез. Мора да се поврзе и внатрешен терминален отпорник. Вклучувањето и исклучувањето на внатрешните отпорници се контролира од регистарот PORTx кога портата е во режим на влез. Ајде да напишеме единици таму.

Поставување на пристаништето Бдо излезот. Режимот на работа на пристаништето се одредува според содржината на регистарот DDRB. Ништо освен ЛЕР на пристаништето Бне е поврзан, па можете да ја конфигурирате целата порта за излез. Ова се прави со регистрација DDRBброј „0xFF“. За да не свети ЛЕД-то кога првпат ќе го вклучите, пишете на портот Блогички нули. Ова се прави со пишување PORTB= 0x00;

За доделување вредности, се користи симболот "=" и се нарекува оператор за доделување, да не се меша со знакот "еднакво".

Поставките на портата ќе изгледаат вака:

ДДРД=0х00;
PORTD=0xFF;
DDRB=0xFF;
PORTB = 0x00;

Ја пишуваме главната јамка на програмата. додека(„до“ од англиски) - оваа команда организира јамка, постојано повторувајќи го телото на јамката додека не се исполни условот, односно додека изразот во заградите не е точен. Во C, изразот се смета за вистинит ако е не-нула, и неточен ако е.

Командата изгледа вака:

додека (состојба)
{
тело на јамка
}

Во нашиот случај, главната јамка ќе се состои од само една команда. Оваа команда го поставува регистарот PORTBпревртена регистерска вредност PORTD.

PORTB = ~PIND; //земи вредност од портата D, преврти ја и додели на PORTB (напиши во PORTB)

// C изразите се читаат од десно кон лево

ПИНДрегистар за внесување информации. За да прочитате информации од надворешниот излез на контролерот, прво мора да го префрлите потребниот бит од портата во режим на влез. Односно, запишете на соодветниот бит од регистарот DDRxнула. Само после тоа, на овој излез може да се примени дигитален сигнал од надворешен уред. Следно, микроконтролерот ќе го прочита бајтот од регистарот PINx. Содржината на соодветниот бит одговара на сигналот на надворешниот пин на портата. Нашата програма е подготвена и изгледа вака:

#вклучи int main (празнина) ( DDRD = 0x00; //порта D - влез PORTD = 0xFF; //поврзете го завршниот отпорник DDRB = 0xFF; //порта B - излез PORTB = 0x00; //поставете го излезот на 0 додека (1) ( PORTB = ~PIND; //~ знак за инвертирање на битови ) )

Коментарите се широко користени во јазикот C. Постојат два начина за пишување.

/*Коментар*/
//Коментар

Во овој случај, компајлерот нема да обрне внимание на она што е напишано во коментарот.

Ако ја користите истата програма и поврзете 8 копчиња и 8 LED диоди со микроконтролерот, како што е прикажано на слика 2, ќе биде јасно дека секој бит од портата Додговара на неговиот бит за порта Б. Со притискање на копчето SB1 - HL1 светнува, со притискање на копчето SB2 - HL2 светнува итн.

Слика 2

Написот користеше материјали од книгата на Белов А.В. „Упатство за програмери на уреди AVR“

Не еднаш или двапати кажав дека проучувањето на МК треба да започне со асемблер. Цел курс на страницата беше посветен на ова (иако не е многу доследен, но постепено го чешлам до адекватен изглед). Да, тешко е, резултатот нема да биде првиот ден, но ќе научите да разберете што се случува во вашиот контролер. Ќе знаеш како функционира, а не како мајмун да копираш туѓи извори и да се обидуваш да разбереш зошто наеднаш престанал да работи. Покрај тоа, на C му е многу полесно да се зафркава со redneck кодот кој ќе излезе со вила во најнеповолниот момент.

За жал, секој сака резултати веднаш. Затоа, решив да одам на друг начин - да направам туторијал за C, но со демонстрација на неговата долна облека. Добриот програмер за вградување секогаш цврсто го држи своето парче железо за чварката, спречувајќи го да направи ниту еден чекор без дозвола. Значи, што ќе биде прво кодот C, потоа што родил компајлерот и како сето тоа функционира во реалноста :)

Од друга страна, силната страна на C е преносливоста на кодот. Ако, се разбира, да се напише сè правилно. Одвојување на работните алгоритми и нивните железни имплементации во различни делови од проектот. Потоа, за да го префрлите алгоритмот во друг МК, ќе биде доволно да се преработи само слојот за интерфејс, каде што е запишан целиот пристап до хардверот и да се остави целиот работен код како што е. И, се разбира, читливост. Изворниот код на Sish е полесен за разбирање на прв поглед (иако .. на пример, не ми е гајле што да потчукнам - барем si, барем asm :)), но, повторно, ако сè е напишано правилно. Ќе обрнам внимание и на овие точки.

Како експериментално парче железо на кое ќе биде поставен лавовскиот дел од сите примери, ќе биде мојата табла за дебагирање.

Прва програма C за AVR

Избор на компајлер и инсталирање на околина
Постојат многу различни C компајлери за AVR:
Прво на сите, ова IAR AVR C- речиси недвосмислено признат како најдобар компајлер за AVR, tk. самиот контролер е создаден во тесна соработка помеѓу Atmel и специјалисти од IAR. Но, треба да платите за сè. И овој компајлер не е само скап комерцијален софтвер, туку има и толкава плејада на поставки што само треба да работите напорно за да го компајлирате во него. Навистина немав пријателство со него, проектот изгни поради чудни грешки во фазата на поврзување (подоцна дознав дека се работи за крива пукнатина).

Второто оди WinAVR GCCе моќен оптимизирачки компајлер. Целосно отворен код, крос-платформа, воопшто, сите радости на животот. Исто така, совршено се интегрира во AVR Studio, овозможувајќи ви да дебагирате токму таму, што е пеколно погодно. Во принцип, јас го избрав.

Исто така имаат CodeVision AVR Cе многу популарен компајлер. Стана популарен поради неговата едноставност. Можете да добиете работна програма во неа за неколку минути - волшебникот за стартни кодови во голема мера придонесува за ова, означувајќи ги стандардите за иницијализирање на сите арти. Да бидам искрен, некако го третирам со сомнеж - штом морав да расклопам програма напишана од овој компајлер, испадна некаква каша, а не код. Ужасна количина на непотребни гестови и операции, што резултираше со прилично голема количина на код и бавни перформанси. Сепак, можеби имало грешка во ДНК на оригиналниот пишувач на фирмверот. Плус сака пари. Не толку колку IAR, но забележливо. И во демо режим ви овозможува да напишете не повеќе од 2 kb код.
Се разбира дека има пукнатина, но ако крадеш, тогаш милион, во смисла на IAR :)

Исто така постои Image Craft AVR CИ MicroCод микроелектрониката. Не морав да го користам ниту еден, но... SWGмногу пофалби микропаскал, велат тие, ужасно удобна програмска средина и библиотеки. Мислам дека MicroC нема да биде полош, но и платен.

Како што реков, јас избрав WinAVRод три причини: бесплатно, се интегрира во AVR Studio и за него се пишува само еден куп готов код за сите прилики.

Затоа преземете WinAVR со и AVR Studio. Следно, студиото прво се инсталира, а потоа, одозгора, WinAVR се навива и се прилепува до студиото во форма на приклучок. Силно препорачувам да го ставите WinAVR на кратка патека, нешто како C:\WinAVR, со што ќе избегнете многу проблеми со патеките.

Создавање проект
Значи, студиото е наместено, C се заеба, време е да се обидеме да програмираме нешто. Да почнеме со едноставното, наједноставното. Стартувајте го студиото, изберете нов проект таму како компајлер AVR GCC и внесете го името на проектот.

Работниот простор се отвора со празна датотека *.c.

Сега не боли да го конфигурирате приказот на патеките во обележувачите на студиото. За да го направите ова, одете на:
Мени Алатки - Опции - Општо - FileTabs и изберете „Само име на датотека“ од паѓачката листа. Во спротивно, ќе биде невозможно да се работи - јазичето ќе ја содржи целата патека на датотеката и нема да има повеќе од две или три јазичиња на екранот.

Поставување на проектот
Општо земено, се смета дека е класично да се креира датотека за правење во која би биле опишани сите зависности. И ова е веројатно точно. Но, за мене, кој пораснав со целосно интегрирани IDE како uVisionили Студио AVRовој пристап е длабоко туѓ. Затоа, тоа ќе го направам на мој начин, со сите средства на студиото.

Кликнете на копчето за менувачот.


Ова се вашите поставки за проектот и попрецизни поставкиавтоматско генерирање на фајлови. На првата страница само треба да ја внесете фреквенцијата на која ќе работи вашиот МК. Зависи од битовите на осигурувачите, па претпоставуваме дека фреквенцијата е 8000000Hz.
Обрнете внимание и на линијата за оптимизација. Сега постои -Os е оптимизација на големината. Оставете го како што е засега, тогаш можете да се обидете да си поиграте со овој параметар. -О0 воопшто не е оптимизација.

Следниот чекор е да ги поставите патеките. Пред сè, додадете го директориумот на вашиот проект таму - таму ќе ставите библиотеки од трети страни. Патеката „.\“ ќе се појави во списокот

Датотеката make е генерирана, можете да ја погледнете во стандардната папка во вашиот проект, само погледнете, видете што има таму.


Тоа е се за сега. Кликнете на ОК насекаде и одете до изворот.

Формулирање на проблемот
Празната плоча е примамливо да отелотвори некаква лукава идеја, бидејќи баналното трепкање на диодата повеќе не се вметнува. Ајде веднаш да го земеме бикот за рогови и да спроведеме врска со компјутерот - ова е првото нешто што го правам.

Ќе работи вака:
Кога единицата ќе пристигне на COM портот (шифра 0x31), ќе ја вклучиме диодата, а кога ќе пристигне нула (шифра 0x30), ќе ја изгасиме. Покрај тоа, сè ќе се прави на прекини, а задачата во заднина ќе биде трепкање на друга диода. Едноставно и значајно.

Составување на шемата
Треба да го поврземе модулот за конвертор USB-USART со USART пиновите на микроконтролерот. За да го направите ова, земаме скокач од две жици и ги ставаме на игличките попречно. Односно, го поврзуваме Rx на контролорот со Tx на конверторот, а Tx на конверторот со Rx на контролерот.

Излегува, на крајот, ова е шемата:


Не размислувам за поврзување на останатите излези, напојување, ресетирање, стандардно е

Ние го пишуваме кодот

Веднаш ќе направам резервација дека нема да истражувам конкретно во описот на самиот јазик C. За да го направите ова, едноставно има огромна количина материјал, почнувајќи од класичниот „C програмски јазик“ од K&R до разни прирачници.

Еден таков метод беше пронајден во мојата скривалиште, еднаш го проучував овој јазик користејќи го. Сè е кратко, јасно и до точка. Постепено го пишувам и го влечам на мојот сајт.

Вистина е дека сè уште не се преместени сите поглавја таму, но мислам дека не е за долго.

Малку е веројатно дека ќе го опишам подобро, затоа, од курсот за обука, наместо детално објаснување за сложеноста на Cish, едноставно ќе дадам директни врски до поединечни страници од овој прирачник.

Додавање библиотеки.
Пред сè, ги додаваме потребните библиотеки и заглавија со дефиниции. На крајот на краиштата, C е универзален јазик и треба да се објасни дека работиме со AVR, па внесете ја линијата во изворниот код:

1 #вклучи

#вклучи

Оваа датотека се наоѓа во папката WinAVRи содржи опис на сите регистри и порти на контролорот. И сè е незгодно таму, во врска со специфичен контролер, кој го пренесува компајлерот преку направидатотека во параметар MCUи врз основа на оваа променлива, со вашиот проект е поврзана датотека со заглавие со опис на адресите на сите порти и регистри за овој конкретен контролер. Како! Без него, можете и вие, но тогаш нема да можете да користите симболични имиња на регистри како SREG или UDR, и ќе мора да ја запомните адресата на секој како „0xC1“, а тоа ви ја крши главата.

Истиот тим #вклучи<имя файла> ви овозможува да додадете во вашиот проект содржината на која било текстуална датотека, на пример, датотека со опис на функции или дел од друг код. И за да може директивата да ја пронајде оваа датотека, ги наведовме патеките до нашиот проект (директориумот WinAVR веќе е стандардно регистриран таму).

главната функција.
Програма C е за сите функции. Тие можат да бидат вгнездени и повикани едни од други по кој било редослед и различни начини. Секоја функција има три потребни параметри:

  • Повратна вредност, на пример, грев (x)ја враќа вредноста на синусот на x. Како во математиката, накратко.
  • Пренесените параметри, исто x.
  • Функционо тело.

Сите пренесени и вратени вредности мора да бидат од некој тип, во зависност од податоците.

Секоја програма C мора да содржи функција главенкако влезна точка во главната програма, инаку воопшто не е C :). Со присуството на main во туѓ извор на милион датотеки, можете да разберете дека ова е главниот дел од програмата од каде започнува сè. Тука ќе поставиме:

1 2 3 4 5 int main(void) (врати 0;)

int main(void) (врати 0;)

Сите, прво наједноставната програманапишано, не е важно што не прави ништо, само што почнавме.

Ајде да видиме што направивме.
инте типот на податоци што го враќа главната функција.

Се разбира, во микроконтролерот главенво принцип ништо не може да се врати, а теоретски треба да биде празнина главна (празнина), но GCC првично е заострен на компјутерот и таму програмата може да ја врати вредноста операционен системпо завршувањето. Затоа GCC вклучен празнина главна (празнина)се колне во Предупредување.

Ова не е грешка, ќе успее, но не сакам предупредувања.

празнинаова е типот на податоци што ги пренесуваме на функцијата, во овој случај главенисто така не може да прифати ништо однадвор, поетот празнина- празен. Никулец се користи кога ништо не треба да се предаде или врати.

Еве ги овие { } кадрави загради е програмски блок, во овој случај телото на функцијата главен, кодот ќе се наоѓа таму.

враќање- ова е повратната вредност што главната функција ќе ја даде по завршувањето, бидејќи имаме int, односно број, тогаш мора да вратиме број. Иако сè уште нема смисла, бидејќи. на микроконтролерот од главниот, не можеме да одиме само никаде. Враќам нула. За нефиг. И компајлерот е обично паметен и не генерира код за овој случај.
Иако, ако е изопачено, тогаш од главенможеш да отидеш во МК - на пример, да паднеш во делот подигнувач и да го извршиш, но овде веќе ќе ти треба земање на фирмверот на ниско ниво за да ги поправиш адресите за транзиција. Подолу ќе видите и разберете како да го направите тоа. За што? Сега ова е друго прашање, во 99,999% од случаите тоа не е потребно :)

Готово, продолжи понатаму. Ајде да додадеме променлива, навистина не ни треба и не треба да воведуваме променливи без неа, но учиме. Ако променливите се додадат во телото на функцијата, тогаш тие се локални и постојат само во оваа функција. Кога ќе излезете од функцијата, овие променливи се бришат, а RAM меморијата се дава на поважни потреби. .

1 2 3 4 5 6 int main(void) (непотпишан знак i; враќање 0;)

int main(void) (непотпишан знак i; враќање 0; )

непотпишанзначи непотпишан. Факт е дека во бинарното претставување, најзначајниот бит се доделува на знакот, што значи дека бројот +127/-128 се вклопува во еден бајт (char), но ако знакот се отфрли, тој ќе одговара од 0 до 255. Обично знакот не е потребен. Значи непотпишан.
јасе само име на променлива. Нема повеќе.

Сега треба да ги иницијализираме пристаништата и УАРТ. Се разбира, можете да ја земете и поврзете библиотеката и да повикате некој вид UartInit (9600); но тогаш нема да знаете што навистина се случило.

Ние го правиме ова:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void ) ( непотпишан char i; #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRRH = HI (бауддивидер) ; UCSRA = 0; UCSRB=1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) (непотпишан char i; #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO (бауддивидер); UBRRH = HI (бауддивидер); UCSRA = 0; UCSRB = 1<

Страшно? Всушност, има само пет последни линии на вистински код. Сè, тоа #Дефинирајтоа е предпроцесорски макро јазик. Речиси исти врвови како во Assembler, но синтаксата е малку поинаква.

Тие ќе ви ги олеснат рутинските операции за пресметување на потребните коефициенти. Во првиот ред велиме дека наместо XTALможете безбедно да замените 8000000, и Л- индикација за тип, велат долга е фреквенцијата на часовникот на процесорот. Исто баудрат- фреквенција на пренос на податоци преку UART.

бауддивидервеќе покомплицирано, наместо него ќе се замени изразот пресметан со формулата од претходните две.
Па и LOИ Здравоод овој резултат ќе се земат ниските и високите бајти, бидејќи очигледно не може да се вклопи во еден бајт. ВО Здраво x се поместува (влезен параметар на макрото) осум пати надесно, како резултат на тоа, од него ќе остане само високиот бајт. И во LOправиме малку И со 00FF, оставајќи го само нискиот бајт како резултат.

Значи сè што е направено е како #Дефинирајможете безбедно да го фрлите и да ги пресметате потребните бројки на калкулаторот и веднаш да ги внесете во линиите UBBRL = .... и UBBRH=…..

Може. Но! Направете го ова СТРОГО НЕВОЗМОЖНО!

Ќе функционира вака и онака, но ќе имате т.н магични броеви- вредности земени од никаде и не е јасно зошто, и ако отворите таков проект за неколку години, тогаш ќе биде проклето тешко да се разбере кои се овие вредности. И сега, ако сакаш да ја смениш брзината, или да ја смениш фреквенцијата на кварцот и ќе треба да пресметуваш се, и така сменил неколку бројки во кодот и толку. Во принцип, ако не сакате да ве сметаат за лош кодер, тогаш направете го кодот за да биде лесен за читање, разбирлив и лесно модифициран.

Тогаш сè е едноставно:
Сите овие „UBRLL и Co“ се конфигурациските регистри на предавателот UART со кои ќе комуницираме со светот. И сега им ги доделивме потребните вредности, поставувајќи ги на саканата брзина и саканиот режим.

Прикажи го записот 1<Тоа значи следново: земете 1 и ставете го на своето место RXENво бајт. RXENова е четвртиот бит од регистарот UCSRB, Значи 1<го формира бинарниот број 00010000, TXENе третиот бит, и 1<ќе даде 00001000. Сингл „|“ тоа е битно ИЛИ, па 00010000 | 00001000 = 00011000. На ист начин, преостанатите потребни битови за конфигурација се поставуваат и се додаваат во заедничкиот куп. Како резултат на тоа, собраниот број е запишан во UCSRB. Подетално е опишано во листот со податоци на МК во делот USART. Затоа, не се расејувајте од техничките детали.

Готово, време е да видиме што ќе се случи. Кликнете на компилацијата и започнете со емулација (Ctrl+F7).

Дебагирање
Поминуваа секакви ленти за напредок, студиото се смени и жолта стрелка се појави во близина на влезот на главната функција. Тука е моментално процесорот и симулацијата е паузирана.

Факт е дека првично, всушност, беше на линијата UBRRL = LO(bauddivider); На крајот на краиштата, она што го имаме во дефинирањето не е код, туку едноставно прелиминарни пресметки, така што симулаторот е малку досаден. Но, сега сфати дека првата инструкција е исполнета и ако се качите на дрво I/O Приказ, во делот USART и погледнете го бајтот UBBRL таму, ќе видите дека веќе има вредност таму! 0x33.

Направете уште еден чекор. Погледнете како ќе се промени содржината на друг регистар. Затоа, проверете ги сите, обрнете внимание на фактот дека сите посочени битови се поставени како што ви кажав, и тие се поставени истовремено за целиот бајт. Работите нема да одат подалеку од Враќање - програмата е завршена.

Отворање
Сега ресетирајте ја симулацијата на нула. Кликнете таму Ресетирање (Shift+F5). Отворете го расклопениот список, сега ќе видите што навистина се случува во контролорот. Прикажи -> Расклопувач. И не YYAAAA!!! Составувач!!! УЖАСНО!!! И ТОА Е ПОТРЕБНО. За подоцна, кога нешто ќе тргне наопаку, да не се глупирате во кодот и да не поставувате потешки прашања на форумите, туку веднаш да влезете во шуплините и да погледнете каде имате приклучок. Нема ништо страшно таму.

Прво ќе има врвови од серијата:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A Скок +00000002: 940C0034 JMP 0x00000034 Скок +00000004: 940C0034 JMP 0x304000C +00400000000 Пратеник 0 x00000034 Скок +00000008: 940C0034 JMP 0x00000034 Скок +0000000A: 940C0034 JMP 0x00000034 Прескок +00000000C +00000000C: + 0000000E: 940C0034 JMP 0x00000034 Скокни +00000010: 940C0034 JMP 0x00000034 Скокни +00000012: 940C0034 JMP 0034000C JMP 0 x00000034 Скок +00000016: 940C0034 JMP 0x00000034 Скок +00000018: 940C0034 JMP 0x00000034 Скок +00000001A +0000001A ЈМП00x004 +0000001C : 940C0034 JMP 0x00000034 Скокни +0000001E: 940C0034 JMP 0x00000034 Скокни +00000020: 940C0034 JMP 003000000000 JMP 0x0000003 4 Скок +00000024: 940C0034 JMP 0x00000034 Скок +00000026: 940C0034 JMP 0x00000034 Скок +0000000MP0004

00000000: 940C002A JMP 0x0000002A Скок +00000002: 940C0034 JMP 0x00000034 Скок +00000004: 940C0034 JMP 0x00400000000 Пратеник 0 x00000034 Скок +00000008: 940C0034 JMP 0x00000034 Скок +0000000A: 940C0034 JMP 0x00000034 Скок +00000000C: 940C0034 JMP 0x00000034 0000000E : 940C0034 JMP 0x00000034 Скокни +00000010: 940C0034 JMP 0x00000034 Скокни +00000012: 940C0034 JMP 0004000C +004000C JMP 0x0000003 4 Скок +00000016: 940C0034 JMP 0x00000034 Скок +00000018: 940C0034 JMP 0x00000034 Прескок +00000001A +0000000MP00304 0000001C: 940C0034 JMP 0x00000034 Скокни +0000001E: 940C0034 JMP 0x00000034 Скокни +00000020: 940C0034 JMP 0x0040000C MP 0x00000034 Скок +00000024: 940C0034 JMP 0x00000034 Скок +00000026: 940C0034 JMP 0x00000034 Скок +000000028 JMP0030000C

Ова е векторската табела за прекини. Подоцна ќе се вратиме на него, засега, само погледнете и запомнете дека е таму. Првата колона е адресата на флеш ќелијата во која се наоѓа командата, втората е командниот код, третата команда мнемоник, истата инструкција за асемблер, третите операнди на командата. О, и автоматски коментар.
Значи, ако погледнете, тогаш има континуирани транзиции. И командниот код JMP е четири бајти, ја содржи адресата за скок напишана наназад - нискиот бајт на ниската адреса и командниот код за скок 940C

0000002B: BE1F OUT 0x3F, R1 Излез во локација за влез/излез

Напишете ја оваа нула на адресата 0x3F Ако погледнете во колоната за преглед на I/O, ќе видите дека адресата 0x3F е адресата на регистарот SREG - регистарот со знаменце на контролерот. Оние. го ресетираме SREG за да ја изврши програмата при нула услови.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Вчитај веднаш +0000002D: E0D4 LDI R29,0x04 Вчитај веднаш +0000002E: BFDE OUT 0x3E,R29 Излезе во локација I/O +0000000002

0000002C: E5CF LDI R28,0x5F Вчитај веднаш +0000002D: E0D4 LDI R29,0x04 Вчитај веднаш +0000002E: BFDE OUT 0x3E,R29 Излезете во I/O локација +0000000002

Ова е вчитување на покажувачот на стек. Не можете директно да вчитате регистри во I/O, само преку среден регистар. Затоа, прво LDI до средно, а потоа од таму OUT до I/O. Ќе ви кажам и повеќе за стекот. Во меѓувреме, знајте дека ова е толку динамична мемориска област, таа виси на крајот на RAM-от и ги складира адресите и средните променливи во себе. Сега наведовме од каде ќе започне оџакот.

00000032: 940C0041 JMP 0x00000041 Скок

Скок до крајот на програмата, и таму имаме оневозможени прекини и цврсто вртење на себе:

1 2 +00000041: 94F8 CLI глобален прекин Оневозможи +00000042: CFFF RJMP PC-0x0000 Релативен скок

00000041: 94F8 CLI Глобален прекин Оневозможи +00000042: CFFF RJMP PC-0x0000 Релативен скок

Ова е во случај на непредвидени околности, како што е излез од главната функција. Контролорот може да се извади од таква јамка или со ресетирање на хардверот, или, поверојатно, со ресетирање од чувар. Па, или, како што реков погоре, поправете ги овие места во уредувачот на шеснаесетникот и возете каде сакаме. Исто така, имајте предвид дека постојат два типа на скокови JMP и RJMP, првиот е директен скок до адреса. Зафаќа четири бајти и може да направи директен скок над целата мемориска област. Вториот тип на транзиција - RJMP - е релативен. Неговата команда трае два бајта, но тој скока од моменталната позиција (адреса) 1024 чекори напред или назад. И неговите параметри укажуваат на поместување од тековната точка. Се користи почесто, tk. зафаќа половина од просторот во блицот, а долгите транзиции ретко се потребни.

1 +00000034: 940C0000 JMP 0x00000000 Скок

00000034: 940C0000 JMP 0x00000000 Скок

И ова е скок до самиот почеток на кодот. Некако рестартирање. Можете да проверите дали сите вектори скокаат овде. Од овој заклучок - ако сега овозможите прекини (тие се стандардно оневозможени) и имате прекин, но нема управувач, тогаш ќе има ресетирање на софтверот - програмата ќе биде фрлена на самиот почеток.

главната функција. Сè е исто, не можете ни да опишете. Погледнете само во регистрите се внесува веќе пресметаниот број. Компајлер предпроцесорски карпи!!! Значи нема „магични“ бројки!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24,0x33 Вчитај веднаш +00000037: B989 OUT 0x09,R24 Излез во I/O локација 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 Излезете во I/O локација 16: UCSRA = 0; +00000039: B81B OUT 0x0B, R1 Излез во I/O локација 17: UCSRB = 1<

И еве го џебот:

1 2 3 +0000003E: E080 LDI R24,0x00 Вчитување веднаш +0000003F: E090 LDI R25,0x00 Вчитај веднаш +00000040: 9508 RET Подпрограма враќање

0000003E: E080 LDI R24,0x00 Вчитување веднаш +0000003F: E090 LDI R25,0x00 Вчитај веднаш +00000040: 9508 RET Повратна потпрограма

Прашањето е зошто компајлерот додава такви врвови? И ова не е ништо повеќе од Return 0, тогаш ја дефиниравме функцијата како int main (void) па заебавме уште четири бајти, не разбирам што :) А ако направиш void main (void) тогаш ќе остане само RET. но ќе се појави предупредување, дека велат дека нашата главна функција не враќа ништо. Во принцип, правете што сакате :)

Тешко? Се чини дека не е. Кликнете на извршување чекор-по-чекор во режим на расклопување и видете како процесорот ги извршува поединечните инструкции, што се случува со регистрите. Како е движењето низ командите и конечниот лупинг.

Продолжува за неколку дена...

Офтоп:
Алексеј78Направив приклучок за Firefox што го олеснува навигацијата на мојот сајт и форум.
Дискусија и преземање,


Модерното аматерско радио не може да се замисли без микроконтролери, а тоа е очигледно. Во последниве децении, микроконтролери од различни производители станаа широко распространети во различни области на човековата активност. Често тие можат да се најдат во најнеочекуваните уреди и дизајни. Сведоци сме на компјутеризација и автоматизација на процесите околу нас. Вистината е дека без познавање на основите на програмирањето, стана речиси невозможно да се создадат современи конкурентни уреди ...

Ако ја читате оваа статија, веројатно имате желба да разберете како работат микроконтролерите и најверојатно имате прашања:

4. Каква литература да се изучува?

Ајде да се обидеме да одговориме на овие прашања.

1. Кој микроконтролер да се избере за работа?

8-битните микроконтролери се многу популарни меѓу радио аматерите. ПИКТехнологија на микрочипови и AVR Atmel, 16-битен MSP430ТИ фирми, како и 32-битни микроконтролери, архитектури АРМ.

Во индустријата, на малку поинаков начин, првото место со голема разлика го зазема Ренесас Електрониксна вториот Слободен размер, на третиот Samsung, тогаш оди МикрочипИ ТИ, потоа сите останати.
Популарноста се одредува според цената и достапноста, достапноста на технички информации и трошоците за софтверска поддршка играат значајна улога.

Ќе проучуваме 8-битни AVR микроконтролери, фамилии ATMEGA 8 и 16 серии. Изборот беше одреден, повторно, од достапноста, присуството на многу аматерски случувања и огромна количина на едукативен материјал. Присуството на различни вградени компоненти и функционалноста на ова семејство.

2. Каква развојна средина треба да користам за програмирање на избраниот микроконтролер?

Различни интегрирани развојни околини (IDE, интегрирана развојна околина) се создадени за AVR.
IDEе систем на софтверски алатки што ги користат програмерите за развој на софтвер (SW), кој вклучува:
уредувач на текст,
компајлер и/или толкувач,
изградба на алатки за автоматизација
дебагер.

Најчестите AVRStudio, ATmelStudio, WINAVR, CodeVision, IAR Embedded Workbench.
За да пишуваме програми, ќе ги користиме бесплатните ATmelStudio IDE верзија 6и повисоко.
Можете да го преземете Atmel Studio од официјалната веб-страница по регистрацијата (регистрацијата е апсолутно бесплатна и не ве обврзува на ништо!)

ATmelStudio ви овозможува да креирате проекти и да пишувате програми и во асемблер и во C.

Првично, секогаш постои прашање: кој програмски јазик да се избере за да се напишат ефективни програми?

Ќе одговорам едноставно: треба да знаеш да напишеш најмалку два асемблерски и Ц јазици. Асемблерот е едноставно неопходен кога треба да пишувате брзи и компактни потпрограми и макроа, разни драјвери за уреди. Но, кога треба да креирате голем проект изграден на сложени алгоритми, без познавање на SI, може да се потроши многу време, особено за време на дебагирање, а ако сакате да се префрлите на друга платформа, како што се PIC18 или STM, може стане нерешлив проблем.
Покрај тоа, сега има хардверски компјутерски платформи Ардуино, за работа со која е потребно познавање на јазикот C++.
Затоа, ќе пишуваме програми и во асемблер и во C.

За визуелно да го видите резултатот од вашата работа, без да користите рачка за лемење или леб, само инсталирајте ја програмата Протеус.

3. Како да го трепкате контролорот и кои дополнителни уреди и додатоци се потребни за удобна работа со нив?

Ние користиме датагоријан. Покрај тоа, ќе треба да купите табли за леб, напојување со излезен напон од 5 волти. Можете да го користите како PSU со мали бранувања со користење на 5 волти зенер диода.
Можеби, со текот на времето, Игор и јас ќе понудиме проект за составување табла за дебагирање.

4. Каква литература да се изучува?

И еве, на пример:
Практично AVR програмирање во асемблер. Ревич, 2011 година
1000 и едно коло за микроконтролер Vol. 1-2. Рјумик, 2010-2011 година
10 практични уреди на MK AVR Book 1-2. Кравченко, 2008-2009 година
Прирачник за самоупатство за развивач на уреди на MK AVR. Белов, 2008 година
MK AVR семејства Тини и Атмега. Ефстифеев, 2008 година
CodeVisionAVR. Водич за почетници. Лебедев, 2008 година
Микропроцесорска контрола на уреди, тиристори, релеи. Белов, 2008 година
Аналогни интерфејси MK. Стјуард, Бол, 2007 година
Ние создаваме уреди на MK AVR. Белов, 2007 година
MK AVR во радиоаматерска практика. Целосна анализа на ATTINY2313. Белов, 2007 година
Мрежна и интермрежна размена на податоци со МК. Оди, 2007 година
МК АВР. пракса за почетници. Хартов, 2007 година
Примена на AVR шеми, алгоритми, програми. Баранов, 2006 г
AVR микроконтролери. Воведен курс. Мортон, 2006 година
Мерење, контрола и регулација со AVR. Тумперт, 2006 година
Програмирање во C за AVR и PIC MK. Шпак, 2006 година
Дизајнирање уреди на МК. Белов, 2005 година
МК - едноставно е, томови 1-3. Фрунзе, 2002-2003 година
Програмскиот јазик C, второ издание. Керниган, Ричи, 2009 година
Програмирање на ATMEL микроконтролери на јазикот на С.Прокопенко, 2012 година

5. Каде можам да поставувам прашања на интернет и да добијам конкретни одговори?

Можете да поставувате прашања на нашиот или на кој било друг форум каде некако се допираат теми за микроконтролери. Главната работа на форумите е правилно да се формулираат прашања со цел јасно да се добијат одговори. Апстрактните прашања не се добредојдени, а најверојатно наместо одговор ќе добиете остри критики или вашето прашање ќе остане без внимание!

Сега да го разгледаме подетално нашиот омилен, микроконтролерот ATMEGA 8.

8-битен AVR микроконтролер со високи перформанси со мала моќност
Прогресивна RISC архитектура
130 инструкции со високи перформанси, повеќето инструкции извршени во еден такт
32 8-битни работни регистри за општа намена
Целосно статична работа
Изведба се приближува до 16 MIPS (на 16 MHz).
Вграден мултипликатор со 2 циклуси

Нестабилна програма и меморија на податоци
8 KB блиц што може да се програмира во системот
Обезбедува 1000 циклуси за бришење/запишување
Дополнителен сектор на кодови за подигање со независни битови за заклучување
Обезбеден е истовремен режим на читање/запишување (Read-While-Write).
512 бајти EEPROM
Обезбедува 100.000 циклуси за бришење/запишување
1 KB вграден SRAM
Програмабилна брава за заштита на корисничкиот софтвер

Вградени периферни уреди
Два 8-битен тајмер/бројач со посебен прескалер, еден со режим на споредување
Еден 16-битен тајмер/бројач со посебен прескалер и режими за снимање и споредување
Бројач во реално време со посебен генератор
Три PWM канали
8-канален аналогно-дигитален конвертор (во пакети TQFP и MLF)
6 канали со 10-битна прецизност
6-канален аналогно-дигитален конвертор (во PDIP пакет)
4 канали со 10-битна прецизност
2 канали со 8-битна прецизност
Бајт-ориентиран сериски интерфејс со 2 жици
Програмабилен сериски USART
Сериски интерфејс SPI (master/slave)
Програмабилен тајмер за чувар со посебен вграден осцилатор
Вграден аналоген компаратор

Специјални функции на микроконтролерот
Ресетирање на вклучување и програмабилен детектор за напон за намалување
Вграден калибриран RC осцилатор
Внатрешни и надворешни извори на прекини
Пет режими со мала моќност: во мирување, заштеда на енергија, исклучување, мирување и намалување на шумот со ADC

I/O пинови и пакети
23 програмабилни В/И линии
28-воден PDIP пакет, 32-воден пакет TQFP и 32-воден пакет MLF

Работни напони
2,7 - 5,5 V (ATmega8L)
4,5 - 5,5 V (ATmega8)

Работна фреквенција
0 - 8 MHz (ATmega8L)
0 - 16 MHz (ATmega8)

разлики помеѓу ATMEGA16 и 8
16 KB блиц што може да се програмира во системот

JTAG интерфејс (компатибилен со IEEE 1149.1)
Способност за периферно скенирање во согласност со стандардот JTAG
Подобрена поддршка за дебагирање на линија
Програмирање преку JTAG интерфејс: блиц, EEPROM меморија, џемпери и делови за заклучување

Четири канали PWM / PWM

8-канален 10-битен A/D конвертор
8 неизбалансирани канали
7 диференцијални канали (само TQFP пакет)
2x диференцијални канали со 1x, 10x или 200x програмабилно засилување (само TQFP пакет)

Шест режими на исклучување: во мирување, заштеда на енергија, исклучување, мирување, продолжено мирување и намалување на шумот со ADC

32 програмабилни В/И линии

Пакет PDIP со 40 води и TQFP пакет со 44 води

AtmelStudio

Ако штотуку почнувате, тогаш треба да ја преземете и инсталирате програмата AtmelStudio од официјалната страница atmel.com
По инсталирањето на програмата AtmelStudio, можете да започнете да креирате проект.
Проект- ова е вашата програма што ќе ја напишете, дебагирате и трепкате, по компилацијата, во меморијата на микроконтролерот.

За да креирате проект, треба да ја отворите програмата, ќе се појави прскан екран,

и ќе се отвори страницата за креирање проект

За да креирате нов проект, кликнете на Нов проект...
Во овој случај, ќе се отвори нов прозорец каде што можете да го изберете програмскиот јазик, името на проектот, неговата локација, името на пакетот со проектните датотеки и можноста за создавање директориум за понатамошна употреба во други вкрстени проекти . За да креирате проект каде што ќе програмираме во асемблер, треба да изберете - асемблер, потоа сменете го името на проектот, неговата локација и изберете ДОБРО.

Ќе се појави следниот прозорец

Изберете мегаАВР, 8-битени пронајдете го микроконтролерот што ни треба, го избравме ATmega8.Список на уреди кои работат со овој микроконтролер се појавува на десната страна на прсканиот екран, од кои еден можеме да го поврземе. Изберете ДОБРО.

Се појавува страницата за уредувач на текст, што ви овозможува да ја уредите и дебагирате програмата. Додека страницата е чиста, се означени времето и датумот на создавање и името на проектната датотека, корисничкото име. Постои дополнителен прозорец за влезно-излезен уред, прозорец за извештај за компилација на програма. сега ние


Можеме да програмираме во асемблер.
Слично, се креира проект за програмирање на јазикот C.

Здраво MySkuers! Херојот на нашиот преглед е микроконтролерот Atmega8A-16PU. Ќе ви кажам за програмирање на овој MK во интегрираното развојно опкружување CodeVisionAvr, трепкајте ја ЛЕР, разгледајте ги добрите и лошите страни на работењето во оваа средина. Можеби во иднина ова ќе ви послужи како алтернатива на веќе „популарниот“ Arduino. Ако сте заинтересирани, одете под рез.

Преамбула.
Се случи да го започнам моето запознавање со МК со Ардуино. Трепкав ЛЕД, поврзав разни сензори и штитови, правев разни проекти. Се работеше, јас бев задоволен, но сакав нешто повеќе. Наидов на еден проект каде што учествува Atmega8A, за кој треба сам да го напишам фирмверот. Токму тој ме турна да го проучам процесот на програмирање на „голиот“ МК.
Значи, имаме микроконтролер на Atmel, семејство AVR Atmega8A.

Спецификации:


Пинут:


Овде е
Сега, за работа и програмирање, треба да го поврзете со програмерот според шемата:

За жал, јас сум како чевлар - без чизми, сега немам програмер при рака, па ќе го користам Arduino UNO за да го подигнам готовиот фирмвер во МК и да ги поставам осигурувачите. Треба само да ја преземете скицата „Arduinoisp“ од папката примери на Arduino IDE и да ја поврзете според шемата:


Сепак, ова решение има значителен недостаток, за кој ќе зборувам малку подоцна. Пред да започнеме да пишуваме програма во CodeVisionAvr (во натамошниот текст CvAvr), треба да одлучиме на која фреквенција ќе работи нашиот микроконтролер. Стандардно, од фабриката, нашиот херој работи од внатрешен rc-осцилатор на фреквенција од 1 MHz (со можност за реконфигурирање на 2, 4 и 8 MHz). Бидејќи внатрешниот генератор на rc е калибриран во фабриката под одредени услови (точен напон, температура), точноста на неговото работење во услови на „поле“ може да варира од 3% до 10%. За задачи каде што не е потребна висока точност на такт, ова може да се занемари, во други случаи подобро е да се користи надворешен кварц. Во мојот проект користев надворешен кварц на фреквенција од 8 MHz. Сега треба да „објасниме“ микрони дека треба да работиме од надворешен кварц. Ова се прави со менување на осигурувачите. Ако објасните „на прстите“, тогаш ова е нешто како BIOS-от, како на матичната плоча, каде што ги означувате неговите начини на работа, слично, им кажуваме на микрони во кои режими, покрај фреквенцијата, треба да работи. Сите информации ќе бидат зачувани во неиспарлива меморија.
Ќе ти кажам за фирмверот на осигурувачите под спојлерот, тие што знаат сами можат да скролуваат понатаму.

дополнителни информации

Како да се препишат токму овие осигурувачи ?! За да го направам ова, ја користев програмата AvrDude, таа е бесплатна и лесно може да се најде на Интернет. За правилно поставување на осигурувачите во согласност со саканата фреквенција, го гледаме листот со податоци или можете да користите едноставен.
Ги поставивме параметрите како на сликата.


Сè е едноставно овде:
Извор на часовник - поставете ја фреквенцијата (надворешен кристал 3 - 16 Mhz) од надворешен кварц.
Време на стартување - брзина на микро стартување откако ќе се отстрани RESET или ќе се примени напојувањето (16K CK + 4,1ms брзо).
Проверете го полето: Ext. Часовник/RC Osc./Ниска фрек. Кристал: овозможете внатрешни кондензатори (36pF)
Внатрешно R/C Osc.: оставете нештиклирано! Надворешен кристал: овозможете целосно замавнување (неопходно за >8 MHz).
Така, добивме Low Fuse 0xEF и High Fuse 0xC9. Одлично, пола готово. Сега го поврзуваме микро со Arduino UNO, а самиот Arduino со компјутерот, соодветно. Ја стартуваме командната линија, одиме во папката со AvrDude. Следно, внесете ја линијата: avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U lfuse:w:0xef:m -U hfuse:w:0xc9:m
Еве како изгледа на сликата:


Ајде да ја анализираме линијата што беше внесена:
avrisp е тип на наш програмер сличен на ардуино
COM13 - бројот на компорта што го дефинира нашиот Arduino во системот (во вашиот случај, треба да го погледнете во менаџерот на уреди)
19200 година - брзина на пристаништето, оставете како што е
m8 - означува дека нашиот MK е Atmega8
-U fuse:w:0xef:m -U hfuse:w:0xc9:m - тука се нашите Low Fuse 0xEF и High Fuse 0xC9
Биди ВНИМАНИЕ!!, неправилно назначениот Осигурувач може да доведе до скалирање на МК (не ни требаат ора со дајре за обновување).
Притискаме „Enter“ и на излезот го добиваме резултатот, како на сликата:


Ако не се појавија грешки во процесот, тогаш работата е завршена, нашиот МК сега ќе работи од надворешен кварц.
Можете да прочитате многу детали за осигурувачите и, како и користење на пребарување на Google.


Сега сме подготвени да започнеме со програмирање. За себе, ја избрав околината за развој на CvAvr. Програмскиот јазик ќе се разликува од „Arduino“, во CvAvr е сличен на C. Ајде да го напишеме нашето прво Трепкање.
По инсталирањето и стартувањето на околината, ќе го користиме волшебникот за креирање проект. Изберете "Датотека" - "Ново" - "Проект". На прашањето дали ќе го користиме мајсторот, одговараме потврдно. Целен тип на чип AVR наведете AT90, ATtity, ATmega.
Вака изгледа проектниот волшебник:


На картичката Чип, изберете ATmega8A, часовник 8.000000 Mhz. Одете во табулаторот Ports. Нашиот LED ќе биде поврзан со пин 14 на микроконтролерот, според пинаут - PB0. На јазичето, изберете Порт Б, бит 0 префрлете се од IN во OUT, т.е. го преведуваме начинот на работа на 14-тиот крак на нашата МК до излезот.


Ова ја комплетира работата на волшебникот. Изберете „Програма“ - „Генерирај, зачувај и излези“. Ние го зачувуваме нашиот проект, на пример, под името Blink.

Ајде да земеме таква крпа за нозете

/*******************************************************
Оваа програма е креирана од
CodeWizardAVR V3.12 Напредно
Автоматски генератор на програми
Тип на чип: ATmega8A
Тип на програма: Апликација
Фреквенција на AVR Основен часовник: 8.000000 MHz
Модел на меморија: Мал
Големина на надворешна RAM меморија: 0
Големина на стек на податоци: 256
*******************************************************/
#вклучи
#вклучи
// Декларирајте ги вашите глобални променливи овде

Празнина главна (празнина)
{
// Декларирајте ги вашите локални променливи овде

// Иницијализација на влезни/излезни порти
// Иницијализација на портата Б
// Функција: Bit7=Во Bit6=Во Bit5=Во Bit4=Во Bit3=Во Bit2=Во Bit1=Во Bit0=Излез
DDRB=(0<// Состојба: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTB=(0<

// Иницијализација на портата C
// Функција: Bit6=Во Bit5=Во Bit4=Во Bit3=Во Bit2=Во Bit1=Во Bit0=Во
DDRC=(0<// Состојба: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<

// Иницијализација на портата D
// Функција: Bit7=Во Bit6=Во Bit5=Во Bit4=Во Bit3=Во Bit2=Во Bit1=Во Bit0=Во
DDRD=(0<// Состојба: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<

// Иницијализација на тајмер/бројач 0

// Вредност на часовникот: Тајмерот 0 запре
TCCR0=(0<TCNT0=0x00;

// Иницијализација на тајмер/бројач 1
// Извор на часовник: Системски часовник
// Вредност на часовникот: Тајмер1 запре
// Режим: Нормален врв=0xFFFF
// OC1A излез: Исклучен
// OC1B излез: Исклучен
// Поништувач на шум: Исклучено
// Внеси снимање на раб што паѓа
// Timer1 Overflow Прекин: Исклучено
// Прекин на снимање на внесување: Исклучено
// Споредете прекин на натпревар: исклучено
// Споредете Б Прекин на совпаѓање: Исклучено
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Иницијализација на тајмер/бројач 2
// Извор на часовник: Системски часовник
// Вредност на часовникот: Тајмер2 запре
// Режим: Нормален врв=0xFF
// OC2 излез: Исклучено
ASSR=0<TCCR2=(0<TCNT2=0x00;
OCR2=0x00;

// Тајмер(и)/бројач(и) Иницијализација на прекин(и).
TIMSK=(0<

// Иницијализација на надворешен прекин(и).
// ИНТ0: Исклучено
// INT1: Исклучено
MCUCR=(0<

// Иницијализација на USART
// USART е оневозможен
UCSRB=(0<

// Иницијализација на аналоген компаратор
// Аналоген компаратор: Исклучено
// Позитивниот влез на аналогниот компаратор е
// поврзан со пинот AIN0
// Негативниот влез на аналогниот компаратор е
// поврзан со пинот AIN1
ACSR=(1<СФИОР=(0<

// Иницијализација на ADC
// ADC е оневозможено
ADCSRA=(0<

// Иницијализација на SPI
// SPI е оневозможен
SPCR=(0<

// Иницијализација на TWI
// TWI е оневозможен
TWCR=(0<

Додека (1)
{


Нема што да се грижите овде, проектот ги означува режимите на работа на пристаништа, тајмери, прекини, USART, аналоген компаратор, ADC, SPI и поврзаните библиотеки. Со еден збор, сите параметри што ги наведовме во волшебникот, сè освен портите и чипот, се стандардно конфигурирани. Главната јамка на програмата ќе биде напишана во while (1) (програмски текст). Бидејќи работиме со PB0 (крак 14), во програмската јамка ќе напишеме:
додека (1)
{
ПОРТБ.0=1;
доцнење_ms (1000);
ПОРТБ.0=0;
доцнење_ms (1000);
}
Овде го поставивме PB0 високо, почекавме 1 секунда и го поставивме ниско, а потоа циклусот се повторува. Не заборавајте да ја вклучите библиотеката на почетокот на проектот #include . Нашата програма е подготвена!!! Како што можете да видите, сè е многу едноставно. Сега изберете „Проект“ - „Изгради ги сите“. Ако не се направени грешки, тогаш ќе го видиме извештајот на волшебникот:

Големината на нашата програма беше 198 бајти и окупираше 2,4% од меморијата на микро.
Ајде да ја изградиме шемата:


Сега одиме во папката со нашиот проект, одиме во папката „Debug“, потоа „Exe“, има датотека со наставката hex. Во мојот случај тоа е трепкање.хекс.
Последниот чекор останува. Копирајте ја оваа датотека во папката со AvrDude. Повторно ја започнуваме командната линија, одете во нашата папка. Внесете ја линијата avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U flash:w:blink.hex
Вака изгледа на сликата:


Ако сè е правилно внесено, притиснете "Enter"


Секоја чест! Работата е завршена, ЛЕД треба радосно да трепка за вас :)
Заклучок.
Како заклучок, сакам да кажам за недостатокот на програмер сличен на ардуино, CvAvr едноставно не го поддржува. Имајќи при рака, на пример, AVRISP mkII, можете да ги трепкате осигурувачите и да ја преземете програмата директно од CodeVisionAvr. Патем, програмерот на homebrew исто така одби да го користи графичкиот интерфејс AvrDude и работеше само од командната линија.
Доста брзо го сфатив CodeVisionAvr, Интернетот е полн со текстуални и видео лекции. За неколку недели, ја совладав работата на хардверски PWM, прекини, тајмери, работа со копчиња и поврзување графички дисплеј. Поточно, морав да направам дел од мојот проект: да организирам хардверски 16-битен PWM на Atmega8, да поврзам 2 копчиња за да го контролирам, а исто така да ги прикажам неговите режими на работа на графички дисплеј, што го направив со леснотија :) Еве еден неколку фотографии:

дополнителни информации





Резултати во споредба со Arduino:
+ Разбирањето на CvArv не е тешко. постои волшебник за креирање проект;
+ Достапност на plug-in библиотеки, тие се доволни;
+ Брза компилација;
+ Способност да се симулира проектот во Proteus, како и да се дебагира со помош на вградениот дебагер;
+ Големината на програмата е многу помала. Стандардниот Blink ни однесе 198 бајти, слична скица во Arduino IDE 1084 Bytes + 2 KB подигнувач;
+ Способност да се имплементираат режими што не можат да се направат на Arduino. На пример, 16-битен PWM (во принцип, тоа е можно на Arduino, но само со „патерици“);
+ Можност за користење MK тип ATtiny, ATmega за вашите проекти каде Arduino ќе биде вишок;
- Сепак, подобро е почетник да започне со совладување на MK со Arduino;
- Програмскиот јазик е различен од arduino processing`a;
- Има уште повеќе библиотеки за Arduino;
- CodeVisionAvr е платена програма, има бесплатни верзии со ограничувања;
Програмирајќи „гола“ МК во CodeVisionAvr, стекнав големо искуство во мојата свинче банка. Проучувањето на тајмерите, регистрите, режимите на работа, архитектурата, читањето на листот со податоци ќе ги зголеми вашите вештини, ќе ги прошири вашите хоризонти и ќе отвори нови аспекти на работа со микроконтролери.
Како бонус, прикачувам неколку фотографии, кога се занимавав со графичкиот LCD дисплеј, играв малку.





П.с. Имаше уште многу за кои сакав да пишувам, но ова нема да биде преглед, туку огромна статија. Подготвен сум да одговарам на прашања од моја надлежност, приватно или коментар. Можете да ѕирнете многу лекции за AVR.

Врв