В. С. Прокопенко П р о г р а м м и р о в а н и е м и к р о к о н т р о л л е р о в н а о я з ы к е и Ь А Т М Е Ь С $ Ь б Т ’ - о ". а ТозЫсеп! А х ’5С£р' Те^пЫ о^уаЬг! 1]гп\’еш{е1 АхЬсго? Яезигз Магкагг Киев, "МК-Пресс" СПб, "КОРОНА-ВЕК" 2015 ББК 32.973-04 УДК 004.312 П80 П р о к о п ен к о В. С. П80 Программирование микроконтроллеров ATMEL на языке С. - К.: “МКПресс”, СПб.: “КОРОНА-ВЕК”, 2015. -320с„ ил. ISBN 978-5-7931-0906-2 (“КОРОНА-ВЕК”) ISBN 978-966-8806-73-5 (“МК-Пресс”) Эта книга — сборник примеров программ на языке С для микроконтроллеров произ­ водства ATMEL. В качестве средств разработки и имитации использованы компилятор WinAVR, среда A V R Studio и имитатор схем Proteus ISIS. Синтаксические особенности языка С и методы работы с перечисленными выше инструментальными средствами в кни­ ге подробно не рассматриваются, поскольку автор преследовал цель дать максимальное число практических примеров использования тех или иных периферийных устройств мик­ роконтроллера: таймеров/счетчиков, приемопередатчика U(S)ART, аналогового компара­ тора, АЦП, интерфейсов SPI и TWI, памяти Flash и EEPROM. Отдельная глава посвящена взаимодействию с ЖК-модулем. Таким образом, это издание рассчитано на тех читателей, которые, обладая базовыми познаниями языка С, желают научиться применять их в рабо­ те с микроконтроллерами ATMEL. ББ К 32.973-04 П р ок о п ен к о В а д и м С е р ге е в и ч П р о г р а м м и р о в а н и е A T M E L м и к р о к о н т р о л л е р о в н а я з ы к е С Г павный редактор: Ю. А. Шпак Подписано в печать 24.10.2014. Формат 60 х 84 1/16. Бумага газетная. Печать офсетная. Уел. печ. л. 18,6. Уч.-изд. л. 13,8. Тираж 1000 экз. Заказ №______ СПД Савченко Л.А., Украина, г. Киев, тел./факс: (044) 517-73-77; e-mail: info@mk-press.com. Свидетельство о внесении субъекта издательского дела в Государственный реестр издателей, производителей и распространителей издательской продукции: серия ДК №51582 от 28.11.2003г. ISBN 978-5-7931-0906-2 (“КОРОНА-ВЕК”) ISBN 978-966-8806-73-5 (“МК-Пресс”) © Прокопенко B.C., текст, иллюстрации, 2011 © “МК-Пресс", оформление, 2015 3 С од ер ж ан и е В в е д е н и е ............................................................................................................................................................................ 8 Ч А С Т Ь Г л а в а I. П Р И С Т У П А Я К Р А Б О Т Е .................................................................................................... 9 1 . С р е д с т в а р а з р а б о т к и / и м и т а ц и и ................................................................................... 1 0 С р е д а р а з р а б о т к и W i n A V R ...................................................................................................................... 1 0 С реда р азрабо тки A V R S t u d i o ............................................................................................................1 2 И м и т а т о р с х е м P r o t e u s I S I S .................................................................................................................1 7 Г Л А В А 2. Р А Б О Т А С Р А З Р Я Д А М И В Я З Ы К Е С ...........................................................2 0 О п е р а т о р < < ................................................................................................................................................................ 2 0 О п е р а т о р > > ................................................................................................................................................................ 2 0 О п е р а т о р ~ ....................................................................................................................................................................2 1 О перато р л О перато р ....................................................................................................................................................................2 1 | ....................................................................................................................................................................2 1 О п е р а т о р & ....................................................................................................................................................................2 2 За п и с ь л о г . 1 в н е к о т о р ы й р азря д с о б н у л е н и е м о с т а л ь н ы х р а з р я д о в ...........................................................................................................................................................................2 2 За п и с ь л о г . 1 в н е к о т о р ы й разря д без о б н у л е н и я о с т а л ь н ы х р а з р я д о в ...........................................................................................................................................................................2 3 За п и с ь л о г . 0 в н е к о т о р ы й разря д без о б н у л е н и я о с т а л ь н ы х Р А З Р Я Д О В ...........................................................................................................................................................................2 4 За п и с ь л о г . 0 в н е к о т о р ы й разря д с з а п и с ь ю р а з р я д ы в о с т а л ь н ы е л о г . 1 .............................................................................................................................................................2 5 П р о в е р к а н е к о т о р о г о р а з р я д а п е р е м е н н о й н а н а л и ч и е л о г . 0 ................ 2 5 П р о в е р к а н е к о т о р о г о р а з р я д а п е р е м е н н о й н а н а л и ч и е л о г . 1 ................ 2 6 О ж и д а н и е п о я влен и я л о г. 1 в н еко то р о м р а з р я д е ................................................... 2 7 О ж и д а н и е п о я в л е н и я л о г . 0 в н е к о т о р о м р а з р я д е ................................................... 2 8 П р о в е р к а с о с т о я н и я о п р е д е л е н н ы х р а з р я д о в ..............................................................2 8 Ч А С Т Ь П. М И К Р О К О Н Т Р О Л Л Е Р Г л а в а 3 . Т а й м е р ы /с ч е т ч и к и A T 9 0 S 2 3 1 3 ..................................................................3 0 A T 9 0 S 2 3 1 3 .......................................................................................3 1 Т а й м е р / с ч е т ч и к 0 ................................................................................................................................................ 3 1 Схема..................................................................................................... 32 Программа............................................................................................. 32 4 Т а й м е р /с ч е т ч и к 0 в р е ж и м е с ч е та и м п у л ь с о в н а в н е ш н е м в ы в о д е Т О .......................................................................................................................................................................3 4 Схем а..................................................................................................... 34 Программа.............................................................................................34 Т а й м е р / с ч е т ч и к 1 ................................................................................................................................................ 3 6 Схем а..................................................................................................... 38 Программа.............................................................................................38 Т а й м е р /с ч е т ч и к 1 в р е ж и м е с ч е т а и м п у л ь с о в н а в н е ш н е м в ы в о д е Т 1 .......................................................................................................................................................................4 0 Схема............ ........................................................................................ 41 Программа.............................................................................................42 Реги с тр з а х в а т а 1С Ш т а й м е р а / с ч е т ч и к а 1 ...................................................................... 4 3 Схема..................................................................................................... 43 Программа.............................................................................................44 Ре ги с тр с о в п а д е н и я О С Ш т а й м е р а / с ч е т ч и к а 1 ........................................................ 4 7 Схема..................................................................................................... 47 Программа.............................................................................................47 И с п о льзо ван и е та й м е ра /с ч е тч и ка 1 в реж и м е Ш И М .........................................5 0 Настройка Ш И М ................................................................................. 52 Расчеты и формулы............................................................................. 53 Схема..................................................................................................... 55 Программа.............................................................................................55 И з м е н е н и е к о э ф ф и ц и е н т а з а п о л н е н и я в р е ж и м е Ш И М ................................. 5 6 Схем а..................................................................................................... 58 Программа.............................................................................................58 Ц А П с применением Ш И М ...................................................................61 С т о р о ж е в о й т а й м е р .........................................................................................................................................6 2 Схема..................................................................................................... 63 Программа.............................................................................................64 Г л а в а 4. П а м я т ь Е Е Р 1 Ю М А Т 9 0 8 2 3 1 3 ..........................................................................................6 6 З а п и с ь / ч т е н и е о д н о г о б а й т а .............................................................................................................. 6 6 З а п и с ь / ч т е н и е з а д а н н о г о к о л и ч е с т в а б а й т ...................................................................6 8 Ра б о т а с Е Е Р Я О М с п о м о щ ь ю Г л а в а 5. Р а бота с и А Я Т ф у н к ц и й \ V i n A V R ................................................... 7 2 в А Т 9 0 8 2 3 1 3 ............................................................................................. 7 4 П е р е д а ч а б а й т а д а н н ы х ч е р е з и А Я Т ........................................................................................7 4 Схема..................................................................................................... 75 Программа.............................................................................................76 П е р е д а ч а з а д а н н о г о ч и с л а б а й т ч е р е з Т Г А Л Т ............................................................... 7 8 5 П р и е м д а н н ы х ч е р е з U A R T ...................................................................................................................... 8 0 Схема..................................................................................................... 81 Настройка виртуального терминала в Proteus.................................. 82 Создание подключения в программе HyperTerminal...........................84 Программа............................................................................................. 86 П р и е м и п е р е д а ч а б а й т а д а н н ы х ч е р е з U A R T ................................................................8 6 П р и е м б а й т а , о т п р а в к а с т р о к и ч е р е з U A R T .....................................................................8 9 И с п о л ь з о в а н и е п о т о к а s t d o u t ............................................................................................................9 1 И с п о л ь з о в а н и е п о т о к о в s t d o u t и s t d in д л я п е р е д а ч и и п р и е м а С И М В О Л А ...........................................................................................................................................................................9 3 И с п о л ь з о в а н и е п о т о к о в s t d o u t и s t d in д л я п е р е д а ч и и п р и е м а с т р о к и ..................................................................................................................................................................................9 5 С р а в н е н и е с т р о к и , п р и н я т о й ч е р е з U A R T .......................................................................... 9 7 У п равлен и е в ы в о д а м и с п о м о щ ь ю U A R T .....................................................................1 0 0 Реализация приглашения командной строки.................................... 103 Г л а в а 6 . А н а л о г о в ы й к о м п а р а т о р A T 9 0 S 2 3 1 3 ..................................................................1 0 7 Г л а в а 7 . Р а б о т а с п р е р ы в а н и я м и в A T 9 0 S 2 3 1 3 ................................................................1 0 9 П р е р ы в а н и е п р и п е р е п о л н е н и и с ч е т н о г о р е г и с т р а T C N T 0 ..................... 1 0 9 Ра б о та т а й м е р а /с ч е т ч и ка 0 в реж и м е с ч е т ч и ка и м п у л ь с о в н а в н е ш н е м в ы в о д е ...............................................................................................................................................1 1 1 П р е р ы в а н и е п р и п е р е п о л н е н и и с ч е т н о г о р е г и с т р а T C N T 1 ..................... 1 1 3 Ра б о та та й м е р а /с ч е т ч и ка в н е ш н е м в ы в о д е 1 в реж и м е с ч е т ч и ка и м п у л ь с о в н а ...............................................................................................................................................1 1 4 П р е р ы в а н и е п о с и г н а л у н а в х о д е з а х в а т а ................................................................... 1 1 6 П р е р ы в а н и е п р и с о в п а д е н и и р е г и с т р а O C R 1 ..............................................................1 1 8 В н е ш н и е п р е р ы в а н и я IN T O и I N T 1 ..............................................................................................1 2 0 П р е р ы в а н и е п р и о ч и с т к е р е г и с т р а U D R ............................................................................1 2 3 П реры ван ие по о ко н ч а н и ю п р и е м а д а н н ы х ................................................................1 2 6 П р е р ы в а н и е п о о к о н ч а н и ю п е р е д а ч и д а н н ы х .......................................................... 1 2 8 П р е р ы в а н и е о т а н а л о г о в о г о к о м п а р а т о р а ................................................................. 1 3 0 И с п о льзо вани е та й м е р а /с ч е тч и ка 1 в реж им е Ш И М ..................................... 1 3 1 П е р е д а ч а д а н н ы х ч е р е з U A R T с и с п о л ь з о в а н и е м б у ф е р а .........................1 3 4 Ч А С Т Ь III. М И К Р О К О Н Т Р О Л Л Е Р A T M E G A 1 6 ....................................................... 1 3 8 Г л а в а 8 . Т а й м е р ы / с ч е т ч и к и A T r a e g a l 6 ..................................................................................... 1 3 9 Т а й м е р / с ч е т ч и к 0 в р е ж и м е “ N o r m a l ” ................................................................................. 1 3 9 Схема................................................................................................... 140 6 Программа...........................................................................................142 Т а й м е р / с ч е т ч и к 0 в р е ж и м е “ С Т С ” ........................................................................................... 1 4 3 Схем а................................................................................................... 144 Программа...........................................................................................146 Т а й м е р / с ч е т ч и к О в р е ж и м е “ F a s t P W M ” .......................................................................... 1 4 8 Схем а................................................................................................... 148 Программа...........................................................................................151 Т а й м е р / с ч е т ч и к О в р е ж и м е “ P h a s e C o r r e c t P W M ” ............................................ 1 5 3 Схем а................................................................................................... 153 Программа...........................................................................................156 Т а й м е р / с ч е т ч и к 1 в р е ж и м е “ N o r m a l ” ................................................................................. 1 5 8 Схема и программа............................................................................. 159 Т а й м е р / с ч е т ч и к 1 в р е ж и м е “ N o r m a l ” и с р е г и с т р о м с р а в н е н и я ... 1 6 1 Схема и программа............................................................................. 163 Т а й м е р / с ч е т ч и к 1 в р е ж и м е “ С Т С ” ........................................................................................... 1 6 5 Схема и программа............................................................................. 165 Т а й м е р / с ч е т ч и к 1 в р е ж и м е “ F a s t P W M ” ..........................................................................1 6 8 Схема и программа............................................................................. 170 Т а й м е р / с ч е т ч и к 1 в р е ж и м е “ P h a s e C o r r e c t P W M ” ............................................ 1 7 3 Схема и программа............................................................................. 175 Изменение частоты и коэффициента заполнения...........................176 Т а й м е р /с ч е тч и к 1 в р еж и м е “ Ph ase a n d F r eq u e n c y C o r r ec t P W M ” ................................................................................................................................................................................. 1 8 0 Схема и программа............................................................................. 181 Изменение частоты и коэффициента заполнения...........................183 С т о р о ж е в о й т а й м е р ..................................................................................................................................... 1 8 5 Программа...........................................................................................187 Г л а в а 9. А н а л о го в ы й ко м па р а то р и А Ц П A T m e g a l ó .............................................1 8 9 А н а л о г о в ы й к о м п а р а т о р ......................................................................................................................1 8 9 А Ц П В Р Е Ж И М Е Н Е П Р Е Р Ы В Н О Г О П Р Е О Б Р А З О В А Н И Я .........................................................1 9 1 А Ц П В Р Е Ж И М Е О Д И Н О Ч Н О Г О П Р Е О Б Р А З О В А Н И Я ................................................................1 9 5 А Ц П В Р Е Ж И М Е Д И Ф Ф Е Р Е Н Ц И А Л Ь Н О Г О В Х О Д А .....................................................................1 9 8 Г л а ва 10. И н те р ф е й с ы п е р е д а ч и д а н н ы х A T m e g a l ó ................................................ 2 0 2 И н т е р ф е й с U S A R T ...........................................................................................................................................2 0 2 Программа.......................................................................................... 204 И н т е р ф е й с S P I. П о д к л ю ч е н и е 12 - р а з р я д н о г о Ц А П М С Р 4 8 2 1 ................ 2 0 8 Программа...........................................................................................210 И н т е р ф е й с S P I. Р а б о т а с п а м я т ь ю E E P R O M ................................................................2 1 4 7 Внешниефункции, используемыевпрограмме............................................... 218 ОписаниемикросхемыМ95040................................................................................. 220 Программа............................................................................................................................. 225 И н т е р ф е й с S P I . Р а б о т а с д а т ч и к о м т е м п е р а т у р ы Т С 7 7 ................................ 2 3 6 Преобразованиезначениятемпературыиздвоичной вдесятичнуюформу........................................................................................................ 239 Программа............................................................................................................................. 241 И н т е р ф е й с S P I . Р а б о т а с F l a s h - п а м я т ь ю ........................................................................ 2 4 3 ОписаниемикросхемыAT25F2048.........................................................................245 Программа..............................................................................................................................252 И н т е р ф е й с S P I. Р а б о т а с т е м п е р а т у р н ы м п р е о б р а з о в а т е л е м М А Х 6 6 7 5 ....................................................................................................................................................................... 2 6 4 Программа............................................................................................................................. 267 И н т е р ф е й с S P I. Р а б о т а с т е м п е р а т у р н ы м п р е о б р а з о в а т е л е м М А Х 6 6 7 4 ....................................................................................................................................................................... 2 6 8 Программа............................................................................................................................. 271 И н т е р ф е й с S P I. Р а б о т а с А Ц П М А Х 1 2 4 1 ............................................................................2 7 2 Процесс приемаданных................................................................................................. 274 Программа..............................................................................................................................276 И н терф ей с T W I ....................................................................................................................................................2 7 8 Схема......................................................................................................................................... 280 Значениерегистра Temperature...............................................................................282 Программа..............................................................................................................................283 Г л а ва 1 1 . И с п о л ь з о в а н и е Ж К - э к р а н а .......................................................................................... 2 8 6 П о д кл ю ч е н и е текс то в о го Ж К -э кр а н а к о н т р о л л е р а 16x2 н а базе K S 0 0 6 6 U .................................................................................................................................. 2 8 6 Программа............................................................................................................................. 288 П ри м енен и е с та н д а р тн ы х ф у н к ц и й в ы в о д а п ри рабо те с Ж К - д и с п л е е м ......................................................................................................................................................... 2 9 2 В ы в о д н а Ж К - э к р а н р е з у л ь т а т о в а н а л о г о -ц и ф р о в о го п р е о б р а з о в а н и я ....................................................................................................................................................2 9 5 И з м е р е н и е т о к а , н а п р я ж е н и я , т е м п е р а т у р ы ................................................................2 9 8 Программа..............................................................................................................................301 П о д к л ю ч е н и е к л а в и а т у р ы 3 x 4 ...................................................................................................... 3 0 3 С о д е р ж и м о е п р и л а га е м о го к кн и ге к о м п а к т - д и с к а ..................................................3 0 8 8 В в ед ен и е Соврем енны й мир невозм ож но представить без м икроконтроллеров. О ни применяются практически во всей электрон н ой технике. Основная задача м икроконтроллера — это прием, обработка и выдача электричес­ ких сигналов. К о гд а и каким образом м и крокон троллер принимает, о б ­ рабатывает и выдает сигналы , определяет ч еловек с п ом ощ ью програм ­ мы, д ля создания которой мож но восп ользоваться одним из д оступ н ы х языков программирования. И сходн ы й текст програм м ы ком пилируется и “ прош ивается” в м икроконтроллер. Среди б о л ь ш о го ч и сла компаний, производящ их м и крокон тролле­ ры, огром ной п оп уляр н остью п ользуется фирма А Т М Е Ь . П рограм м н ое обеспечение д ля отладки и ком пиляции программ, предназначенных для устройств А Т М Е Ь , а также — д ля имитации их работы создается не тольк о этой компанией, но и сторонним и разработчиками. О сновны е различия м еж ду типами м и крокон троллеров, вы пускае­ м ы х А Т М Е Ь , заклю чаю тся в наборе периф ерийных ком понентов, мак­ сим альной частоте работы , коли честве выводов, объ ем е памяти про­ грамм и пр. Д л я примеров, рассматриваемы х в этой книге, б ы ли вы бра­ ны два п оп уляр н ы х типа устройств: А Т 9 0 8 2 3 1 3 и А Т п ^ а 1 6 . Д ля написания програм м мы б уд ем и сп ользовать язык вы сокого уровня С, которы й очень популярен во всем мире. Н аписанны е на нем программы б о л е е компактны и удобочи таем ы , чем созданны е с прим е­ нением ассем блера. Я зы к С просто несравним с языками н изкого уров­ ня, наподобие ассем блера, п оск ольк у он обладает всеми преим ущ ества­ ми языков вы сок ого уровня, и одно из них — независим ость от процес­ сора. Н аучивш ись создавать программы для одн ого типа м и кроконтрол­ леров, мож но без особ ы х уси ли й программировать и другие их типы. М атери ал этой книги излагается по принципу “ от п ростого к с л о ж ­ н о м у” , т.е. на первы х страницах вы не увидите слож н ого, м н огостран и ч­ ного п рограм м н ого кода. Осваивая и тестируя текущ и е примеры, автор как бы подготавливает читателя к б о л е е слож ны м . Ц е ль книги -— формирование с п ом ощ ью н еб оль ш и х примеров т е о ­ ретической и практической базы знаний д ля создания п олн оц ен н ы х уст ­ ройств с применением м и крокон троллеров А Т М Е Ь . П р и с к т р а у п б о а я т е . В э т о й части: ❖ Глава 1. Средства разработки/имитации ❖ Глава 2. Работа с разрядами в языке С . . _____________________________ Г л а в а С р е д с т в а С р ед а 1______________________ _______ р а з р а б о т к и / и м и т а ц и и р азр аботк и W in A V R W in A V R — это W in d o w s-совм естим ы й набор и сп олн яем ы х про­ граммны х продуктов с открыты м исходны м кодом д ля R IS C -микропроцессоров A tm e l серий A V R и A V R 3 2 . Каж ды й из этих продуктов решает оп р ед елен н ую задачу по разработке м икропрограм м ного обеспечения. В частности, в ком плект входит ком пилятор G N U G C C д ля языков про­ граммирования С и C + + . Состав W in A V R : • G N U Binutils — бинарные ути ли ты д ля м икроконтроллеров A V R (вклю чая ассем блер, ком поновщ ик и др.); • A V R G N U C o m p ile r C o lle c tio n ( G C C ) — ком пилятор на базе G C C , предназначенный д ля компиляции и сход н ого кода програм м для м икроконтроллеров A V R в Н Е Х -ф ай лы языков С и C + + д ля A V R ; • a vr-Iib c 1.6.7cvs — би бли отека языка С д ля разработки программ д ля м икроконтроллеров A tm el A V R ; • A V R D U D E 5.8cvs — “ прош ивки” A V R ; консольная программа, предназначенная для • A V R G N U D e b u g g e r (G D B ) — отладчик с интерф ейсом командной строки, • In sig h t 6.8 — отладчик с графическим интерфейсом; • A V a R I C E 2.9 — транслятор м еж ду протоколам и уд алён н ой отлад ­ ки G D B и A V R J T A G IC E ; • S im u lA V R 0.9cvs — и сп ользуется вместе с G D B д ля си м уляци и ра­ боты м икрокон троллеров A V R ; • S R e c o rd 1.47 — коллекция м ощ н ы х ути ли т д ля работы с загрузоч­ ны ми файлами E P R O M ; . M F ile — автоматический генератор т а к е-ф а й ло в для A V R G C C ; • P ro g ra m m e rs N o te p a d 2.0.8.718 — редактор програм м иста и интег­ рированная среда разработки (ID E ); • L ib U S B 0.1.12.1 — би бли отека U S B для A V R D U D E и A V a R IC E , чтобы п озволи ть им подклю читься к A tm el J T A G IC E М К И и M K II A V R IS P A tm e l (драйверы д ля этих устройств, также вклю чен ы ); С р е д с т в а р а з р а б о т к и /и м и т а ц и и 11 • C y g w in D L L s — оп ред елен н ы е би бли отек и из проекта C y gw in , н е ­ о бход и м ы е д ля конкретны х пакетов; • множ ество програм м и у т и ли т W in32 G N U , вклю чая m a k e и b a s h ; • T o fr o d o s 1.6 — конвертер текстовы х ф айлов м еж ду ф орматами M S D O S (и ли W in d o w s) и Unix; • ш аблон M a k e f i l e д ля и спользования в проектах; • документация д ля различны х проектов. Загрузить п о след н ю ю версию W in A V R м ож но с W e b -страницы h t t p : / / s o u r c e f o r g e . n e t / p r o j e c t s / w i n a v r . К р о м е того , ус та ­ новочны й пакет W in A V R находится на п рилагаем ом к книге компактдиске в папке П р о г р а м м ы . О н представляет со б о й и сп олн яем ы й файл . е х е , имя которого отражает д ату сборки пакета. Н а м ом ент написания книги установочны й пакет назывался W i n A V R - 2 0 1 0 0 1 1 0 - i n s t a l l . е х е , что соответствует 10 января 2010 года. Рассм отрим процесс установки W in A V R . 1. П о с л е запуска и н сталляц и он н ого пакета б уд ет п ред лож ен о вы брать язык установки. В ы бери те русский язык (R u s s ia n ) и нажмите ОК. 2. Появится окно с сообщ ен и ем о н еобходи м ости закрыть все р а б о ­ таю щ ие прилож ения. Закройте такие п рилож ения и наж мите кнопку Д алее. 3. В окне с ли ц ен зи он н ы м соглаш ением наж мите кнопку П р и н и м аю . 4. В след ую щ ем окне мастера установки буд ет п ред лож ен о вы брать папку для установки пакета. Р ек ом ен д уем оставить папку, п р ед л о ­ ж енную по ум олч ан и ю . В л ю б о м случ ае, учтите, что среда разра­ ботки не допускает в названиях папок п р о белы и русски е сим волы . 5. Д а л ее требуется вы брать устанавливаем ы е ком п он ен ты (рис. 1.1). Редактор Program m ers N otepad нам заменит програм м а A V R Studio, п оэтом у его м ож н о н е устанавливать. С бросьте соответствую щ и й флаж ок и нажмите кнопку У с т а н о в и т ь . 6. П о с л е завершения установки W in A V R ж ела тельн о п ерезагрузить компьютер, чтобы актуализировать пути к ком п и лятору и б и б л и о ­ текам. Теперь в систем ном м еню П уск ► П р о гр а м м ы буд ет д о с­ туп н о описание пакета W in A V R , а также — руководство п о ф унк­ циям библиотеки языка С a v r - l i b c (рис. 1.2). К ом пилировать, “ прош ивать” , редактировать и отлаж ивать п ро­ граммы мы будем в среде разработки с граф ическим интерф ейсом A V R Studio, которая автоматически и сп о льзует ути ли ты и ком пилятор языка С из пакета W in A V R . 12 Глава 1 У с т а н о в к а W inAV R 2 0 1 0 0 1 1 0 К ом пон ен ты у стан ав ли ваем о й п рограм м ы В ы б е р и те к о м п о н е н ты W inAVR 2 0 1 0 0 1 1 0 , к о т о р ы е в ы х о т и т е у с т а н о в и т ь . В ы б ери те ком пон ен ты программы , к о т о р ы е в ы х о т и т е у с т а н о в и т ь . Н аж мите кнопку 'У стан о ви ть ', ч т о б ы у ст а н о в и т ь программу. В ы б ери те ком поненты программы д л я устан овк и : 0 In s ta ll Files @ A d d D ire cto rie s to PATH (R ecom m ended) □DInstall Program m ers N otepad Т р еб у е тс я н а д и ске: 2 5 7 .3 М байт < Н а зад I У стан ови ть 1 Отмена Рис. 1.1. Выбор устанавливаемых компонентов W inAVR f r fe i Программы И зб ранн ое о Н а ст р о й к а Н айти ► yJ ID WinAVR-20100110 AVR In s ig h t [W inA V R ] * avr-libc M anual [W inAVR ] ► j3 ] GNU M anuals O nline [W inA V R ] ► N * MFile [W inAVR ] 3 Program m ers N o tep a d [WinAVR] С п р а вк а и п о д д е р ж к а Uninstall WinAVR-20100110 В ы п о л н и ть ... WinAVR User Manual j пуск Ь » И J ' Г• Рис. 1.2. Доступ к документации W inAVR через системное меню Пуск С р ед а р азр аботк и A V R S tu d io A V R S tu d io — и н т е г р и р о в а н н а я с р е д а р а з р а б о т к и (ID E ) д л я н а п и с а ­ н и я и о т л а д к и A V R -п р и л о ж е н и й в о п е р а ц и о н н ы х с и с т е м а х W in d o w s 9 x /M E /N T /2 0 0 0 /X P /V IS T A /7 х 3 2 /6 4 . A V R S tu d io с о д е р ж и т в с е б е м е ­ недж ер п роектов, редактор и сход н ого кода, им итатор, ассем б л ер и и н ­ т е р ф е й с д л я я з ы к а п р о г р а м м и р о в а н и я C /C + + , а т а к ж е и н с т р у м е н т ы в и р ­ ту ал ьн о й и м и тац и и и вн утри схем н ой отладки. С качать последн ю ю версию п акета м ож но с сайта h t t p : / / w w w . a t m e l . com . Н а м ом ен т н ап и сан и я дан н ой главы бы л а ак ту ал ьн а в ер ­ с и я A V R S tu d io 4 .1 9 , у с т а н о в о ч н ы й п а к е т к о т о р о й м о ж н о н а й т и н а п р и ­ л а г а е м о м к к н и г е к о м п а к т -д и с к е в п а п к е П р о г р а м м ы . С р е д с т в а р а з р а б о т к и /и м и т а ц и и 13 Рассм отрим процесс установки A V R Studio. 1. П о с л е запуска устан овоч н ого ф айла . е х е отобразится окно с п р и ­ ветствием и сообщ ен и ем о том, что среда разработки б уд ет ус та ­ новленная на компью тер. Н аж мите кнопку N e x t (Д а л ее). 2. Ознакомивш ись с ли цен зи он н ы м соглаш ением , вы берите п ер ек лю ­ чатель I a c c e p t th e term s o f th e lic e n s e a g r e e m e n t (Я приним аю у с ­ лови я ли ц ен зи он н ого соглаш ен и я) и нажмите кнопку N ext. 3. Н а след ую щ ем этапе буд ет п ред лож ен о вы брать папку д ля устан ов­ ки A V R Studio (учти те, что п уть к этой папке не д олж ен содерж ать русских сим волов). Д ля перехода к оч еред н ом у окн у мастера у с т а ­ новки нажмите кнопку Next. 4. В ответ на предлож ен и е установить драйвер Jungo U S B д ля р а зли ч ­ ны х программаторов (рис. 1.3) нажмите к нопку Next. Рис. 1.3. Предложение установить драйвер Jungo USB 5. В п оследн ем окне мастера установки наж мите кнопку In stall (У с т а ­ новить). 6. П о с л е успеш ной установки наж мите кнопку Fin ish (Заверш ить). П рограмма A V R Studio б уд ет д оступ н а через ком ан ду си стем н ого меню П уск ► П р о гр а м м ы ► A tm el A V R T o o ls ► A V R S tu d io 4. П о с л е ее запуска откроется менедж ер проектов, в котором м ож но откры ть с у ­ щ ествую щ ий проект с п ом ощ ью кнопки O p en и ли создать новый, нажав кнопку N e w P r o je c t (рис. 1.4). 14 Глава 1 W e lc o m e t o A V R S t u d io 4 tù New Project Open Recent projects Modified Ver 4.18.716 P jShow dialog at startup! | | | Cance Help Рис. 1.4. Менеджер проектов AVR Studio 4 Н аж мите кнопку N e w P ro je c t. В р езульта те откроется окно, в кото­ ром н ео бх о д и м о вы брать тип проекта (сп и сок P r o je c t ty p e ), а также ввести имена д ля создаваем ого проекта (п о л е P r o je c t n a m e ) и его на­ чальн о го ф айла (п о л е Initial file ) (рис. 1.5). W e lc o m e t o A V R S t u d io 4 Create new proiect Project type: Project name: ♦ Atmel AVR Assembler jprogl U AVR GCC R7 Create initial file Г/ Create folder Initial file: .c |piog1 .ocation: C:\Myprogs Ver 4.13.716 « Back | j Next » j Finish | Рис. 1.5. В ы б о р тип а и им ени пр о е кта Cancel | Help 15 С р е д с т в а р а з р а б о т к и /и м и т а ц и и П акет W in A V R и сп о льзуется в A V R Studio в качестве плагина. Без его установки у нас не б ы л о бы возм ож ности програм м ировать на языке С. В ы п о лн и те в окне, показанном на рис. 1.5, след ую щ и е настройки. 1. В ы берите в списке P r o je c t ty p e элем ент A V R G C C . 2. В веди те имена д ля сам ого проекта и его н ачальн ого файла . с. 3. У стан о в и те флажки C rea te initial file (С озд а ть начальны й ф айл) и C rea te F o ld e r (С озд а ть папку); 4. В п о л е L o c a tio n укаж ите разм ещ ение р а б оч его каталога проекта. Э тот путь н е д олж ен содерж ать русски х сим волов. Рек ом ен д уем также сделать его как м ож но короче. 5. Н аж м ите к нопку Next. Д а л ее н ео бх о д и м о вы брать отла д о ч н ую п латф орм у и м о д ел ь м и к ­ рокон тр оллера (рис. 1.6). W e lc o m e t o A V R S t u d io 4 Select debug platform and device Device: Debug platform: И s Ц AT megal 61 AT megal 62 AT megal 63 AT megal 64A AT megal 64P AT megal 64PA AT megal 65 AT megal 65A AT megal 65P AT megal 65PA AVR Dragon AVR ONE! AVR Simulator AVR Simulator 2 ICE200 ICE40 ICE50 JTAG ICE JTAGICE mkll Proteus VS M Viewer (“ Open platform options next time debug mode is entered ¡ Ver 4.18.716 | « Back~~j ext | Finish | Cancel j Help Рис. 1.6. Выбор отладочной платф ормы и модели микроконтроллера М ы будем создавать програм м у д ля А Т m ega 16, п о эт ом у вы берите отладчик A V R S im u la to r, а в списке D e v ic e (У с т р о й с т в о ) — элем ен т А Т т е д а 1 6 , и нажмите кнопку Fin ish . В результате появится рабочая среда A V R Studio, состоящ ая из след ую щ и х окон (рис. 1.7): • 1 — окно A V R G C C , отображ аю щ ее структуру проекта (все файлы, задействованные в текущ ем проекте); • 2 — окно и сх од н о го кода, отображ аю щ ее код тек ущ его откры того файла . с (и м ен н о в нем вводится текст програм м ы ); 16 • Глава 1 3 — о кн о I/O V ie w , п о л ь зу е м о го о то б р а ж а ю щ е е м и кр о ко н тр о л л е р а с о сто я н и е (п о р т ы , в се й п е р и ф е р и и т а й м е р ы /с ч е т ч и к и , и с ­ и н те р ­ ф е й с ы , э н е р го н е з а в и с и м а я п а м я т ь и д р .); • 4 — о кн о о Build — с о о б щ е н и й ; со д е р ж и т че ты р е в кл а д ки : п а р а м е тр ы ко м а н д н о й п р о ц е н т и с п о л ь зо в а н н о й о M essage — ж е — о б со о б щ е н и я о ш и б ка х о Find in F ile s Find in F ile s — 5 — о з а гр у ж е н н ы х р е зул ь та ты (П р а в к а п р и п е р и ф е р и й н о е о тл а д ке ко м п и л я то р у ; м о д ул я х п р о гр а м м ы , а т а к ­ в ы п о л н е н и я ко м а н д ы м е н ю E dit ► ► П о и с к в ф а й л а х ); с о с то я н и е р е ги с тр о в н и б у д ь п е р е д а н н ы е ко м п и л я ц и и ; о B re a k p o in ts and Т ra c e p o in ts • с тр о ки , п а м я ти м и кр о ко н тр о л л е р а ; — т о ч ки устр о й ств о . п р о гр а м м ы , п р е р ы в а н и я и п е р и ф е р и и , ко гд а Э то п о с ко л ь ку щ е е с о с то я н и е р а зр я д о в р е ги с тр о в о н о в о кн е о кн о уд о б н о н а гл я д н о тр а с с и р о в ки ; 3 в ы б р а н о ка ко е - и сп о л ь зо в а ть о то б р а ж а е т т е ку ­ пери ф е р и и . Примечание Частоту работы микроконтроллера, используемого в проекте, задают с помощью команды меню Project ► Configuration Options ► Frequency. Это необходимо де­ лать после создания каждого проекта. Частоту для режима имитации задают с по­ мощью команды меню Debug ► AVR Simulator Options (доступна только после запуска имитации по команде Build ► Build and Run) С р е д с т в а р а з р а б о т к и /и м и т а ц и и И м и татор схем 17 P ro te u s IS IS Пакет Proteus от компании Labcenter Electronics (оф и ци альн ы й сайт h t t p : / / w w w . l a b c e n t e r . c o m ) представляет собой си стем у сх ем о ­ т ехн и ческого моделирования. Е го отли ч и тельн ая черта — возм ож ность м оделировать р а б оту м икрокон троллеров, м икропроцессоров, Ж К -и н дикаторов, тем пературны х датчиков, ви ртуальн ы х портов и ви р туа ль­ н ы х изм ерительны х приборов, что н е всегда д оступ н о в д р уги х п о д о б ­ н ы х программах. Библиотека ком понентов также содерж ит справочны е данные. С истем а Proteus состои т из д в ух ком понентов: • Proteus V S M Simulator (IS IS ) — програм м а синтеза, м одели рован и я и отладки в реж име р еа льн ого времени электрон н ы х схем; • Proteus P C B D esign (A R E S ) — програм м а разработки печатны х плат. Н а м потребуется т о л ь к о Proteus IS IS д ля проверки и имитации ра­ бото сп особ н ости програм м и схем для м икроконтроллеров. П о след н ю ю версию Proteus м ож н о при обрести на сайте Labcenter Electronics. К р о м е того, на п рилагаем ом к книге компакт-диске в папке I I p o r p a M M b i\ P r o t e u s находится дем онстрационная версия и н ст а лл я ­ ц ионного пакета Proteus Professional, а также ф айлы установки и н тегри ­ рованной среды V S M Studio ID E и драйверов Proteus V S M U SB . Рассмотрим процесс установки ли ц ен зи он н ой версии Proteus. 1. П о с л е запуска устан ов оч н ого ф айла появится окно приветствия. Н аж мите в нем кноп ку Next. 2. В след ую щ ем окне, ознакомивш ись с ли ц ен зи он н ы м соглаш ением , нажмите кнопку Y e s (Д а). 3. У каж и те путь размещ ения ли ц ен зи о н н ого клю ча: ло к а ль н о и ли на сервере (рис. 1.8), и нажмите кнопку N ext. 4. У каж и те каталог д ля установки пакета Proteus и л и оставьте папку, вы бранную по ум олч ан и ю , и наж мите кнопку Next. 5. В след ую щ ем окне мастера н ео бх о д и м о вы брать устанавливаем ы е компоненты пакета (рис. 1.9). С бр осьте все флажки, кроме P r o te u s V S M S im u lator, и наж мите к нопку Next. 6. Н а последнем этапе наж мите кнопку N ext, а п о сле заверш ения у с ­ тановки — Finish. П рограмма Proteus IS IS б уд ет доступ н а в систем ном м ен ю П уск ► П р о гр а м м ы ► P r o te u s 7 P r o fe s s io n a l. e a t / -" ' ' — - ~ ----- L Глава 1 18 X] S e tu p Type Select the setup type that best suits your needs. Choose whether to use a locally installed or server based licence key (• Use a locally installed Licence Key Use a licence key installed on a server Next > < Back Cancel 1 .......... ............... 1 J Рис. 1.8. Выбор размещения лицензионного ключа Xj P r o t e u s P r o f e s s i o n a l - I n s t a l l S h ie l d W iz a r d S e le c t Features Select the features setup will install. Select the features you want to install, and deselect the features you do not want to install. ~Descriptio This component includes files specifically required for Proteus VSM simulation [jProteus PCB Design QGerber Import Tool [П Converter Files 236.37 MB of space required on the С drive 249655.13 MB of space available on the С drive InstallS hield----------- —--------------------------------------------------------------- -------------------------------------------------- < Back I Next > | Cancel | Рис. 1.9. Выбор устанавливаемых компонентов пакета Proteus О сн о в н о е (р и с . • о кн о п р о гр а м м ы с о с то и т и з с л е д у ю щ и х эл е м е н то в и о ко н п о зв о л я е т о п е р а ти в н о п е р е м е щ а ться 1 .1 0 ): 1 — о кн о схе м е то л ь ко обзора, п р о е кта , о б л а сть, ко то р о е п р ед оставл яет о б о зн а че н н а я кр а т ки й с и н и м об зор схе м ы п о (о то б р а ж а е тс я п р я м о у го л ь н и ко м ; зе л е н ы й Средства разработки/имитации п р я м о у го л ь н и к 19 о б о зн а ча е т в и д и м у ю о б л а сть с х е м ы ), а т а к ж е п о к а з ы в а е т в ы б р а н н ы й • 2 — и • о кн о р е д а кти р о в а н и я р е д а кти р о в а н и я схе м ы , п р е д н а зн а ч е н н о е для р а зм е щ е н и я со е д и н е н и я эл е м е н то в схе м ы ; 3 — о кн о вы б о р а н е о б х о д и м ы х о н о 4 — д л я о б ъ е кто в, ко то р о е р а зм е щ е н и я в за п о м и н а е т и с п о л ь зо в а н н ы е в д а л ьн е й ш е м • о кн а ко м п о н е н т; п а не л ь и х м о ж н о вы б о р а б ы л о р е ж и м о в с о д е р ж и т с п и с о к о кн е р е д а кти р о в а н и я ко м п о н е н т ы и з ко м п о н е н то в , (в ч а с тн о сти , б и б л и о те ки , ч то б ы б ы с тр о п р и м е н и т ь ); р е д а кто р а (р а з д е л е н а н а тр и ч а сти : о с­ н о в н ы е р е ж и м ы , п р и с п о с о б л е н и я , 2 0 -гр а ф и к а ); • 5 — пане л ь у п р а в л е н и я и м и та ц и е й , н а ко т о р о й р а зм е щ е н о че ты р е о д н о го та кта и м и та ц и и , п а уза , сто п . * Ш> » D9m\Â. •4 fei г к н о п к и : п у с к, в ы п о л н е н и е Рис. 1.10. Окно программы Proteus ISIS Примечание Для добавления в микроконтроллер программы (НЕХ-файла) необходимо щелк­ нуть правой кнопкой мыши на микроконтроллере, выбрать в контекстном меню ко­ манду Edit Properties ► Program File и указать интересующий файл .hex. В этом же окне можно задать частоту работы микроконтроллера. Для того чтобы один такт соответствовал необходимому временному отрезку, не­ обходимо в режиме имитации выбрать команду меню System ► Set Animation O p­ tions и задать параметр Single step time Теперь один шаг имитации будет длить­ ся указанное вами время. _______________ Г л а в а Р а б о т а О п ер а тор с 2 __________ ____ р а з р я д а м и в _____ я з ы к е С << Оператор < < вы полняет поразрядный сдвиг ч и сла влево. Е го си н ­ таксис: П ерем енная = (П ерем енная << Ч исло_разрядов_дл я_сдвига); Значение перем енной сдвигается в лево на указанное коли ч еств о бит с зап олнением освободи вш и хся разрядов справа логи ч ески м и нулям и. П р и вы ходе за д оп усти м ы е п ред елы типа данны х сдвигаем ы е биты т е­ ряются. Например: Десятич­ ное зна­ чение Число в двоичной системе счисления Операция u nsign ed ch ar n = 0x 0 1 ; 0 0 0 0 0 0 0 1 1 n = (n << 5 ) ; 0 0 1 0 0 0 0 0 32 u n sign ed ch ar n = 0x06; 0 0 0 0 0 1 1 0 6 n = (n << 6 ) ; 1 0 0 0 0 0 0 0 128 К р о м е того , мож но сдвигать числовы е константы, например: П = (1 << 7) ;__________________________________________________________________ | В данном случае единица сдвинется на семь разрядов, и мы п о л у ­ чим в переменной п двоичное значение 1 0 0 0 0 0 0 0 (ш естнадцатеричное 8 0 и ли десятичное 12 8). О п ер атор >> Оператор > > вы полняет поразрядный сдвиг числа вправо. Е го син­ таксис: П ерем енная = (П ерем енная >> Ч исло_разрядов_дл я_сдвига); 21 Р абота с разрядам и в язы ке С Значение перем енной сдвигается вправо на указанное коли ч еств о бит с заполнением освободи вш и хся разрядов слева логи чески м и н у л я ­ ми. П ри вы ходе за н улев ой разряд перем енной сдвигаем ы е биты теря­ ются. Например: u n sig n e d n = (n = (n n = 0x80; >> 4 ) ; u n sig n e d n char char >> n = OxAO ; 2); О п ер а тор Десятич­ ное зна­ чение Число в двоичной системе счисления Операция 128 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 8 0 0 0 160 0 0 0 40 1 0 1 0 0 0 0 1 0 1 ~ Оператор ~ инвертирует каждый разряд, т.е. 1 заменяется на 0 и на­ оборот. Э тот оператор — унарный, т.е. применяется т о л ь к о к од н ом у операнду. П ример: п п = 0Ь01010101; = ~п ; О п ер а тор // // 85 п = 0Ы 0101010, т .е . 170 Л Оператор Л прим еняет к операндам логи ч еск ую операцию и ск л ю ­ чаю щ его “ И Л И ” , когда в каждый разряд результата записывается 1, есл и соответствую щ ие разряды операндов различаю тся, и л и 0, если они совпадают. Например: А = 0Ь01010101; В = ОЬ0 0 0 0 0 0 0 1 ; С = А А В; О п ер атор / / С = оъоюююо | Оператор | применяет к операндам логи ч еск ую операцию пораз­ рядного “ И Л И ” . Э то значит, что разряд результата буд ет равен 1, если 1 содержится в соответствую щ ем разряде хотя бы одн ого операнда. Например: 22 Глава 2 А = 0Ь01010101; В = ОЪОООООООХ; С = А | В; О п ер а тор / / С = О Ъ О Ю Ю Ю ! & О ператор & применяет к операндам логи ч еск у ю операцию пораз­ рядного “ И ” . Э то значит, что разряд результата будет равен 1 т о ль к о в том случае, когда соответствую щ ий разряд о бои х операндов содерж ит 1. В противном случ ае он б уд ет равен 0. Например: А = 0Ъ01010Ю 1 ; В = ОЬ00000001; С = А & В; С = 0Ь00000001 / / З ап и сь лог. 1 в н ек отор ы й с о б н у лен и е м о с т а л ь н ы х р азр яд р а зр я д о в Д л я записи логи ч еской единицы в некоторый разряд с обн улен и ем остальн ы х разрядов м ож но воспользоваться оператором: П ерем енная = (1 Н о м е р _ р а з р я д а ); << Запись неск ольки х логи ч еск и х единиц с о бн улен и ем остальн ы х раз­ рядов: П ерем енная = (1 Н ом ер_разряда) << ... | (1 << Н ом ер_разряда) ; А льтерн ати вн ы й вариант — просто присвоить перем енной значение с логи чески м и единицами в требуем ы х разрядах: п = ОЬОЮ Ю Ю Х; / / то же самое, что п = 0x55; Рассм отрим пример выражения со схем ой вы числений: П = (1 « 4) (1 << 4) = ИЛИ (1 << 2) = | (1 « 2) | (1 << 1); 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 или (1 « 1) = Результат 23 Р абота с разрядам и в я зы ке С Р езульта т — ОЬО 0 0 1 0 1 1 0 , т.е. десятичное 22. З ап и сь лог. 1 в н ек отор ы й о б н у лен и я о с т а л ь н ы х р а зр я д б ез р а зр я д о в Д ля записи логи ч еской единицы в некоторы й разряд без обн улен и я остальн ы х разрядов м ож но восп ользоваться оператором: П ерем енная |= (1 Н ом ер_разряда) ; << Эта запись равнозначна след ую щ ей : П ерем енная = П ерем енная | << Н о м е р _ р а з р я д а ); (1 Запись н еск ольки х логи ч еск и х единиц без о бн у лен и я о стальн ы х разрядов: П ерем енная |= (1 Н ом ер_разряда) . . . << | (1 << Н ом ер_разряда) ; А льтерн ати вн ы й вариант — просто прим енить к п ерем енной значе­ ние с логи ческ и м и единицами в требуем ы х разрядах с п о м ощ ью опера­ тора “ И Л И ” , например: п = п | 0Ь0Ю 10101; / / то же самое, Рассм отрим пример. П р едп олож и м , п п |= (1 « 4) | (1 << 2) | (1 « что = п |= 0x55; О хАА. Т о гд а выражение 1 ) ;_________________________________________ б уд ет вы числено п о след ую щ ей схем е: 1 0 1 0 1 0 1 0 = 0 0 0 1 0 0 0 0 = 0 0 0 0 0 1 0 0 = 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0 п ИЛИ (1 << (1 << 4) ИЛИ 2) или (1 « 1) Результат Р езультат — 0 Ы 0 1 1 1 1 1 0 , т.е. поверх су щ еств у ю щ его значения переменной в заданные разряды б ы ли записаны л оги ч еск и е единицы. 24 Глава 2 З а п и сь лог. О в н ек отор ы й о б н у лен и я о с т а л ь н ы х р а зр я д б ез р а зр я д о в Д ля записи логи ч еск о го н уля в некоторы й разряд без о бн улен и я ос­ т альн ы х разрядов м ож но воспользоваться оператором: П ерем енная &= ~ ( 1 << Н ом ер_разряда) ; Эта запись равнозначна след ую щ ей : П ерем енная = П ерем енная & ~ (1 << Н ом ер_разряда) ; Запись нескольки х логи ч еск и х н улей б ез обн улен и я о стальн ы х раз­ рядов: П ерем енная &= ~ ( 1 < < Н о м е р _ р а з р я д а ) . & - (1 < < Н о м е р _ р а з р я д а ); . И ли : П ерем енная = П ерем енная & ( ~ ( ( 1 < < Н о м е р _ р а з р я д а ). . | (1<<Н ом ер_разряда) ) ) ; М о ж н о также прим енить к перем енной операцию поразрядного “ И ” с числовы м операндом, в котором в позициях обн уля ем ы х разрядов д олж н ы бы ть нули. Например: п = п & 0Ы 1111000; _________________________________________________________ Л оги ч еск и е н ули б у д у т записаны в разряды 0 -2, а остальн ы е разря­ ды перем енной останутся неизменны ми. Рассм отрим след ую щ и м пример. П редп олож и м , п выражение п &= ~ ( 1 << 2) & ~ (1 << 3) & ~ (1 << = О хАА. Т о гд а 4); буд ет вы числено по след ую щ ей схем е: 1 п 0 1 0 И ~ (1 « 2) = 1 1 1 1 И ~ (1 « 1 0 1 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 0 & & 3) = И ~ ( 1 « 4) = Результат 1 1 1 1 & 1 1 1 0 1 1 0 0 Работа с разрядами в языке С 25 Р езульта т— 0 Ы 0 1 0 0 0 1 0 , т.е. в преды дущ ее значение перем енной в указанны е разряды бы ли записаны логи ч еск и е н ули . З ап и сь лог. О в н ек отор ы й в о с т а л ь н ы е р а зр я д ы р а зр я д с за п и сью лог. 1 Д л я записи ло ги ч еск о го н уля в некоторы й разряд перем енной с за­ п и сью ло г. 1 в остальн ы е разряды м ож но восп ользоваться оператором : П ерем енная = ~ (1 <<Н ом ер_разряда) . . . П р овер ка н ек отор ого & ~ (1 « Н о м ер _ р а зр я д а ) ; р а зр я д а п ер ем ен н ой на н а ли ч и е лог. О Возм ож ны е варианты проверки: (о== & (1 << if (П е р е м е н н а я Н о м е р _ р а з р я д а )) ) { О п е р а т о р 1 ;} e l s e { О п е р а т о р 2 ;} if ( ~ П е р е м е н н а я & (1 << Н о м е р _ р а з р я д а ) ) { О п е р а т о р 1 ;} e l s e { 0 п е р а т о р 2 ;} П ри п одклю чен н ом за голов оч н ом ф айле < a v r / s f r _ d e f s . h > п р о ­ верка м ож ет вы глядеть так: ( b i t _ i s _ c l e a r {П е р е м е н н а я , if {O n e p a ro p l; } e lse Н о м е р _ р а з р я д а )) {0 п е р а т о р 2 ;} Операт ор1 вы полнится в том случ а е, если в указанном н ом ере разряда переменной буд ет 0. В противном случ а е вы п олн и тся О п е р а тор2 Рассмотрим след ую щ и й пример: if (~п & (1 << 4 ) ) {О п е р а т о р !;} e lse { 0 п е р а т о р 2 ;} П ервы й вариант вы числений: п ~п = 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 И (1 << & 4) Р е зу л ь т а т = Результат равен н у л ю — значит вы полнится 0п ерат ор2. 26 Глава 2 В торой вариант вы числений: п ~п = 0 1 0 0 0 1 0 1 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 И (1 « & 4) = Результат Р езу ль т а т не равен н у л ю — значит в ы полнится П р овер к а н ек отор ого р а зр я д а О перат ор!. п ер ем ен н ой на н а ли ч и е лог. 1 В озм ож н ы е варианты проверки: if ( 0 != ( П е р е м е н н а я & ( 1 << Н о м е р _ р а з р я д а ) ) ) { О п е р а т о р 1 ; } e l s e {О п е р а т о р 2 ;} if ( П е р е м е н н а я & ( 1 << Н о м е р _ р а з р я д а ) ) { 0 п е р а т о р 1 ; } e l s e {О п е р а т о р 2 ;} ( ( П е р е м е н н а я & (1 << Н о м е р _ р а з р я д а )) (1 << Н о м е р _ _ р а з р я д а ) ) { 0 п е р а т о р 1 ;} e l s e {0 п е р а т о р 2 ;} if == П ри подклю чен н ом заголов оч н ом ф айле < a v r / s f r _ d e f s .h > про­ верка мож ет вы глядеть так: if ( b i t _ i s _ s e t (П е р е м е н н а я , Н о м е р ^ р а з р я д а )) { О п е р а т о р 1 ;} e l s e {О п е р а т о р 2 ;} О перат ор1 вы полнится, если в указанном разряде перем енной на­ ходится единица. В противном случ ае вы полнится 0п ерат ор2. Рассм отрим след ую щ и й пример: if (п & (1 << 3)) {О п е р а т о р !;} e lse {0 п е р а т о р 2 ;} П ервы й вариант вы числений: п 0 1 0 1 (1 < < 3) = Результат 0 1 0 1 Sc и 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 Р езу ль т а т равен н у л ю — значит вы полнится В торой вариант вы числений: 0п ерат ор2. Работа с разрядами в языке С п 27 1 0 1 0 (1 « 3) = Результат 1 1 0 1 & И 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 Р езульта т не равен н у л ю — значит вы полнится О ж и дан и е п о я в лен и я О перат ор!. лог. 1 в н ек отор ом р а зр я д е Варианты реализации такого ожидания: w h ile (~П ерем енная w h ile ( ! {П е р е м е н н а я & (1 & (1 << << Н о м е р _ р а з р я д а ) ) ;______________________________ | Н о м е р _ р а з р я д а )) ) ; П ри подклю чен н ом за го ло в о ч н ом ф айле < a v r / s f r _ d e f s . h > п ро­ верку м ож но вы полн и ть так: I lo o p _ u n t il_ b it _ is _ s e t {П е р е м е н н а я , Н о м е р _ р а з р я д а ); Ц и к л ожидания будет вы полняться д о тех пор, пока заданный раз­ ряд перем енной содерж ит лог. 0. К ак тольк о в нем появится лог. 1, п ро­ изойдет вы ход из цикла. Рассм отрим след ую щ и й пример: I w h ile (~п & (1 << 6 ) ) ; Первы й вариант вы числений: п 1 0 1 0 1 0 1 0 ~п = 0 1 0 1 0 1 0 1 & и (1 << 6) = 0 1 0 0 0 0 0 0 Результат 0 1 0 0 0 0 0 0 Р езульта т не равен н у л ю — значит ш естой разряд перем енной равен 0, и вы ход из цикла не произойдет. В торой вариант вы числений: п 1 1 1 0 1 0 1 0 ~п = 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 & и (1 << 6) = Результат 28 Глава 2 Р езульта т равен н у л ю — значит ш естой разряд перем енной равен 1, и произойдет вы ход из цикла. О ж и дан и е п о я в лен и я лог. О в н ек отор ом р а зр я д е Варианты реализации такого ожидания: w h ile ( П е р е м е н н а я & (1 < < Н о м е р _ р а з р я д а ) ); П ри подклю чен н ом за голов оч н ом ф айле < a v r / s f r _ d e f s , h > про­ верку м ож но вы п олн и ть так: lo o p _ u n t il_ b it _ is _ c le a r (П е р е м е н н а я , Н ом ер_разряда) ; Ц и к л ожидания будет вы полняться до тех пор, пока разряд в пере­ менной содерж ит лог. 1. Как тольк о в разряде появится лог. О, произой­ дет вы ход из цикла. Рассм отрим след ую щ и й пример: w h ile (п & (1 << 3 ) ) ; Первы й вариант вы числений: п 1 0 1 0 И 1 0 1 0 & (1 « 3) = Результат 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 Р езульта т не равен н у л ю — значит третий разряд перем енной со ­ держ ит 1, и вы ход из цикла не произойдет. В торой вариант вы числений: п 1 0 1 0 0 0 1 0 Sc И (1 « 3) = Результат 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 Результат равен н у л ю — значит третий разряд перем енной содер­ жит 0, и произойдет вы ход из цикла. П р овер к а Так ую оператора: со стоя н и я о п р ед еле н н ы х проверку вы п олн яю т с пом ощ ью р а зр я д о в сл е д у ю щ е го ус ло в н ого Р абота с р азрядам и в я зы ке С If ( ( П ерем енная 29 & Требуем ы е_разряды ) { Операr o p l ;} e l s e == Значение) { Оператор2;} 0 п е р а т о р 1 вы полнится тольк о в том случае, если тр ебуем ы е раз­ ряды переменной совпадаю т с соответствую щ и м и разрядами З н а ч е ­ н и я . В противном случ а е вы полнится 0 п е р а т о р 2 . Рассм отрим пример. П р едп олож и м P I N D = 0 Ы 1 1 1 0 0 0 1 . Т о гд а у с ло в и е if ((P IN D & 0Ы 1110000) { Оператор1; } else == ОЫОЮОООО) { Оператор2; } буд ет проверять разряды 4—7 регистра P I N D на соответствие значению 1 0 1 0 . Вариант 1: O b llllO O O l & 0Ы 1110000 = О Ы 1 И О О О О ________________________________________ Р езульта т не равен О Ы О Ю О О О О , а значит вы полнится О п е р а т ор2. Вариант 2: ОЫОЮООО! & 0Ы 1110000 = ОЫОЮОООО Результат равен О Ы О Ю О О О О , а значит вы полнится О п е р а т о р !. М и к р о к А Т 9 о 0 н Б т 2 р 3 о 1 л 3 В э т о й части: ❖ Глава 3. Таймеры/счетчики АТ9082313 ❖ Глава 4. Память ЕЕРРОМ АТ9032313 ❖ Глава 5. Работа с 11АРТ в АТ9032313 ❖ Глава 6. Аналоговый компаратор АТ9082313 ❖ Глава 7. Работа с прерываниями в АТ90Б2313 л е р ____________________________ Г л а в а 3____________________________ Т а й м е р ы / с ч е т ч и к и А Т 9 0 8 2 3 1 3 В этой гла ве мы рассм отрим м етоды работы с таймерами м и крокон ­ троллер а А Т 9 0 8 2 3 1 3 и соответствую щ и е програм м ы на С. Тай м ер/счетчик О Тайм ер 0 настроен таким образом, что через каждые 0,000256 с (1 024 / 4 000 000 Г ц ) содерж им ое сч етн о го регистра (счетчи ка) Т С О Т О увеличивается на единицу. Рассм отрим програм м у, р еа ли зую щ ую два условия: • если счетны й регистр равен 0, то установить на всем п о р ту Б у р о ­ вень л о г. 1 (+ 5 В ); • если счетны й регистр равен 128, то установить на всем п о р т у Б у р о ­ вень л о г. 0 (0 В ). У р о в е н ь лог. 1 д ли тся 128 отсчетов Т О Г Г О (о т 0 до 128), ур ов ен ь лог. 0 — так же 128 отсчетов Т О Г Г О (о т 128 до 0). П о с л е т ого , как тай ­ мер вы п олн и т 255-й отсчет, счетны й регистр ТСТЧТО автоматически о б ­ нуляется (рис. 3.1). тсито тсыго ув еличился н а 1 ув еличился н а 128 тсьтто ув еличился н а 255 ТСЫТО сб росился в 0 (насчитав всего 256 подсчетов) 262144 циклов М К +5 вольт 128 подсчетов (131072 циклов МК) 0 вольт 128 подсчетов (131072 циклов МК) 128 Рис. 3.1. Схема работы ТСЫТО П о ск о льк у сч етн о м у р еги стру д ля ув ели ч ен и я значения на еди н и цу требуется 0,000256 с, п олож и тельн ы й и м п уль с (так же, как и н у л ев о й ) 32 Глава 3 будит длиться 0,000256x128 = 0,032768 с. Это наглядно показывает ос­ циллограмма, изображенная на рис. 3.2 (32,76 мс = 0,032768 с). а Рис. 3.2. Осциллограмма работы таймера/счетчика 0 Частота импульсов на порте Б составляет 4 000 000 Гц / 1024 /256 = 15,2587890625 Гц, т.е. напряжение на выводах меняется с +5 В на 0 В почти 16 раз в секунду. С хем а Тестовая схема показана на рис. 3.3. К порту Б подключены свето­ диоды. Для ограничения тока последовательно со светодиодами вклю­ чены резисторы. Примечание В дальнейшем в схемах эти сопротивления указываться не будут, однако их при­ сутствие обязательно. П р ограм м а Программа, реализующая работу схемы, показанной на рис. 3.3, представлена в листинге 3.1. Таймеры/счетчики AT90S2313 33 Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT 9 0S 2 31 3 \3 . 01 - Т ай м ер о. Листинг 3.1. Программа Ъ а л п е г 8 Ь : и . с #1пс1ис1е in t < a v r/io .h > // Заголовочны й / / / / вво д а-вы во д а для у с тр о й с т в а , используем ого в проекте файл подклю чает определения / / / / / / I 01111111 - о п р ед ел я ем в с е выводы п о р та к а к вы хо ды (в п о р т у Б в с е г о 7 в ы в о д о в : РВ 0-Р В 7) 01111111 - на всех вы водах порта Б у р о в е н ь л о г . 1 ( + 5 В) И нициализация сч етн о го р е г и с т р а т айм ера/ сче тчика 0, m a in (v o id ) { DDRD = 0 x 7 F ; PORT D = 0 x 7 F ; TCNTO = 0; //Н а с т р о й к а / / / / / / I т а й м ер а/сч етч и к аО Б 34 Глава 3 Листинг 3.1. Окончание TCCR0=0x05; w h ile d ) // // // // // // И нициализация р е г и с т р а уп равлен и я т а й м е р о м /с ч е т ч и к о м 0. Зн ачен и ю 5 ( т . е . 0Ы 01) со о тв етств у ет н астройка тайм ера н а ч а с т о т у 4 0 0 0 0 0 0 /1 0 2 4 Гц. Это зн а ч и т , ч т о каж дые 0 ,0 0 0 2 5 6 с зн а ч е н и е с ч е т н о г о р е г и с т р а ТСЫТО б у д е т у в е л и ч и в а т ь с я (использован предварительны й делитель) // Бесконечны й // цикл { if ( TC N TO = = 0 x 0 0 ) {PORTD = 0 x 7 F ; } / / Если счетны й регистр = 0, то на все // в ы в о д ы п о р т а В п о д а е м + 5 В if (TC NTO = = 0 x 8 0 ) {PORTD = 0 x 0 0 ; } / / Если счетны й регистр = 1 2 8 ,) то на все // в ы в о д ы п о р т а Э п о д а е м 0 В } } Тай м ер/счетчик 0 в реж и м е счета на вн еш н ем и м п у л ь с о в в ы в о д е ТО В это прим ере таймер/счетчик 0 настроен таким образом, что он подсчиты вает и м п ульсы на внеш нем вы воде ТО (P D 4 ). П о с л е отсчета 10 и м п ульсов на все выводы порта В подается напряж ение 0 В. К о гд а счет­ чик д ости гн ет значения 20, на все вы воды порта В подается напряжение +5 В. В качестве источника счетны х им п ульсов и сп ользуем кнопку. С хем а Тестовая схема показана на рис. 3.4. Из-за дребезга контактов кноп­ ки (S W 0 ) данная схема (и програм м а) будет работать корректно т оль к о в имитаторе схем. П о ск о л ьк у м и крокон троллер работает на б ольш ой частоте, он улавливает д р ебезг контактов кнопки, и п о то м у коли чество подсчитанны х импульсов каждый раз будет разным. П р огр ам м а П рограм м а, реализую щ ая р а боту схемы , показанной на рис. 3.4, представлена в ли сти н ге 3.2. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T 9 0 S 2 3 1 3 \ 3 .0 2 - Т ай м ер О в режиме с ч е т а и м п у л ь с о в на в ы в оде ТО. Таймеры/счетчики А Т9032313 35 D1 LED-RED D2 J L C1 10pF J - C2 ]~~ 10pF 0 LED-RED X1 HDh' U1 /К_ XTAL1 PBO/AIM D XTAL2 P01/AIN1 RESET PB2 PB3/OC1 PDO/RXD PB4 PD1/TXD PB5 48 PD2/INT0 PB6 PD3/INT1 PB7 Lii£ PD4/TD Р Ь5П \ PD6/ICP AT90S2313 swo j—-- О О— LED-RED D3 D4 D5 LED-RED D6 LED-RED D7 D8 Рис. 3.4. Схема для подсчета импульсов на выводе ТО Листинг 3.2. Программа с о и п Ъ е г в Ы Ъ . с #з.пс1ис1е in t < a v r/io .h > / / / / / / З аго л о в о ч н ы й файл п о дкл ю чает вво д а-вы во д а для у стр о й ст в а, используем ого в проекте определения m a in (v o id ) { DDRB = PORTB = DDRD PORTD O x ff; O x ff; I= - (1< < 4); 1 « 4 ; / / / / / / / / / / / / 0 х £ £ = 0 Ы 1 1 1 1 1 1 1 (Ь1п) - в с е вы в о д ы / п о р т а В (РВ 0-Р В 7) - вы ходы / 0х££ = 0 Ы 1 1 1 1 1 1 1 - на в с е выводы п о р та / В п о д а е м +5 В / Записы ваем 0 в 4 р азр я д р еги с тр а / н а п р а в л е н и я п е р е д а ч и данны х п о р т а В, / т . е . в ы в о д РБ4 б у д е т р а б о т а т ь к а к в х о д / З ап и сы в а ем 1 в 4 р а з р я д п о р т а Б . Это / з н а ч и т ч т о в ы в о д РБ4 б у д е т н а гр у ж е н / подтягиваю щ им с о п р о ти в л ен и ем . В нутри / м и к р о к о н т р о л л е р а к РБ4 п о д к л ю ч е н о Глава 3 36 Листинг 3.2. Окончание / / / / сопротивление, п о д а н о +5 В . на другой конец которого //Н а с т р о й к а т а й м е р а /с ч е т ч и к а О / / И нициализация р е г и с т р а уп равлен и я ТСС110 = 0 x 0 7 ; / / т а й м е р о м /с ч е т ч и к о м 0 . З а п и с а в в н е г о / / 0 Ы 1 1 ( Ы п ) = 0 x 7 , мы о п р е д е л и л и / / увеличение значения счетного р еги стра // ТСКЛО по каж дому ниспадаю щ ему фронту / / ( т . е . п е р е х о д у н а п р я ж е н и я с + 5 В к 0 В) / / на вы воде Т 0 (Р В 4 ). П о с к о л ь к у в н у т р и МК / / мы п о д к л ю ч и л и к в ы в о д у РБ4 внутренний / / подтягиваю щ ий резистор, для появления / / ниспадаю щ его ф ронта необходим о п о д ать на / / вывод 0 В . ф Ы 1е (1 ) / / Бесконечны й цикл { 0x14) (ТСОТО // Если счетны й / / / / то на весь и начинаем / / Если // то регистр 20, 0x14 { РО ИТВ = ТСЭТО = 0 ; 0х££; порт счет Б подаем с начала +5 В, } 1£( ТСОТО == ОхОА) счетчик досчитал до 10, { РОИТВ = 0x00; на весь порт Б подаем 0 В } Тай м ер/счетчик 1 Д ля организации работы таймера/счетчика 1 служ ат два регистра управления: Т С С Ш А и Т С С Ш В . В рассм отренном ниж е прим ере тай­ мер/счетчик 1 настроен на ув ели ч ен и е сч етн ого регистра ТС Ы Т1 на еди­ ниц у в каждом 64 ц икле м икроконтроллера. П о ск о льк у частота работы м икроконтроллера составляет 4 М Г ц , а коэффициент предварительного д ели теля — 64, т о содерж им ое счетн ого регистра Т С Э Т 1 будет ув е ли ­ чиваться на единицу через каждый 6 4 / 4 000 000 = 0,000016 с. В бесконечном ц икле программы проверяю тся два условия: • если счетны й регистр ТС1ЧТ1 содерж ит 32 768, то на все выводы порта Б подается 0 В; Таймеры/счетчики А Т9052313 37 • если счетны й регистр Т О Г Л содерж ит 0, то на все вы воды порта Б подается +5 В. П орт Б буд ет находиться в состоянии лог. О (О В ) 32 768 отсчетов Т С К Т 1 и ли 2 097 152 циклов м икроконтроллера, а в состоянии л о г. 1 (+ 5 В ) — 32 768 отсчетов, от 32 768 отсчета д о п ереполнения счетчика (рис. 3.5). тот ув еличипся н а 1 тот тот ув еличипся н а 32768 ув еличипся н а 65535 4194304 циклов М К +5Волынапортуйбудутдлиться32768подсчетовТСМГ1 Рис. 3.5. Схема работы ТСМТ1 М аксим альное значение, которое м ож н о записать в 16-разрядный регистр Т С И Т 1 — это 65 535 ( 0 Ы 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) . К о гд а счетчик досчитает 17-разрядного значения ОЫОООООООООООООООО (65 536), он сохраняет его без старш его разряда, п о ск о льк у оно н е пом еш ается в 16-разрядный регистр. Д р уги м и словам и , возникает п ер еп олн ен и е счетчика, когда его содерж им ое обн уляется. Время нахож дения порта Б в состоянии лог. 0 совпадает с д л и т е л ь ­ ностью состояния л о г. 1 (рис. 3.6). У м н ож и в время, за которое со д е р ­ ж имое Т С Ж 1 увеличивается на единицу, на количество раз, в котором порт Б находится в том и ли ином состоянии, мы п олуч и м п о лн о е время в данном состоянии: 32 768 х 0,000016 с = 0,524288 с. 38 Глава 3 Рис. 3.6. Осциллограмма работы таймера/счетчика 1 С хем а Т е сто ва я схе м а д л я д а н н о го п р и м е р а п о к а з а н а н а р и с . 3 .7 . П р ограм м а П р о гр а м м а , п р ед ста вл ен а р е а л и зую щ а я в л и с ти н ге р а б о ту схе м ы , п о ка за н н о й н а р и с . 3 .7 , 3 .3 . Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T 9 0 S 2 3 1 3 \ 3 . о з - Т ай м ер X. Листинг 3 . 3 . Программа t i m # in c lu d e in t < a v r/io .h > e lö b it.c // Заголовочны й / / / / вво д а-вы во д а для у стр о й ст в а, используем ого в проекте файл подклю чает определения / / / / O b O l l l l l l l - в с е выводы п о р т а D р а б о т а ю т к а к вы ходы (в п о р т у D в с е г о с е м ь в ы в о д о в : PD 0-PD 7) O b O lllllll - на всех вы водах порта D m a in (v o id ) { DDRD = 0 x 7 F ; P ORT D = 0x7F; / / / / // устанавливаем уровень лог. 1 (+5 В) 39 Таймеры/счетчики AT90S2313 Листинг 3.3. Окончание // Н астройка // Р еги стр // 8 -р а зр я д н ы х TCCR1A = TCCR1B = тай м ера/счетчика управления р еги стр ов : 0x00; 0x06; // Н ачальная // Р еги стр TCCR1 Реж им п оскольку // совп аден и я OCR1; // О ЬО О О О О Н О - // и сп ользуем , // Не // поэтом у счетн ы х разрядам и // разрядах // им п ульсов си гн ала AT90S2313 си гн ал р еги стр зн ачение // сбрасы вается в в р еги стр е // П ри // TCNT1L, чтении T C N T1H = TCNT1L = w h i l e (1 ) а 0 и 0x0 0 ; 0x00; на 0 TCNT1 сч етн ого В) к и из ф лаг в TCNT1 в TCNT1H , чтобы на TCNT1 счетны х (п е р е х о д Т1 на (в МК PD 5 счетны й единицу. TCNT1 двух Е го к отор ого р еги стр переп олн ен и я необходим о, а (O C R 1 ), эти х вы воде О В, не 0. источник ф ронт TCNT1L. дости гн ув в К огд а р еги стр а записи - на +5 = источник P D 5 ). с TCNT1H н еобходим о, 110 что состоит 65535, р еги стр а увели чи тся устанавливается При для вы вод 6 -7 В ы бираем ниспадаю щ ий +5 ШИМ (IC R 1 ) совпадения Зн ачен и е зап и сы вали сь TCNT1 потом - разряды 3 = 0 . перей дет р еги стр ов : T IF R . вначале - двух отклю чен, зап р ещ ен а р еги стр 0 -2 . с из р еги стр захвата поэтом у 1 6 -р а зр я д н ы й , восьм и разрядн ы х такж е озн ачает, // // вы ходе р еги стр и м пульсов // // на и сп ользуем разряд // - не и сп ользуем // м аксим альное данны е совп аден и я мы состоит TCCR1B // // // и // // // 1 6 -р а зр я д н ы й , TC C R1A и н и ц и али зац и я TCNT1 1 - потом вначале - чтобы в TCNT1L. счи ты вался TCNT1H . // С тарш ий // TCNT1 байт 1 6 -р а зр я д н о го р еги стр а // М ладш ий // TCNT1 байт 1 6 -р а зр я д н о го р еги стр а // Б есконечны й цикл { if { if { } } (T C N T 1 L = = 0 x 0 0 PORTD = 0 x 7 F ; } && T C N T1H = = (T C N T 1 L = = 0 x 0 0 PORTD = 0 x 0 0 ; } && T C N T1H //на //на все == все 0x00) вы воды 0x80) вы воды // Е сли порта // TCNT1=0, D Е сли порта D подаем то +5 В TCNT1=32768, подаем 0 В 40 Глава 3 D1 LED-RED D2 X LED-RED - L D3 C2 - L 1HF I C1 1»F Ф LED-R.ED X1 D4 □ LED-RED D5 U1 5 4 LED-RED _L1 XTAL1 XTAL2 RESET 2- РDCVRXD 3* D6 LED-RED D7 _§L 73 8" 9" 11" PDirTXD PD2IKTO PD^IMTI PD+TTD PDS.T1 PDffCP ■2 PBQ'AIHQ 1 3 PВ1/AIM1 ■1 PB2 W 1 S PBi'OCI 16 PBi 7 PB5 1 2 PB6 ■1 1 PB7 9 LED-RED Рис. 3.7. Схема тестирования работы таймера 1 Тайм ер/счетчик 1 в реж им е счета и м п у л ь с о в на в н еш н ем в ы в о д е Т1 К выводу PD5 микроконтроллера подключена кнопка SW0. Счет­ ный регистр TC N T 1 таймера/счетчика 1 увеличивается на единицу при каждом спаде фронта напряжения на выводе PD5, т.е. при нажатии на кнопку SW0. 41 Таймеры/счетчики АТ90Б2313 В программе проверяются два условия: • если счетный регистр Т С К Л содержит 5, то на все выводы порта В подается О В; • если счетный регистр ТСТЧТ1 содержит 10, то на все выводы порта В подается +5 В, а счетный регистр обнуляется. С хем а Тестовая схема для данного примера показана на рис. 3.8. Из-за дре­ безга контактов кнопки 8\¥0 значение счетного регистра Т С Ш Т будет увеличиваться не на единицу, а каждый раз — по-разному. Схема будет работать верно только в имитационной среде, где отсутствует дребезг контактов кнопки. 01 1 I » " 1ЩI • С2 С1 1011 Х1 -!□ ш XT.ft.UZ Р.БЭ ЕТ РВСТАШП Р В1/А1И1 Р ВЭ О С 1 Г и и П_Л.и Р 0 1ГО<0 □и птччитп Г XI 1Я 1и В; 11« вое РПС «1 2 ] 13 ■ 1+ '■ л* 16 18 ■ 17 13 19 Р 0 *ЛП Р0ЙТ1 РОвСР Рис. 3.8. Схема для подсчета импульсов на выводе Т1 42 Глава 3 Программа Программа, реализующая работу схемы, показанной на рис. 3.8, представлена в листинге 3.4. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T 9 0 S 2 3 1 3 \ 3 . 04 - Т а й м е р 1 в р е ­ * ж име с ч е т а и м п ульсов на вы воде Т1 . Листинг 3.4. Программа соипЬег1. с #1пс1ис1е < a v r / i o . h > in t / / З а голо в оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого в п одклю чает оп ределен и я устройства, п роекте m a in (v o id ) { DDRB = O x F F ; //0Ы 11Х1111 // PORTB = O x F F ; DDRD PORTD |= ~ (1 « 5 ) ; 1= 1 « 5 ; // Н астройка // Р еги стр / / и з двух // 0Ы 1111111 - // Устанавливаем // Записы ваем // направления // PD5 // З ап и сь // к 1 0 в вы воду вы воды всех вы водах уровень в л о г. разряд п ередачи как 5 1 5 р еги стр а подклю чено п од тя ги в а ю щ ее сопротивление. л о г. будет // н ем // подан до тех пор, уровень (+ 5 т .е . Реж им // п оскольку PORTD , - на совпадения работа 16 TC C R1A мы // Уровень н его не не разрядн ы й , и на вы ходе отклю чен , исп ользуем О СИ 1. состоит TCCR1B К ром е р еги стр того, зап р ещ ен а ШИМ. // О ЬО О О О О Н О . Р еги стр захвата ХСН1 и сп ользуем , поэтом у разряды 6 -7 // Р еги стр совпадения // поэтом у разряд им п ульсов пом ощ ью 110, // им п ульсов будет // (п е р е х о д си гн ала не 0 -2 . +5 к вы бираем содерж ат счетны х ниспадаю щ ий с 0. счетн ы х ТСЯТ Они источником не = и сп ользуем , И сточник р еги стр а разрядов значит 0CR1 3 = 0 . для // а на будет // с т .е . 0. л о г. совпадения // // вы вод присутствовать пока TCCR1 р еги стр ов : // // В В) 1 тайм ером 8 -р а зр я д н ы х В) порта внутреннее // (+ 5 (Р В 0 - Р В 7 ) р еги стр а данны х, // 1 В вход разряд PD 5 порта вы ходы на работает тай м ера/счетчи ка TCCR1B = 0 x06; все как уп равлен и я TCC R1A = 0 x 0 0 ; - оп ределяем 0 В) ф ронт на вы воде 43 Таймеры/счетчики AT90S2313 Листинг 3.4. Окончание // Т1 (в AT90S2313 // п ер ех о д е // О В w h i l e (1 ) // - си гн ала содерж и м ое Б есконечны й P D 5 ), на т .е . вы воде TCNT1 при PD 5 увели чи тся с +5 на В на 1. цикл { if (T C N T 1 L == ОхОА && T C N T1H = = 0x00) // Е сли TCNT1 = 10 то { PORTB = O x F F ; TC N T1H = 0 x 0 0 ; TCNT1L = 0 x 0 0 ; // На / / В все вы воды счетн ы й порта р еги стр В подаем зап и сы ваем +5 В 0 } if { (T C N T 1 L = = PORTB=OxOO; 0x05 } && T C N T1H = = / / Н а все 0x00) // вы воды Е сли порта TCNT1 В = подаем 5, 0 то В } } Р е г и с т р з а х в а т а IC R 1 т а й м е р а / с ч е т ч и к а 1 Регистр захвата ICR1 используется для хранения значения счетного регистра TC N T1 . Аппаратное копирование в этот регистр происходит при поступлении сигнала на вывод IC P (PD 6 в AT90S2313). Для настройки таймера/счетчика 1 на перенос содержимого счетно­ го регистра в ICR1 по ни спадающему фронту на выводе IC P (P D 6 ) сл у ­ жит регистр управления TCCR1 (см. листинг 3.5). Другими словами, при переходе состояния вывода ICP из +5 В в 0 В будет выполнено ап­ паратное копирование содержимого регистра TC N T1 в регистр ICR1. Для предварительного делителя, связанного с регистром T C N T 1 , мы за­ дадим коэффициент 1 024. Это значит, что значение T C N T 1 будет уве­ личиваться на единицу через каждые 1 024 / 4 000 000 (4 М Г ц ) = = 0,000256 с. С хем а Тестовая схема для данного примера показана на рис. 3.9. К выводу IC P (PD 6 в AT90S2313) подключена кнопка. При ее нажатии на выводе PD6 напряжение падает с +5 В до 0 В (ниспадающий фронт сигнала), в результате чего значение TC N T1 копируется в регистр захвата ICR1. К порту В подключены восемь светодиодов, из которых семь (D 2 D8) служат для индикации состояния регистра захвата IC R1, а светоди­ од D1 — для индикации перехода счетного регистра TC N T1 через зна­ чение 32 768. 44 Глава 3 П р огр ам м а В бесконечном цикле проверяется семь условий, на основании ко­ торых определяется включение светодиодов на выводах РВ 1-РВ 7. Это показывает, в каком диапазоне находится значение регистра IC R 1 : • если ICR1 > 10 ООО, то на выводе РВ1 — +5 В, в противном слу ­ чае — 0 В; • если ICR1 > 15 ООО, то на выводе РВ2 — +5 В, в противном слу ­ чае — 0 В; • если ICR1 > 20 ООО, то на выводе РВЗ — +5 В, в противном слу ­ чае — 0 В; 45 Таймеры/счетчики AT90S2313 • если ICR1 чае — 0 В; • если ICR1 чае — 0 В; • если ICR1 чае — 0 В; • если ICR1 чае — 0 В. > 30 ООО, то на выводе РВ4 — +5 В, в противном с л у ­ > 40 ООО, то на выводе РВ5 — +5 В, в противном с л у ­ > 50 ООО, то на выводе РВ6 — +5 В, в противном с л у ­ > 60 ООО, то на выводе РВ7 — +5 В, в противном с л у ­ Еще одно условие проверяется для индикации диапазона счетного регистра TC N T1. Если TC N T1 > 32 768, то на выводе РВО установится лог. 1, в противном случае —- лог. 0. Светодиод D1 будет включаться и отключаться через каждые 1 024 х 32 768 = 33 554 432 циклов микро­ контроллера, что составляет 33 554 432 / 4 000 000 = 8,388608 сек. Программа, реализующая работу схемы, показанной на рис. 3.9, представлена в листинге 3.5. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T 9 0 S 2 3 1 3 \ 3 .0 5 Р еги стр Л захвата IC R 1 тайм ера 1. Листинг 3.5. Программа t i m e r _ c o u n t e r l _ a n d _ I C R l . c # in c lu d e in t < a v r /io .h > // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого в подклю чает определения устройства, п роекте m a in (v o id ) { DDRB = O xFF; //0Ы 1111111 // PORTB = O xFF; // Н астройка // Р еги стр // 8 -р а зр я д н ы х TCCR1A = TCCR1B = работаю т 0Ы 1111111 устанавливаем TCCR1 р еги стр ов: ОЬОООООООО // отклю чен, р еги стр работа 0Ы 0000101 IC R 1 . // реж им т .е . всех вы водах уровень и (Р В 0 -Р В 7 ) л о г. порта 1 (+ 5 В В) - состоит из двух TCCR1B реж им совпадения п оскольку O CR1. // // В К ром е мы не того, на вы ходе и сп ользуем зап р ещ ен а ШИМ. // IC P на 1 6 -р а зр я д н ы й , // // - TC C R1A // порта 1 - // вы воды вы ходы // тай м ера/счетчи ка 0x85; все // управления 0x00; как - Разряд и сп ользуем 7 = п одавлен и я (P D 6 по в 1, а р еги стр зн ачи т в ход н ого AT90S2 313) ) . ниспадаю щ ем у захвата вклю чен ш ум а на Разряд ф ронту вы воде 6 си гн ала = 0, 46 Глава 3 Листинг 3.5. Окончание // (п е р е х о д у // // (з н а ч е н и е Н астройка // задали D D RD &= PO R TD |= // совпадению нам // и сп ользуем р еги стр // поэтом у разряд // счетны х и м п ульсов // с п ом ощ ью не для // увеличиваться // 1 0 2 4 / 4 0 0 0 0 0 0 (4 М Г ц ) (P D 6 ) IC P в зн ачение на источник TCNT Мы зап и сы ваем счетны х TCNT1 Д р уги м и будет каж ды е 0 ,0 0 0 2 5 6 обязательн а, не OCR1, В ы бираем М К/1024. = по р еги стр а ед и н и ц у даж е с. если мы TCCR1 // Разряд 6 р еги стр а // данны х = разряду счетчика 0 -2 . частота на п оскольку и сточн и к словам и , О В) захват совпадения 3 = 0 . т .е . - к перепиш ется нуж на, // захвата TCNT1 разрядов 101, них +5 О чистка и м п ульсов / / К w h ile (1 ) IC R 1 ). // вы вода (1 < < б ); р еги стр а р еги стр с вы полнен в парам етры ~ (1 < < б ); будет // / / в // напряж ения PD 6 вы воде 0, порта // п од тяги в а ю щ и й // Б есконечны й н ап равления PD6 т .е . D работает подклю чен р ези стор (н а п ередачи как вход. вн утренний вы воде +5 В) цикл { // if if if if if if if if И ндикации (IC R 1 в котором находится // PORTB |= ( 1 « 1 ); e l s e PORTB & = ~ ( 1 < < 1 ) ; ( IC R 1 > 0 x 3 А 9 8 ) PORTB 1= e l s e PORTB &= - ( 1 « 2) / ( IC R 1 > 0 x 4 E 2 O ) PORTB e l s e PORTB &= ~ ( 1 « 3) ! ( IC R 1 > 0 x 7 5 3 0 ) PORTB 1= e l s e PORTB &= - ( 1 « 4) 7 ( IC R 1 > 0 x 9 C4 0 ) PORTB 1= e l s e PORTB &= - ( 1 « 5) 7 ( IC R 1 > 0 x C 3 5 0 ) PORTB 1= e l s e PORTB &= - ( 1 « 6) // на // иначе ( IC R 1 > ОхЕАбО) PORTB i = e ls e PO R TB &= ~ ( 1 « 7 ); (T C N T 1 e ls e } ди ап азон а, 0x2710) PO RTB } > |= >= (1 PO RTB подаем (i << 3) ; // 20000 (i << 4) ; // 30000 (i << 5) ; // 40000 (i << 6) ; // 50000 (i << 7) ; // 60000 на счетн ы й вы вод // в РВ0 IC R 1 то +5 В, В 15000 Е сли 0 ); РВ1 0 // // << - 10000, 2) ; // - (1 вы вод зн ачен и е = << 0 ); &= IC R 1 (i 0x8000) « Е сли 32768, т о В, с л у ч а е - 0 В. р еги стр подаем противном ^ +5 47 Таймеры/счетчики AT90S2313 Р еги стр со в п а д ен и я OCR1 тайм ера/счетчика 1 Вывод ОС1 (РВ З) аппаратно привязан к блоку совпадения и изме­ няет свое состояние при равенстве T C N T и OCR1. Определяем его как выход, и подключаем к нему светодиод D0. К выводу микроконтроллера PD0 (определен как вход с нагруженным подтягивающим резистором) подключаем кнопку SW0, при нажатии на которую инициализируется и запускается таймер. Д ля индикации работы таймера/счетчика к выво­ ду РВО, определенного как выход, подключен светодиод D1. С хем а Тестовая схема для данного примера показана на рис. 3.10. П р о гр а м м а В бесконечном цикле проверяем: если напряжение на выводе РЭО упало с +5 В до 0 В, то включаем светодиод Э1 и активизируем таймер/ счетчик 1. Регистр управления таймером/счетчиком 1 (Т С С Ш ) настроен сле­ дующим образом: • при равенстве счетного регистра Т С Ш Т и регистра совпадения О С Ш вывод ОС1 (РВ З) переключается из состояния лог. 0 в со­ стояние лог. 1, и наоборот; 48 Глава 3 • коэффициент предварительного делителя равен 8, т.е. счетный ре­ гистр ТС О Т1 будет инкрементироваться каждые 8 / 4 000 000 (4 М Г ц ) = 0,000002 с. Поскольку регистру О С Ш присвоено значение 32 768), а регистр Т О Ш проинициализирован нулем, то первое совпадение (переключе­ ние состояния на выводе О С 1) произойдет через 32 768 * 0,000002 = = 0,065536 с. Последую щ ие переключения будут происходить с интер­ валом в 65 536 х 0,000002 = 0,131072 с (рис. 3.11). Рис. 3.11. Осциллограмма сигнала на выводе ОС1 Программа, реализующая работу схемы, показанной на рис. ЗЛО, представлена в листинге 3.6. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T 9 0 S 2 3 1 3 \ 3 .0 6 дения OCR1 тайм ера Р еги стр совпа­ 1. Листинг 3.6. Программа t i m e r _ c o u n t e r l a n d O C R l . c # in c lu d e in t { < a v r /io .h > m a in (v o id ) // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого в подклю чает устройства, проекте определения 49 Таймеры/счетчики AT90S2313 Листинг 3.6. Продолжение // В ы вод DDRB ОС1 - сравнение (1 < < 3 ); |= // PORTB & = // ~ (1 < < 3 ); Кнопка SW 0 - // В ы вод РВ О &= PORTB - // (к // На ~ (1 < < 0 ); - 3 и т .е . нем у вы вод п одклю чен вы вод РВЗ подаем тайм ера/счетчика вы вод // O bxxxxxxxl - на // п од тя ги в а ю щ и е работы // Разряд // = 1, // (к // На Р еги стр OCR1 непреры вно // сч етн ого 3 нем у вы вод 1 6 -р а зр я д н ы й . р еги стр а 1 PD 0 работает PD 0 передачи РВЗ вход нем сравн и ваю тся с 1 данны х работает как DDRB вы ход светодиод) подаем В как п одк лю чаем тайм ера/счетчика РВЗ вы ход сопроти влен и е подклю чен вы вод D D RB как О В вы вод р еги стр а т .е . данны х работает светодиод) - которы е w h ile (1 ) передачи РВЗ O bxxxxxxxO // 0x8000; OCR1 р еги стр а // // OCR1 = 1, индикация (1 < < 0 ); |= = зап уск DDRD & = O xFE ; PORTD |= 0 x 0 1 ; DDRB TC N T1 //Разряд 0 В хранятся текущ им данны е, зн ачен и ем TCNT1 // К огд а // п р ои зой д ет значение // TCCR1 // Б есконечны й TCNT1 дости гн ет действие, задан н ое 32768, р еги стр ом цикл { / / П о // if и наж атию кнопки ак ти ви зи р уем (- P IN D & (1 << SW 0 настраи ваем тайм ер/счетчик 1 его 0 )) // Е сли на PD 0 напряж ение О В, { PORTB |= (1 << // Н астройка // Р еги стр // двух 0 ); / / С и гн а ли зи р уем // счетчи к // в 8 -р а зр я д н ы х TCCR1A = 0 x 4 0 ; 1 X ^ 1 TCCR1B = 0x02; л о г . что тайм ер/ установкой РВО 1 . 1 6 -р а зр я д н ы й , ТССН1А // О ЬО Ю О О О О О // вы ходе. // Э то - и о будет // совп аден и и // Разряд // значит, // ОЪООООООЮ // не состоит совпадения 7=0, том , разряд что зн ачен и й а что ШИМ н е - и сп ользуем ТС№ Г1 разряд 1=0. на 6=1. вы вод переклю чаться 0=0, из TCCR1B реж им Разряд гов ор и т (Р В З ) том , 1 - р еги стр ов : // о запущ ен, состоян и е тай м ера/счетчи ка уп равлен и я 1 ОС1 при и О СЯ1. Э то и сп ользуется. р еги стр (р а з р я д захвата 7=0, 1СН 1 разряд 50 Глава 3 Листинг 3.6. Окончание // 6 = 0 ). // не Разряд будем // к огд а // 010, // им п ульсов // (з н а ч е н и е 3=0 озн ачает, обнулять ТС№ Г1=О СЯ1. т .е . // будет // каж ды е // 0,000002 Разряды источник - частота сч етн ого увели чи ваться 8/4000000 что р еги стр мы ТС№ Г1, 0 -2 = счетны х МК/ 8 р еги стр а на (4 М Г ц ) ТС№ Г1 единицу = с. } } } И сп о ль зо в а н и е тайм ера/счетчика 1 в реж и м е Ш ИМ Таймер/счетчик 1 переводят в режим широтно-импульсной модуля­ ции (Ш И М ) с помощью регистра управления Т С С Ю . В этом режиме вывод РВЗ (О С 1 ) работает следующим образом. Значение счетного ре­ гистра Т С Ш 1 изменяется циклично от 0 до “ Т О Р ” и обратно от “ Т О Р ” до 0, а затем цикл повторяется сначала. Если Т С Ш Т = О С Ю , когда зна­ чение Т С Ш 1 увеличивается, то на выводе ОС1 установится лог. 0 (0 В). Если же значение Т С Ш Т уменьшалось, то на выводе ОС1 установится лог. 1 (+5 В). “ Т О Р ” — это максимальное значение регистра Т С Ш Т . В нашем примере выберем его равным 255 (восьмиразрядная Ш И М ). Т О Р = 2 " - 1, где N — разрядность Ш И М (разряды Р\¥М11 и Р\УМ10 регистра Т С С Ю А ). Регистру сравнения О С Ю присвоим 40. Счет Т С Ш Т выполняется до 255. В таком случае, на выводе ОС1 установится 0 В, когда Т С Ш Т примет значение 41, а +5 В — когда Т С Ш 1 при обратном отсчете дой­ дет до 39. Таким образом, лог. 0 (0 В ) на выводе ОС1 будет длиться (255 — 41) + (255 — 39) = 430 отсчетов Т С Ш Т . Лог. 1 (+5 В) на выводе ОС1 будет длиться от 39 до 0 и от 0 до 41, т.е. 39 + 41 = 80 отсчетов Т С Ш 1 . Такая широтно-импульсная модуляция называется неинвертирую­ щей (рис. 3.12). Нам известно, сколько требуется времени на одно приращение Т С Ш 1 (коэффициент предварительного делителя / частота М К ): 1 024 / 4 000 000 = 0,000256 с. РВЗ (0С1)п _ 430 [вд| 430 [¡ю] 430 [ё0| 430 [Й ] 430 [зр] 430 Рис. 3.12. Неинвертирую щ ая ШИМ Положительный импульс будет длиться 80 • 0,000256 = 0,02048 с. Нулевой импульс t\ будет длиться 430 ■ 0,000256 = 0,11008 с. Период Тшим составляет 0,11008 + 0,02048 = 0,13056 с (рис. 3.13). Рис. 3.13. Период Гщим и длительность положительного и отрицательного импульса Частота Ш И М (количество периодов за одну секунду) на выводе РВЗ (О С 1), вычисляется по формуле: /шим=Лс1/(2№1- 2 ) ( Г ц ), где / / С1 — частота работы таймера/счетчика 1, выбранная с помощью разрядов С810-С812 регистра Т С С Ш В ; N — разрешающая способ­ ность, заданная с помощью разрядов Р\УМ 10 и Р\¥М 11 регистра Т С С Ю А ; (2№'1- 2) — количество отсчетов Т О Ч И за один период. 52 Глава 3 /шим= (4 ООО ООО / 1 024) / (2М+1 - 2) = 3 906,25 /510= 7,6593 (Гц). Другими словами, за одну секунду на выводе РВЗ сигнал меняется с 0 В на +5 В почти восемь раз. Частоту можно вычислить и по-другому. Поскольку частота F = 1 с / период, частота Ш И М будет равна 1 / 0,13056 = -7,6593 Гц (рис. 3.14). Р и с . 3 .1 4 . Ч а с т о т а ^ и м Н а с т р о й к а Ш ИМ Для настройки Ш И М необходимо установить: • р а з р я д н о с т ь Ш И М (разряды Р\УМ11 и РШ М Ю регистра управле­ ния Т С С Ш А ): о 8 бит — счет в цикле от 0 до 255 и обратно; о 9 бит — счет в цикле от 0 до 511 и обратно; о 10 бит — счет в цикле от 0 до 1023 и обратно; • р е ж и м с о в п а д е н и я , т.е. состояние на выводе РВЗ (О С 1 ) в случае совпадения О С Ш с ТСЫТ1 (устанавливается с помощью разрядов С О М 1А1 и СОМ1АО регистра Т С С Ш А — табл. 3.1); • з н а ч е н и е р е г и с т р а с о в п а д е н и я О С Ю , поскольку вывод Ш И М (РВЗ/ О С 1) напрямую зависит от О С Ш (когда ТС1МТ1 = О С Ш , про- 53 Таймеры/счетчики AT90S2313 изойдет действие, заданное разрядами СО М 1А1 и СОМ 1АО регист­ ра Т С С Ш А — см. табл. 3.1). Таблица 3.1. Разряды СОМ1А1 и СОМ1АО регистра управления TCCR1A СОМ1А1 0 0 1 СОМ1АО 0 1 0 1 1 • Вывод ОС1 Не подключен Не подключен 0 В при совпадении ОСР?1 и ТСЫТ1, если счет шел на увеличение, и +5 В, если счет шел на уменьшение +5 В при совпадении ОСК1 и ТСЫТ1, если счет шел на увеличение, и 0 В, если счет шел на уменьшение и с т о ч н и к т а к т и р о в а н и я T C N T 1 — разряды 0-2 регистра управле­ ния TCCR1B. Расчеты и ф о р м улы П е р и о д ГШим — это длительность одного полож ительного плю с одного нулевого импульса на выводе РВЗ (О С 1). Говоря иначе, Гшим — это отрезок времени между фронтами двух соседних импульсов. Т — -* Ш И М - Т /о(^+1 ) t/cl I / — ¿h где TVci — время, за которое значение T C N T 1 увеличивается на едини­ цу; N — разрядность Ш И М . Ч а с т о т а /(/сх определяет значение счетного регистра TC N T1 через одну секунду и вычисляет по формуле: ftic\ = F m k / к, где Fmk — частота работы микроконтроллера (4 ООО ООО Гц), а к — ко­ эффициент делителя (в нашем случае — 1 024). Таким образом, за одну секунду значение TC N T1 увеличится на 4 ООО ООО /1 024 = 3 906,25. Если делитель не используется, то TC N T 1 за одну секунду увели­ чится на значение частоты микроконтроллера. Вычислим в р е м я за которое T C N T 1 увеличивается на едини­ цу. Поскольку частота F = l /Т, время Тм = 1 / ß d = 1 с / 3 906,25 = = 0,000256 с. Другими словами, значение TC N T1 увеличивается на еди­ ницу за 0,000256 с. Значение Тцс\ можно рассчитать и по-другому. Длительность одного такта микроконтроллера равна 1 с / F Mk , = 1 с/ 4 000 000 = 0,00000025 с. П оскольку мы используем деление на 1 024, значение TC N T1 увеличит­ ся на единицу через 1 024 такта, т.е. через 1 024 • 0,00000025 с = = 0,000256 с. 54 Глава 3 Еще одна формула расчета: Тмс = к / Г Мк = 1 024 / 4 ООО ООО = 0,000256 с. Если предварительный делитель не используется, к = 1. Количество отсчетов ТСЫТ1 в одном периоде составляет 2(Л~1) - 2, где N — разрядность Ш И М . Если ТУ = 8, то 2 1- 2 = 510. В таком слу ­ чае, длительность одного периода Ш И М Тшим = 0,000256 ■ 510 = 0,13056 с. Д л и т е л ь н о с т ь п о л о ж и т е л ь н о г о и м п у л ь с а 4 н а в ы в о д е Р В З: ^ * Г/с1, где «ь — количество отсчетов Т О Г Л в положительном импульсе при неинвертирующей Ш И М (О С Ш ■ 2 = 40 • 2 = 80). В таком случае, дли­ тельность полож ительного импульса = 80 • Тм = 80 • 0,000256 с = = 0,02048 с. Д л и т е л ь н о с т ь н у л е в о г о и м п у л ь с а и н а в ы в о д е РВЗ: ¿1= П\ ■ Тх! с Ь где п\ — количество отсчетов Т С ^ Т 1 в нулевом импульсе при неинвертируюшей Ш И М : щ = 2(ЛГ+1) - 2 - ОСЯ1 -2 = 5 1 0 - 8 0 = 430. В таком случае, длительность нулевого импульса А = 430 • 0,000256 = 0,11008 с. К о э ф ф и ц и е н т з а п о л н е н и я — это отношение длительности поло­ жительного импульса к длительности одного периода: g = h l Тшим где 4 — длительность положительного импульса; Г Шим — длительность одного периода. В таком случае, g = 0,02048 / 0,13056 = 0,156862. Поскольку /ь — 2 • О С Ю , коэффициентом заполнения можно управлять с помощью регистра сравнения. Коэффициент заполнения тем выше, чем больш е длительность положительного импульса. С к в а ж н о с т ь — это отношение одного периода к длительности по­ лож ительного импульса: 5 = ГШим / ¿ь = 0,13056 / 0,02048 = 6,375. Скважность выше при меньшей длительности полож ительного им­ пульса. 55 Таймеры/счетчики AT90S2313 С хем а Тестовая схема для исследования Ш И М показана на рис. 3.15. С2 С1 iqiF | iDpf X1 Hob U1 XTAL1 XTALZ RESET 2‘ PDCVRXO _3i PDIiTXD 6 PDZ/IHTU 7 PD3TINT1 S PEmTD В Р0ЙТ1 11 PDSfCP 00001 PBQ’AIND PВ1/AIN1 PB2 PВЭКЮ1 PBi PBS PBS PB7 42 13 ‘U ■15 ■16 "17 13 1B Р и с . 3 .1 5 . С х е м а д л я и с с л е д о в а н и я Ш И М П р о гр а м м а Программа, реализующая работу схемы, показанной на рис. 3.15, представлена в листинге 3.7. Л Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T 9 0 S 2 3 1 3 \ 3 .0 7 - шим. Листинг 3.7. Программа ъ_с1_апс! Рим. с # а .п с 1 и с 1 е in t { < a v r / io .h > m a in (v o id ) // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого в п одклю чает устройства, проекте определения 56 Глава 3 Л и с т и н г 3 .7 . О к о н ч а н и е DDRB |= (X << 3 ); // Разряд // = Р еги стр OCRX // которы е непреры вно // сч етн ого = - р еги стр а 0x0028; // Н астройка // Р еги стр // 8 -р а з р я д н ы х С О М Х АХ (р а з р я д 7) // устанавливается // зн ачен и е // ум ен ьш ается, // устанавливается TCNTX PW M X0 // ШИМ (р а з р я д // 2 55 и обратно. TC CRXA = 0x81; Э то Разряд 7 = 0 , Разряд 3 = 0 - // не р еги стр а // 4000000 л о г. при хранятся текущ им X DDRB вы ход данны е, зн ачен и ем (T C N T X ) при X вы воде 6) совп аден и и Е сли PW M 1X из двух TCNTX 0 — установка (P B 3 ) TCNTX же (р а з р я д счет = ОС1 и OCRXA, зн ачение и OCRX (н е и н в е р т и р у ю щ а я что состоит TCCRXB (р а з р я д На совп аден и и = 0 , разряд - 6 р еги стр (в М Гц) 0 X) когда TCNTX на вы воде OCX Ш И М ). = X — разрядность происходит = при источника TCNTX будет — реги стр ШИМ э т о т Значение отсчетов TCNTX = TCNTX реж им е вы бор TCNTX. (4 и СОМХАО ШИМ. 0 ло г. 0) обнуляется // с данны х как в цикле от 0 до //О ЬХО О О О О О Х // 3 9 0 6 ,2 5 X, для зн ачи т, // // н ем Х6 -р а з р я д н ы й , - TCCRXA увеличивается. то // 0 -2 TCCRX = совпадения Разряды В п ередачи работает 40 р еги стр ов : реж им а р еги стр а PB 3 тай м ера/счетчикаХ // // р еги стр а тай м ера/счетчи ка // // // 3 вы вод ср авн и ваю тся управления (8) . - Х6 - р а з р я д н ы й . // OCRXA X О ЬХ О Х за X с, разряд счетн ы х - TC C R X B =0x05; //О ЬО О О О О ХО Х w h i l e (X ) // не т .е . не 1 и OCRX и с п о л ь з у ю т ). МК значение на и сп ользуем . TCNTX им п ульсов частота увели чи ваться 0 ,0 0 0 2 5 6 IC R X совпадении / для Х024 = сч етн ого каж ды е Х024 / с. Б есконечны й цикл { } } И зм ен ен и е коэф ф и ц иента зап олн ен и я в реж им е Ш ИМ Данный пример аналогичен предыдущему за тем исключением, что к микроконтроллеру подключены две кнопки: SW 0 — для увеличения, и SW1 — для уменьшения коэффициента заполнения g сигнала Ш И М . Кроме того, мы используем разрядность Ш И М не 8, а 10. Таймеры/счетчики AT90S2313 57 Количество отсчетов регистра TC N T 1 для положительного и н уле­ вого импульсов при значении регистра совпадения O C R 1 A = 511 пока­ заны на рис. 3.16. ТОРИ 023 обш^ее количество отсчетов TCNT1 Рис. 3.16. Количество отсчетов ТСМТ1 для положительного и нулевого импульса Длительность полож ительного импульса: ?ь = ии ’ Тх!С1= (ОСЮ •2) •(к ! Гмк)= (511 • 2) • (1 / 4 ООО ООО) = 0,0002555 с. 58 Глава 3 Такова исходная длительность импульсов после подачи питания, когда еще не были нажаты кнопки увеличения или уменьшения значе­ ния регистра О С Ю (рис. 3.17). Рис. 3.17. Исходны е длительности импульсов Длительность нулевого импульса: к = и, • 7*, = ((2"+1- 2) - (О С Ю •2)) •(1 / Гмк) = ((2 1<Н1 - 2) - (511 - 2 ) ) - ( 1 / 4 ООО 0 0 0 )= 1 024 • 0,00000025 = 0,000256 с. Период Гщим = 0,000256 + 0,0002555 = 0,0005115 с. Частота /щим = 1 / 0,0005115 ~ 1955 Гц, т.е. за одну секунду на вы­ воде РВЗ сигнал меняется с 0 В на +5 В 1955 раз. С хем а Тестовая схема для данного примера показана на рис. 3.18. При на­ жатии на кнопку 8'\¥0 увеличивается длительность положительного им­ пульса и уменьшается длительность нулевого импульса, а при нажатии на кнопку 8\\Ч, наоборот, уменьшается длительность положительного импульса и увеличивается длительность нулевого. П р огр ам м а Программа, реализующая работу схемы, показанной на рис. 3.18, представлена в листинге 3.8. 59 Таймеры/счетчики AT90S2313 Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\3 . 08 - Изменение ко­ С эффициента заполнения в режиме ШИМ. Рис. 3.18. Схема ШИМ с кнопками для изменения коэф ф ициента заполнения Л и с т и н г 3 .8 . П р о г р а м м а t t tin c lu d e < a v r / io .h > # in c lu d e in t c l and P W M .c // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого < u til/ d e la y .h > // Д ля в п одклю чает определения устройства, п роекте доступа к ф ункциям задерж ки m a in (v o id ) { DDRBI = (1 < < 3 ) ; // Р еги стр // Разряду // присвоили OCR1A - // н епреры вно // тайм ера/счетчика OCR1A = // Н астройка // Р еги стр // двух 1 // 1, т .е . с текущ им п ередачи РВ З - данны х DDRB вы ход хранит данны е, которы е значением (T C N T 1 ) 511 тай м ера/счетчи ка уп равлен ия 8 -р а зр я д н ы х р еги стр а 1 6 -р а зр я д н ы й , сравн и ваю тся O x O lF F ; 3 1 тайм ером /счетчиком р еги стр ов : TCCR1A и TCCR1 TCCR1B состоит из 60 Глава 3 Л и с т и н г 3 .8 . О к о н ч а н и е // СОМ 1А1 // реж им а (р а з р я д 7) // устанавливается // когда // при // устан авли вается // РШ 10 // 1 0 -р а зр я д н у ю // значение // от ТСЫ Т1 0 (р а з р я д до = // 1С Ы С 1 захвата Разряд // не л о г . л о г. 1 = 1023 и 1, 7) не (1 0 2 4 3 = 0 - // м и крокон троллера // 0 ,0 0 0 0 0 0 2 5 // увели чи ваться 0 -2 - вы бор ТС№ Г1. с 4 то Ш И М ). О п ределяем 1 0 2 3 ), т .е . в цикле = 0 и зм ен яться 0. на при 6) - р еги стр совп аден и и ШИМ э т о т М Гц, счетн ы х 0Ы 01 т .е . разряд ТС№ Г1 и м п ульсов 1 / р еги стр а и ОС1^1 и с п о л ь з у ю т ). соответствует каж ды е сч етн ого не для частота 4000000 ТСЫ Т1 = будет еди н и ц у. / / 0Ь 0 0 0 0 0 0 0 1 О пределяем РБ О кнопки и зм ен ен и я и Р01 ~ (1 « 0) & ~ (1 (1 « 0) | (1 И зм ен ен и е & до источника зн ачение 0x 0 1 ; (- P IN D будет ОСШ А, (Р В З ) = 1 . до (р а з р я д ТСЫ Т1 З начениею // // 1023 0 и ум еньш ается, ОС1 1) от ТС№ Г1 1СЕ31 реж им е // i f от р еги стр Разряды |= отсчетов р еги стр а = 0 , (в р еги стр а &= (р а з р я д установка и сп ользуем . // РОЮ ТЭ вы воде - (Р В З ) ТС№ П ТСЫ Т1 (н е и н в е р т и р у ю щ а я РШ 11 обратно // ВОЮЭ на же 0 ОС1 //О Ы О О О О О Н М Я для = вы вод совпадении Е сли ОСЯ1 6) (р а з р я д Теперь О при и сч етн ого обнуляется тсаи в = ШИМ. ТСЫ Т1 ШИМ (р а з р я д // в 0) 0x83; // СО М 1АО ддя увеличивается. совп аден и и ТССШ А = 1 , совпадения как « << 1) ; 1 ); коэф ф и ц и ен та (1 << входы . К эти м коэф ф и ц и ен та 0 )) вы водам зап олн ен и я и // РВО // П одклю чаем к // внутренние н агр узочн ы е // сопротивления зап олн ен и я на РП1 при // Е сли вы воде // У вели чи ваем - подклю чены ШИМ входы РБ О наж атии PD 0 0 и на РБ1 кнопки В { OCR1 = OCR1 + 1 ; _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ) ; } i f (- P IN D & (1 << 1 )) зн ачен и е // З адерж ка // н аж атием // Е сли // Ум еньш аем на вы воде 0CR1 перед на 1 следую щ и м кнопки РБ1 +5 В { OCR1 = OCR1 - 1; _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); } } } зн ачение 0CR1 // З адерж ка перед // наж атием кнопки на 1 следую щ и м Таймеры/счетчики АТ9052313 61 Ц А П с п р и м е н е н и е м Ш ИМ На рис. 3.19 показана схема для опроса напряжения на выходе п о­ сле фильтра низкой частоты (Ф Н Ч ). Оно увеличивается или уменьшает­ ся в зависимости от нажатия кнопок 8\¥0 и 8\¥1. Рис. 3.19. Схема с ФНЧ 62 Глава 3 Среднее напряжение С/ау, которое получается, если напряжение на выводе РВЗ пропустить через Ф Н Ч : и лу = ( 4 4 £Л+ ¿г Ц ) / ?шим, где 4 — длительность полож ительного сигнала; [4 — напряжение по­ ложительного сигнала; и — длительность нулевого сигнала; 11\ — на­ пряжение нулевого сигнала; Гщим — период Ш ИМ-сигнала. и т = (0,0002555 • 5 + 0,000256 • 0) / 0,0005115 ~ 2, 5 В. Еще один вариант включения — с полевым транзистором с индуци­ рованным каналом (рис. 3.20). С торож евой тайм ер Сторожевой таймер (watchdog timer) оснащен собственным генера­ тором, работающим на частоте 1 М Г ц (если питание микроконтроллера в точности равно 5 В), и предварительным делителем. Он служит для защиты от сбоев ( “ зависания” ). С помощью сторожевого таймера можно прервать зацикливание программы путем сброса микроконтроллера. П о прошествии времени, заданного регистром сторожевого таймера (тайм-аута), микроконтрол­ лер перезапускается, т.е. программа начинает выполняться с самого на­ чала. Для того чтобы этого не произошло при нормальном выполнении Таймеры/счетчики АТ9082313 63 программы, сторожевой таймер до наступления тайм-аута необходимо обнулять командой адс1г. С хем а Схема для исследования работы сторожевого таймера представлена на рис. 3.21. Д ля того чтобы увидеть перезагрузку микроконтроллера, в начале программы на выводе РВЗ устанавливается О В (это произойдет и в том случае, если сторожевой таймер сбросит микроконтроллер). В бесконечном цикле выполняется проверка выводов Р 0 0 - Р 0 2 на наличие низкого уровня сигнала (к этим выводам подключены кнопки). Когда на РОО появится О В, сторожевой таймер отключится. Когда на РЭ1 появится О В, на светодиод, подключенный к РВЗ, будет подано напряжение +5 В. Сторожевой таймер включится с тайм-аутом 2 048 мс и начнет отсчитывать время до перезагрузки микроконтроллера. Если после включения сторожевого таймера, до того как он отсчи­ тает 2 048 мс, не нажать кнопку, подключенную к выводу РБ 2 (сброс таймера), то программа начнет выполняться с начала (произойдет пере- 64 Глава 3 загрузка микроконтроллера). Это можно будет увидеть по погасшему светодиоду Б 1. На рис. 3.22 видно, что после нажатия кнопки Р01 (светодиод В1 включился) прошло время тайм-аута (светодиод Б1 включен), а затем произошел сброс микроконтроллера (светодиод отключился). Рис. 3.22. Осциллограм ма напряжения на светодиоде D1 Д ля того чтобы микроконтроллер не перезагружался при нормаль­ ной работе программы, каждый раз до наступления сброса необходимо обнулять сторожевой таймер командой w dr. П р огр ам м а Программа, реализующая работу схемы, показанной на рис. 3.21, представлена в листинге 3.9. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\3.09 - Сторожевой таймер. Л и с т и н г 3 .9 . П р о г р а м м а w a t c h d o g t i m e r . с # in c lu d e # in c lu d e < a v r / io .h > // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого c u til/ d e la y .h > // Д ля в подклю чает определения устройства, проекте доступа к ф ункциям задерж ки 65 Таймеры/счетчики AT90S2313 Л и с т и н г 3 .9 . О к о н ч а н и е in t m a in (v o id ) { DDRB I= (1 << 3 ); PORTB &= - ( 1 << 3 ) ; DDRD & = 0 x F 8 ; PO R TD 1= 0x07; w h ile ( 1) // Разряд // БЭНВ 3 р еги стр а // работает // П одаем // О ЬхххххО О О // работаю т // О Ь хххххШ - // подклю чен ы п од тяги в аю щ и е // соп роти влен и я // Б ескон ечн ы й равен 1, как на передачи т .е . вы вод данны х РВ З вы ход РВЗ - напряж ение вы воды как 0 В Р Э 0 -Р О 2 входы к вы водам Р Б 0 -Р Б 2 цикл { // i f О тклю чаем (- P IN D & сторож евой (1 << тайм ер, 0 )) // Е сли если на н аж ата вы воде кнопка PD 0 0 В, SW 0 то { // О дноврем енно зап и сы ваем // 3 даст // тайм ера. П еред // записать единицу // четы рех (W D E ). Э то тактов W DTCR |= (1 W DTCR &= ~ (1 « его в | разряды 4 отклю чение (W D T O E ) необходи м о преж де 4, в << 3 и а затем стор ож евой и стор ож ев ого отклю чен и ем (1 3 ); в на разряды отклю чить 4) << единицу разреш ен и е течение тайм ер. 3) ; // О тклю чаем сторож евой // записав в 0 разряд тайм ер, WDE } // i f В клю чаем (- P IN D & сторож евой тайм ер, если (1 // на << 1 )) Е сли наж ата вы воде кнопка PD 1 0 SW1 В, то { // Разреш аем // п ер езап усти т работу // т а й м -а у та , // п рои зой д ет, // обнулять стор ож ев ого если если мы не |= 0x0F; PO RTB |= (1 << 3 ); по отклю чим каж ды й сторож евой W DTCR тайм ера. м икроконтроллер раз тайм ер / / Н а тайм ер. перед он врем ени Э того такж е заверш ен и ем ком андой вы вод З атем прош ествии РВЗ w d r. подали +5 В } // И м итируем // сторож евой i f (- P IN D & норм альн ую (1 тайм ер << 2 )) работу ком андой п р огр ам м ы , wdr // Е сли // С брос // вы воде (т .е . наж ата сбрасы вая т а й м -а у т кнопка = 0 с) SW2 { a s m C 'w d r " ) ; } стор ож евой РВЗ будет тайм ера. 0 В не врем ени На Глава 4 П а м я ть Е Е Р Е Ю М А Т9082313 В этой главе мы рассмотрим методы работы с памятью Е Е РЯ О М микроконтроллера АТ9082313 и соответствующие программы на С. Запись/чтение од н ого байта Рассмотренная ниже программа записывает в энергонезависимую память ЕЕРШ ЭМ по адресу 0 x 0 0 байт данных 0x03 (рис. 4.1). 0x00 000000 000016 00002С 000042 000058 00006Е 03 гг гг гг гг ГГ ГГ гг гг гг гг ГГ гг гг гг гг гг ГГ гг гг гг гг гг ГГ гг гг гг гг гг ГГ гг гг гг гг гг ГГ гг гг гг гг гг РТ гг гг гг гг гг ГГ гг гг гг гг гг 1Т гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг гг .яяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяя Рис. 4.1. Содержим ое памяти ЕЕРРОМ после записи в нее байта данны х Затем она считывает этот же байт по адресу 0 x 0 0 и выводит его в порт В, к выводам которого для индикации подключены светодиоды (рис. 4.2). В нашем случае включатся два светодиода: 0 0 и 01. •I 0 7 i ¥ г± LE0-R.EC> I Ж > : 1ЕС-ИЕ0 I Ж 1 )5 |.Е0-ЯЕ1> Т "[ >СЗ А I ' |.Е0-КЕ» Ж0 2 , 1.Е0-АЕ0 РРвСР М В ГТ 1 Р й «Э Т ТГ З Р О П Рйаи-гП о Р»1ЛХ» роаяхо X □ Х1 4Ш х Рис. 4.2. Считанный байт данных выведен в порт В 67 Память EEPROM AT90S2313 Другими словами, мы получили индикацию двоичного числа ОЬООООООН, что соответствует десятичному 3. В программе, представленной в листинге 4.1, для записи и чтения энергозависимой памяти используются две собственных функции: • e e p r o m _ w r _ b y te (А дрес_п ам ят и , Б а й т _ д а н н ы х ) — запи­ сывает байт данных в Е Е РЯ О М по указанному адресу; • е е р г о т _ г с 1 _ Ь у Ь е ( А д р е с _ п а м я т и ) — считывает байт данных по указанному адресу и возвращает его в качестве результата. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\4 .01 - Запись-чтение * одного байта. Л и с т и н г 4 . 1 . П р о г р а м м а E E P R O M _ b y te . с # in c lu d e < a v r /io .h > // Ф ункция // адрес, v o id записи по // З а голо в оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого байта котором у в EEPRO M . будет в п одклю чает проекте П ри н и м ает п р ои звед ен а e e p r o m _ w r _ b y te (u n s ig n e d s h o rt определения устройства, два п арам етра: зап и сь, a d d re s s , и байт u n s ig n e d данны х c h a r d a ta ) { w h ile (EECR & EEAR = (1 << 1)); a d d re s s ; EEDR = d a t a ; EECR (1 |= << 2 ); // О ж идаем // записи (0 // А дрес, по (1 |= << п р ои звести Д анны е, // зап и сать // EEMWE (р а з р е ш а е м / / В разряд данны х EEW E) необходим о зап и сь которы е разряд преды дущ ей разряде котором у // / / В 1 ); в // // EECR окончания необходи м о EEW E в EEPRO M ) 1 записы ваем зап и сан 1 записы ваем зап и сь в (б а й т EEPRO M ) } // Ф ункция // котором у // В озвращ ает u n s ig n e d чтения char { w h ile (EECR EEAR = EECR |= байта необходи м о прочитанны й из EEPRO M . чтение & (1 << 0) ; << П риним ает байта адрес, по данны х. бай т. e e p r o m _ r d _ b y te (u n s ig n e d a d d re s s ; (1 данны х п р ои зв ести 1) ) ; / / О ж идаем s h o rt a d d re s s ) окончания (0 в преды дущ ей // записи разряде // Адрес // необходим о п р ои звести чтение // Записы ваем 1 EERE. // сам ы м ячейки байт, EEW E) EEPRO M , в из разряд которы й которой Тем необходим о 68 Глава 4 Л и с т и н г 4 .1 . О к о н ч а н и е re tu rn EEDR; // считать, // ЕЕШ ? записан // Ф ункция // находится вернет в в р еги стр байт, р еги стр е данны х которы й данны х ЕЕБЯ } in t m a in (v o id ) { DDRB PO R TB = O x ff; = 0x00; // 0Ы 1111111 // ОЬОООООООО // подаем e e p r o m _ w r _ b y t e ( 0x 0 0 , PO RTB О 0 x 0 3 ); = eep ro m rd b y te (0 x 0 0 ); - все выводы порта В - выходы - на все выводы порта В В // Запись байта 0 x 0 3 в нулевую // ячейку EEPROM // Чтение байта из EEPROM / / и его вывод в порт В } З апись/чтение зад ан н ого к оли ч еств а бай т Программа, представленная в листинге 4.2, записывает 15 байт дан­ ных их массива s t r o k a _ i z _ r a m _ v _ e e p r o m в энергонезависимую память, а затем считывает 15 байт обратно из E E PR O M в переменную s t r o k a _ i z _ e e p r o m _ v _ r a m . Предложение “ работа с eeprom” в мас­ сивах размещается, начиная с нулевого элемента по 14 включительно (в данном примере мы обходимся без символа завершения строки “ \0” ). Содержимое массивов находятся в ОЗУ. Размерность энергонезави­ симой памяти микроконтроллера AT90S2313 — 128 байт (память E E PR O M выдерживает не менее 100 000 циклов записи/стирания). В программе для записи и чтения энергозависимой памяти исполь­ зуются две собственных функции: • E E P R O M _ w r i t e _ s t r i n g ( А дрес_Е Е РЯ О М , К о л и ч е с т в о _ б а й т , А д р е с _ м а с с и в а _ д а н н ы х ) — запись од­ ного и нескольких байт данных в EEPRO M ; • E E P R O M _ r e a d _ s t r i n g (А д р е с _ Е EPROM, К о л и ч е с т в о _ б а й т , А д р е с _ м а с с и в а ) — чтение байта данных по заданному адресу памяти (функция возвращает его в качестве результата). Исходные файлы этого примера для WinAVR и AVR Studio находятся на прилагае­ мом к книге компакт-диске в папке AT90S2313\4.02 - Запись-чтение задан- ного числа байт. 69 Память EEPROM AT90S2313 Л и с т и н г 4 .2 . П р о г р а м м а Е Е Р И О М Ь у Ъ е . с # л .п с 1 и с 1 е // < a v r / io .h > Ф ункция v o id зап и си в // З а голов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого в п одклю чает определения устройства, п роекте EE PR O M E E P R O M _ w r ite _ s tr in g (in t ad d ress, in t le n g h t, ch ar *d a ta ) { w h ile (le n g h t) w h ile EEAR (E E C R = d a ta = = П ока // вы полняем // равны м // записаны (1 << = a d d ress + 1; ‘ d a ta ; d a ta + не все 0, 1; EECR I = (1 << 2) ; (1 « |= le n g h t = 1 ); le n g h t - цикл 14 1; зап и сан ы К огд а прервется, О ж идаем по п рои звести // П ереходим зап и си // пам яти зап и сь к будут от 0 до (ж д е м необходи м о в EE PR O M следую щ ей ячейке EEPRO M // К опируем // байт в р еги стр данны х, // зап и сать // *d a ta в // адресу // П оскольку // пам яти, данны х которы й пам ять озн ачает EEDR необходим о EEPRO M . "в зя т ь З ап и сь данны е по d a ta " d a ta для содер ж и т того следую щ ем у чтобы элем енту // увеличиваем адрес // Записы ваем // (р а з р е ш а е м // З аписы ваем // переписан из // У м еньш аем количество // оставш ихся 1 в на 1 в в для // Ф ункция чтения из ЕЕМ ЯЕ в Е Е ^ ге (б а й т БЕРНОМ ) бай т, зап и си EEPRO M E E P R O M _ r e a d _ s tr in g (in t in t a d d ress le n g h t, ch ar *d a ta ) { w h ile w h ile (E E C R & (1 (le n g h t- - ) << 1 )) // О ж идаем // зап и си // П ока // байт // из не окончания (ж д е м 0 в считали (п е р е м е н н а я ЕЕРИО М , цикл преды дущ ей разряде требуем ое не мь ЕЕРЕО М ) разряд ЕЕОИ м ассива, ед и н и ц у разряд зап и сь адрес п ерей ти } v o id 14 ЕЕ1УЕ котором у А дрес, // стан ет т .е . окончания разряде // EEPRO M , м ассива преды дущ ей в в le n g h t элем ентов // // // / / к EECR байты цикл. 1 )); a d d ress; a d d ress EEDR & // равна ЕЕДОЕ) число н улю ) вы полняется. 70 Глава 4 Л и с т и н г 4 .2 . О к о н ч а н и е { EEAR = Е Е CR a d d ress+ + ; |= *d a ta = (1 << 0 ); EEDR; d a ta + + ; // А дрес // необходи м о ячейки // и // З ап и сь // которы й необходим о // зап и сан в // Записы ваем // в переходим 1 в ячейку ЕЕРКОМ , к П ереходим // м ассива ЕЕИЕ р еги стр байт к которой чтение, следую щ ей разряд ячейке (б а й т , считать, данны х данны х м ассива // из п р ои звести ЕЕБЮ из ЕЕ РЯ О М з 1: г о к а _ 7 _ е е р г о т следую щ ем у элем енту } } in t m a in (v o id ) { // М ассив s t a tic s tr o k a _ iz _ r a m _ v _ e e p r o m ch ar // З аписы ваем // адрес по // s t r o k a _ iz _ r a m _ v _ e e p r o m которой адресу - это 0x00 адрес E E P R O M w r i t e s t r i n g (0 x 0 0 , // М ассив // из разм ещ ается s t r o k a _ i z _ r a m _ v _ e e p r o m [1 5 ] 15, s t r o k a _ iz _ e e p r o m EEPRO M строку н улев ого ОЗУ с e e p ro m "; длиной элем ента & s tr o k a _ iz будет в = "р а б о т а 15 байт, м ассива ra m v e e p ro m [0 ]); содерж ать строку, счи тан н ую EE PR O M s t a tic ch ar s t r o k a _ iz _ e e p r o m _ v _ r a m [1 5 ]; // Ч тение из // байт ОЗУ в ячейки по EEPRO M адресу с адресом м ассива E E P R O M _ r e a d _ s tr in g (0 x 0 0 , 15, 0x00 строки длиной 15 s tr o k a _ iz _ e e p r o m _ v _ r a m & s tr o k a _ iz _ e e p r o m v r a m [0 ]); } Содержимое памяти E E PR O M отображается в окне Mem ory. Перед записью все ее ячейки содержат значение OxFF (рис. 4.3): EEPROM 000000 8/16] abc. [ Address: |0x00 FF FF FF F F FF FF 0 0 0 0 1 4 FF FF FF F F FF FF 0 0 0028 FF FF FF F F FF FF 0 0 003C FF FF FF F F FF FF 000050 FF F F F F F F F F FF FF FF FF FF FF F F F F F F F F FF FF FF FF FF FF FF FF F F FF FF FF FF FF FF FF 0 0 0 0 6 4 FF FF FF F F FF FF FF FF FF FF FF 0 0 0 0 7 8 FF FF F F F F FF FF FF FF Cols: [Auto ^ j F F FF FF FF FF F F FF FF FF ЯЯЯ ЯЯ ЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯ FF FF FF FF FF F F FF FF FF ЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ FF FF FF FF FF FF FF FF FF ЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ F F FF FF FF FF F F FF FF FF ЯЯЯ ЯЯ ЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯ FF FF FF FF FF FF FF FF FF ЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ FF FF FF FF FF FF FF FF FF ЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ яяяяяяяя Рис. 4.3. Память EEPROM перед записью данных 71 Память EEPROM AT90S2313 Содержание энергонезависимой памяти после записи в нее массива 8 Ь г о к а _ 1 2 _ г а т _ у _ е е р г о т показано на рис. 4.4. I eEPROM 8/1б| abe j Address: |0х00 Cols: [Âüto^J 6 6D F F F F F F F F FF FF F F F F F F F F F F работа с еерготяяяяя яяяяяяяяяяяяяяяяяяяя F F F F F F F F F F FF FF F F F F F F F F FF яяяяяяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяяяяяя 000050 FFFF FF FF FF FF FF FF FF FF FF FF FF F F F F F F F F F F F F FF F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FF яяяяяяяяяяяяяяяяяяяя 000064 FF яяяяяяяяяяяяяяяяяяяя 0 0 0 0 0 0 ГО Е 0 E l Е Е F2 Е 0 20 F1 20 65 65 70 72 F FF 0 0 0 0 1 4 F F F F F F F F F F F F F F F F F F F F F F F F FF 0 0 0 0 2 8 F F F F F F F F F F F F F F F F F F F F F F F F FF FF FF 00003C FFFF FF FF FF FF FF FF FF FF FF FF FF 000078 FFFF FF FF FF FF FF FF яяяяяяяя Рис. 4.4. Память EEPROM после записи в нее данны х Содержимое массива s t r o k a _ i z _ e e p r o m _ v _ r a m после чтения данных из памяти E E PR O M можно увидеть в окне W a tch (рис. 4.5). -----Watch X 1Location ) Value 1Type Name 1 char[15] 0x0060 [SRAM] — stroka_iz_ram_v_eeprom [...] 0x0060 [SRAM] OxFO 'P1 char [0] 0 x0061 [SRAM] O x E O 'a' ch a r [1] char 0x0062 [SRAM] OxEl '6' [2] 0x0063 [SRAM] OxEE •o' char [3] 0x0064 [SRAM] 0xF2 iTi char [4] char 0x0065 [SRAM] OxEO 'a' [S] char 0x0066 [SRAM] 0x20 1 [6] 0x0067 [SRAM] OxFI •c' char [7] 0x0068 [SRAM] char 0x20 1 ' [8] char 0x0069 [SRAM] 0x65 ' ei [9] ОхООбА [SRAM] 0x65 e char [10] 0x006В [SRAM] 0x70 'P' char [И] char ОхООбС [SRAM] 0x72 1r ' [12] char 0x006D [SRAM] 0x6F •o' [13] ОхООбЕ [SRAM] 0x6D 'm' char [14] char[15] 0x0070 [SRAM] — stroka_iz_eeprom_v_ram [...] ch a r 0x0070 [SRAM] OxFO 'P' [0] 0x0071 [SRAM] ch a r O x E O 'a' [1] 0x0072 [SRAM] char OxEl '6' [2] 0x0073 [SRAM] char OxEE 1o' [3] char 0x0074 [SRAM] 0xF2 iT« [4] 0x0075 [SRAM] OxEO 'a' char [5] 0x0076 [SRAM] char 0x20 ' ' [6] 0x0077 [SRAM] char OxFI ' с■ [7] 0x0078 [SRAM] 0x20 ' ' char [8] 0x0079 [SRAM] 0x65 ' e1 char [9] 0x007A [SRAM] char 0x65 ' e1 [10] char 0x007В [SRAM] 0x70 'P1 [И] iri 0X007C [SRAM] char 0x72 [12] 0x007D [SRAM] char 0x6F '01 [13] char 0X007E [SRAM] Ox6D 'i' [14] 1ы < ►►\Watch1/Watch2/Watch3/Watch4/ Рис. 4.5. Данные, считанные из EEPROM в ОЗУ II II 72 Глава 4 Работа с ЕЕРКО М с п ом ощ ью ф ункций У\/тА\/Р В программе, представленной в листинге 4.3, используются две библиотечные функции \VinAVR, предназначенные специально для ра­ боты с памятью Е Е РЯ О М (они определены в подключаемом файле < a v r / е е р г о ш . Ь > ): • е е р г о г а _ г е а < 1 _ Ь у Ь е ( Адрес_ЕЕРЯОМ ) — чтение байта по ука­ занному адресу памяти ЕЕ РЯ О М ; • e e ф r o m _ w r i t e _ b y t e (А дрес_Е Е РЯ О М , Б а й т _ д а н н ы х ) — за­ писывает байт данных по указанному адресу памяти БЕРНОМ. В программе переменной ее_-от::1Ье присваиваем значение 0 x 7 6 , которое с помощью функции e e p r o m _ w r i t e _ b y t e записываем в пер­ вую ячейку энергонезависимой памяти. Затем это значение считывается с помощью функции е е р г о ш _ г е а с !_ Ь у Ь е и присваивается перемен­ ной е е _ г е а с 1 . Для того чтоб убедится, что запись и чтение выполнены успешно, значение переменной е е _ г е а с 1 выводим в порт Э (рис. 4.6). Рис. 4.6. Индикация значения 0x76 73 Память EEPROM AT90S2313 Значение 0 x 7 6 — это O b O l l l O l l O , т.е. на выводах порта D п о лу­ чены следующие напряжения: . PD6 — +5 В; . PD5 — +5 В; . PD4 — +5 В; . PD3 — OB; . PD2 — +5 В; . PD1 — +5 В; . PD0 — OB. ( 'Ä k ^ Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\4 . 03 - Запись-чтение одного байта. Л истинг 4.3. ttin c lu d e П р ограм м а < a v r / io .h > # in c lu d e eeprom .с // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / e e p r o m .h > в подклю чает определения устройства, проекте // П одклю чение // пам ятью ф ункций для работы EEPRO M / / И с п о л ь з у е м д в е ф у н к ц и и и з з а г о л о в о ч н о г о ф а й л а eeprom .h: // eeprom _w rite_by te (u in t 8 _ t *__ p, u in t 8 _ t __ v a lu e ) // u in t 8 _ t eeprom _read_byte (c o n st u in t 8 _ t *__ p) in t m a in (v o id ) { u i n t 8_ t e e _ w r ite ; e e _ w r it e = 0x7 6 ; // П ерем енная e e _ w r it e // З аписали п ерем енную // Записы ваем в // перем енной e e _ w rite первую в ячей ку пам яти e e p r o m w r i t e b y t e ( ( u i n t 8_ t * ) 1 , u i n t 8_ t С читы ваем // его ее read D D RD } ee_rea d ; // в = PO R TD = PO R TD = из // п ерем енную = ячейки EEPRO M зн ачен и е e e w r it e ); e e _ re a d П ерем енная первой u n sign ed ch ar O b O lllO llO типа EEPRO M типа байт u n sign ed char данны х и записы ваем e e _re a d e e p r o m _ r e a d _ b y t e ( ( u i n t 8_ t * ) 1 ) ; O x ff; 0x00; ee_rea d ; O b llllllll // 0b00000000 // // В ы водим в // e e _re a d для - все - на порт его вы воды всех D порта вы водах зн ачение индикации D - порта вы ходы DOB перем енной светоди одам и ___________________________ Г л а в а 5 ___________________________ Р абота с U A R T в A T 90S 2313 В этой главе мы рассмотрим методы работы с универсальным асин­ хронным приемопередатчиком (U A R T ) микроконтроллера AT90S2313 и соответствующие программы на С. П ередача байта д ан н ы х чер ез U A R T Частота обмена данными для асинхронного приемопередатчика микроконтроллер AT90S2313 устанавливается программно, т.е. внеш­ ний тактирующий сигнал не используется. Для того чтоб задать режим передачи необходимо: 1. В третий разряд (T X E N ) регистра управления U A R T (U C R ) запи­ сать единицу, чтобы мы разрешить работу передатчика: UCR |= (1 « 2. 3 ); Установить скорость передачи данных, записав в регистр U B R R значение, которое можно найти в таблице 15 технического описания микроконтроллера AT90S2313 (A T 9 0 s 2 3 1 3 . p d f ) или вычислить по формуле: U B R R = ((F ck / B A U D ) / 16) — 1, где Fck — частота работы микроконтроллера; U B R R — содержимое регистра скорости передачи U A R T ; B A U D — скорость, которая нам необходима для передачи. Таким образом, U B R R = ((3686400/9600) / 16) - 1 = 23. П осле того как U A R T настроен в режиме передатчика, можно пере­ давать данные, записывая в регистр ввода-вывода U D R байт данных для отправки. Перед следующей отправкой необходимо проверять, пустой ли регистр U D R (т.е. бы л ли отправлен предыдущий байт). Это можно сделать, проверив пятый разряд (U D R E ) регистра состояния USR: if (USR & (1 << 5 )) { UDR = ' А ' ; } Работа с иАЯТ в АТ90Э2313 75 С хем а Д ля соединения иАЛТ-интерф ейса микроконтроллера с С О М -портом компьютера необходим преобразователь уровней (рис. 5.1). 76 Глава 5 У компьютерного интерфейса 118232 уровню лог. 1 соответствует напряжение -3..-12 В, а уровню лог. О — +3..+12 В. В случае с и А Я Т микроконтроллера лог. 1 — это +5 В, а лог. О — О В. При подключении использована микросхема преобразователя уровней М А Х232. Схема соединения интерфейса и А Л Т микроконтроллера с вирту­ альным терминалом показана на рис. 5.2. С2 С1 1CHF 1HF Х1 □ З.ЯЕЙ+CTJJHl U1 XTAL1 XTALZ Р.БВЕТ PDffRXD Р01ГГХ0 PDZi'IMTH РD3*IHT1 PDtfTO PDST1 PDffCP AT5GBZ313 PBCVAIMD PВ1/AIN1 PB2 РВЭОС1 P8* PBS PBS PB7 12 13 и is 16 17 1S 19 Рис. 5.2. Схема соединения интерф ейса UART с виртуальны м терминалом П р огр ам м а Программа, реализующая работу схемы, показанной на рис. 5.1, представлена в листинге 5.1. Л к Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S23i3\5.01 - передача байта данных по UART. 77 Работа с UART в AT90S2313 Л и с т и н г 5 .1 . П р о г р а м м а u a r t _ s e n d _ a . c # in c lu d e // < a v r / io .h > ф ункция v o id // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого и н и ц и али зац и и подклю чает определения устройства, в проекте UART U A R T _ IN IT () { UCR I= (1 « 3 ); / / В // UBRR = 0x17; разряд ТХ ЕЫ разреш и ть - зап и сы ваем работу // 23 // частоте скорость // И н и ц и али зи руем // Б есконечны й МК 1, чтобы передатчика передачи 3 .6 8 6 4 9600 бод при М Гц } in t m a in (v o id ) { UART IN IT (); w h ile (1 ) UART цикл { i f (U S R & (1 << 5 )) // Е с л и разряд // равен 1, то // пуст, т .е . // данны е // П ередаем для UDRE р еги стр а р еги стр готов USR данны х принять UDR новы е отправки. { UDR = 'А'; через UART букву "А " } } } Программа в бесконечном цикле передает через и А Я Т символ “ А ” . Результат приема данных виртуальным терминалом показан на рис. 5.3. Virtual Тerminal ОЙЙЙЙАЙЙЙЙЙЙЙАЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙАЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙАЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙПЙЙЩ| ЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙЙАЙ Рис. 5.3. Прием данных виртуальным терминалом 78 Глава 5 П ередача зад ан н ого ч и сла ба й т ч ер ез и А Ш В этом примере программа передает через универсальный асин­ хронный приемопередатчик 11ЛЯТ предложение “ привет, это твой мик­ роконтроллер = )” . Схема подключений и результат вывода данных через виртуальный терминал показаны на рис. 5.4. Рис. 5.4. Схема подклю чений и результат вывода через виртуальны й терминал Программа, реализующая работу схемы, показанной на рис. 5.4, представлена в листинге 5.2. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5.02 - Передача за­ данного числа байт по UART. Л и с т и н г 5 .2 . П р о г р а м м а u a r t _ s e n d _ s t r i n g . c # in c lu d e # in c lu d e // < a v r / io .h > < s tr in g .h > ф ункция v o id // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого в // Д ля строкам и иниц и али зац и и работы со подклю чает определения устройства, проекте UART U A R T IN IT () { UCR UBRR |= = (1 « 0x17; 3 ); / / В разряд // разреш и ть // 23 - TXEN зап и сы ваем работу скорость 1, чтобы передатчика передачи 9600 бод при 79 Работа с UART в AT90S2313 Л и с т и н г 5 .2 . О к о н ч а н и е // частоте МК 3.6864 МГц } in t { m a in (v o id ) U A R T _IN IT (); // Инициализируем UART // Объявляем массив stro k a [ ] , который будет содержать // предложение для отправки. Он состоит из 3 7 элементов / / с индексацией от от 0 до 36 включительно. Элемент // с индексом 37 - символ конца строки с кодом 0x00. s t a t i c c h a r s t r o k a [37] = "п р и в е т , s t a tic in t это d lin a _ s tr o k i in t i= 0 w h ile твой м и крокон троллер d lin a _ s tr o k i = = 0 ; s t r le n (s tr o k a ; = )\ г \ п "; // Переменная для хранения // количества байт / / в передаваемом массиве ) ; // С помощью функции s t r l e n // определяем количество байт // в массиве stro k a // Индекс байта массива для отправки (1) // Бесконечный цикл { // Если регистр ввода-вывода UDR пуст, и передаваемый // в данный момент байт - последний, т о . .. i f (U S R & (1 << 5) && i < d lin a _ s tr o k i) { UDR i = = s t r o k a [i]; i + 1; // Передаем через UART один байт // Переходим к следующему байту } } } М ассиву символов s t r o k a [ ] присвоена строка “ привет, это твой микроконтроллер =)\г\п” . Теперь к лю бо м у байту в этом массиве можно обратится так s t r o k a [ И н д е к с ] . Компилятор при инициализации сим­ вольных массивов автоматически добавляет в их конец символ “ \0” (0 x 0 0 ), из-за чего размерность массива всегда больш е на один элемент. В нашем случае 37-й элемент массива содержит 0x0 0 (рис. 5.5). М ы определили количество байт в массиве s t r o k a [ ] с помощью функции s t r l e n ( ) , объявленной в библиотечном заголовочном файле s t r i n g . h (определяет длину строки без учета символа “ \0” ). М ы м ог­ ли бы воспользоваться явной инициализацией переменной для длины сроки, без использования функции s t r l e n : d l i n a _ s t r o k i = 3 7. В та­ 80 Глава 5 ком случае при инициализации массива s t o k a [] необходимо бы ло бы указать размерность 38, т.е. s t a t i c c h a r s t r o k a [ 3 8 ] . --------------------------- -------------------------------------------------------------------Match ... Name j Value 1Location 1 1Type — stroke char[37] 0x0060 [SRAM] [-..] OxEF n1 char 0x0060 [SRAH] [0] OxFO P' char 0x0061 [SRAM] [1] 0xE8 и1 char [2] 0x0062 [SRAH] [3] 0xE2 в' char 0x0063 [SRAH] 0xE5 e1 char 0x0064 [SRAH] [4] 0xF2 T1 char [5] 0x0065 [SRAM] 0x2C , ' char [б] 0x0066 [SRAM] 0x20 char 0x0067 [SRAH] [7] OxFD э1 char [8] 0x0068 [SRAH] 0xF2 T1 char [9] 0x0069 [SRAH] [10] OxEE 01 char ОхООбА [SRAH] 0x20 char 0x006В [SRAH] [11] [12] 0xF2 T' char ОхООбС [SRAH] 0xE2 Б1 char [13] 0x006D [SRAH] [14] OxEE 01 char ОхООбЕ [SRAH] [15] 0xE9 Й1 char 0x006F [SRAH] [16] 0x20 char 0x0070 [SRAH] [17] OxEC M' char 0x0071 [SRAH] [18] 0xE8 и1 char 0x0072 [SRAH] [19] OxEA к' char 0x0073 [SRAH] [20] OxFO p' char 0x0074 [SRAH] [21] OxEE 01 char 0x0075 [SRAH] [22] OxEA к' char 0x0076 [SRAH] [23] OxEE 01 char 0x0077 [SRAH] [24] OxED H ' char 0x0078 [SRAH] [25] 0xF2 T ' char 0x0079 [SRAH] [26] OxFO p' char 0x007À [SRAH] [27] OxEE o' char 0x007B [SRAH] [28] OxEB л' char 0x007C [SRAH] [29] OxEB л' char 0x007D [SRAH] [30] 0xE5 e' char 0X007E [SRAH] [31] OxFO P' char 0x007F [SRAH] [32] 0x20 char 0x0080 [SRAH] [33] Ox3D =' char 0x0081 [SRAH] [34] 0x29 )' char 0x0082 [SRAH] [35] OxOD char 0x0083 [SRAH] _ [36] OxOA char 0x0084 [SRAH] к 4 t /уШсШ3/Watch Г? \Watch 1 /Watch 2 Рис. 5.5. Содержимое массива s t r o k a [] П рием д ан н ы х ч ер ез U A R T В данном примере программа принимает данные через U A R T и вы­ водит их в порт В. В функции U A R T _ I N IT ( ) приемопередатчик ини­ циализируется на прием данных записью 1 четвертый разряд (R X E N ) регистра U C R : 81 Работа с IIА Ш в АТ9052313 иск |= (1 << 4 ) ; ______________________________________________________________ Устанавливаем скорость передачи данных: ивия = 0 x 1 7 ; ___________________________________________________________________________________________ Порт В микроконтроллера определяем на вывод: РРИВ = ОхРР;____________________________________________________________________ В бесконечном цикле проверяем седьмой разряд регистра состояния Ш Я . Если в нем установлена 1, то это говорит о завершении приема данных завершен, т.е. байт принят и переписан в регистр 1ЛЖ . Как только это произойдет, байт данных выводится в порт В: роетв = ШН; С хем а Схема соединения микроконтроллера со светодиодами и виртуаль­ ным терминалом показана на рис. 5.6. за Х1 -*-С2 — С1 1сь} Рис. 5.6. Схема соединения м икроконтроллера со светодиодами и виртуальным терминалом 82 Глава 5 В примере, показанном на рис. 5.6, с микроконтроллером бы ло ус­ тановлено соединение через программу HyperTerminal и передан символ “ 1” (единица). На выводах порта В появились следующие уровни: . РВ7 — 0; . РВ6 — 0; • РВ5 — 1; . РВ4 — 1; . Р В З — 0; • РВ2 — 0; • РВ1 — 0; . Р В 0 — 1. М ы получили двоичное 00110001 (шестнадцатеричное 0 x 3 1 ). С о­ поставив этот код с таблицей символов А 8 С П (рис. 5.6), убеждаемся, что был принят символ “ 1” 00 0 10 20 ► * 30 40 0 Р А В С 1 2 3 © О -« г ■■ 1 2 * и # 3 4 5 4 ♦ Я1 $ 5 * ff % 6 * • - □ О t 7 8 9 А В s cf 4•4 С 2 D Г «i— « Е Я æ ж ▼ F & в » 7 8 < ) ■ж+ * - 9 ; < = > ? D 50 P Q R S T 60 * 70 80 90 А0 В0 P A a b 4 Б P С а б Ik J_ T r B T s Г У в Г W с ТГ 11 a e t u Д E ф X т 1- Ж ц ч ш + 1= F ГГ li­ li * Ш J 14 ъ Ы Е F U U £ G U Sf V w H X h X 3 И I V i J К Z С J k L M \ 1 У z -c ! n > N 3 A n H о О — о п й к n M А е ж 3 и й щ ь ы ь л м э н ю я о п к 1 А 11 Т1 Ц с е I>0 il L ÍI II IÏ JL Ï1 и и ir Ir = d 1 t Г ■ ■ E0 P с T У Ф X F0 = + > < Г J Ц 4 о • b ■J n ir 4 ч Э Ю • ± Ш я 2 Рис. 5.7. Таблица символов ASCII Н а с т р о й к а в и р т у а л ь н о г о т е р м и н а л а в P r o te u s Для отображения вводимых символов в терминале внутри про­ граммной среды Proteus необходимо щелкнуть правой кнопкой мыши и установить в контекстном меню флажок Echo Typ ed Characters (В ы ­ давать эхом вводимые символы) (рис. 5.8). Затем следует задать шрифт. Для этого в меню, показанном на рис. 5.8, необходимо выбрать команду 83 Работа с UART в AT90S2313 Set Font и выбрать необходимые настройки в диалоговом окне Ш риф т (рис. 5.9). 1515sxem- ISIS Professional (Animating) ; File View Edit Tools Design Graph Source Debug Library Template System Help Virtual Terminal *j| Рис. 5.8. Отображение вводимы х символов в терминале Proteus В Е Ш -12 -23 -34 -45 А}*1 Начертание: Шрифт: с Fixedsys Ч: isocTEUR О Lucida Console 4 1Monospac821 ВТ 4? MS Mincho Terminal ок 9 |обычный Courier New Размер: обычный курсив I жирный жирный курсив J !------- 3 10 I 11 12 114 16 18 d ■“ ZÍ Образец АаБЪЕбФф Набор символов: I Рис. 5.9. Выбор шрифта ~3 Отмена 84 Глава 5 С о зд а н и е п о д к лю ч ен и я в п р огр ам м е Н у р е г Т е г т т а ! Для запуска программой НурегТептппа1 можно воспользоваться ко­ мандой системного меню Пуск ► В се програм м ы ► С тандартны е ► С в я зь ► Н у р е г Т е г т т а !. 1. В диалоговом окне Описание подклю чен ия (рис. 5.10) вводим л ю ­ бое название и нажимаем кнопку ОК. т И *} Ш ки Новое подключение Введите название подключения и выберите для него значок: Название: N Значок: \к ок Отмена Рис. 5.10. Д иалоговое окно Описание подключения 2. В диалоговом окне П одк лю чен и е выбираем СОМ -порт, к которому подключен микроконтроллер (рис. 5.11) и нажимаем кнопку ОК. Л х| 1 Введите сведения о телефонном номере: Страна или регион: | □ Код города: Номер телефона: Подключаться через: [ ОК Отмена Рис. 5.11. Диалоговое окно Подключение 85 Работа с UART в AT90S2313 3. В диалоговом окне С войства выбираем: С к ор ость бит/с — 9600; Биты д ан ны х — 8; Ч етн ость — Нет; С топ ов ы е биты — 1; Уп рав­ л е н и е потоком — Нет, — и нажимаем ОК. Примечание Управление потоком бывает аппаратным и программным, однако мы его не ис­ пользуем. В случае программного управления типа Xon/X off для выдачи устройст­ ву сигнала прекратить/возобновить передачу данных используются стандартные контрольные символы ASCII (коды 17 и 19). При аппаратном управлении потоком для приостановки и последующего возобновления передачи используют специаль­ ные линии интерфейса RS-232 (сигналы CTS и RTS). Также, в HyperTerminal можно активизировать отображение вве­ денных с клавиатуры символов. Выберите команду меню Ф а й л ► С войства, в диалоговом окне С вой ства перейти на вкладку П арам ет­ ры, нажмите кнопку Параметры ASCII и установите флажок О т о б р а ­ жать в в ед ен н ы е с и м в о л ы на экране (рис. 5.12). ------ Подключение Jj xj j -----Параметры I Рис. 5.12. Активизация отображения введенных с клавиатуры символов Для установки параметров шрифта выберите команду меню В ид ► Ш рифт, в диалоговом окне Ш рифт найдите в перечне шрифтов элемент 86 Глава 5 Courier N ew и выберите в раскрывающемся списке Н абор с и м в о л о в элемент Кириллический. П р о гр а м м а Программа, реализующая работу схемы, показанной на рис. 5.6, представлена в листинге 5.3. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5. 03 - Прием данных через UART. Л и с т и н г 5 .3 . П р о г р а м м а U A R T # in c lu d e // < a v r / io .h > Ф ункция v o id to .с p o r t b // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого и н и ц и али зац и и в подклю чает определения устройства, проекте UART U A R T I N I T () { UCR I= (1 « 4 ); // Разреш аем // Устанавливаем // при U A R T IN IT ( ) ; // И н и ц и али зац и я DDRB // В ы воды UBRR = 0x17; работу частоте прием ника скорость МК 3 .6 8 6 4 передачи 9600 бод М Гц } in t m a in (v o id ) { = O xFF ; PO RTB = 0x00; w h ile (1) / / Н а // порта все иАЯТ В вы воды Б есконечны й работаю т порта В как вы ходы подаем 0 В цикл { i f (U S R PO RTB & = (1 << UDR; 7 )) // Е сли // разряде // В ы водим // через в появилась порт (R X C ) В байт единица р еги стр а данны х, в седьм ом USR, т о ... приняты й UART } } } П рием и передача байта дан н ы х ч ер ез U A R T В данном примере микроконтроллер в бесконечном цикле принима­ ет через U A R T байт данных, а затем отправляет его обратно (рис. 5.13). Схема соединений — такая же, как на рис. 5.6. 87 Работа с UART в AT90S2313 передали байт ------------------------------------------------► hyper terminal ПК МК МК отправил строку Байт, который пришел б 11АКТ МК М----------------------------------------------- Рис. 5.13. Прием и передача данны х через UART Например, мы передаем в микроконтроллер через U A R T символ “ а” . В таком случае от микроконтроллера через U A R T мы получим этот же символ. Программа, реализующая прием и передачи данных через U A R T , представлена в листинге 5.4. Щ Ч к Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5.04 - Прием и пе­ редача данных через UART. Л и с т и н г 5 .4 . П р о г р а м м а U A R T _ r _ a n d _ s _ b . с # in c lu d e // < a v r / io .h > Ф ункция v o id // З аголо в оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого и н и ц и али зац и и в п одклю чает определения устройства, п роекте UART U A R T I N I T () { XJCR UBRR |= = (1 « 4) | 0x17; (1 << 3 ); // Разреш аем // (1 в // UCR) // разряде // Устанавливаем // при частоте работу разряде и прием ника р еги стр а п ередатчика 3 скорость МК 4 3 .6 8 6 4 (X в р еги стр а UCR) п ередачи 9600 бод М Гц } // Ф ункция v o id отправки байта o tp r a v itb a it(c h a r данны х через UART o d in _ b a it) { lo o p _ u n til_ b it_ is _ s e t(U S R , 5 ); // О ж идаем , // установлен пока // р еги стр а в USR. будет 1 разряд Э то 5 гов ор и т о 88 Глава 5 Л и с т и н г 5 .4 . О к о н ч а н и е UDR = // том, что регистр данных // UART пуст, и мы можем // записать в него байт данных // для передачи // Записываем в порт ввода-вывода // значение переменной od in b a it o d in _ b a it; } in t m a in (v o id ) { // Инициализация иАЯТ // Выводы порта В работают как выходы / / Н а все выводы порта В подаем 0 В U A R T IN IT ( ) ; D D RB = O xFF; PO R TB = 0x00; w h ile (1) // Бесконечный цикл { i f (U S R & (1 << // Если появилась единица в седьмом // разряде (RXC) регистра USR, т о . . . 7 )) { ch ar o d in _ b a it PO RTB = = UDR; o d in _ b a it; o t p r a v it jb a it(o d in b a it ); // // // // // // // Переменной o d in _ b a it присваиваем содержимое регистра ввода-вывода UDR Выводим в порт В содержимое переменной o d in _ b a it Отправляем через UART значение od in b a i t } } Окно терминала, демонстрирующее работу этой программы, пока­ зано на рис. 5.14. Virtual Terminal Рис. 5.14. Каждый принятый символ дублируется переданным символом 89 Работа с UART в AT90S2313 П рием байта, отправка строки ч ер ез U A R T В этом примере программа в бесконечном цикле принимает один байт через U A R T , после чего программа отправляет через U A R T строку “ М К Гсс\ус(1-Принятый_байт”. Так, если передать символ “ х ” , то от микроконтроллера придет строка “ М К recived-x” . Схема соединений — такая же, как на рис. 5.6. Программа, реализующая прием байта и передачу строки через U A R T , представлена в листинге 5.5. шцЩк Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5 . 05 - Прием байта и отправка строки через UART. Л и с т и н г 5 .5 . П р о г р а м м а U A R T # in c lu d e < a v r / io .h > rb s s tr .c // Заголовочный файл подключает определения // ввода-вывода для устройства, // используемого в проекте // Функция инициализации UART v o id U A R T _ IN IT () { |= (1 << 4 ) UCR UBRR = 0x17; I (1 << 3) ; // Разрешаем работу приемника // (1 в разряде 4 регистра // UCR) и передатчика (1 в // разряде 3 регистра UCR) // Устанавливаем скорость передачи 9 6 0 0 бод // при частоте МК 3 . 6 8 6 4 МГц } // Функция отправки строки через UART // Указатель * s t r o k a содержит адрес первого элемента массива v o id o t p r a v it _ s t r o k u (c h a r *s tro k a ) { w h ile != ' \ 0 ' ) // Цикл выполняется до тех пор, пока не будеь достигнут символ " \0" . * s tr o k a - это содержимое байта данных по адресу s t ro k a . Можно было бы использовать просто цикл w h ile ( * s t r o k a ) , т . е . "пока есть что-либо в памяти (* s tr o k a // // // // { / / Ожидаем появления 1 // в разряде 5 регистра USR UDR = * s t r o k a ; // Выводим через UART * s tr o k a // значение, находящееся по адресу stro k a s t r o k a = s t r o k a + 1; // Переходим к следующей ячейке // памяти, поскольку stro k a - это указатель на память lo o p _ u n til_ b it_ is _ s e t(U S R , 5 ); 90 Глава 5 Л и с т и н г 5 .5 . О к о н ч а н и е } } in t m a in (v o id ) { U A R T _ IN IT ( ) ; // И ни ц и али зац и я DDRB // В ы воды = PO RTB O xFF; = 0x00; / / Н а (1) w h ile // все порта и А [? Т В вы воды Б есконечны й работаю т порта В как вы ходы подаем 0 В цикл { i f (U S R (1 & << 7 )) // Е сли // разряде п оявилась (R X C ) единица в р еги стр а седьм ом ХТБН, т о ... { ch ar o d in b a it // PORTB = В м ассив // \ r\ n ", // а // ком пилятор s tr где сим вол s t r [1 3 ] // "\ п " ch ar = // зап и сы ваем сим вол - "\ г" o d in _ b a it; п ер в ого // его // перем енной п редставить В // порт r e c iv e d - каретки, ячейку "\ 0 " \ r\ n "; м ассива ф ункции s t r []. как зн ачен и е ячейку П ередаем такж е, o d in _ b a it 1 6 -ю 1 4 -ю м ассива UDR содерж и м ое "\ r\ n M K З ап исы ваем в В си м вол r e c iv e d // элем ента в возврат зап и ш ет o d in _ b a it o t p r a v i t _ s t r o k u ( & s t r [0 ] ) ; // В ы водим строки. s t r [ 1 7 ] = "\ r\ n M K в в о д а -в ы в о д а // озн ачает п еревод o d in _ b a it р еги стр а предлож ение автом атически перем енной П ерем енной содерж и м ое o d in _ b a it; // s ta tic UDR; = п ри сваи ваем & str адрес М ож но или бы ло бы & s tr+ 0 . } } Окно терминала, демонстрирующее работу этой программы, пока­ зано на рис. 5.15. Virtual Terminal МК rë c iu e d -1 МК reciued-2 МК reciued-ii МК reci,ued-5 HK recived-й Рис. 5.15. Прием байта и отправка строки 91 Работа с UART в AT90S2313 И сп о льзо в а н и е потока s td o u t Вместо стандартного выходного потока s t d o u t мы воспользуемся собственным потоком m y s t d o u t (листинг 5.6). Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5. 06 - Использование потока stdout. Л и с т и н г 5 .6 . П р о г р а м м а U A R T _ s _ f r o m _ s t r e a m . c # in c lu d e # in c lu d e // < a v r / io .h > < s td io .h > Ф ункция v o id // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого // С тандартны е иниц и али зац и и в п одклю чает определения устройства, п роекте средства в в о д а -в ы в о д а UART U A R T _ IN IT () { UCR |= UBRR = (1 << 3 ); 0x17; // Разреш аем // Устанавливаем работу // при частоте передатчика скорость МК 3 .6 8 6 4 п ередачи 9600 бод М Гц } // Ф ункция, // вы вод s ta tic которая будет вы зы ваться при обращ ен ии потока на сим вола in t u a r t_ p u tc h a r (c h a r s im v o l, F IL E »s tr e a m ) { lo o p _ u n til_ b it_ is _ s e t (T J S R , UDR = s im v o l; re tu rn U D R E ); // П ересы лаем // содерж ащ ийся // через в О ж идаем появления / / в разряде UART байт перем енной 1 UDRE данны х, s im v o l 0; }; // С оздаем вы вода. поток Ф ункцию только вы вод, s ta tic F IL E m y s td o u t, для ввода установив m y s td o u t н азн ачи в не ф лаг u art указав p u tc h a r NU LL. для И сп ользуем _ F D E V _ S E T U P _ W R IT E = F D E V _ S E T U P _ S T R E A M (u a r t_ p u t c h a r , in t ф ункцию н азн ачаем , NULL, _ F D E V _ S E T U P _ W R IT E ); m a in (v o id ) { U A R T _ IN IT (); // И ниц иализац ия s td o u t // П ер ен азн ачаем // ста н д ар тн ого = fc m y s td o u t; p r in tf("H e llo , // "H e llo , w o r ld !\ r \ n " ) ; w o r ld !" . П оскольку // UART поток вы вода П ередаем вы ходной в std o u t на наш поток поток m y s td o u t строку н азн ач ен как 92 Глава 5 Л и с т и н г 5 .6 . О к о н ч а н и е // ф ункция // принимая re tu rn u a rt p u tc h a r, си м волы для будет вы зы ваться данная отправки, 0; } Результат работы программы показан на рис. 5.16. V ir tu a l T e r m in a l Рис. 5.16. Вывод строки через поток ф ункция, 93 Работа с UART в AT90S2313 И сп ользо в а н и е п отоков s td o u t и s td in д ля передачи и прием а си м в ола В это примере программа (листинг 5.7) с помощью потока s t d i n принимает символ через U A R T , отображает его A S C II-код на светодио­ дах и передает этот же символ через U A R T с помощью потока s t d o u t . Выход из цикла приема/передачи символов происходит после приема кода клавиши <Enter>. Схема соединений — такая же как на рис. 5.6. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом Ккниге компакт-диске в папке AT90S2313\5 . 07 - Использование потоков stdout и stdin для передачи и приема символа. Л и с т и н г 5 .7 . П р о г р а м м а U A R T s f r o m s t r e a m a n d r . c # in c lu d e # in c lu d e // < a v r / io .h > < s t d io .h > Ф ункция v o id // З аголо в оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого // С тандартны е и н и ц и али зац и и в подклю чает определения устройства, проекте средства в в о д а -в ы в о д а UART U A R T IN IT () { UCR |= UBRR = (1 << 3) | 0x17; (1 << 4) ; // Р азреш аем // п ередатчика // Устанавливаем // при частоте скорость МК 3 .6 8 6 4 работу и прием ника п ередачи 9600 бод М Гц } // Ф ункция, // вы вод s ta tic которая будет вы зы ваться при обращ ен и и потока на си м вола in t u a r tp u tc h a r (c h a r s im v o l, F IL E ‘ s tre a m ) { lo o p _ u n til_ b it_ is _ s e t (U S R , UDR = s im v o l; re tu rn U D R E ); // П ересы лаем // содерж ащ ийся через в // О ж идаем // в UART появления разряде байт п ерем ен н ой 1 UDRE данны х, s im v o l 0; }; // Ф ункция, // ввод s ta tic которая будет вы зы ваться при обращ ении потока на сим вола in t u a r t_ g e tc h a r (F IL E * s tre a m ) { w h ile ( ! (U S R & ( 1 < < 7 ) ) ) ; // О ж идаем , пока // заверш и тся установкой в // в USR заверш ен ) р еги стр е (п р и е м единицу прием разряда си м вола 7 (R X C ) 94 Глава 5 Л и с т и н г 5 .7 . О к о н ч а н и е re tu rn UDR; //ф ункция верн ет приняты й сим вол } // С оздаем // u a rt_ p u tc h a r // И сп ользуем s t a tic поток F IL E m y s t d o u t_ m y s t d in , для ввод вы вода, и а вы вод, m y s t d o u t_ m y s t d in ф ункцию u a rt_ g e tc h a r установи в ф лаг - для ввода. _F D E V _S E TU P_R W = F D E V _ S E T U P _ S T R E A M (u a r t_ p u t c h a r , in t н азн ачи в ф ункцию u a rt_ g e tc h a r, _ F D E V _ S E T U P _ R W ); m a in (v o id ) { DDRB O xFF; // В ы воды U A R T _ IN IT ( ) ; = // И ни ц и али зац и я // П ередаем // s td o u t s td in // = адрес (н а s td o u t П ередаем пам яти вы вод) = и ch ar н а ш его потока стандартны й В - вы ходы UART в стан дар тн ы й поток s td in поток (н а ввод) & m y s td o u t_ m y s td in ; через UART p r i n t f ( п\ г\ п П р и н и м а е м через в порта п редлож ени е сим вол U A R T \ r\ n через UART и отправляем его " ); с; w h ile ( (с = g e tc h a rO ) // сим вол из // вы полняется // с != O x O D )/ / ста н д ар тн ого до A S C II -к о д о м тех 13, пор, т .е . Ф ункция потока пока g etch a rO s t d in не наж ата (и з будет клавиш а считы вает U A R T ). считан Цикл сим вол < E n te r> { p u tc h a r (c ); // П ередаем PO RTB // В ы водим = с; // приняты й сим вол отображ ения его си м вол через порт A S C II-к о д а через В на UART (д л я светодиодах) }; p r i n t f (" \ r \ n E X IT \ r \ n "); // В ы водим слово "E X IT " 0; re tu rn Результат работы программы показан на рис. 5.17. jaixj Ф айл Правка Вид D ls H V s l Вызов Передача Справка о| э 1 йН Приним аем символ через UART и о т п р а в л ем е г о через UART 112233 E X IT Рис. 5.17. Результат использования потоков для ввода-вывода символа 95 Работа с UART в AT90S2313 И сп ользо в а н и е п отоков s td o u t и s td in передачи д ля и п р и ем а строки Принимаемые символы записываются в массив b u f [ ] . Прием про­ должается до тех пор, пока не будет превышен размер массива или не поступит код клавиши <Enter>. Код поступающих символов отобража­ ется на светодиодах. П о окончании приема принятая строка выводится через U A R T . В программе (листинг 5.8) используется собственная функция приема строки i n p u t _ l i n e , а для вывода строки — внешняя функция p r i n t f ( ) . Схема соединений — такая же как на рис. 5.6. _ Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5 . 08 - Использование потоков stdout и stdin для передачи и приема строки. Л и с т и н г 5 .8 . П р о г р а м м а U A R T s # in c lu d e # in c lu d e // < a v r / io .h > < s t d io .h > Ф ункция v o id r s .с // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого // С тандартны е и н и ц и али зац и и в подклю чает определения устройства, п роекте средства в в о д а -в ы в о д а UART U A R T _ IN IT () { XJCR |= UBRR = (1 << 3) I 0x17; (1 << 4) ; // Разреш аем // передатчика // У станавливаем // при частоте скорость МК 3 .6 8 6 4 работу и прием ника передачи 9600 бод М Гц } // Ф ункция, // вы вод s ta tic которая будет вы зы ваться при обращ ении потока на си м вола in t u a r t_ p u tc h a r (c h a r s im v o l, F IL E ‘ s tre a m ) { lo o p _ u n til_ b it_ is _ s e t (U S R , UDR = s im v o l; re tu rn U D R E ); // П ересы лаем // содерж ащ и й ся // через в О ж идаем п оявлен и я / / в разряде UART байт перем енной UDRE данны х, s im v o l 0; }/• // Ф ункция, // ввод s ta tic { которая будет вы зы ваться си м вола in t u a r tg e tc h a r (F IL E *s tre a m ) при обращ ени и потока на 1 96 Глава 5 Л и с т и н г 5 .8 . П р о д о л ж е н и е w h ile ( ! (U S R re tu rn & (1 << 7 ) ) ) ; // О ж идаем , пока // заверш и тся установкой в // в USR заверш ен ) р еги стр е UDR; //ф ункция (п р и е м верн ет единицу приняты й прием разряда си м вола 7 (R X C ) сим вол } // С оздаем // u a rt_ p u tc h a r // И сп ользуем s ta tic поток F IL E m y s t d o u t_ m y s t d in , для ввод вы вода, и а вы вод, m y s t d o u t_ m y s t d in Ф ункция, которая // в b u f[], // П арам етры : м ассив II- адрес т .е . // напрям ую II- далее в н улев ого обращ аем ся in t u a rt_ g e tc h a r, строку - элем ента обращ аясь к м ассиву длина - для ввода. _FD E V _SE TU P_R W = приним ает ф ункции, le n g th _ lin e l s ta tic ф лаг через п р о и н и ц и али зи р ов ан н ы й пам яти // ф ункцию u a rt_ g e tc h a r установив F D E V _ S E T U P _ S T R E A M (u a r t_ p u t c h a r , // н азн ачи в ф ункцию u art в и записы вает основной м ассива к _ F D E V _ S E T U P _ R W ); в указателе * b u fl, b u f1 [и н д е к с ], ук азателю ее п р огр а м м е мы b u f [] ; строки i п р и t _ l i n e (c h a r * b u fl, in t le n g t h lin e l) { in t i = char 0; с; // Д ля // П ерем енная le n g th _ lin e l = элем ентов // на 1 для Цикл // сим вол // дости гн ут w h ile м ассива ((с = до коду конец м ассива g e tc h a rO ) 1; пор, пока 1= O xO D к i < сим вола индексация мы у м е н ь ш а е м последн ем у приняты й < E n te r> && UART П оскольку 0, с обращ ени я клавиш и сим волов через // начинается тех равен п р и н я того - кор р ек тн ого вы полняется не отправленны х для le n g t h _ lin e l // // подсчета и ли через не длину элем ен ту u art будет le n g t h _ lin e l ) { PO RTB = b u fl[i] i = i + с; = с; 1; // На // п р и н я того светоди оды порта В вы водим A S C II-к о д сим вола // Записы ваем // м ассива приняты й // Увеличиваем // п ерейти // П оследний сим вол в ячей ку i b u f [] к индекс м ассива следую щ ей его на 1, чтобы ячейке } b u fl[i] // // // re tu rn in t = ' \ 0 '; строки . Н априм ер, (b u f[8] ) , с индексом i ; m a in (v o id ) то 7, если элем ен т м ассив си м вол конца т .е . b u f[7 ]. м ассива состоит строки из сим вол 8 запиш ется конца элем ентов в ячейку 97 Работа с UART в AT90S2313 Л и с т и н г 5 .8 . О к о н ч а н и е { DDRB = O xFF; // В ы воды UART IN IT (); // И н и ц и али зац и я // П ередаем // s td o u t адрес (н а пам яти вы вод) и в порта н а ш его В - вы ходы UART потока стандартны й в s t d in = stdou t = &mystdout_mystdin; char b u f [ 8 ] ; // М а сси в , в к отор ы й u nsign ed in t le n g t h _ lin e = 0 ; // Э та // хранить длину строки, // В ы зы ваем ф ункцию in p u t _ lin e // элем ента м ассива и его которая и стан дар тн ы й поток s td in будет поступит в ввод) зап и сан а перем енная передаем поток (н а н ее строка будет через UART адрес п ер вого разм ер le n g t h _ lin e = i n p u t _ li n e (& b u f [ 0 ] , s i z e o f ( b u f ) ) ; p r i n t f ("\ r\ n CTpoKa-%s", b u f ) ; / / П е р е д а е м п р и н я т у ю // через UART. // зам ещ ает строку О бозначение вы водим ую %s строку re tu rn 0; } Результат работы программы показан на рис. 5.18. ¡т т т я га ш и к * .' 12345678 строка-1234567| О шшяшшяшшш *J 3 - zi Рис. 5.18. Результат использования потоков для ввода-вы вода строки С р а в н ен и е строки, п р и н ятой через U AR T Программа, представленная в листинге 5.9, с помощью внешней функции f g e t s принимает через U A R T строку и сравнивает ее со стро­ кой, хранящейся в памяти программ. Если принятая строка меньше строки, хранящейся в Flash-памяти, то в U A R T передастся символ “ < ” . Если она больше, то передастся символ “ > ” , если же строки равны, то передается символ “ = ” . Для завершения ввода в виртуальном терминале, необходимо нажать комбинацию клавиш <Ctrl+Enter>. 98 Глава 5 Схема соединения микроконтроллера с терминалом представлена на рис. 5.19. роах р PDST1 PD*rra PD3flMT1 роагшт РD1ГГХ& PDCVRXD PB7 PBS PSS РБ+ PB3^0C1 PB2 PВ1/AIN1 PBOTAIND REBET XTAL2 XTAL1 19 ATKEZ313 Рис. 5.19. Схема соединения микроконтроллера с терминалом Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5. 09 - Сравнение строки, принятой через UART. Л и с т и н г 5 .9 . П р о г р а м м а U A R T r # in c lu d e < a v r / io .h > // З аголов оч н ы й ф айл в в о д а -в ы в о д а для // и сп ользуем ого // С тандартны е < s td io .h > # in c lu d e < a v r / p g m s p a c e .h > // Ф ункция s .с // # in c lu d e v o id c и н и ц и али зац и и // в п одклю чает п роекте средства У тилиты определения устройства, для в в о д а -в ы в о д а работы с F la s h - пам ятью UART U A R T IN IT () { UCR UBRR |= = (1 << 0x17; 3) | (1 // << 4 ); // Разреш аем // передатчика У станавливаем скорость работу и прием ника п ередачи 9600 бод 99 Работа с UART в AT90S2313 Л и с т и н г 5 .9 . П р о д о л ж е н и е // при частоте МК 3 .6 8 6 4 М Гц } // Ф ункция, // вы вод s ta tic которая будет вы зы ваться при обращ ен ии потока на сим вола in t u a r t_ p u tc h a r (c h a r s im v o l, F IL E ‘ s tre a m ) { lo o p _ u n til_ b it_ is _ s e t(U S R , UDR = s im v o l; U D R E ); // П ересы лаем // содерж ащ ийся через в // О ж идаем // в появления разряде UART байт перем енной 1 UDRE данны х, s im v o l 0; re tu rn }'• // Ф ункция, // ввод s ta tic которая будет вы зы ваться при обращ ении потока на си м вола in t u a r t_ g e tc h a r (F IL E ‘ s tre a m ) { w h ile ( ! (U S R re tu rn & (1 << 7 ) ) ) ; // О ж идаем , пока // заверш и тся установкой в // в USR заверш ен ) р еги стр е UDR; //ф ункция (п р и е м вернет ед и н и ц у приняты й прием си м вола разряда 7 (R X C ) сим вол } // С оздаем // u a rt_ p u tc h a r // И спользуем s ta tic поток F IL E m y s t d o u t_ m y s t d in , для ввод вы вода, и а вы вод, m y s t d o u t_ m y s t d in ф ункцию u a rt_ g e tc h a r установив ф лаг - для ввода. _FD E V _SE TU P_R W = F D E V _ S E T U P _ S T R E A M (u a r t_ p u t c h a r , in t н азн ачи в ф ункцию u a rt_ g e tc h a r, _ F D E V _ S E T U P _ R W ); m a in (v o id ) { U A R T _ IN IT (); // П ередаем // s td o u t s t d in in t = (н а w h ile И н и ц и али зац и я пам яти вы вод) s td o u t k o l_ s im ch ar // адрес = и в н аш его UART потока стандартны й в стандартны й поток s td in (н а поток ввод) & m y s td o u t_ m y s td in ; = 1 0 ; fr o m _ u a r t [k o l_ s im ]; (1 ) // Разм ерн ость м ассива // п риним аем ы х через // М ассив // Б ескон ечн ы й из 10 сим волов, UART элем ен тов цикл { // П риним аем // приняты // сим вол // fr o m _ u a r t строку все новой 10 из строки после UART сим волов в м ассив или пока '\ п ' введенны х (о н fr o m _ u a r t, не такж е будет пока зап и сы вается с и м в о л о в ). не встречен в м асси в 100 Глава 5 Л и с т и н г 5 .9 . О к о н ч а н и е fg e ts (& fr o m u a r t[0] , // С равниваем // со строкой, // то в k o l_ s im + l, строку, содерж ащ ую ся разм ещ ен н ой п ерем ен н ую & m y s td o u t_ m y s td in ); s r a v n ili во в перем енной F la s h -п а м я ти . будет зап и сан (s r a v n ili < 0) p u t c h a r ( 1< 1 ) ; // // e ls e i f (s r a v n ili > 0) i f (s r a v n ili == 0) p u t c h a r ( 1= ' ) ; Е сли 67 8 9 " ) ) ; s r a v n ili< 0 , то Е сли s r a v n ili> 0 , то f r o m _ u a r t > " 0 1 2 34 5 6 7 8 9 " // // равны , fr o m _ u a r t < "0 1 2 3 4 5 6 7 8 9 " p u t c h a r ( 1> 1) ; / / // они 0 in t s r a v n i l i = strcm p _P ( f rom _uart, PSTR ( " 0 1 2 3 4 5 i f fr o m _ u a r t, Е сли Е сли s r a v n ili= = 0 , то fr o m _ u a r t= "0 1 2 3 4 5 6 7 8 9 " }; re tu rn 0; } Результат работы программы показан на рис. 5.20. Р и с . 5.20. Р е з у л ь т а т с р а в н е н и я с т р о к и У п равлени е вы водам и с пом ощ ью U AR T Программа (листинг 5.10) выводит через U A R T цифровое меню, предлагая сделать выбор от 0 до 9. В зависимости от выбора напряже­ ние +5 В подается на тот или иной вывод микроконтроллера. Текст для меню извлекается из массива s t r [ ] , хранимого с целью экономии О ЗУ микроконтроллера в Flash-памяти программ. Схема соединений — такая же как на рис. 5.6. щ Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5 .10 - Управление вы­ водами с помощью UART. 101 Работа с U A R T в A T 9 0 S 2 3 1 3 Листинг 5.10. Программа U A R T _ f l a s h _ m a s _ t o _ u a r t . с t t in c lu d e < a v r / io .h > // Заголовочн ы й ф айл подклю чает // в в о д а -в ы в о д а для // и сп ользуем ого // Стандартны е # in c lu d e < s t d io .h > # in c lu d e < a v r / p g m s p a c e .h > // Ф у н кц и я и н и ц и а л и з а ц и и v o id ÜART // определения устройства, в проекте средства в в о д а -в ы в о д а У т и ли т ы д л я р а б о т ы с F l a s h -п а м я т ь ю UART IN IT O { UCR |= (1 UBRR = << 3) I (1 0x17; << 4 ); // Разреш аем // передатчика // Устанавливаем // при ч а с т о т е работу скорость МК 3 .6 8 6 4 и прием ника передачи 9600 бод МГц } // Ф ункция, // вы вод s t a t ic которая будет вы зы ваться при обращ ении п о т о к а на сим вола in t u a r t p u t c h a r (c h a r s im v o l, F IL E ‘ stre am ) { lo o p _ u n t il_ b it _ is _ s e t (U S R , UDR = s im v o l; retu rn Ü D R E ); // П ересы лаем // содерж ащ и й ся через в // Ож идаем п о я в л е н и я // в разряде UART б а й т перем енной 1 UDRE данны х, s im v o l 0; }; // Ф ункция, которая будет вы зы ваться // в в о д сим вола s t a t i c in t u a r t _ g e t c h a r (F IL E при обращ ении п о т о к а на ‘ stre a m ) { w h ile ( ! (U S R & // (1 / / в retu rn << 7 ))); заверш ится регистре UDR; // О ж и д аем , пока установкой в USR заверш ен) //ф ункция (п р и е м вернет прием сим вола ед и н и ц у р а з р я д а приняты й 7 (R X C ) сим вол } // С озд аем // u art_p u tch ar // И сп ользуем s ta t ic поток F IL E m y s t d o u t_ m y s td in , для ввод вы вода, и вы вод, а установив m y s t d o u t m y s t d in С ледую щ ая // (fla s h ). s t a t ic 2 ) PB1 char 1/0 строка М ассив s t r [] \r\n хранится не мож но б ы ло PROGMEM 3 ) P B2 1/0 функцию - для ввода. ф л а г _F D E V _ S E T U P _ R W = F D E V _ S E T U P _ S T R E A M (u a r t _ p u tc h a r , // н азначив функцию u a r t _ g e t c h a r u art_ge tc h a r, в еще ОЗУ, а в объявить = "\ r\ n \ r\ n 4 ) PB3 М еню : 1/0 _ F D E V _ S E T U P _ R W ); п ам яти как \ r\ n \ r\ n програм м p ro g_ch ar 1 )P B 0 5 )P B 4 1/0 s t r []= 1 /0 \r\n \ r\ n 102 Глава 5 Листинг 5.10. Окончание 6 )Р В 5 1/0 ном ер от \r\ n 1 7 )Р В 6 до 8, 1/0 \ r\ n чтобы 8 )Р В 7 подать 1/0 +5V \r\n на 0 )Е Х 1 Т \ г \ п вы вод МК, введите или 0 для в ы х о д а\ г\ п "; in t m a in (v o id ) { U A R T _ IN IT (); // П ередаем // адрес И н и ц и али зац и я пам яти наш его UART потока // s t d o u t (н а вы вод) и в с т ан д а р т н ы й s t d i n = s t d o u t = & m y s t d o u t _ m y s t d in ; D D R B = 0 x ff; // Выводы п о р т а w h ile // Бесконечны й (1 ) В в стандартны й поток - s t d in поток (н а ввод) выходы цикл { // В ы водим меню // Ц икл // разм ещ ен н ого fo r fo r (in t i (м а с с и в str) вы полняется = 0; в до через тех пор, F l a s h -п а м я т и , не UART пока из будет p g m re a d b y te (& s t r [i]); м ассива считан str, сим вол "\ 0 " i= i+ l) { p u t c h a r (p g m r e a d b y t e (& s t r [i]) ) ; // адресу s t r [i] и // С ч и т ы в ае м вы водим е г о байт через по UART }; char ch oose; ch oose if = getch arO ; (c h o o s e == // П ри н и м аем ч е р е з '0 ') // //В зависим ости // со о т в ет ст в у щ и й s w it c h (c h o o s e ) UART вы бранны й / / в меню с и м в о л break ; / / Е с л и в ы б р ан от вы бранного вы вод порта бесконечного пункта case case case case case case case d e fa ' 1 : PORTB = : PORTB = ■ 3 : PORTB = ■4 : PORTB = ' 5 ' : PORTB = ■6 : PORTB = 17 : PORTB = ' 8' : PORTB = u lt : p u tc h a r( •2 O bO O O O O O O l; break ; O bO O O O O O lO ; break ; ObO O O O O lO O ; break ; O bO O O O lO O O ; break ; O bO O O lO O O O ; break ; O bO O lO O O O O ; break ; O bO lO O O O O O ; break ; 0Ы 0000000; brea k ; ?' ); } }» retu rn вы ходим и з цикла меню п о д а е м В { case 0, 0; } Р езульта т работы программы показан на рис. 5.21. +5 В на 103 Работа с U A R T в A T 9 0 S 2 3 1 3 -Ü [3 Virtual Terminal 0)EXIT введите номер от 1го до 8 чтобы подать +5U на ножку МК, или 0 выход Меню: 1)РВ0 1/0 2)РВ1 1/0 V 3)РВ2 1/0 ¿ОРВЗ 1/0 5)РВ4 1/0 6)РВ5 1/0 7)РВб 1/0 8)РВ7 1/0 0)ЕХ1Т введите номер от 1го до 8 чтобы подать +5U на ножку МК, или 0 выход Рис. 5.21. Управление выводами микроконтроллера с помощью UART Реализация приглашения командной строки Н еск ольк о м о д и ф и ц и р у ем р а ссм о т р ен н у ю вы ш е п р огр ам м у, чтобы реал и зов ать в н а ш ем м ен ю п р и гл а ш ен и е к о м а н д н о й стр ок и . Д ля эт о г о м ы в о сп о л ь зу ем ся си м в ольн ы м и м асси в ам и , р а зм ещ ен н ы м и в п ам я ти п р о г р а м м (F la s h ) (к о р р ек т и в ы в ы д е л е н ы в л и с т и н г е 5 .1 1 п о л у ж и р н ы м ш р и ф т о м ). Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\5 .11 - Реализация к о ­ мандной строки. Листинг 5.11. Программа U A R T _ f l a s h _ m a s _ t o _ u a r t . c # in c lu d e < a v r / io .h > // Заголовочн ы й ф айл п одклю чает // в в о д а -в ы в о д а для // и сп ользуем ого // Стандартны е # in c lu d e < s td io .h > # in c lu d e < a v r / p g m s p a c e ,h > // определения устройства, в проекте средства в в о д а -в ы в о д а // Ути ли ты д л я р а бо т ы с F l a s h -п а м я т ь ю Ф ун кц и я и н и ц и а л и з а ц и и UART v o id U A R T _ I N I T () { UCR |= UBRR = (1 << 3) I 0x17; (1 << 4 ); // // // Устанавливаем // при ч а с т о т е Разреш аем р а б о т у п ер ед а т ч и к а и прием ника скорость МК 3 .6 8 6 4 передачи 9600 МГц } // Ф ункция, // вы вод которая сим вола будет вы зы ваться при обращ ении потока на бод 104 Гл ав а 5 Листинг 5.11. Продолжение s ta t ic in t u a r t _ p u t c h a r (c h a r s im v o l, F IL E ‘ stre am ) { lo o p _ u n t il_ b it _ is _ s e t (U S R , UDR = s im v o l; U D R E ); // П ересы лаем // содерж ащ ий ся // через в Ож идаем п о я в л е н и я 1 / / в р а з р я д е UDRE UART б а й т д а н н ы х , п ерем енной s im v o l 0; retu rn }? // // Ф ункция, к о т о р а я ввод сим вола s ta t ic in t будет вы зы в аться u a r t _ g e t c h a r (F IL E при обращ ении п о т о к а на *strea m ) { w h ile ( ! (U S R retu rn & (1 << 7 ))); // О ж и д аем , пока // заверш ится установкой в // в реги стре USR заверш ен ) UDR; //ф ункц ия (п р и е м вернет прием сим вола ед и н и ц у р а з р я д а п ри н я ты й 7 (R X C ) си м вол } // С озд аем // u art_p u tch ar // И спользуем s t a t ic поток F IL E m y s t d o u t _ m y s t d in , для ввод вы вода, а и вы вод, установив m y s t d o u t _ m y s t d in Ф ун кц и я передачи строки, функцию - для ввода. ф л а г _F D E V _ S E T U P _ R W = F D E V _ S E T U P _ S T R E A M (u a r t _ p u t c h a r , // назначив функцию u a r t _ g e t c h a r u art_ge tc h a r, хранящ ейся в _ F D E V _ S E T U P _ R W ); пам яти // А д р е с п е р в о г о си м вола п е р е д а е т с я ч е р е з v o i d S e n d S T R _ P (c o n s t c h a r * F la s h S T R ) F la s h указатель * F la s h S T R { u in t8 _ t i; // Ц икл fo r // будет fo r вы полняется считан (i= 0 ; сим вол до "\ тех пор, пока из F l a s h -п а м я т и не 0" p g m r e a d b y t e (fc F la s h S T R [i] ) ; i ++ ) { // П ередаем p u t c h a r (p g m через read UART с и м в о л по адресу F la s h S T R [i] b y t e (S c F la s h S T R [ i ] ) ) ; } } // Следую щ ия м а с с и в ы const char 2 )P B 1 1/0 6 ) PB5 1/0 m en u [ ] \ r\n \ r\ n ном ер от 1 до в ы х о д а\ г\ п "; хранятся PROGMEM 3 ) PB2 1/0 7 ) PB6 1/0 8, чтобы = не \r\n \r\n в ОЗУ, "\ r\ n 4 ) PB3 8 ) PB7 подать а Меню: 1/0 1/0 +5V на в пам яти програм м \ r\n 1 )P B 0 1/0 \ r\ n \ r\n 5 )P B 4 1 /0 \ r\ n \r\n 0 )E X I T \ r \ n вы вод МК, или введите 0 для 105 Работа с U A R T в A T 90 S 2 31 3 Л истинг 5.11. Продолжение const char unknown [] const char q u it [] const char c m d [] PROGMEM = PROGMEM = PROGMEM = // О бъ являем м асси в // п рограм м . Тип Н еизвестная к о м ан д а \ г\ п "; П рои зош ел в ы х о д \ г \ п "; c m d > "; a r r a y [] определен // у к а з а т е л ь н а тип c h a r P G M P a r r a y [ 3 ] PROGMEM = in t "\ r\ n указателей PG M _P "\ r\ n "\ r\ n как на строки const в п ам яти p ro g_ch ar *, (т .е . д л я си м в о ла в пам яти п рограм м ) {m e n u , u n k n o w n , q u i t } ; m a in (v o id ) { U A R T _IN IT ( ) ; // П ередаем // std o u t s t d in = // адрес (н а И н и ц и али зац и я п ам яти н аш его вы вод) std o u t = и в UART потока стандартны й в стандартны й поток s td in поток (н а ввод) & m y s t d o u t _ m y s t d in ; D D R B = 0 x ff; // Выводы п о р т а w h ile // Бесконечны й (1 ) В - выходы цикл { S e n d S T R _ P (& a r r a y [0 ] [ 0 ] ) ; S e n d S T R _ P (& c m d [ 0 ] ) ; ch ar // Вы водим меню Вы водим п р и г л а ш е н и е (м а с с и в ком андной m en u ) строки ch oose; ch oose if // = getch arO ; (c h o o s e == '0 ') // В зави си м ост и // соответствущ и й s w it c h // П ри н и м аем ч е р е з // в меню с и м в о л break ; от UART // Если // беск он ечн ого вы бран н ого вы вод п о р т а пункта в ы б р ан вы бранны й 0, вы ходим и з цикла меню п о д а е м +5 В на В (c h o o s e ) { case '1 ' PORTB = O bO O O O O O O l; break case '2 ' PORTB = O bO O O O O O lO ; b reak case '3 ' PORTB = O bO O O O O lO O ; b reak case PORTB = O bO O O O lO O O ; break case 14 ' 15 1 16 ' case case case PORTB = O bO O O lO O O O ; break PORTB = O bO O lO O O O O ; b reak '7' PORTB = 0b 01000000 ; break 18 ' PORTB = 0Ы 0000000 ; break S e n d S T R _P ( s a rr a y [1 ][0 ]); d e fa u lt : // ch oose // ф разу не равна "Н еи зв ест н ая } Вы водим с т р о к у и з ОЗУ ч е р е з от ком анда" }; / / // Е с л и п е р е м е н н а я сим волам UART 0 до 8, то вы водим 106 Г л ав а 5 Л истинг 5.11. Окончание c h a r b u f[2 0 ]; // strc p y J P (b u f , & q u it [0 ]); // fo r Вы водим с т р о к у (in t retu rn i= 0 ; И н и ц и али зи р уем через i< 2 0 ; i+ + ) // К опируем // в м ассив UART м ассив, строку b u f, ра зм е щ ен н ы й в ОЗУ q u it из F la s h ра зм е щ ен н ы й p u t c h a r (b u f[i]) ; 0; } Р е з у л ь т а т р а б о т ы п р о г р а м м ы п о к а з а н н а р и с . 5 .2 2 . Virtual Terminal введите номер от 1го до 8 чтобы подать +5и на ножку ПК, или 0 выход cnd>7 Меню: 1)РВ0 1/0 :.'Ш V 2)РВ1 1/0 3)РВ2 1/0 4)РВЗ 1/0 5) PB1» 1/0 6)РВ5 1/0 7)РВ6 1/0 * 8) PB7 1/0 ' 0)ЕХДТ введите номер от 1го до 8 чтобы подать +SU на ножку НК, или 0 выход cnd>| Рис. 5.22. Реализовано приглашение командной строки в ОЗУ Глава 6 А н а л о г о в ы й к о м п а р а т о р A T 9 0 S 2 3 1 3 За аналоговы м к ом п ар атор ом зак р еп лен ы дв а вы вода м и к р о к о н ­ т р о л л ер а : РВО (A I N 0 ) и Р В 1 (A I N 1 ). К о г д а н а п р я ж е н и е н а п о л о ж и т е л ь ­ ном в х о д е бол ьш е н ап ря ж ен и я на отрицательном , устанавливается р а з­ р я д A C O в р е г и с т р е A C S R (р е г и с т р у п р а в л е н и я и с о с т о я н и я а н а л о г о в о ­ г о к о м п а р а т о р а ). Д л я и н д и к а ц и и т о г о , н а к а к о м в х о д е (A I N 0 и л и A I N 1 ) н а п р я ж е н и е б о л ь ш е, мы о п р е д е л и м вы воды P D 0 и P D 1 как вы ходы и п о д к л ю ч и м к н и м с в е т о д и о д ы (р и с . 6 .1 ). П ол ож и тел ьн ы й и отрицательны й вы воды ком п ар атор а о п р ед ел я ем как в х о д ы , и о т к л ю ч а е м н а н и х в н у т р е н н и е п о д т я г и в а ю щ и е с о п р о т и в ­ л ен и я : 108 Глава 6 DDRB &= PORTB &= ~(1 « 0 ) & ~ (1 « 1 ) ; ~(1 < < 0 ) & ~(1 « 1 ) ; Затем разреш аем работу компаратора и реализуем бесконечны й цикл, в котором проверяем состояние пятого разряда (A CO ) регистра ACSR. Если он содерж ит 1, напряжение на положительном входе РВО (A IN 0) больш е, чем на отрицательном PB 1 (A IN 1 ). В программе (листинг 6.1) задано условие: при появлении единицы в разряде A C O подаем на вывод P D 0 +5 В, а на PD1 — 0 В, и наоборот: если разряд A C O обнулился, на P D 0 подаем 0 В, а на PD1 — +5 В. Исходные ф айлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT 9 0S 2 31 3 \6 - А н а л о г о в ы й к о м п а ­ ? ратор. Листинг 6.1. Программа АС. с # in c lu d e in t < a v r / io .h > // Заголовочны й ф айл п од к лю чает // в в о д а -в ы в о д а для // и сп ользуем ого определения устройства, в проекте m a in (v o id ) { DDRD = 0x03; PORTD = 0x00; DDRB &= -(1 PORTB ~ (1 &= AC S R & = // << << « ~ (1 0) // Выводы P D 0 ,P D 1 // Н а вы воды п о р т а & ~ (1 0) << & ~ (1 7 ); ком паратор, w h i l e (1 ) << выходы D подаем 0 В // Выводы Р В 0 ,Р В 1 - 1 );/ / Выводы Р В 0 ,Р В 1 - вы со ко ом н ы е // // п о д т я ги в а ю щ и х с о п р о т и в л е н и й ) Разреш аем и с п о л ь з о в а т ь ан ало го в ы й 0 в разряд Бесконечны й входы 7 (б е з входы // зап и сав // 1 ); - (A D C ) внутренних регистра ACSR цикл { if (A C S R & (1 << 5 )) { PORTD |= PORTD & = } e ls e } } } (1 << -(1 0 ); << 1) ; { PORTD &= ~ (1 PORTD |= (1 << << // Если // регистра // то // а // И наче, 0 ); 1 ); в на на в ы в о д PD1 а на если на (A C O ) ACSR п о я в и л а с ь вы вод PD0 // // пятом р а з р я д е подаем подаем AC0 = в ы вод в ы вод PD1 еди н и ца, +5 0, PD0 п о д а е м - В, 0 В +5 В 0 В, Глава 7 Р а б о т а с п р ер ы в а н и я м и в A T 9 0 S 2 3 1 3 Прерывания (interrupts) — это вызовы определенны х функций, ге­ нерируемы е, главным образом, аппаратной частью микроконтроллера. В результате прерывания вы полнение программы приостанавливается, и происходит п ер еход к соответствую щ ей подпрограм м е обработки прерывания. Прерывания бывают внутренними и внеш ними. И сточни­ ками внутреннего прерывания являются встроенные м одули микрокон­ троллера (например, таймер/счетчик или сторож евой таймер). В неш ние прерывания вызываются сбросом (сигнал на выводе R ESET) или сигна­ лами заданного уровня на выводах INT. В программах для компилятора W inA V R подпрограммы обработки прерываний определяю т с помощ ью следую щ ей конструкции: I S R (В е к т о р _ п р е р ы в а н и я ) { // П рограм м н ы й к о д обработки преры вания J ___________________________________________________________________________________ Здесь В ект ор преры вания — это ф иксированное усл овн ое обозн а­ чение типа прерывания, например: • T I M E R O _ O V F O _ v e c t — прерывание по переполнению счетного регистра таймера/счетчика 0; • U A R T _ U D R E _ v e c t — прерывание при опустош ении регистра дан ­ ных U D R приемопередатчика U A R T и т.д. Такие обозначение определены в библиотечном заголовочном ф ай­ ле a v r / i n t e r r u p t . h . П р ер ы в а н и е р еги ст р а п р и п е р е п о л н е н и и сч ет н о г о T C N T 0 Схема соединений в данном примере такая же, как представленная на рис. 3.3. Внутренний таймер настроен так, что через кажды е 1024 / 40 0 0 0 0 0 М Гц = 0,00 0 2 5 6 с увеличивается значение счетного регистра TCNT0. 110 Глава 7 О тличие эт о го п ри м ера от програм м ы , п р едстав л ен н ой в л и сти н ге 3 .1 , за к л ю ч а е т с я в т о м , ч т о в м е с т о у с л о в н о г о в ы р а ж е н и я , в к о т о р о м н а р авен ств о н у л ю п ров ер яется зн а ч ен и е T C N T 0 , мы в осп ол ь зуем ся п р е­ р ы в а н и е м п о п е р е п о л н е н и ю т а й м е р а /с ч е т ч и к а 0 (л и с т и н г 7 .1 ). Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7. 01 - Прерывание при переполнении счетного регистра TCNT0. Л истинг 7.1. Программа t im e r _ c o u n t e r 0 _ 8 b it _ in t e r r u p t .c # in c lu d e // Заголовочны й ф айл п о д к лю ч ает // в в о д а -в ы в о д а для < a v r / io .h > // и сп о ль зу ем о го в п ро ек т е < a v r / in t e rr u p t .h > / / Д ля р а б о т ы # in c lu d e // П одпрограм м а о б р а б о т к и I S R (T I M E R O _ O V F O _ v e c t ) преры вания определения устройства, при с п р е р ы в ан и я м и переполнении TCNT0 { PORTD = 0x7F ; // П оскольку зн ач ен и е счетного // см ен и лось с 0, // порта 255 D п одаем на +5 на реги стра все выводы В } in t m a in (v o id ) { DDRD = 0x7F; PORTD = TCNT0 0x7F; = 0 ; //Н астройка // 01111111 // как // P D 0 -P D 7 ) - (в 01111111 // уровень на // И н и ц и али зац и я // тайм ера/счетчикаО , лог. все вы воды п о р т а порту D в сего // всех 1 (+ 5 вы водах 7 вы водов: порта D - В) счетного // И н и ц и али зац и я // тайм ером /счетчиком // O b lO l) реги стра на // что // реги стра //Н астройка преры вания << 1 ); частоту каж ды е 0. управления Значению 0 ,0 0 0 2 5 6 TCNT0 будет 5 настройка 4000000/1024 (и с п о л ь з о в а н T IM S K реги стра соответствует // // (1 определяем тайм ера/счетчикаО TC CR 0=0x05; |= - вы ходы с Гц. Это зн ач ен и е (т .е . тайм ера значит, счетн ого увеличиваться п редварительны й д е л и т е л ь ) // П ервы й р а з р я д // м аскирования преры ваний // равен значит, // р азр еш ен о 1. Это (T O IE O ) преры вание регистра что по T IM S K D 111 Работа с прерываниями в AT90S2313 Л истинг 7.1. Окончание s e i(); w h ile d ) // переполнению // т .е . // досчитав // п рои зойд ет // T IM E R O _O V F O _v e c t // Запись // озн ачает // Бесконечны й когда до ед и н и ц ы в р а з р я д общ ее тайм ера/счетчика сч е т н ы й р е г и с т р 255, сбросится преры вание 7 регистра разр еш ен и е по 0, TCNT0, в О, вектору SREG, что преры ваний. цикл { // Если // порта счетны й р е г и с т р if (T C N T 0 D подаем == 0x8 0) содерж ит 128, то на все вы воды О В { PORTD = 0 x0 0 ; } } } Р а б о т а т а й м е р а /с ч е т ч и к а и м п у л ь с о в н а в н еш н ем 0 в р еж и м е сч ет ч и к а в ы в о д е Схема соединений в данном примере такая ж е, как представленная на рис. 3.4. Таймер/счетчик настроен на использование источника внеш ­ них тактовых сигналов, приходящ их на вывод PD4. Отличие этого при ­ мера от программы, представленной в листинге 3.2, заключается в том, что в нем используется подпрограмма обработки прерывания, по п ере­ полнению счетного регистра T C N T0. П осле 20 отсчетов сработает век­ тор прерывания T IM E R O _O V F O _vect, и будет вызвана соответствую ­ щая подпрограмма обработки. Для того чтобы переполнение сработало на 20-й отсчет, счетный регистр инициализируется значением 236. Щ Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7. 02 - Режим счетчика импульсов на внешнем выводе ТО. Л истинг 7.2. # in c lu d e iin c lu d e // Программа < a v r / io .h > c o u n t e r 0_ 8b i t _ i n t e r r u p t . c // Заголовочны й ф айл под клю чает // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / in t e r r u p t .h > П одп рограм м а обработки // преры вания определения устройства, в проекте Д ля работы с преры ваниям и при п ер е п о л н е н и и TCNT0 I S R (T I M E R O _ O V F O _ v e c t ) { PORTB = O x ff; // На в с е TCNT0 = О хЕ С ; // TCNT0=236, вы воды п о р т а чтобы до В подать +5 переполнения В 112 Глава 7 Листинг 7.2. Окончание 20 // оставалось отсчетов // 0Ы 1111111 все // 0Ы 1111111 на // подаем } in t m a in (v o id ) { DDRB = O x ff; PORTB = DDRD = ~ (1 PORTD TCNT0 O x ff; ]= 1 = << 4) ; 4; ОхЕС; //Н астройка TCCR0 « = // направления // D, т .е . вы ходы В Это // п од тя ги ваю щ и м // С ч ет н ы й р е г и с т р // переполнения PD4 1 в разр яд зн ачи т, что 4 регистра передачи вы вод Записы ваем - данны х п о р т а вход 4 регистра вы вод PD4 PORT. будет нагруж ен сопротивлением содерж ит 236, 20 оставалось // TCCRO = O b O O O O O H l // зн ач ен и е // увеличиваться // вы воде - счетн ого чтобы до отсчетов ТО по это под клю чи ли к вы воду рези стор, // ф ронта << 1 ); будет PD4 п о д т я ги в аю щ и й появления подать ниспадаю щ его на в ы во д (T O IE O ) 0 В. // П ервы й р а з р я д // м аскирования п р е р ы в а н и й T IM S K // равен зн ачи т, // разр еш ен о // п ереполнению // т .е . // досчитав // п роизойдет 1. Это когда Запись // озн ачает // Б есконечны й ци к л регистра что преры вание по тайм ера/счетчика счетны й р е г и с т р до 2 55, сбросится п реры ван и е / / T IM E R O _ O V F O _ v e c t ед и н и ц ы в р а з р я д 7 р е г и с т р а // на П о с к о л ь к у в н у т р и МК мы // следует что T C N T0 н и сп ад аю щ ем у ф р о н т у (P D 4 ). для зн ачи т, реги стра // преры вания w h i l e (1 ) О бнуляем р а з р я д // //Н астройка s e i(); - В // // T IM S K (1 В вы воды п о р т а тайм ера/счетчика0 0x07; |= +5 выводы п о р т а все общ ее р а зр еш е н и е по 0, TCNT0, в 0, вектору SREG, что преры ваний. { if } (T C N T 0 == 0xF6) // содерж ит // на все 0xF5 { PORTB (2 4 6 ), выводы п о р т а = 0x00; т .е . } счетчик D п одаем 0 В // сделал Если сч е т н ы й 10 отсчетов, 113 Р абота с п р е р ы в а н и я м и в A T 9 0 S 2 3 1 3 П р ер ы в а н и е р еги ст р а п р и п е р е п о л н е н и и сч ет н о г о T C N T 1 Схема соединений в данном примере такая же, как представленная на рис. 3.7. Таймер/счетчик 1 считает в цикле от 0 до 65535. П ереполне­ ние счетного регистра TCNT1 возникает при п ереходе от 65535 к 0. В подпрограмма обработке прерывания T I M E R l_ O V F l_ v e c t на все вы­ воды порта D подается +5 В. Регистр управления TCCR1 настроен так, что значение счетного р е ­ гистра TCNT1 увеличивается на единицу каждые 0 ,0 0 0 0 1 6 с (при часто­ те микроконтроллера 4 М Гц). К огда это значение достигнет 3 2768, т.е. через 32 768 • 0 ,0 0 0 0 1 6 = 0 ,5 24288 с, на всех вы водах порта D устан о­ вится 0 В. | Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7. 03 - Прерывание при переполнении счетного регистра TCNT1. Л истинг 7.3. # in c lu d e t t in c lu d e // Программа < a v r / io .h > t im e r _ c o u n t e r l_ 1 6 b it _ in t e r r u p t . с // Заголовочны й ф айл п о д к лю ч ает // в в о д а -в ы в о д а для // и сп ользуем ого в проекте < a v r / in t e r r u p t .h > / / Д ля р а б о т ы П одпрограм м а обработки преры вания определения устройства, при с преры ваниям и переполнении TCNT1 IS R (T IM E R l_ O V F l_ v e c t ) { PORTD = 0x7F; //Н а все вы воды п о р т а D подаем +5 В. } in t m a in (v o id ) { DDRD = 0 x7 F ; PORTD = 0x7F ; //Н астройка ТССН 1А = TCCR1B = // 01111111 // как // РБ 0-Р О 7) - вы ходы // 01111111 // уровень - опред еляем (в на лог. все вы воды п о р т а порту Б в сего всех 1 (+ 5 вы водах Б 7 вы водов: порта Б - В) тайм ера/счетчика1 0x00; 0x03; // Режим с о в п а д е н и я // п о с к о л ь к у мы н е // совпадения O C R l; // О ЬО О О О О О Н - // и сп ользуем , // Не и с п о л ь з у е м на вы ходе и сп ользуем такж е реги стр з а п р е щ е н а ШИМ захвата п о это м у разр яд ы реги стр отклю чен, реги стр (IC R 1 ) 6 -7 совпадения = не 0. (O C R l), 114 Гл а в а 7 Л истинг 7.3. Окончание // поэтом у // счетны х // разр яд ам и // разряд ах // им пульсов // 6 4 / 4 0 0 0 0 0 0 (4 М Г ц ) // T CNT1 //Н астройка преры вания T IM S K « |= (1 7 ); разряд w h i l e (1 ) 0 -2 . для - В ы б и р а ем реги стра Значение озн ачает, частота = 7 011 что МК / на в этих 64, т .е . с Разряд // м аскирования п реры ван и й // единицу. значит, // разр еш ен о // п ереполнению // К огда // регистра // обнулится, // м ож ет // озн ачает // Бесконечны й общ ее по м иновав 65535, преры вание T IM E R l_ O V F l_ v e c t назы ваться вектор (д л я преры вания и н а ч е !) 7 регистра разр еш ен и е 1. счетного произойдет МК э т о т ед и н и ц ы в р а з р я д содерж ит что тайм ера/счетчика TCNT1, вектору другого каж ды е регистр реги стра преры вание содерж и м ое // Запись Это счетны х ед иницу. // // (T O IE 1 ) и сточник TCNT1 частота 0 ,0 0 0 0 1 6 увеличивается //п о s e i(); 3 = 0 . им пульсов SREG, что преры ваний. цикл { if { (T C N T 1 PORTD = == 0x8000) 0x00; } // Если //н а T CNT1 все содерж ит вы воды п о р т а 32768, то D подаем 0 В } } Р а б о т а т а й м е р а /с ч е т ч и к а и м п у л ь с о в н а в н еш н ем 1 в р еж и м е сч етч и к а в ы в о д е С хема соединений в данном примере такая же, как представленная на рис. 3.8. В данном примере таймер/счетчик 1 настроен на использо­ вание источника внеш них тактовых сигналов. К выводу микроконтрол­ лера PD 5 подклю чена кнопка, и значение счетного регистра TCNT1 увеличивается на единицу по каждому ниспадаю щ ем у фронту напряже­ ния на выводе Т 1 (PD 5). П осле пятого нажатия кнопки на все выводы порта В подается 0 В. Повторное пятикратное нажатие кнопки приводит к прерыванию по пе­ реполнению регистра T C N T 1, вследствие чего вызывается соответст­ вующая подпрограмма обработки, в которой на все выводы порта В по­ дается +5 В, а счетном у регистру присваивается значение 65 526. При таком значении до следую щ его переполнения останется 10 отсчетов. 115 Работа с прерываниями в AT90S2313 Э та схем а б у д и т правильно работать только в и м итаторе, п оск ол ь к у в н ет отсутств ует д р е б е зг контактов. П ри н аж атии на к ноп ку п р о и с х о ­ д и т м н о г о к р а т н о е з а м ы к а н и е и р а зм ы к а н и е е е к о н т а к т о в . П о с к о л ь к у м и крок онтроллер р а бот ает н а вы сок ой ч астоте, он п р и н и м ает этот д р е ­ б езг за наж атия. Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7. 04 - Режим счетчика * импульсов на внешнем выводе Т1. Листинг 7.4. Программа сошз^ег1_16Ь^_1^еггир^с #з.пс1ис1е < a v r / io .h > // Заголовочны й ф айл подклю чает // в в о д а -в ы в о д а для // и сп о льзуем ого в проекте < a v r / in t e rr u p t .h > / / Д ля р а б о т ы #1пс1ийе // П одпрограм м а о б р а б о т к и Т Б И (Т 1 М Е Я 1 О У Р1 v e c t ) преры вания при PORTB = O xFF; //Н а T C N T1 = 0xFFF6; // ТСКГТ1 = 6 5 5 2 6 , // оставалось // // // 0Ы 1111111 - все 0Ы 1111111 - на весь порт определения устройства, с п реры ваниям и п ереполнении ТСГТТО В подать +5 чтобы переполнения 10 до В отсчетов } in t m a in (v o id ) { DDRB = PORTB DDRD O xFF; = OxFF; I= PORTD -(1 « 1= 1 < < подаем 5) 5; // // // +5 = 0x0 6; // направления // D, т .е . зн ачи т, вы вод PD5 что - данны х 5 регистра в ы в о д PD5 будет на вы ходе отклю чен, // совпадения // ОЬО О О О О НО . Регистр // и сп ользуем , п оэтом у разр яд ы // Регистр // поэтом у р а зр я д с // 1 10 , O C R l; такж е совпадения значит реги стр з а п р е щ е н а ШИМ з а х в а т а JCR1 0CR1 3 = 0 . для не 6 -7 0 -2 . источником не = 0. и сп ользуем , И сточник реги стра помощью р а з р я д о в а PORT. нагруж ен соп роти влен и ем п о с к о л ь к у мы н е и с п о л ь з у е м // порта вход // им пульсов вы ходы В 5 реги стра передачи 1 в разряд п о д тя ги ваю щ и м // - В О бнуляем р а з р я д //Н астройка тай м ер а/сч ет ч и к а! T CCR 1A = 0 x 0 0 ; / / Реж им с о в п а д е н и я TC CR 1B В вы воды п о р т а // Записы ваем Это вы воды п о р т а все счетны х ТС№Г в ы б и р ае м Они с о д е р ж а т счетны х 116 Глава 7 Л истинг 7.4. Окончание // им пульсов // (п е р е х о д // Т1 (в TCNT1 = 0xFFF6; с - сигнала содерж им ое преры вания << 7 ) ; +5 О В) P D 5 ), т .е . на 7 +5 на значит, чтобы до содерж ит что преры вание по тайм ера/счетчика содерж им ое TCNT1, м иновав 65535, произойдет // по T T M E R l_ O V F l_ v e c t вектору / / м ож ет // Запись // озн ачает // Бесконечны й ци к л МК э т о т общ ее вектор н азы ваться ед и н и ц ы в р а з р я д преры вание (д л я преры вания иначе !) 7 регистра разр еш ен и е 1. счетн ого // о бн ули т ся, // д р у г о г о В на 1. регистра // единицу. // р е г и с т р а с отсчетов преры ваний // К огд а (1 ) PD5 65526, 10 (T O I E 1 ) Это вы воде при // м аскирования // п ереполнению w h ile на увеличится содерж ит // разр еш ен о s e i(); вы воде оставалось // Р азр я д ф рон т к TCNT1 / / С ч ет н ы й р е г и с т р // п ер еп о лн ен и я //Н астройка T IM S K |= ( 1 н и спадаю щ ий AT90S2313 // п ер ехо д е // O B будет сигнала SREG, что преры ваний. { if { (T C N T 1 PORTB = == O xFFFB) 0x00; } // Если // отсчитано // МК P D 5 , //н а T CNT1 все содерж ит 65531, 5 им пульсов на т .е . вы во д е то выводы п о р т а В подаем 0 В } } П р ер ы в а н и е п о си г н а л у н а в х о д е за х в а т а С хема соединений в данном примере такая же, как представленная на рис. 3.9. Программа идентична показанной в листинге 3.5, за тем иск­ лю чением , что записывается 1 в разряд 3 регистра маскирования преры­ ваний TIM SK , что разреш ает прерывание T I M E R l _ C A P T l _ v e c t при появлении сигнала на входе P D 6 (ICP). При поступлении сигнала на вход P D 6 содерж и м ое счетного регистра TCNT1 копируется в регистр захвата ICR1, срабатывает вектор прерывания T I M E R l _ C A P T l _ v e c t , вызывается соответствую щ ая подпрограмма обработки, которая уста­ навливает уровень лог. 1 или лог. 0 на тех или иных вы водах микрокон­ троллера. 117 Работа с прерываниями в AT90S2313 Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7. 05 - Прерывание по сигналу на входе захвата. Л истинг 7.5. Программа Ь :1 т е г _ с о и п Ъ е г 1 _ а п с а _ 1 С 1 1 1 _ 1 6 Ь 1 Ъ _ 1 п Ь е г г и р 1 :.с #1пс1ис1е // Заголовочны й ф айл п одклю чает // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / io .h > #1пс1ис1е < a v r / in t e r r u p t .h > // П одпрограм м а // захвата обработки в // проекте Д ля р а б о т ы п реры вания определения устройства, по с сигналу п реры ваниям и на входе (Р Б 6) 1СР 1311 (Т 1М Е Е1_С А РТ 1^есЪ ) { диапазон а, в котором // И ндикация // захвата 1СЯ1 if (IC R 1 > 0x2710) PORTB if ( IC R 1 > 0 x 3 A 9 8) PORTB 1= 1= if ( IC R 1 > 0x4E20) PORTB if (I C R 1 > 0 x7 53 0 ) PORTB находится значение регистра (1 «1 ) (1 «2 ) e ls e PORTB e ls e PORTB &= Sc= ~ (1 «1 ) = (1 «3 ) e ls e PORTB &= = (1 «4 ) e ls e PORTB &= ~ (1 «3 ) ~ (1 «4 ) ~ (1 «5 ) - (1 «2 ) if ( IC R 1 > 0x9C4 0) PORTB j= (1 «5 ) e ls e PORTB &= if (I C R 1 > 0xC350) PORTB I= (1 «6 ) e ls e PORTB &= ~ (1 «6 ) if (I C R 1 > О хЕ А бО ) PORTB 1= (1 «7 ) e ls e PORTB &= ~ (1 «7 ) } in t m a in (v o id ) { DDRB = PORTB O xFF; = OxFF; //Н астройка TCCR 1A = TCCR1B = // 0Ы 1111111 - все // 0Ы 1111111 - на // подаем +5 тай м ера/счетчика1 / / Режим с о в п а д е н и я // поскольку // совпадения ОСН1; // 0Ы 0000101 - // IC R 1 . // реж им п о д а в л е н и я // 1С Р // т .е . // // мы н е Разряд (Р Б 6 по на в вы ходе отклю чен, и сп ользуем такж е з а п р е щ е н а ШИМ и сп ользуем 7 = 1, а реги стр реги стр значит вход н ого А Т 9 0 3 2 3 1 3 )) . напряж ения РБ6 буд ет // (з н а ч е н и е // в реги стр реги стра // совпадению н ам н е // и сп ользуем реги стр // п оэтом у р а зр я д IC R 1 ). с +5 вы полнен захвата вклю чен шума н а вы воде Разряд 6 н и сп ад аю щ ем у ф р о н т у (п е р е х о д у вы воде вы ходы В вы воды п о р т а В 0 x0 0 ; 0x85; В - вы воды п о р т а все к = 0, сигнала 0 В) на захват ТС№Г1 п е р е п и ш е т с я О чистка нуж н а, счетчика совпадения 3 = 0 . по поскольку Вы бираем не 0 CR 1 , источник 118 Гл ав а 7 Л истинг 7.5. Окончание // счетны х им пульсов для // с помощью р а з р я д о в // в них 101 , // им пульсов // словам и , т .е . - значение на Н астройка // задали DDRD &= PORTD ~ (1 |= вы вода << (1 захвата Разряд 6 регистра данны х = 0, К разряд у //Н астройка преры вания << (1 sei О ; w h ile (1 ) даж е 3 ); с. если направления PD6 р а б о т а е т т .е . порта D подклю чен п о д т я ги в аю щ и й р е з и с т о р T IM S K |= 0 ,0 0 0 2 5 6 обя зательн а, // // = мы в TCCR1 6) ; / / 6) ; / / << (P D 6 ) IC P п арам етры Д р уги м и будет е д и н и ц у каждые / / 1 0 2 4 / 4 0 0 0 0 0 0 (4 М Г ц ) // счетны х М К /1024. TCNT1 TCNT Мы з а п и с ы в а е м источник частота // у в ели ч и в а т ь с я регистра 0 -2 . +5 В ). Разряд // м аскирования преры ваний содерж ит // единицу. значит, // р азр еш ен о // сигналу Запись // озн ачает // Бесконечны й цикл (T IC IE 1 ) внутренний вы воде // // 3 (н а передачи как вход. Это регистра что п реры вание на ед и н и ц ы в р а з р я д входу по захвата. 7 регистра общ ее р а зр еш е н и е SR E G , что преры ваний. { // П одаем // Если if на (T C N T 1 PORTB e ls e в ы вод РВ0 он м еньш е, |= >= (1 PORTB то +5 0x8000) << &= если Если //н а << 0 ); сч е т н ы й р е г и с т р ^ 32768. 0 В. // 0 ); ~ (1 В, подаем // TCNT1 РВ0 иначе > подаем п одаем 32768, +5 то В 0 В } } П р ер ы в а н и е п р и с о в п а д е н и и р еги ст р а O C R 1 С хема соединений в данном примере такая ж е, как представленная на рис. З.Ю. Регистр TCCR1 настроен с помощ ью разрядов СОМ 1А1 и COM I АО так, что при совпадении значений TCNT1 и OCR1 состояние вывода ОС1 (РВЗ) будет переключаться (с 0 в 1 или с 1 в 0). Значение счетного регистра TCNT1 увеличивается через каждые 0,0 0 0 0 1 6 с. Реги­ стру совпадения OCR1 присвоено значение 32 768. Таким образом, пер­ вое переклю чение состояния на выводе ОС1 (РВ З) произойдет через 32 768 • 0 ,0 0 0 0 1 6 = 0 ,5 24288 с. 119 Работа с прерываниями в AT90S2313 В р еги ст р е м аск и р ов ан и я п р ер ы вани й T IM S K у ст а н о в л ен р а зр я д , р азр еш аю щ и й п р ер ы в ан и е п о со в п а д ен и ю T C N T 1 и O C R 1. В с о о т в е т с т ­ в ую щ ей п одп р огр ам м е обр аботк и для инди к ац и и срабаты вания п реры ­ в а н и е в к л ю ч а ет ся и о т к л ю ч а е т с я с в е т о д и о д D 1. _ %[ Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7. Об - Прерывание при совпадении регистра OCR1. ЛИСТИНГ 7.6. # in c lu d e Программа < a v r / io .h > t im e r _ c o u n t e r l_ a n d _ O C R l_ 1 6 b it _ in t e r r u p t .c // Заголовочны й ф айл // в в о д а -в ы в о д а для подклю чает # in c lu d e // и сп о ль зу ем о го в п роек т е < a v r / in t e r r u p t .h > // Д ля р а б о т ы # in c lu d e < u t il/ d e la y .h > // П одпрограм м а // реги стров обработки T CNT1 и // Д ля // задерж ки доступа преры вания определения устройства, при с преры ваниям и к ф ун кц и ям ц и к л о в совпадении содерж им ого 0CR1 I S R (T IM E R l_ C O M P l_ v e c t ) { PORTB fo r |= (in t PORTB &= (1 << i= 0 ; ~ (1 0 ); // i< 5 ; << i+ + ) На РВО подаем +5 В _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); 0 ); // На РВО подаем 0 В } in t m a in (v o id ) { DDRB DDRB |= (1 |= PORTB (1 &= << 3 ); << ~ (1 0 ); << // Разряд // = // (к // Регистр OCR1 // которы е непреры вно // счетного = // Н астройка // Регистр // двух TCCR 1A д а н н ы х DDRB как вы хо д светодиод) подаем 0 В В нем х р а н я т с я сравн и ваю тся с текущ им данны е, значением TCNT1 К огда // п рои зойд ет // TCCR1 значение тайм ера/счетчика управления 0x40; передачи РВЗ р а б о т а е т вы х о д РВО // 8- р а з р я д н ы х = - На 1 6 -р а з р я д н ы й . реги стра 0x8000; вы вод н ем у п о д к л ю ч е н // // OCR1 3 реги стра т .е . В ы в од РВО 0 ); - 1, TCCR1 - дости гн ет задан н ое 32768, реги стром 1 1 6 -р а з р я д н ы й , регистров: состоит из T C C R 1 A и TCCR1B // ОЬОЮООООО // Разряд 7=0, // о что том , T CNT 1 действи е, - реж им с о в п а д е н и я разряд 6=1. в ы во д ОС1 Это (Р В З ) на вы ходе. говорит будет 120 Г л ав а 7 Л истинг 7.6. Окончание TCCR 1B = 0x03; // переклю чаться при // TCNT1 и O CR 1. Разряд // Это O b O O O O O O ll - и сп ользуем (р а з р я д // Разряд // обнулять // OCR1. // тактирования // счетного // увеличиваться // 64/4000000 преры вания << sei О ; w h i l e (1 ) { 6 ); Запись // озн ачает // регистр Разряды - захвата = что на ед и н и ц у (4 М Г ц ) 6 = т .е . (з н а ч е н и е кажды е с. // Разряд // м аскирования п реры ваний // единицу. значит, // разр еш ен о Это общ ее регистра преры вание разр еш ен и е = источник будет 0 ,0 0 0 0 1 6 (O C IE 1 A ) будем TCNT1 МК/64 TCNT1 не 6 = 0 ). мы н е когда 011, частота регистра IC R 1 разряд TCNT1, 0 -2 1=0. и сп ользуется. 7=0, озн ачает, реги стр значений а разряд содерж ит что по / / с о в п а д е н и ю р е г и с т р а O C R 1. ед и н и ц ы в р а з р я д 7 р е г и с т р а S R E G , // } 3=0 0=0, Н1ИМ н е // //Н астройка (1 что // T IM S K |= зн ачи т, совпадении что преры ваний. Бесконечны й цикл } В н еш н и е п р ер ы в а н и я IN T O и IN T 1 Отличие данной программы от представленной в листинге 3.18 за­ ключается в том что, вместо условий проверки состояния выводов PD0 и PD1 используются внеш ние прерывания INTO (вывод P D 2) и INT1 (вывод PD 3). Слово “внеш ние” говорит само за себя. Если в преды ду­ щих примерах мы использовали прерывания, которые генерировались внутри микроконтроллера, то в данном случае они срабатывают при по­ ступлении сигналов извне. Прерывания INTO и INT1 настроены на срабатывание п о ниспадаю ­ щ ем у фронту. Д ругие варианты настройки: прерывание по нарастаю ­ щ ем у фронту или по низкому уровню сигнала. К огда на выводе PD 2 напряжение падает с 5 В д о 0 В (ниспадаю ­ щий фронт), вызывается подпрограмма обработки вектора I N T 0 _ v e c t . В ней увеличивается на единицу значение регистра сравнения OCR1. Тем самым, если Ш ИМ неинвертирующ ая, увеличивается длительность полож ительного импульса. С хема соединений для данного примера показана на рис. 7.1. 121 Р абота с пре ры ва н иям и в A T 9 0 S 2 3 1 3 - L С2 р iq>f JL ci Р 10PF Х1 HOb U1 P BQ'AIHD pai/Aim PBZ РВЭ'ОСИ swo(Qcri+i ) PВ* PBS 1 * SW1 (OCR1-1) A TK T3Z 313 Рис. 7.1. Схема соединений для исследования внешних прерываний INTO и INT1 П р огр ам м а, р еал и зую щ ая р а б о т у эт о й схем ы , п р ед ста в л ен а в л и с ­ т и н г е 7 .7 . щ Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7 . 07 - Внешние преры­ вания INTO и INT1. Л истинг 7.7. Программа tim e r _ c o u n te rl_ a n d _ P W M _ 1 6 b it_ in te r ru p t. с # in c lu d e < a v r / io .h > // Заголовочны й ф айл п одклю чает // в в о д а -в ы в о д а для # in c lu d e // и сп оль зуем ого в проекте < a v r / in t e r r u p t .h > / / Д ля р а б о т ы # in c lu d e c u t il/ d e la y .h > // П одп рограм м а //н а вы воде обработки IN T O // Д ля д о с т у п а // задерж ки преры вания по определения устройства, с преры ваниям и к ф ун кц и ям ц и к л о в спаду н ап ряж ен и я коэф ф ициента заполнения на (P D 2 ) IS R (IN T 0 _ v e c t ) { OCR1 = OCR1 + 1 ; // // // И зм ен ен и е (у в е л и ч е н и е им пульса) длительности полож ительного 122 Гл а в а 7 Л истинг 7.7. Продолжение _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); // Задерж ка // кнопки перед следую щ им н а ж а т и е м } // П одпрограм м а // на вы воде обработки IN T I преры вания по спаду напряж ения коэф ф и ц и ен та заполнения на (P D 3 ) IS R (IN T lv e c t ) { 0CR1 = 0CR1 - 1; // И зм ен ен и е // (у м е н ь ш е н и е // длительности полож ительного им пульса) _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); // Задерж ка // кнопки перед следую щ им н а ж а т и е м } in t m a in (v o id ) { DDRB // // |= (1 << Регистр 3 ); // Разряд // = // (к 0CR1A непреры вно 1, - 3 реги стра т .е . передачи вы в о д РВЗ н ем у п о д к л ю ч е н 1 6 -р а з р я д н ы й , сравн и ваю тся с как вы ход светодиод) хранит текущ им д а н н ы х DDRB работает данны е, которы е зн ачен и ем / / т а й м е р а / с ч е т ч и к а 1 (T C N T 1 ) 0 C R 1 A = O x O lF F ; / / 511 // Н астройка // Регистр // двух тайм ера/счетчика управления 8- р а з р я д н ы х реги стров: // С0М1А1 (р а з р я д // реж има совпадения // устанавливается // когда // при // устанавливается // PWM10 // 1 0 -р а з р я д н у ю // зн ачен и е // от TCNT1 7) (р а з р я д 1023 IC N C 1 (р а з р я д // захвата Разряд // Р азряды лог. 0) 1 1, (1 0 2 4 СОМ1АО (р а з р я д Теперь О при 6) совпадении на из вы воде (р а з р я д отсчетов от TCNT1 1023 до 0 то (Р В З ) ШИМ). = 1 . 0 до будет установка ум еньш ается, ОС1 1) - (Р В З ) T C N T1 и OCR 1A , (н е и н в е р т и р у ю щ а я PWM11 от = в ы вод ОС1 Е с л и ж е TCNT1 регистра состоит О пределяем 1 0 2 3 ), т .е . в ц икле и зм ен яться 0. //0Ы0000011 IC R 1 7) = 0 , IC E S 1 (р а з р я д 6) = 0 - регистр не и с п о л ь зу е м . 3 = 0 - обнуляется 0 -2 = TCCR1 T C C R 1 A и TCCR1B и 0CR1 и обратно // не T CNT1 счетного 0x83; // в лог. ШИМ T CCR 1A = // = 1 , д д я ШИМ. увеличивается. совпадении 0 до 1 тайм ером /счетчиком - регистр (в TCNT1 при реж и м е ШИМ э т о т вы бор и с т о ч н и к а совпадении разряд счетны х не TCNT1 и OCR1 и с п о л ь з у ю т ). им пульсов для 123 Работа с прерываниями в AT90S2313 Л истинг 7.7. Окончание // регистра // м икроконтроллера // 0 ,0 0 0 0 0 0 2 5 // увеличиваться TCCR1B = TCNT1. с Значениею 4 М Гц, зн ач ен и е на 0x01; О пределяем PD2 кнопки д ля и зм енения // G IM SK 2) & -(1 (1 « 2) | |= (1 sei О ; (1 ) { частота / 4000000 реги стра T C N T1 = будет (1 как входы . К эти м коэф ф ициента « 3 ); << 3) ; вы водам п о д к лю ч е н ы заполнения // PD2 и PD3 - ШИМ входы // П од клю чаем к // внутренние // соп роти влен и я PD2 и РОЗ н агрузочн ы е преры ваний О хО А ; << 6) // ОЬООООЮ Ю // сработаю т // (е с л и удерж ивать сработает // д ребезга (1 наж атой, // и 7 разр еш ает PD2 (IN T O ) // Тип сигнала // задаю т озн ачает // Запись вн еш н и е и общ ее IN T O сигнала ее преры вание если нет для в разряд 6 G IM S K преры вания на вы водах в МК A T 9 0 S 2 3 1 3 . возн и к н овен и я преры вания MCUCR 7 регистра разр еш ен и е Бесконечны й ед и н и ц ы в р а з р я д ы регистра P D 3 ( IN T 1 ) в регистре ед и н и ц ы то один р а з , (IN T 1 ) // Запись или контактов) // // IN T 1 н и сп ад аю щ ем у ф р о н т у только 7 ); (IN T O ) // } << преры вания мы нажмем к н о п к у и б у д е м // | по // // w h ile PD3 « Н астройка MCUCR = и ~ (1 |= счетного 1 единицу. // PORTD соответствует каж ды е //O bO O O O O O O l // DDRD &= 0Ы 01 т .е . SREG, что преры ваний. цикл } П р ер ы в а н и е п р и о ч и ст к е р ег и ст р а U D R С х е м а с о е д и н е н и й в д а н н о м п р и м е р е та к а я ж е , как п р е д с т а в л е н н а я н а р и с . 5 .1 . К ак т о л ь к о р е г и с т р д а н н ы х U D R п р и е м о п е р е д а т ч и к а U A R T о ч и с т и т с я , в о з н и к н е т п р е р ы в а н и е (в е к т о р а U A R T _ U D R E _ v e c t ) . В с о о т ­ ветствую щ ей п о д п р о гр а м м е о бр аботк и в р еги стр д ан н ы х U D R за п и сы ­ в а ет ся с и м в о л “А ”, к о т о р ы й и б у д е т п е р е д а н ч е р е з U A R T (в ы в о д T X D ) . П оск ол ь к у п р ограм м а р аб от ает в беск о н еч н о м цик ле, а п о д п р о гр а м м а в ы зы в а ет ся к а ж д ы й р а з п р и о с в о б о ж д е н и и р е г и с т р а U D R , с и м в о л “ А ” б у д ет передаваться п остоян н о. Д ля того чтобы си м в ол п ередался толь­ к о о д и н р а з, н е о б х о д и м о п о с л е п е р в о й п е р е д а ч и о т к л ю ч и т ь п р е р ы в а н и е п р и о ч и с т к е р е г и с т р а д а н н ы х U A R T (5 - й р а з р я д U D R I E р е г и с т р а U C R ). 124 Гл ав а 7 Программа, реализующ ая прерывание при очистке регистра НОЯ, представлена в листинге 7.8. Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7.08 - Прерывание при * очистке регистра UDR. Л истинг 7.8. Программа UART send А. с # in c lu d e # in c lu d e < a v r / io .h > // Заголовочн ы й ф айл п о д к лю ч ает // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / in t e r r u p t .h > обработки // в проекте Д ля р а б о т ы // П од програм м а // д а н н ы х UD R п р и е м о п е р е д а т ч и к а UART преры вания / / 5 - г о р а з р я д а UDRE в р е г и с т р е IS R (U A R T U D R E v e c t ) определения устройства, при с очистке (в о з н и к а е т п р е р ы в ан и я м и регистра при у ст а н о в к е USR) { UDR = UCR &= 1А ' ; ~ (1 5); << // П ередаем // О т к л ю ч аем через преры вание, UART б у к в у чтобы // передался только раз (1 << один "А " сим вол } v o id U A R T _ IN IT () { UCR 1= UBRR = (1 « 3) 0x17; 5) ; // Разреш аем // (1 // UCR) // разряде // Устанавливаем // при U A R T _IN IT ( ) ; // И н и ц и али зац и я s e i () ; // О бщ ее р а з р е ш е н и е // Б есконечны й частоте работу в разряде прием ника 4 реги стра и п ередатчика 3 реги стра скорость МК 3 .6 8 6 4 передачи (1 в ТСЖ) 9600 бод МГц } in t m a in (v o id ) { w h ile (1 ) { } UART преры ваний цикл } В это прим ере мы реализовали передачу одн ого символа. Рассмот­ рим программу, которая с помощ ью прерывания при очистке регистра и О Л передает через и Д Я Т строку. Схема соединений в данном примере такая ж е, как представленная на рис. 5.4. В программе (листинг 7.9 ) глобальному указателю р мы присваива­ ем адрес нулевого элемента символьного массива. Зная адрес первого 125 Работа с прерываниями в AT90S2313 э л е м е н т а м а с с и в а , м ы м о ж е м с п о м о щ ь ю о п е р а т о р а * и зв л е ч ь с о д е р ж и ­ м о е я ч ей к и п о д а н н о м у а д р е с у . В п о д п р о гр а м м е обр а бо тк и преры вания (U A R T _ U D R E _ v e c t) мы проверяем н аличи е дан н ы х п о а д р есу р и за н о си м и х в р еги стр U D R . Е сл и дан н ы е для отправки о тсу тств у ю т, пр ер ы в ан и е отклю чается. Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T 9 0 S 2 3 1 3 \7 .0 9 - Прерывание при очистке регистра UDR. Листинг 7.9. Программа # in c lu d e # in c lu d e s t a t ic < a v r / io .h > U A R T _ s e n d _ s t r .c // Заголовочны й ф айл подклю чает // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / in t e r r u p t .h > v o la t ile char *р ; обработки в проекте // Д ля р а б о т ы // Указатель // П одпрограм м а // д а н н ы х UDR п р и е м о п е р е д а т ч и к а UA R T преры вания / / 5 - г о р а з р я д а UDR I в р е г и с т р е I S R (U A R T _ U D R E _ v e c t ) определения устройства, при с очистке (в о з н и к а е т п реры ваниям и реги стра при у с т а н о в к е USR) { if (* р ) { UDR = *р ++; } // Если // Записы ваем есть, что о т п р а в л я т ь ... // сим вол и у в ели ч и в аем // т .е . переходим // Если отправлять // отклю чаем (1 << в реги стр к данны х п ер ед а в ае м ы й указатель след у ю щ е й на 1, ячейке. e ls e { UCR &= - (1 «5 ) ; н ечего, то преры вание } } v o id U A R T _ IN IT () { UCR |= (1 « 3) | 5) ; // Разреш аем // (1 // UCR) // разр яд е // Устанавливаем // при ч а с т о т е U A R T _IN IT () ; // И н и ц и али зац и я sei (); // О бщ ее р а з р е ш е н и е UBRR = 0x17; работу в разряде и передатчика 3 регистра скорость МК 3 .6 8 6 4 передачи МГц } in t прием ника 4 реги стра m a in (v o id ) { UART п реры ваний (1 в ТСЖ) 960 0 б о д 126 Глава 7 Листинг 7.9. Окончание // М ассив // отправлено // как // OxOD s ta t ic к s t r o k a [] = - это char // "\ г ", это Н ачинаем (1 ) { предлож ение, О братиться этом ОхОА - твой байте это к которое будет отдельном у хранится буква байту можно 'в'). "\ п ". = м и кроконтроллер = )\ г \ п " ; // Сохраняем адрес // м ассива в глобальном пам яти 1 первого элем ента р указателе передачу |= (1 << 5 ) ; w h ile (в s t r o k a [] & s t r o k a [0 ]; UCR UART. s t r o k a [3 ] "п р и в ет , р содерж ит через } // Записав // преры вание // Бесконечны й цикл в разряд при U D R IE , очистке активизируем реги стра данны х } П р ер ы в а н и е п о о к о н ч а н и ю п р и ем а д а н н ы х Схема соединений в данном примере такая же, как представленная на рис. 5.6. Программа (листинг 7 .1 0 ) принимает данные через UART и выводит их в порт В. При этом используется прерывание по оконча­ нию приема, которое сработает при появлении данных в регистре UDR. В подпрограмме обработки прерывания (U A R T R X v e c t) значение, хра­ нимое в регистре UDR, копируется в порт В. Исходные файлы этого примера для W i n A V R , A V R S t u d i o и P r o t e u s находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7. ю - Прерывание по окончанию приема данных. Листинг 7.10. Программа U A R T _ r e c i v e _ p o r t b . c # in c lu d e # in c lu d e < a v r / io .h > // Заголовочны й ф айл п од клю чает // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / in t e rr u p t .h > // П одпрограм м а о б р а б о т к и IS R (U A R T J R X v e c t ) // определения устройства, в проекте Д ля р а б о т ы преры вания по с преры ваниям и окончанию прием а д ан н ы х { PORTB = UDR; // Вы водим в п о р т В полученны й байт } v o id U A R T I N I T () { UCR |= (1 « 4) | (1 < < 7 ) ; // // и Разреш аем преры вание по работу прием ника окончанию прием а 127 Р абота с пре ры ва н и ям и в A T 90 S 2 3 1 3 Л истинг 7.10. Окончание UBRR = 0x17; // Устанавливаем // при ч а с т о т е скорость U A R T IN IT ( ); // И н и ц и али зац и я OxFF; PORTB = 0x00; // В с е // На в с е sei ( ) ; // О бщ ее р а з р е ш е н и е // Бесконечны й МК 3 .6 8 6 4 передачи 9600 бод МГц } in t m a in (v o id ) { DDRB = w h ile (1 ) { } иАНТ вы воды п о р т а В выводы п о р т а - выходы В подаем 0 В преры ваний цикл } Е щ е о д и н вари ант програм м ы — с отправкой п р и н ятого бай та о б ­ р атн о ч ер ез U A R T в п о д п р о гр ам м е обр аб отк и преры вания дл я век тора U A R T _ R X _ v e c t (л и с т и н г 7 .1 1 ). Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7 .11 - Передача при­ нятого символа. Л истинг 7.11 . Программа # in c lu d e < a v r / io .h > # in c lu d e // U A R T r s .с // Заголовочны й ф айл подклю чает // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / in t e r r u p t .h > П одп рограм м а обработки // в проекте Д ля р а б о т ы преры вания определения устройства, по с преры ваниям и окончанию прием а данны х IS R (U A R T _ R X _ v e c t ) { char rsv PORTB UDR = = = UDR; rsv; rsv ; // С охраняем // Вы водим п р и н я т ы й б а й т п ри н я ты й // индикации // О тправляем // чтобы с сим вол в в порт перем енной В, для помощью с в е т о д и о д о в п ри н я ты й увидеть, что сим вол ч е р е з бы ло иАНТ, принято } v o id U A R T IN IT () { // Разреш аем // окончанию UCR |= ( 1 « UBRR = } 0x17; работу приема 4) | (1 прием ни ка, « 7) | передатчика (1 « и преры вание по 3); // Устанавливаем // при ч а с т о т е скорость МК 3 . 6 8 6 4 передачи МГц 9600 бод 128 Гл а в а 7 Листинг 7.11. Окончание in t m a in (v o id ) { UART IN IT () ; // И н и ц и али зац и я DDRB = // В се // На в с е // О бщ ее р а з р е ш е н и е // Бесконечны й PO R T B O xFF; = 0x00; s e i () ; w h ile (1 ) { } UART вы воды п о р т а В выводы п о р т а - вы ходы В подаем 0 В преры ваний цикл } П р ер ы в а н и е п о о к о н ч а н и ю п е р е д а ч и д а н н ы х С х е м а с о е д и н е н и й в д а н н о м п р и м е р е та к а я ж е , как п р е д с т а в л е н н а я н а р и с . 5 .6 . П р о г р а м м а (л и с т и н г 7 .1 2 ) п р и н и м а е т ч е р е з U A R T б а й т , п о ­ с л е ч е г о о т п р а в л я е т о б р а т н о с т р о к у “ М К r e c iv e d - x “ , г д е “ х ” — п р и н я ­ ты й си м в ол . С трок а хр ан и т ся в си м в ол ь н ом м асси в е, н а тек ущ и й эл еен т к о т о р о г о у к а зы в а е т г л о б а л ь н ы й у к а за т е л ь р . П р и э т о м в п о д п р о г р а м м е о б р а б о т к и п р е р ы в а н и я п о о к о н ч а н и ю п е р е д а ч и (U A R T T X v e c t ) р увел и ч и вается на еди н и ц у, чтобы перей ти к сл ед у ю щ ем у эл ем ен т у м ас­ си в а . Е с л и п о а д р е с у р ес т ь к а к и е -л и б о д а н н ы е , т о о н и о т п р а в л я ю т с я ч ер ез U A R T , в п р оти вн ом сл уч ае мы отправляем “0 ” дл я инди кации о к о н ч а н и я п е р е д а ч и , и о т к л ю ч а е м п р е р ы в а н и е. Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7.12 - Прерывание по окончанию передачи данных. Л и с т и н г 7.12. # in c lu d e # in c lu d e s t a t ic / / В v o la t ile глобальн ы й r e c iv e d - // новой s t a t ic U A R T r s s t r .c // Заголовочн ы й ф айл п од клю чает // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / in t e r r u p t .h > // // Программа < a v r / io .h > char *р ; м ассив \r \n " , гд е // // str в проекте Д ля р а б о т ы Глобальны й записы ваем "\ г" - определения устройства, с указатель предлож ение возв рат преры ваниям и каретки, а "\r\n M K " \п " - с и м в о л строки v o la t ile П одпрограм м а char s t r [] обрабоки / / (в ы з ы в а е т с я , к о г д а I S R ( U A R T RX v e c t ) = "\ r\ n M K преры вания п ри н я ты й r e c iv e d по сим вол \ r\ n "; окончанию окаж ется прием а в реги стре UDR) { c h a r rs v = UDR; / / С охраняем пр и н я ты й сим вол в перем ен но й 129 Работа с прерываниями в AT90S2313 Л истинг 7.12. Продолжение PORTB = rsv; s t r [1 3 ] р = = rsv; &str[0]; UCR |= UDR = (1 « 6 ); str[0]; // Вы водим п ри н я ты й // индикации н а байт // записы ваем его // м ассива строкой // Зап ом и н аем // Разреш аем со в 13 порт адрес (к а к передачи // через // // U A R T _T X _v ect) Зап и сы ваем в р е г и с т р // сим вол д ля // его // окончанию по только передачи сим вола строки окончанию п ередадутся вектор преры вания д а н н ы х п ер в ы й через возн и кн ет передачи глобальн ого данны е сработает В для такж е вы вода первого // отправки а ячейку для преры вание UART, в светодиодах, UART. П осле преры вание по данны х. } // П одпрограм м а // (в ы з о в е т с я , обработки когда преры вания в реги стре по UDR н е окончанию останется передачи данны х) IS R (U A R T _ T X _ v e c t ) { р if = р + 1; (* р ) // Увеличиваем // к // Если адрес, чтобы перейти след у ю щ ем у э л е м е н т у м а с с и в а по адресу р есть сим вол, т о . .. { UDR = *р ; // записы ваем // данны х содерж и м ое // Если // О тправляем ч е р е з // для // В к лю ч ае м (т.е. передаем ячейки через в регистр UART) } e ls e отправлять нечего, т о . .. { ТЛЖ = иСН '0 '; &= ~ (1 < < 6 ); индикации иАВТ с и м в о л окончания "О " (п р о с т о п ередачи ) преры вание } } v o id U A R T _ IN IT () { // Разреш аем р а б о т у // окончанию UCR |= ( 1 « UBRR = 0x17; прием а 4) | (1 in t m a in (v o id ) { ÜART IN IT (); « //23 // } прием ни ка, 7) - 9600 | передатчика (1 « при преры вание по 3 ); устанавливаем бод и скорость частоте передачи МК 3 . 6 8 6 4 МГц 130 Гл а в а 7 Листинг 7.12. Окончание DDRB = PORTB OxFF; = // 0x00; s e i(); w h ile (1 ) { Все //На } вы воды п о р т а всех вы водах В - вы ходы порта // О бщ ее р а з р е ш е н и е // Бесконечны й В - 0 В преры вания цикл } П р ер ы в а н и е о т а н а л о г о в о г о к о м п а р а т о р а С х е м а с о е д и н е н и й в д а н н о м п р и м е р е так ая ж е , как п р е д с т а в л е н н а я н а р и с . 6 .1 . П р е р ы в а н и е в о з н и к а е т п р и п о я в л е н и и н и с п а д а ю щ е г о ф р о н т а н а в ы х о д е к о м п а р а т о р а A C O . В ы х о д к о м п а р а т о р а п е р е х о д и т и з 0 в 1, к о г д а н а п р я ж е н и е н а о т р и ц а т е л ь н ы м в х о д е A IN 1 (Р В 1 ) с т а н о в и т с я бол ьш е, чем н ап р я ж ен и е н а п ол ож и тел ьн ом в х о д е. В п од п р огр ам м е о б ­ р а б о т к и п р ер ы в а н и я , н а в ы в о д P D 0 п о д а е т с я 0 В , а н а P D 1 — + 5 В . П р о г р а м м а , д е м о н с т р и р у ю щ а я и с п о л ь з о в а н и е п р ер ы в а н и я о т а н а л о ­ г о в о г о к о м п а р а т о р а , п р е д с т а в л е н а в л и с т и н г е 7 .1 3 . Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S23X3\7.13 - Прерывание от * аналогового компаратора. Листинг 7.13. Программа АС. с # in c lu d e < a v r / io .h > // Заголовочны й ф айл п одклю чает // в в о д а -в ы в о д а для # in c lu d e // и сп ользуем ого в проекте < a v r / in t e r r u p t . h> / / Д ля р а б о т ы # in c lu d e c u t il/ d e la y .h > // П од програм м а обработки // (в ы з о в е т с я , к о г д а IS R (A N A _ C O M P _ v e c t ) // Д ля д о с т у п а // циклов преры вания от определения устройства, с п р е р ы в ан и я м и к ф ункц иям задерж ки аналогового в ы х о д к о м п а р а т о р а ACO п е р е й д е т ком паратора из 1 в 0) { // Если разряд 5 реги стра // п одаем 0 В , а н а PORTD &= - ( 1 < < 0 ) ; PORTD |= (1 << вы вод ACSR содерж ит PD1 — +5 0, то на В 1 ); } in t m a in (v o id ) { DDRD = PORTD 0 x 0 3 ; = 0 x 0 0 ; // Выводы P D 0 ,P D 1 //Ha выводы п о р т а - вы ходы D п одаем 0 В вы вод PD0 131 Р абота с пре ры ва н иям и в A T 90 S 2 3 1 3 Л истинг 7.13. Окончание / / В хо д ы к о м п а р а т о р а DDRB &= ~ ( 1 < < 0 ) & ~ ( 1 PORTB A CSR &= &= ACSR |= ~ (1 -(1 (1 << << << 0) << & ~ (1 7 ); 3 ); возн и к ает 1 ); << // Выводы Р В 0 ,Р В 1 - 1);// Выводы Р В 0 ,Р В 1 - // вы со к о ом н ы е // внутренних // сопротивлений) // Разреш аем // аналогового // 0 в разряд // Разреш аем // аналогового // 1 в разряд // П реры вание // ком паратора, т.е. // из 1 в // отрицательном входе A IN 1 // полож ительном входе AINO(РВО). состоян и я ACSR &= -(1 ACSR |= (1 « << 0. 0 ); 1 ); sei О ; w h ile по когда (1 ) Это ни входы и сп ользован и е ком паратора, 7 (A D C ) (A C IE ) если // Разряд Р а з р я д A C IS 1 = 1 // О бщ ее р а з р е ш е н и е // Б есконечны й ACSR вы ходе ACSR п е р е й д е т нап ряж ен и е больш е // зап и сав регистра ACO р е г и с т р а станет ACSR от ком паратора, 3 зап и сав регистра преры вание п рои зой д ет, (Р В 1 ) (б е з п о д т я ги в а ю щ и х сп адаю щ ем у ф р о н т у н а разряд входы на напряж ения на A C IS 0 = 0 п реры ван и й цикл { if (A C S R & (1 « 5 )) // Если 0 ); // на р а з р я д А СО =1, то { PORTD |= (1 PORTD &= ~ ( 1 << << 1 ); / / а вы вод на PD0 в ы во д подаем PD1 - +5 В, 0 В. } } } И с п о л ь зо в а н и е т а й м е р а /с ч е т ч и к а 1 в р еж и м е Ш ИМ • К м и к р о к о н т р о л л е р у п о д к л ю ч е н ы ч е т ы р е к н о п к и (р и с . 7 .2 ): РОО, Р О I — д л я у в е л и ч е н и я и л и у м е н ь ш е н и я к о э ф ф и ц и е н т а з а п о л ­ • н е н и я g Ш И М -с и г н а л а ; Р Б 2 , Р Э З — д л я у в е л и ч е н и я и л и у м е н ь ш е н и я ч а с т о т ы Ш И М -с и г н а ­ ла. П р и н а ж а т и и к н о п к и РОО у в е л и ч и в а е т с я д л и т е л ь н о с т ь п о л о ж и т е л ь ­ н ого и м п ульса и ум еньш ается дл и тел ь н ость н ул ев ого, и н а о б о р о т — при наж атии кнопки Р 0 1 ум еньш ается дл ительность п ол ож и тел ьн ого и м пульса, и увелич ивается дл и тельн ость н ул евого. 132 Глава 7 П р и н а ж а т и и к н о п к и Р 0 2 с о к р а щ а е т с я в р ем я п о л у п е р и о д а (п о л о в и ­ н а п о л о ж и т е л ь н о г о и л и н у л е в о г о и м п у л ь с а ), а п р и н а ж а т и и к н о п к и Р Б З он о увелич ивается. Рис. 7.2. С хема с ч е т ы р ь м я кн о п ка м и П р о г р а м м а , р е а л и зу ю щ а я р а б о т у с х е м ы , п о к а з а н н о й н а р и с . 7 .2 , п р е д с т а в л е н а в л и с т и н г е 7 .1 4 . Ч» Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке AT90S2313\7.14 - Использование таймера 1 в режиме ШИМ. Листинг 7.14. Программа # in c lu d e < a v r / io .h > P W M _ a n d _ F re q _ in te rru p t.c // Заголовочны й ф айл п од клю чает // в в о д а -в ы в о д а для // и сп ользуем ого # in c lu d e < a v r / i n t e r r u p t . h> v o la t ile in t tcn t_ = 0 ; // П одпрограм м а о б р а б о т к и I S R ( T IM E R IO V F l_ v e с t ) { // // в проекте Д ля р а б о т ы Глобальная преры вания определения устройства, с п р е р ы в ан и я м и перем ен н ая типа при п е р еп о л н е н и и in t TCNT1 133 Работа с прерываниями в A T 90 S 23 13 Листинг 7.14. Продолжение TCNT1 = TCNT1 + tc n t_; // // увеличится или // перем енной tcn t_ // v o la t ile , ее Содерж им ое р е г и с т р а ум еньш ится в (п о с к о л ь к у значение TCNT1 зависим ости она от объявлена мож но и з м е н я т ь в значения как п одп рограм м е) } in t m a in (v o id ) { DDRB |= (1 << // Н астройка // Регистр // двух 3 ); // 8 -р а з р я д н ы х С0М1А1 // реж има // устанавливается // когда // при (р а з р я д 7) устанавливается PWM10 // 1 0 -р а з р я д н у ю // значение // от (р а з р я д 0 до = // IC N C 1 захвата // Разряд не 1023 и Разряды регистра 7) не 0 -2 - регистра // увеличиваться с на O x O lF F ; << 0С1 1) то (Р В З ) = 1 . 0 до будет до О пределяем 1023), т.е. в цикле изм еняться 0. 6) (р а з р я д при = 0 - т.е. совпадении разряд сч етн ы х 0Ы 01 реги стр не T C N T1 им пульсов 1 T C N T1 для частота / 4000000 регистра и OCR1 и с п о л ь з у ю т ). соответствует каж ды е счетного OCR1 непреры вно тайм ера/счетчика // 0CR1A, ум еньш ается, = будет единицу. Содерж им ое р е г и с т р << установка //O bO O O O O O O l зн ачением ~ (1 1023 T CNT1 4 М Гц, // DDRD &= T CNT1 IC E S 1 значение 0x01; (1 от реж и м е ШИМ э т о т // |= от Значениею 0,00000025 PORTD (р а з р я д вы бор и с т о ч н и к а м икроконтроллера << вы воде - (Р В З ) TCNT1 и же TCNT1 отсчетов реги стр TCNT1. // 0 (н е и н в е р т и р у ю щ а я Ш И М ). (1 0 2 4 = 0 , (в // ~ (1 из и сп ользуем . // DDRD &= = вы вод 0 С 1 совпадении Если PWM11 обратно 3 = 0 - // 1 1, состоит //О Ы О О О О О Н IC R 1 // = счетного обнуляется = О при 6) (р а з р я д Теперь и OCR1 н а лог. ШИМ (р а з р я д // OCR1 СОМ1АО в лог. 0) 0x83; // = = 1 , TCCR1 T C C R 1 A и TCCR1B д д я ШИМ. T CNT1 // в ы х о д Ш И М -с и г н а л а 1 TCNT1 у в е л и ч и в а е т с я . // В - тайм ером /счетчиком регистров: совпадения совпадении TCCR1B 3 порта тайм ера/счетчика управления // ТС C R IA Разряд // 0) & ~ (1 I << 1 ); (1 << 1) ; н агру зоч н ы е 2) сравнивается с текущ им (T C N T 1 ) 511 кн оп ок и зм енения 0) 1 & ~ (1 « PD0 и // PD1 // кнопок - PD2 и входы д ля заполнения П од клю чаем сопротивления 3 ); // // коэф ф и ци ен та к в ы в о д ам PD3 и зм енения ШИМ внутренние - PD0 входы частоты и для ШИМ PD1 134 Гл а в а 7 Л истинг 7.14. Окончание Р ОИТБ |= (1 << // T IM S K |= (1 | 2) (1 << « 7 ); s e i () ; w h ile 3 ); н агру зоч н ы е (1 ) // П о д к лю ч ае м сопротивления внутренние к вы водам // Разреш ение // переполнению преры вания // О бщ ее р а з р е ш е н и е // Бесконечны й цикл Р02 и РБЗ по тайм ера/счетчика 1 преры ваний { // if И зм ен ен и е (-P IN D & коэф ф ициента (1 << 0 )) // заполнения Если на вы воде PD0 О В, . . . { OCR1 = w h ile OCR1 + (-P IN D 1; & (1 « 0 )) // О ж идаем о т п у с к а н и я кнопки // Если +5 // Ож идаем о т п у с к а н и я кнопки // Если - // Ож идаем о т п у с к а н и я кнопки // Если - // О ж идаем о т п у с к а н и я } if (-P IN D & (1 « 1 )) на вы воде РБ1 В { OCR1 w h ile = OCR1 - (-P IN D 1; & (1 « 1 )) } // if И з м е н е н и е ч а с т о т ы ШИМ ( - P I N D & (1 < < 2 ) ) на вы воде РБ2 О В { tc n t_ = w h ile (-P I N D tcn t_ + & 1; (1 « 2 )) } if (-P IN D & (1 « 3 )) на вы воде РБЗ 0 В { tcn t_ = w h ile (-P IN E tcn t_ & 1; (1 « 3 )) кнопки } } П ер ед а ч а д а н н ы х с и с п о л ь зо в а н и е м ч е р е з 11А РТ б у ф е р а С х е м а с о е д и н е н и й д л я э т о г о п р и м е р а п о к а з а н а на р и с . 7 .3 . П р о ­ г р а м м а (л и с т и н г 7 .1 5 ) п е р е д а е т с т р о к у “ п р и в е т , э т о т в о й м и к р о к о н т р о л ­ л е р = ) ” ч е р е з п р и е м о п е р е д а т ч и к и А Я Т . П р и э т о м в н ей и с п о л ь з у е т с я б у ф ер н ы й м а сси в из 3 2 эл ем ен т о в , в к отор ом н ак ап ли ваю тся си м волы для п ер ед а ч и , есл и р еги стр д ан н ы х Ц О Я полон. Д л я о б р а щ е н и я к а д р е с у п а м я т и и с п о л ь з у е м у к а за т е л ь в б е з у н а р н о ­ г о о п е р а т о р а * (р а ск р ы т и я с с ы л к и ). Д л я т о г о ч т о б ы и зв л е ч ь с о д е р ж и м о е 135 Работа с прерываниями в A T 90 S 23 13 (в д а н н о м с л у ч а е — с и м в о л ) я ч ей к и п о а д р е с у э , п р и м е н я е м у н а р н ы й о п е р а т о р р а ск р ы т и я с с ы л к и , т .е . * э . К о гд а р еги стр д а н н ы х и А Л Т о св о б о ж д а ет ся , возн и к ает п р ер ы в ан и е (в ек т о р и А К Т _ т а Ш Е _ у е с ^ . В п о д п р о г р а м м е е г о о б р а б о т к и п р о в е р я ­ ем : е с л и г л о б а л ь н а я п е р е м е н н а я и А И Т _ Т х Н е а с 1 н е р а в н а г л о б а л ь н о й п е р е м е н н о й и А 1 1 Т _ Т х Т а д .1 (т .е . е щ е п р и с у т с т в у ю т с и м в о л ы д л я о т ­ п р а в к и ч е р е з и А И .Т ), т о з а п и с ы в а е м в р е г и с т р д а н н ы х с и м в о л . В п р о ­ т и в н ом сл уч ае отк л ю ч аем преры вание. - 1- С2 | 1»F Х1 ; С1 1CSF □ з.еэ5*амн1 XTAL1 XTAL2 RESET РDCVRXD Р D1iTXD Р02У1МТП Р D3*1HT1 р d +гга PDST1 РЕ'вЕР PBQ'AIMD РВ1/А1И1 РВ2 РВ30С1 PB i PBS РВь PB7 12 13 U 15 16 И7_ 1В 1S ATEC=:Z313 Рис. 7.3. С хема со е д и н е н и й д л я п е р ед а чи д а н н ы х че р е з UART П р о г р а м м а , р е а л и з у ю щ а я р а б о т у с х е м ы , п о к а з а н н о й н а р и с . 7 .3 , п р е д с т а в л е н а в л и с т и н г е 7 .1 5 . . щ Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T 9 0 S 2 3 1 3 \7 .1 5 - Передача дан­ ных через UART с использованием буфера. Листинг 7.15. Программа # in c lu d e # in c lu d e U A R T _ s e n d _ s t r _ b u f .с / / Заголовочный файл подключает определения / / ввода-вы вода для у с т р о й с т в а , / / используем ого в проекте < a v r / in t e r r u p t .h > / / Для работы с прерываниями < a v r / io .h > 136 Глава 7 Листинг 7.15. Продолжение // Глобальная // U A R T _T xB u f [ ] , s ta t ic перем енная, v o la t ile u n s ig n e d // Глобальная // U A R T _ T x B u f[ ] , s ta t ic v o la t ile которы й Глобальны й м ассив необходим о отправить v o la t ile содерж ащ ая in t = 0; индекс через со д е р ж ащ и й char // П одпрограм м а о б р а б о т к и IS R (U A R T _ U D R E _ v e c t ) м ассива элем ента м ассива UART U A R T _ T x T a il= 0 ; (б у ф е р ), u n s ig n e d элем ента сим вол U A R T _T xH ead отправляем u n s ig n e d // индекс записы ваем in t перем енная, // s ta t ic содерж ащ ая в которы й сим волы , которы е U A R T _ T x B u f [3 2 ] ; преры вания при очистке реги стра UDR { u n s ig n e d if in t t m p t a il; (U A R T _ T x H e a d != // U A R T _ T x T a il)// { // // У величиваем tm p ta il на В рем енная перем ен н ая Если ч т о -т о есть единицу, чтобы / / след у ю щ и й с и м в о л с и н д е к с о м t m p t a i l t m p t a i l = (U A R T J T x T a il + 1 ) & 3 1 ; U A R T _ T x T a il UDR = = t m p t a il; // // присваиваем // в м ассиве // вы зове // элем ен т e ls e // Если отправлять при преры вания уж е U A R T T x B u f[t m p t a il]; чтобы U A R T _T xB uf перем енной отп равляем ого U A R T _ T x B u f, м ассива отправить в м ассиве Глобальной индекс обработчика для о т п р а в к и ... элем ента следую щ ем зн ать, что этот отправлен // Записы ваем // сим вол нечего, то отправляем ы й в регистр д а н н ы х UDR отклю чаем преры вание { OCR &= ~ (1 << 5 ); // Записы ваем 0 в разр яд UDRE } } // Ф ункция u a r t _ p u t c его приним ает / / и зап и сы вает в v o id u a r t _ p u t c (u n s ig n e d в глобальны й качестве м ассив char d a ta ) >31, то парам етра сим вол U A R T _ T x B u f[] { u n s ig n e d in t tm p h ead ; U A R T _T xH ead+l // // Если // увеличится на единицу. // (0 Ы 1 1 1 0 ) , то tm phead // Т.е. // потом у ч то tm p h e a d если = Н ап ри м ер, = 0Ы 1110 (U A R T _ T x H e a d + l ) 0Ы 00000 (U A R T T x H e a d > 31, 0Ы 1111 & + Врем енная tm p h e a d 1) = & 31; = если & то 0. 0, п ерем енная иначе tm ph ead (U A R T _ T x H e a d + l) 0Ы 1111 tm p h e a d = 0Ы 1110 будет = 30 ( 30) . равно 0, 137 Работа с прерываниями в A T 90 S 23 13 Л истинг 7.15. Окончание // О ж и даем , пока // сим вол и н д ексом U A R T _ T x T a il // чтобы // значение w h ile { ; } с подп рограм м а в м ассив по (t m p h e a d == // О ж и даем , // св обод н ы е = отправит U A R T _ T x B u f[ ] , б ы ло записать новое U A R T T x T a il) << в м ассиве U A R T _ T x B u f[] появятся ячейки = d a ta ; tm ph ead; // (1 э т о м у и н д е к с у можно когда U A R T _ T x B u f [t m p h e a d ] |= преры вания в м ассиве перем енной U A R T _T xH е a d UCR обработки присвоенного 5 ); // Зап и сы ваем // З п и с ы в ае м элем ента // Разряд // при U D R IE = 1 очистке в м ассив в глобальн ую - активизац ия регистра сим вол индекс п ерем енную преры вания данны х } // Ф ункция u a r t _ _ p u t s // м ассива s t r o k a в v o id u a r t _ p u t s (c h a r передает { w h ile (*s) u artpu tc(*s++); посим вольно функцию u a r t _ p u t c *s) // У к а з а т е л ь // элем ента // До // сим вол тех содерж и м ое s - ад рес м ассива пор, пока есть // В ы зы ваем функцию о т п р а в к и // передав // s , / / к ей содерж им ое след у ю щ е м у адрес s элем енту н улевого stro k a в п ам яти п о и увеличив всего к а к о й -л и б о ад ресу ячейки на s сим вола, 1 по адресу (п е р е х о д м а с с и в а ). } v o id U A R T _IN IT () { UCR |= UBRR = (1 << 3) I (1 << 5 ); // передатчика // очистке 0x17; и // Разреш аем активизируем регистра в в о д а -в ы в о д а // Скорость // МК 3 . 6 8 6 4 передачи U A R T _ IN IT (); // И н и ц и али зац и я sei (); // О бщ ее р а з р е ш е н и е работу преры вание 9600 при UDR. бод при ч а с т о т е МГц } in t m a in (v o id ) { s ta t ic char "п р и в ет , s t r o k a [] это твой (1 ) { } преры ваний = м икроконтроллер u a r t _ p u t s (& s t r o k a [ 0 ] ) ; w h ile UART = )\ г \ п " ; // П ередаем // м ассива адрес н улевого // Б есконечны й ц и к л stro k a элем ента Ч Ш кш ь Ш М и к р о А к Т о м н е т с р а о 1 л л е 6 В эт ой части: ❖ Г л а в а 8 . Т а й м е р ы /с ч е т ч и к и А Т т е д а 1 6 ❖ Г л ава 9. А н алоговы й к ом п ар атор и А Ц П А Т т е д а 1 6 ❖ Г лава 10. И н тер ф ей сы п ер ед а ч и дан н ы х А Т т е д а 1 6 ❖ Г л а в а 1 1 . И с п о л ь з о в а н и е Ж К -эк р а н а р Глава 8 Т а й м е р ы /с ч е т ч и к и A T m eg a l6 В этой главе мы рассмотрим методы работы с таймерами микрокон­ троллера A T m e g a l6 и соответствую щ ие программы на С. Т а й м е р /с ч е т ч и к 0 в р е ж и м е “ N o r m a l” В функции t i m e r _ c o u n t e r O _ I N I T () инициализируется таймер/ счетчик 0. С помощ ью разрядов C S 0 -C S 0 2 регистра TCCR0 задаем ко­ эфф ициент предделителя 1 024, т.е. при частоте работы микроконтрол­ лера 10 М Гц счетчик T C N T0 будет увеличиваться на единицу за 1 024 / 10 М Гц = 0 ,0 0 0 1 0 2 4 с. Таким образом, частота счетчика составляет 1 / 0,0 0 0 1 0 2 4 = 9765,625 Гц. Если без предделителя счетчик работал бы на частоте 10 М Гц (10 миллионов приращ ений TC N T0 за секунду), то одн о увеличение значе­ ния счетного регистра T C N T0 длилось бы 1 / 10 М Гц = 0,0000001 с. Т е­ перь ж е, с предделителем, на одно приращ ение TC N T 0 уходи т 1 024 такта микроконтроллера: 0,0000001 • 1 024 = 0 ,0 0 0 1 0 24 с. Таким образом, за о дн у секун ду происходит 97 6 5 ,6 2 5 отсчетов по 0 ,0 0 0 1 0 2 4 с каждая. С помощ ью разрядов W G M 00 и W GM 01 задаем реж им “normal”, в котором таймер/счетчик работает как сум мирую щ ий счетчик (при ка­ ж дом импульсе тактового сигнала инкрементируется счетный регистр TCN T0). Поскольку таймер/счетчик 0 — восьмиразрядный, максималь­ ное значение счетного регистра — 255. Таким образом , до его п ерепол ­ нения (перехода в 0) — 2 56 отсчетов. В бесконечном цикле основной программы выполняются четыре проверки содерж им ого счетного регистра T C NT0, на основании кото­ рых инвертируется состояние (п ереход из 0 В к + 5 В и наоборот) того или иного вывода микроконтроллера. Так, если значение счетного регистра T C N T 0 равно нулю , то инвер­ тируется состояние вывода PD 0. Это будет происходить через каждые 252 отсчета TCNT0. Положительный импульс, как и отрицательный, длится (256 - 4) -0,0001024 = 0 ,0 2 5 8 0 4 8 с (рис. 8.1). 140 Гл а в а 8 Рис. 8.1. Осциллограмма импульсов М еж ду изм енением состояния соседн и х выводов проходит 63 отс­ чета ТСЫТО, что составляет 63 -0,0001024 = 0,0064512 с. Поскольку одно увеличение ТСМТ0 на единицу происходит за 1 024 такта микроконтроллера, для использования условия, связанного со счетчиком ТОЧТО, в бесконечном цикле приходится идти на ухищ ре­ ния. Если бы мы после выполнения условия ТСКГТО = = 0x00, не ин­ крементировали счетчик на единицу, то дан ное условие было бы истин­ ным н е один раз, а на протяжении всех 1 024 тактов, пока ТОЧТО не увеличилось на единицу. Для того чтобы вывод порта менял свое со ­ стояние на противополож енное один раз за 252 отсчета счетчика, мы после изменения состояния вывода микроконтроллера инкрементируем счетчик на единицу. Частота импульсов на выводах РОО-РЭЗ составляет Р = 1 / период = 1 / (0 ,0 2 5 8 0 4 8 + 0 ,0 2 5 8048) ~ 19,38 Гц. Схема С хема соединений для данного примера показана на рис. 8.2. П ри м ечани е Перед "прошивкой” микроконтроллера, необходимо установить внешний источник частоты, иначе будет использован внутренний источник (рис. 8.3). 141 Таймеры/счетчики А Т т е д а 1 6 ) О а ■ ’“ N в!=я>1 ООО о ог *1 РСРС Ь в 9 Р Г я < 1 Г ) йтгй ййааё ____________ пУ яМ пШ „ . Е § || -М -М -Ш » ! х ! № СЧ_ о о Рис. 8.2. Схема для исследования работы таймера/счетчика 0 в режиме “погпаГ 142 Гл а в а 8 [sTK500 in ISP mode with ATmega16 Main I Program ül Fuses | LockBits | Advanced j Fuse HWSettings | HW Info | Auto | Value 0CDEN JTAGEN 0 SPIEN r■i EESAVE B00TSZ Boot Flash size=1024 words start address=$1 COO ▼ Brown-out detection at VCC=2.7 V ▼ B00TRST СК0РТ B0DLEVEL B0DEN SUTJXSEL Ext. Clock; Start-up time: 8 CK + 0 ms Ext. Clock; Start-up time: 6 CK + 0 ms Ext. Clock; Start-up time: 6 CK + 4 ms Ext. Clock; Start-up time: 6 CK + B4 ms Int. RC Osc. 1 MHz; Start-up time: 6 CK + 0 ms Int. RC Osc. 1 MHz; Start-up time: 6 CK + 4 ms Int. RC Osc. 1 MHz; Start-up time: 6 CK + 64 ms; default value ___ . HIGH Low __ Рис. 8.3. Выбор внешнего источника частоты Программа П р о г р а м м а , р е а л и з у ю щ а я р а б о т у с х е м ы , п о к а з а н н о й н а р и с . 8 .2 , п р е д с т а в л е н а в л и с т и н г е 8 .1 . Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATmegal6\8. 01 - Таймер 0 в ре­ жиме normal. Л истинг 8.1 . Программа t im e r _ c o u n t e r O . с # in c lu d e // Заголовочн ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого < a v r / io .h > подклю чает определения устройства, в проекте / / Функция и н и ц и а л и з а ц и и т а й м е р а / с ч е т ч и к а v o i d t im e r _ c o u n t e r O _ I N IT () 0 { // Д елитель // // на увеличение у х о д и т 1024 / TCCR0 |= (1 TCCR0 &= -(1 // помощью р а з р я д о в « &= ~ (1 зн ачения 10 МГц = 0) << Режим р а б о т ы TCCR0 } с << | (1 « C S 0 0 -C S 0 2 2 ); 1 ); // CS00=1, // CS01=0 тайм ера/счетчика 6) &- (1 задан счетного реги стра 0,0001024 с. << 3);// - как TCNT0 1024, на CS02=1 " n o r m a l" W G M O0=0, WGM01=0 т.е. ед и н и ц у 143 Таймеры/счетчики A Tm ega16 Л истинг 8.1. Окончание in t m a in ( v o i d ) { t im e r _ c o u n t e r O _ IN IT (); // И н и ц и али зац и и DDRD = // Выводы п о р т а // На O xFF; PORTD = 0x00; w h ile (1 ) вы водах тайм ера/счетчика D - порта // Б еск он ечн ы й // Если О вы ходы D - 0 В цикл { if (T C N T 0 == 0x00) счетны й р е г и с т р содерж ит 0, { PORTD = PORTD л (1 << TCNT0++; } if (T C N T 0 0) ; // == 0x40) // И нвертируем У величиваем состояние сч е т н ы й р е г и с т р // единицу, // ц икле чтобы при // инвертировалось // 64 состояние PD0 на следую щ ем вы вода не обратно { PORTD = PORTD А (1 « 1 ); TCNT0++; } if (T C N T 0 == 0x80) // 128 { PORTD = PORTD л (1 << 2 ); TCNT0++; } if (T C N T 0 == O xCO ) // 192 { PORTD = PORTD л (1 « 3) ; TCNT0++; } } } Т а й м е р /с ч е т ч и к 0 в р еж и м е “С Т С ” В функции t i m e r _ c o u n t e r O _ I N I T ( ) инициализируется таймер/ счетчик 0. Разряды C S 0 0 -C S 0 2 задаю т коэффициент делителя 1 024, т.е. каждый 1024 такт микроконтроллера содер ж и м ое счетного регистра T C N T 0 будет увеличиваться на единицу. С помощ ью разрядов W GM 01 и W G M 00 задан реж им “СТС”, в ко­ тором при равенстве содерж им ого регистра TC NT0 и регистра сравне­ ния OCR.O счетный регистр обнуляется. В нашем примере OCRO устано­ вим равным 80, т.е. T C N T0 обнулится после 81 отсчетов (рис. 8.4). 144 Гл ав а 8 TONTO увеличилсяна 1 TCNTO увеличилсяна40 TCNTO увеличилсяна 80 TCNTO сб р о с и л с я в 0 (н асч и та в в с его 81 о т с ч е т ) 81920 циклов МК Рис. 8.4. К о л и ч е с тв о о тс ч е то в TCNT0 п р и OCRO, р а вно м 80 Разряды C O M Ol, СОМОО регистра TCCR0 определяют, что при ра­ венстве содерж им ого регистров TC N T0 и OCRO будет инвертироваться состояние вывода ОСО (РВ З) через каждые 81 920 циклов микрокон­ троллера (рис. 8.5). TCNTO==OCRO TCNT0=0 вывод РВЗ ОСО В1920 циклов 81920 циклов МК Рис. 8.5. С ч е тч и к TCNT0 и в ы х о д ОСО пр и OCRO, ра вно м 80 Схема С хема соединений для данного примера показана на рис. 8.6. Вывод РВ 7 микроконтроллера настроен как вход с подтягиваю щ им сопротив­ лением. К нем у подклю чена кнопка, при нажатии которой содерж им ое регистра сравнения OCRO увеличивается на единицу. Светодиод, п од­ ключенный к выводу РВ6, изменяет свое состояние на противополо­ ж енное (для индикации изменений в OCRO). При увеличении или уменьш ении содерж им ого OCRO будет изм е­ няться частота на выводе ОСО (РВЗ) при неизменном коэф ф ициенте за­ полнения. Частота сигнала на выводе ОСО вычисляется по формуле: Foc = /c lk _ io / 2 где N — коэффициент предделителя. -N (1 + OCR), 145 Таймеры/счетчики А Т т е д а 1 6 С2 1UF С1 I— I- Х1 1ЕЖ 1НХ U1 Р.ЕВЕТ 1Е*F вш ж ш ж З 13 12 XTAL1 XTAL2 ЗГ 35 35 3» 33 PAQ'ABCD PA1/ADC1 РА2УА0С2 PA3fADC3 PAtfADC+ PAfVADCS PASADC6 PA7iADC7 1 2 3 РВО'ХСКЛП РВ1ГГ1 PBZi'IHTZi'AIHD PВЗЮСПГАНИ PCIY3CL PC1SDA PC2iTCK РСЗГГИВ PC4TTDO PCSTD1 РС6ГГ0ЕС1 PCTiTOSCZ PDQ'PXD PD1m<\> рвггштп PD3MHT1 PDWOC1В PDSTOC1A PDSfcP PD7i*0C2 PBSiMOSI рвамво PB7®CK А.ТМEGA16 AVCС AREF D1 LED-P.ED Рис. 8.6. С хем а с о е д и н е н и й д л я и с с л е д о в а н и я р е ж и м а “ С Т С ” Соответственно, частота, при ОСО = 80 будет равна: ^ с = 10 М Г ц / 2 -1 024 -(1 + 8 0 ) - 6 0 , 2 8 Гц. П ериод при ОСО = 80 равен 1 / 60,28 = 0 ,0 1 65888 с (или 16,5888 мс) (рис. 8.7). Время, за которое содерж и м ое счетного регистра ТСЫТО увеличи­ вается на единицу: 1 0 2 4 / 10 М Гц = 0 ,0 0 0 1 0 2 4 с. Длительность полож ительного и нулевого импульса на выводе РВЗ (ОСО) при ОСО = 80: 0,0001024 -(80 + 1) = 0,0082944 с. 146 Глава 8 Рис. 8.7. Длительность и период импульсов Для увеличение счетчика ТСОТО на единицу требуется 1 0 2 4 такта микроконтроллера. О тсю да, на инвертирование состояния вывода ОСО уйдет 1 024 (8 0 + 1) = 82 944 такта микроконтроллера. Скважность и коэффициент заполнения при ОСО = 80: Скважность = период / длительность импульса = = 0 ,0 1 6 5 8 8 8 /0 ,0 0 8 2 9 4 4 = 2; К оэф фициент заполнения = длительность импульса / период = = 0 ,0 0 8 2 9 4 4 / 0 ,0165888 = 0,5. При изменении регистра ОСШ) длительности положительного и ну­ левого импульсов всегда равны. Соответственно, коэффициент заполне­ ния и скважность не меняются. Реж им “С ТС ” предназначен для генерирования импульсов с разной частотой при неизменной скважности и коэффициенте заполнения. Программа П рограмма, реализующ ая работу схемы, показанной на рис. 8.6, представлена в листинге 8.2. Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке АТшеда16\8 .02 - Таймер 0 в ре­ жиме СТС. 147 Таймеры/счетчики ATm ega16 Л и с т и н г8.2. Программа tim e r _ c o u n te rO .с # in c lu d e < a v r / io .h > // Заголовочны й ф айл подклю чает // в в о д а -в ы в о д а для // и сп о ль зу ем о го в п роек т е < u t il/ d e la y .h > / / Д л я д о с т у п а к ф ункц иям ц и к л о в # in c lu d e // v o id опред еления устройства, задерж ки t im e r _ c o u n t e r O _ I N I T () { // Д елитель //на // уходит TCCR0 |= -(1 -(1 TCCR0 |= (1 « МГц = I (1 « |= (1 6) ; 3 ); вы вода << 0,0001024 2 ); задан регистра CS00=1, // CS01=0 СТС // WGM00=0 // WGM01=1 ОСО м е н я е т с я на - // 1024, на т.е. ед и н и ц у CS02=1 сброс при совпадении противополож енное р е г и с т р о в TCNT0 / / СОМ01=0 4 ); как TC N T0 с. // тайм ера/счетчика: << // р а в е н с т в е , содерж им ого TCCR0 &= ~ ( l ' < < 5 ) ; TCCR0 C S 0 0 -C S 0 2 счетного 1 ); « Состояние 10 0) Режим р а б о т ы &= значения / « TCCR0 // помощью р а з р я д о в 1024 (1 Т С C R 0 &= // с увеличение при и OCRO СОМОО=1 } in t m a in (v o id ) OCRO = t im e r (1 « DDRB &= ~(1 « PORTB |= (1 « DDRB 1= DDRB 1= w h ile // В регистре // И н и ц и али зац и и // Вы вод РВЗ (О С О ) 7) ; // Вы вод РВ7 - вход 7) ; // Вы вод РВ7 - с // с опро тивлением // Вы вод // Бесконечны й // Е сли // с п о д т я ги в аю щ и м 0x5 0; co u n terO (1 INIT(); 3) ; 6) « ; (1 ) сравнения РВ6 - - 80 тайм ера/счетчика - 0 вы хо д п о д тя ги ваю щ и м в ы хо д цикл r X if ( -P IN B & (1 « 7 )) напряж ение // стало // наж ата, р авн ы м на вы воде соп роти влен и ем 0 В, т.е. кнопка то... { // О ж идаем в ц и к л е // равно // вы ход и з w h ile d e la y 0, (-P IN B lo o p т.е. до как тех пор, только пока отпустят напряж ение кнопку, ц икла & (1 << 2(65535); 7 )) _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); // П ауза на вы воде п роизойдет 148 Гл а в а 8 Листинг 8.2. Окончание PORTB OCRO А= (1 << 6 ) ; = OCRO + / / Инвертируем состоян и е вывода РВ6 / / (светодиод вклю чится, если был / / отклю чен, и наоборот) / / Увеличить содержимое р еги стр а / / сравнения (есл и будет 2 55, / / и произойдет еще одно увеличени е, / / то значение с та н е т равным 0) 1; } } } Т а й м е р /с ч е т ч и к 0 в р еж и м е “F a st P W M ” В режиме “Fast PWM” счетный регистр работает как суммирующий счетчик. Состояние счетчика изменяется от 0 до 255, после чего счет­ ный регистр сбрасывается, и цикл повторяется (рис. 8.8). Такой режим устанавливают с помощью разрядов WGM01, WGM00 регистра TCCR0. TONTO увеличипсяна 1 TCNTO увеличипсяна80 TCNT0 узеличипсяна255 TCNT0 сбросилсяв0(насчитаввсего 256 отсчетов) 262144цикловМК Рис. 8.8. К о л и ч е с тв о о тс ч е то в TCNT0 Особенностью данного режима является двойная буферизация за­ писи в регистр сравнения. Записываемое число сохраняется в буфере, а изменение регистра сравнения происходит в момент достижения счет­ ного регистра максимального значения 255. Благодаря этому, исключа­ ется появление несимметричных импульсов. Поведение вывода ОСО определяют с помощью разрядов COMOl, СОМОО регистра TCCR0. На выводе будет уровень лог. 0 при TCNT0 = = OCRO и лог. 1 при TCNT0 = 0 (неинвертированная ШИМ) (рис. 8.9). Схема Схема соединений для данного примера показана на рис. 8.10. К вы­ водам микроконтроллера РВ6 и РВ7 подключены кнопки SW0 и SW1 для изменения содержимого регистра сравнения OCRO. 149 Таймеры/счетчики A Tm ega16 255 TCNTO==OCRO==8Ci TCNT0=0 ' вывод РВЗ(ОСО) Рис. 8.9. С че тч и к TCNT0 и в ы х о д ОСО п р и OCRO = 80 С2 I---- 1 X"1 U1 ■ 1IWHI С1 RESET XTA L1 X T ALZ 33 P A Q A DС □ PA1iADC1 P A2iADC2 PA3AD C3 PAdADC* PASfADCS P A& AD C 6 PA7.ADC7 р всухскгга P В 1.T1 P BZTiMTZiAIKG P B 3 Ü C Q A IH 1 PB'h'ES P BSftKISI PBSW EC PB 7ßCK PCQ ^CL PC1£3DA РС2ГГС К pshtw b PCfcTDO PC:STD I PC & T 0 8 C 1 РС7ПТ05С2 PDQ'RXD p dim io Р DS'IKTD PDU'IMTI P D♦«'ОС 1В PDÄÜ01A P DS‘ K: P PD7iüC2 AV C C AREF ATM EG A 16 SW0 D1 LED-P.ED SW1 Рис. 8.10. Схема соединений для исследования режима “Fast PWM” 22 Z3 2» 25 26 • 27 23 3 1» 15 16 17 15 15 2D 21 150 Гл а в а 8 Частота сигнала на выводе ОСО вычисляется по формуле: Foc = y clk _ io / N -256, где N — коэффициент предделителя. Таким образом, F o c = 10 М Г ц / (1 024 -256) ~ 38,15 Гц. В таком случае, период равен (рис. 8.11) 1 /3 8 ,1 5 = 0,02621 с (26,21 мс). Рис. 8.11. Период следования импульсов Время, за которое значение счетного регистра TC N T0 увеличивает­ ся на единицу: 1024 / 10 М Гц = 0,0 0 0 1 0 2 4 с. Длительность положитель­ ного импульса (при ОСО = 80): 80 0 ,0001024 = 0,008192 с (рис. 8.12). Второй вариант расчета: (O C R O /T O P + 1 ) Тщим = (80 / 255 + 1) -26,21 = 0,008192 с. Длительность нулевого импульса (при ОСО = 80): ( ( 2 5 5 + 1 ) - 8 0 ) -0 ,0 0 0 1 0 2 4 = 1 7 6 -0,0001024 = 0 ,0 180224 с. Режим “Fast PW M ” предназначен для генерации сигнала с ш иротно­ импульсной модуляцией при неизменной частоте сигнала. 151 Таймеры/счетчики A T m ega16 Рис. 8.12. Длительность нулевого и положительного импульсов Программа П р о г р а м м а , р е а л и з у ю щ а я р а б о т у с х е м ы , п о к а з а н н о й н а р и с . 8.10, п р е д с т а в л е н а в л и с т и н г е 8 .3 . Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATmegal6\8. 03 - Таймер 0 в ре­ жиме Fast PWM. Щ Л истинг 8.3. Программа t im e r _ c o u n t e r O . с # in c lu d e // Заголовочны й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого # in c lu d e // < a v r / io .h > < u t il/ d e la y .h > Ф ун кц и я и н и ц и а л и з а ц и и v o id Д ля // задерж ки тайм ера/счетчика { // Режим - "F ast |= (1 « TCCRO |= (1 « PWM" 6) ; // 3 ); // WGM01=1 WGM00=1 определения проекте доступа t im e r _ c o u n t e r O _ IN I T () TCCRO в // подклю чает устройства, к ф ун кц и ям ц и к л о в 0 152 Глава 8 Листинг 8.3. Продолжение // // Н а в ы в о д е ОСО у с т а н а в л и в а е т с я л о г . 1 п р и ТСДГТО = = О ТСХЖО &= TCCR0 ~ (1 « 4 ); // СОМОО = С> // С0м 01=1 (1 « // Д ели тель с // // на у в е ли ч ен и е зн ач ен и я у х о д и т 1 0 2 4 / 10 М Гц = ТССИО |= (1 ТССИО &= ~ (1 in t 5 ); пом ощ ью р а з р я д о в 0) « (1 | С Б О О -С Э О г 2 ); « О при ТСКЛО задан сч етн ого р еги стр а 0 ,0 0 0 1 0 2 4 с . 1 ); « лог. // СБ00=1, // С Б01=0 == как ТС№ Г0 ОСЛО, 1024, на т .е . единицу С802=1 m a in (v o id ) { = 0x50; t im e r_ c o u n te rO _ IN IT () ; // В р еги стр е // И ни ц иализац и я DDRB // В ы вод OCRO // I= (1 К нопка DDRB &= PORTB << 3 ); увели чен ия OCRO (О С О ) 7 ); // В ы вод РВ7 - вход (1 « 7 ); // В ы вод РВ7 - с // соп роти влени ем |= (1 « б ); //светоди од DDRB |= (1 « PORTB &= w h ile (1 ) -(1 OCRO 5) ; « 5 ); 80 - 0 вы ход 1 « // К н о п к а ум ен ьш ен и я DDRB &= - ( 1 « б ); - тай м ера/счетчи ка ~ (1 |= PORTB на РВЗ стравнени я на п од тя ги ва ю щ и м 1 // В ы вод РВ 6 - вход // В ы вод РВ6 - с // соп роти влени ем // Вы вод //На РВ 5 вы воде - вы ход РВ 5 // Б есконечны й // Е сли п од тя ги ваю щ и м - 0 В цикл { if (-P IN B & (1 << 7 )) { / / т .е . // О ж идаем // равно 0, т.е. // вы ход из ц икла w h ile в ц икле (-P IN B & до как (1 « тех PO R TB OCRO } (1 = OCRO << + 5 ); 1; пор, только 7 )) _ d e la y _ lo o p _ 2 ( 65535) ; напряж ен ие кнопка { на пока то... н апряж ен ие отпустят кнопку, на вы воде прои зой дет _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); // РВ7==0 , вы воде наж ата, } П ауза // И нвертируем // (с в е т о д и о д // отклю чен, // С одерж им ое состояние вклю чится, и вы вода если РВ 5 бы л наоборот) р еги стр а сравнения + 1 153 Т а й м е р ы /с ч е т ч и к и A T m e g a 1 6 Листинг 8.3. Окончание if (-P I N B & (1 6) ) << { // Ож идаем в // равно 0, ц икле т.е. Если напряж ение т.е. кнопка до как / / вы ход и з ц и к л а w h i l e ( - P I N B & (1 // // << тех б )) _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); PORTB OCRO л= (1 = OCRO << - 5 ); 1; пор, только { на вы воде наж ата, пока отпустят напряж ение кнопку, на вы воде п роизойдет _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); // РВ6=0, то... } П ауза // И нвертируем // (с в е т о д и о д состояние вклю чится, // отклю чен, // Содерж им ое р е г и с т р а и вы вода если РВ5 бы л наоборот) сравнения - 1 } } } Т а й м е р /с ч е т ч и к 0 в р еж и м е “P h a se C o rrect P W M ” В реж им е “Phase Correct PW M ” счетный регистр работает как р е­ версивный счетчик. Его состояние изменяется от 0 до 2 55, а затем — обратно д о 0. Режим “Phase Correct PW M ” устанавливается в программе с помощ ью разрядов W GM 01 и W G M 00 регистра TCCR0 в функции t i m e r _ c o u n t e r O _ I N I T ( ) . В ней ж е зададим значение регистра сравнения OCRO, равным 80, а также установим коэф ф ициент делителя 1 024 с помощ ью разрядов C SO 0-C S02. Теперь значение счетного реги ­ стра TC N T 0 будет увеличиваться на еди ни ц у каждый 1 024 цикл микро­ контроллера. С помощ ью разрядов COMOl и СОМОО регистра TCCR0 устанавли­ ваем поведение вывода ОСО. На нем установится уровень лог. 0 при прямом счете и уровень лог. 1 при обратном счете (неинвертированная Ш ИМ ). Состояние вывода ОСО (РВЗ) меняется при равенстве содер ж и ­ м ого регистров OCRO и TC N T0 в следую щ ем отсчете счетного регистра (рис. 8.13). Схема С хема соединений для данного примера показана на рис. 8.14. Для изменения содерж им ого регистра сравнения OCRO будем использовать кнопки, подклю ченные к выводам РВ6 и РВ 7. Следовательно, н ео б х о ­ дим о определить эти выводы как входы с подтягиваю щ им сопротивле­ нием. Для индикации нажатия лю бой и з кнопок воспользуем ся свето­ диодом , подключенным к выводу РВ5 (определяем его как вы ход). 154 Глава 8 ТС1МТ0=255 Рис. 8.13. Счетчик ТСЫТО и выход ШИМ В б еск он еч н ом цикле п роверяем со ст о я н и е вы водов Р В 6 и Р В 7. П о ­ ск о л ь к у о н и р а б о т а ю т , как в х о д ы с п о д т я г и в а ю щ и м с о п р о т и в л е н и е м , на н и х и зн а ч а л ь н о п р и с у т с т в у е т + 5 В (с о с т о я н и е л о г . 1). Е с л и н а о д н о м и з Таймеры/счетчики ATm ega16 155 этих выводов состояние изменилось на лог. О, то увеличивается или уменьш ается содер ж и м ое регистра ОСЯО. Частота сигнала на выводе ОСО вычисляется по формуле: ^ с = /с1 к _ ю / 5 1 0 -/V, где N — коэффициент предцелителя. Таким образом, ^ с = 10 М Г ц / 5 1 0 - 1 0 2 4 - 19,15 Гц. Отсю да, период составляет 1 / 19,15 = 0 ,0 5 2 2 2 с. Положительный импульс будит длиться (79 + 81) -(1 0 2 4 / 10 М Гц) = 0 ,0 1 6 3 8 4 с. Нулевой импульс будит длиться ((255 + 255) - (79 + 81)) • (1 0 2 4 / 10 М Гц) = 0 ,0 3 5 8 4 с (рис. 8.15). Рис. 8.15. Длительность положительного и нулевого импульсов Количество отсчетов для полож ительного и нулевого импульсов по­ казаны на рис. 8.16. Режим “Phase Correct PW M ” предназначен для генерации сигнала с ш иротно-импульсной модуляцией при неизменной частоте. О собен ­ ность данного реж им а заключается в том, что изм енение регистра OCRO происходит только при достиж ения максимального значения счетным регистром TCNT0. 156 Гл а в а 8 80 81 80 254 255 254 81920 82944 циклов MKциклов MK вывод OCO+5 Вольт 81 отсчет TCNT0 79 441344 440320 циклов MK циклов MK 261120 циклов MK вывод ОСО+5 Вольт 79 отсчетовКШО 350 отсчетов TCNT0 вывод OCOв состоянии логического нуля Рис. 8.16. Количество отсчетов ТСШО для положительного и нулевого импульсов Программа П р о г р а м м а , р е а л и зу ю щ а я р а б о т у с х е м ы , п о к а з а н н о й н а р и с . 8 .1 4 , п р е д с т а в л е н а в л и с т и н г е 8 .4 . . Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке АТшеда16\8. 04 - Таймер 0 в ре­ жиме Phase C orrect PWM. Л истинг 8.4. Программа P h ase iin c lu d e // Заголовочны й ф айл п од клю чает // в в о д а -в ы в о д а для # in c lu d e < a v r / io .h > C o rre ct PWM. с // и сп о ль зу ем о го в п роекте c u t il/ d e la y .h > / / Д л я д о с т у п а к ф ункц иям // определения устройства, циклов задерж ки / / Ф ункция и н и ц и а л и з а ц и и т а й м е р а / с ч е т ч и к а v o id t i m e r c o u n t e r O I N I T () 0 { // Д елитель // на с помощью р а з р я д о в увеличение // у х о д и т 1024 TCCR0 |= ( 1 « TCCR0 // &= Режим -(1 - << значения / 10 МГц = 0) | (1 < < |= (1 TCCR0 &= -(1 C o rre c t 6) ; « << 3 ); // &= ~ (1 TCCR0 |= (1 } in t m a in ( v o id ) << « 4 ); 5 ); как TCNT0 1024, т.е. на ед и н и ц у == OCRO, CS02=1 CS01=0 PWM" // WGM00=1 // WGM01=0 / / Н а в ы в о д е OCO у с т а н а в л и в а е т с я / / л о г . 1 п р и TCNT0 = = 0 TCCR0 задан реги стра 0,0001024 с. 2 ); // C S00=1, 1 ); "P h a se TCCR0 C S 0 0 -C S 0 2 счетного лог. // COM00=0 // COM01=1 0 при TCNT0 157 Таймеры/счетчики A Tm ega16 Листинг 8.4. Продолжение { ОСИО // В реги стре ^ т е г _ с о ш ^ е г 0 _ 1 1 1 1 Т () ; // И н и ц и али зац и я БОЕВ |= // Вы вод // = 0x50; (1 « Кнопка &= РО Е ТВ // O CR0 н а увеличения - (1 |= 3 ); (1 PORTB Вы вод Р В7 - вход << 7 ); // Вы вод Р В7 - с // соп роти влен и ем DDRB 6 ); (1 « 6 ); |= w h ile (1 << O CR0 н а 1 / / Вы вод 5 ); (1 ) 80 - О вы ход 1 // « |= (О СО ) 7 ); ~ (1 - тайм ера/счетчика « К н о п к а у м е н ь ш ен и я DDRB &= РВЗ стравнения РВ6 - под тя ги ваю щ и м вход РВ6 - // Вы вод // сопротивлением // Вы вод // Бесконечны й Р В5 с - под тя ги ваю щ и м вы хо д (с в е т о д и о д ) цикл { if (-P IN B & (1 << 7 )) { // Ож идаем // равно // вы ход и з w h ile в ц икле 0, т.е. // Если напряж ение // т.е. кнопка до как тех пор, только & (1 « 7 )) { OCRO = OCRO пока н апряж ение отпустят РВ7=0, то... кнопку, на вы воде произойдет _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); (1 вы воде ц икла (-P IN B PORTB на наж ата, << + 5) ; 1; // > П ауза // И нвертируем // (с в е т о д и о д состояние вклю чится, // отклю чен, // С одерж им ое р е г и с т р а // Если вы вода если РВ5 бы л и наоборот) сравнения + 1 } if (-P I N B & (1 6) ) << { / / т .е . // О ж идаем в ц и к л е // равно 0, т.е. до как / / вы ход и з ц и к л а w h i l e ( - P I N B & (1 << тех PORTB OCRO } } } А= (1 = OCRO << - 5 ); 1; пор, только 6 )) _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); напряж ение кнопка { на вы воде наж ата, пока отпустят напряж ение кнопку, на вы воде произойдет _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); // РВ6=0, то... } П ауза // И нвертируем // (с в е т о д и о д состояние вклю чится, // отклю чен, // С одерж им ое р е г и с т р а вы вода если РВ5 бы л и наоборот) сравнения - 1 158 Глава 8 Т а й м е р /с ч е т ч и к 1 в р еж и м е “ N o r m a l” М икроконтроллер работает на частоте 10 М Гц, таймер/счетчик1 — через предделитель с коэффициентом 1 024. Таким образом , его частота составляет 10 М Гц / 1 024 = 9 765,625 Гц, т.е. TCNT1 за 1 секунду м о­ ж ет сделать 9 765 отсчетов. Значение счетного регистра увеличивается на единицу через каждые 1 024 / 10 М Гц = 0 ,0 0 01024 с. Поскольку счетный регистр TCNT1 — 16-рязрядный, максимальное значение п ер ед его переполнением (п ереходом в 0) — 65 535. П осле ожидания 1 024 тактов микроконтроллера при TCNT1, равном 65 535, счетчик сделает 65 536 отсчетов. Следовательно, для полного п рохода счетчиком от 0 д о 65 535 и сброса в 0 требуется 0 ,0 0 0 1 0 2 4 • 65 536 = = 6,710 8 8 6 4 с (рис. 8.17). Рис. 8.17. Длительность сигнала В бесконечном цикле значение счетного регистра Т С Ш Т проверя­ ется на его принадлеж ность одном у из четырех диапазонов. На основа­ нии этого инвертируется состояние того или иного вывода микрокон­ троллера. Условия заданы таким образом, чтобы м еж ду сменами состоя­ ния выводов проходило 9 765 отсчетов счетчика, т.е. 9765 • 0 ,0 0 0 1 0 2 4 = = 0 ,999 9 3 6 с (рис. 8.18). 159 Таймеры/счетчики ATm ega16 Рис. 8.18. Время между изменениями состояния выводов микроконтроллера П осле инвертирования состояния вывода вызывается функция за­ держ ки _ d e l a y _ l o o p _ 2 ( ) , один цикл которой равен четырем циклам микроконтроллера. Она н еобходим а потом у, что одн о приращ ение зн а­ чения TCNT1 происходит за 1 024 такта, и условие TC NT = Значение выполнялось бы на протяжении остальных тактов. Схема и программа Схема соединений для данного примера представлена на рис. 8.19, а программа, реализующ ая ее работу, — в листинге 8.5. Исходные файлы этого примера для W inAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATmegal6\8 . 05 - Таймер 1 в режиме Normal. Л истинг 8.5. t t in c lu d e # in c lu d e Программа < a v r / io .h > t im e r c o u n t e r l. с // Заголовочны й ф айл п одклю чает // в в о д а -в ы в о д а для // и сп о ль зу ем о го в п р о ек т е c u t il/ d e la y .h > / / Д ля д о с т у п а к ф ун кц и ям ц и к л о в // // Ф ункция и н и ц и а л и за ц и и v o id определения устройства, t im e r co u n terl IN IT O задерж ки тайм ера/счетчика 1 160 Гл ав а 8 Л истинг 8.5. Окончание { // Д елитель // на // уходит с 1024 TCCR 1B |= (1 TCCR 1B &= ~ (1 // помощью р а з р я д о в увеличение Режим - / « счетного 10 0,0001024 0) « C S 1 0 -C S 1 2 значения МГц = I (1 « 2 ); 1 ); задан регистра как TCNT1 1024, на т.е. ед и н и ц у с. // CS10=1, // CS11=0 CS12=1 "N o r m a l" TC C R 1 A &= ~ (1 « 1) & -(1 « 0 ); // W G M 1 1=0 , WGM10=0 TCCR 1B -(1 « 4) & -(1 « 3 ); // W G M 13=0, WGM12=0 in t &= m a in (v o id ) { DDRD |= OxO F; PORTD &= ~0x0F; tim e r co u n terl w h ile (1 ) INITO; // Выводы Р Б О -Р В Э // П од аем // И н и ц и али зац и я // Б есконечны й ц икл // Если 0 В на - вы ходы вы воды Р Б О -Р О З тайм ера/счетчика 1 { if (T C N T 1 PORTD = == 0x0000) PORTD * (1 << _ d e la y _ lo o p _ 2 (2 5 6 ); f (T C N T 1 PORTD = == 0x2625) PORTD (1 << 0) ; счетны й р е г и с т р // И нвертируем // Задерж ка // Если 1) ; на вы вод 2 5 6 *4 =1 0 2 4 счетны й р е г и с т р // равен И нвертируем 0 PD0 такта равен МК 9765 в ы во д PD1 _ d e la y _ lo o p _ 2 (256) ; if (T C N T 1 PORTD = == 0х4С4А) PORTD л // (1 << Если 2) ; счетны й р е г и с т р // И нвертировать равен 19530 вы вод PD2 равен 29295 _ d e la y _ lo o p _ 2 (256) ; f (T C N T 1 PORTD = == PORTD _ d e la y _ lo o p } } 0x726F) А // (1 _2 ( 2 5 6 ) << ; Если 3) ; счетны й р е г и с т р // И нвертируем вы вод РОЗ 161 Таймеры/счетчики A Tm ega16 Рис. 8.19. С хема д л я и с с л е д о в а н и я ре ж и м а “ N o rm a l” Т а й м е р /с ч е т ч и к р ег и ст р о м 1 в р еж и м е “ N o r m a l” и с ср а в н ен и я В данном примере мы используем два блока сравнения. При равен­ стве значения счетного регистра TCNT1 и содерж им ого регистра срав­ нения O C R 1A или O C R 1B изменяется состояние вывода микроконтрол­ лера O C IA (PD 5) или О С 1В (P D 4) соответственно. Каким образом тот или иной вывод б удет изменять свое состояние, мы задаем с помощ ью разрядов С О М 1А 1-С О М 1А О для вывода O C IA и СОМ 1В 1-С О М 1 ВО для вывода ОС1В. С помощ ью регистра управления мы определяем установку лог. 1 на выводе ОС1В (P D 4) при равенстве TCNT1 и O CR1B, и инвертирова­ ние состояние вывода O C IA (PD 5) при равенстве TCNT1 и O CR1A. Микроконтроллер работает на частоте 10 М Гц, таймер/счетчик 1 — через предделитель с коэф ф ициентом 256. Следовательно, содерж и м ое счетного регистра будет увеличиваться на единицу, через кажды е 2 5 6 / 10 М Гц = 0,0000256 с. Вы вод O C IA первый раз изменит свое состояние на лог. 1 при ра­ венстве TCNT1 и O C R 1A через 400 0 0 • 0 ,0 0 0 0 2 5 6 = 1,024 с (рис. 8.20). 162 Гл а в а 8 Поскольку мы задали для данного вывода инвертирование, в дальней­ шем при равенстве ТС1ЧТ1 и ОСЮ А он буди т изменять свое состояние через 65 536 • 0,0 0 0 0 2 5 6 = 1,6777216 с. Рис. 8.20. В ы в о д ОС1А Вывод О С 1В (рис. 8.21) установится в состояние лог. 1 через 200000 ,0 0 0 0 2 5 6 = 0,5 1 2 с. Рис. 8.21. Вывод ОС1В 163 Таймеры/счетчики ATmega16 С хем а и программ а С хем а соединений для д ан н ого примера представлена на рис. 8.22, а программа, реализую щ ая ее работу, — в ли сти н ге 8.6. Н ' • • . 5o l * !(ПФ г- ИlTi □ нм " я * шо с т 11 “ г ;Р Г ш < ь п u Hi oooooifctI i S l l l i i l 83 ItD 5 9 <<£<<<<£ |tt 0 .0 .0 .0 .0 .1 1 .0 .0 . № SS XX nN У i № *- N П * Vi <Гг-1Ml -I— !□ !— p - T Рис. 8.22. Схема для исследования режима “ Norm al” с регистром сравнения 164 Глава 8 Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке АТшеда16\8 . 06 - Таймер l в ре- . Ьг жиме Normal и регистром сравнения. Л и с т и н г 8.6 . П р о г р а м м а t i m e r _ c o u n t e r l . c # in c lu d e // < a v r / io .h > Ф ункция v o id // З аголовочн ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого и н и ц и али зац и и в подклю чает определен ия устройства, проекте тай м ера/счетчи ка 1 t im e r _ c o u n t e r l_ I N I T () { // Р еж и м - "N o r m a l" T C C R 1 A &= ~ (1 « 1) & - (1 « 0 ); // W G M 1 1 =0, WGM10=0 T C C R 1B &= ~ (1 « 4) & ~ (1 « 3 ); // W G M 1 3 =0, W GM12=0 // П ри совп аден ии // и р еги стр а // п е р е к л ю ч а е т с я T C C R 1 A &= - ( 1 « // П ри совп аден ии // и р еги стр а // устан авли вается (1 6 ); // TCNT1 (P D 5 ) СО М 1АО=1 сод ер ж и м ого сравнения << р еги стр а O C IA (и н в е р т и р о в а н и е с о с т о я н и я ) . / / С О М 1А 1=0 |= |= << сч етн ого O C R 1A в ы в о д 7); TCCR1A TCCR1A (1 сод ер ж и м ого сравнения OCR1B в лог. 5) I (1 сч етн ого вы вод р еги стр а О С1В TCNT1 (P D 4 ) 1. « 4 ); // С О М 1В 1=1 и СОМ1ВО=1 } in t m a in (v o id ) { // Вы воды DDRD PO RTD |= блоков сравнени я 0x30; -0x30; &= // Вы воды PD 4 // П одаем 0 В на // В ы в о д P D 7 с и г н а л и з и р у е т DDRD |= ( 1 < < 7 ) ; / / В ы в о д PO RTO // &= - (1 К нопки DDRB &= P O R TB |= << SW0 и ~ (1 (1 7 ); (О С 1 В ) и PD 4 PD5 (O C I A ) (О С 1 В ) о старте/останове PD 7 - в ы х о д // П одаем 0 В на и PD 5 - вы ходы (O C I A ) тай м ера/счетчи ка PD7 SW1 « 0) & - (1 << 0) I (1 « << 1 ); 1 ); // // PB 0 // н а гр уж аем и РВ1 - входы вы воды п од тяги ваю щ и м PB0 и РВ 1 соп роти влени ем 0CR1A = 0х9С 40; // Р еги стр сравнени я кан ала А 0CR1B = 0х4Е 20; // Р еги стр сравнени я кан ала В = 2 00 00 // И ни ц иализац и я Ы т е г_ с о ш ^ е г1 _ Ю Т Т () ; =40000 тай м ера/счетчи ка 1 165 Таймеры/счетчики ATmega16 Л и с т и н г 8.6 . О к о н ч а н и е w h ile (1 ) // Б есконечны й цикл { i f (0 == (P IN B & (1 « 1 ))) // К нопка остановки тайм ера { PO RTD &= - (1 << 7 ); // Гаси м светодиод D3 на вы воде P D7 // CS11=0, CS10=0, CS12=0 T C C R 1B &= ~ (1 « 1) & ~ (1 « 0) & -(1 << 2 ); } i f (0 == (P IN B & (1 << 0 ))) // К нопка зап уска Ф айм ера { PO RTD |= (1 // Д елитель // т .е . // единицу на << с 7); // В клю чаем пом ощ ью р а з р я д о в светодиод C S 1 0 -C S 1 2 увели чен ие зн ачен и я сч етн ого уходит / = T C C R 1B |= (1 T C C R 1B &= ~ (1 256 << 2 ); « 1) 10 М Гц & -(1 « 0 ); на вы воде задан как р еги стр а 0 ,0 0 0 0 2 5 6 PD7 256, TCNT1 на с. // CS12=1 // CS11=0, CS10=0 } } } Таймер/счетчик 1 в режиме “СТС” П ри работе в реж им е С Т С (сб р о с при совпадении) содерж им ое счетн ого регистра T C N T 1 увеличивается д о м акси м альн ого значения, о п ред елен н ого в реги стре O C R 1 A и ли IC R 1 , а затем сбрасывается в 0. Реж им работы таймера/счетчика 1 вы бирается с п ом ощ ью разрядов W G M 1 0 - W G M 1 3 регистров T C C R 1 B / T C C R 1 А (м ы зададим сброс при совпадении T C N T и регистра O C R 1 A ). Д ля вывода O C I A при равенстве T C N T 1 и O C R 1 A с п о м ощ ью раз­ рядов С О М 1 А 1 и С О М 1 А О регистра T C C R 1 A определяем инвертирова­ ние состояния. Ч астота сигнала на выводе O C I A : /ocn=/cikj/0/ 2 jV ( 1 + ^ 0 = 1 0 М Г ц / 2 • 256 • (1 + 65 035) ~ 0,3 Гц. П ери од = 1 / 0,3 ~ 3,3 с (рис. 8.23). Д ли т ел ь н о ст ь од н о го и м п ульса (п о ло ж и т ельн о го и н у л е в о го ) = 65 035 + 1 • 0,0000256 = 1,6649216 с (рис. 8.24). С хем а и програм м а С хем а соединений д ля д анного примера представлена на рис. 8.25, а программа, реализую щ ая ее работу, — - в ли сти н ге 8.7. Глава 8 166 Рис. 8.23. Период сигнала на вы воде ОС1А Digital Oscilloscope Рис. 8.24. Д лительность импульса на выводе ОС1А 167 Таймеры/счетчики А Ттеда16 о; И|п|я|14|й|и й Я г » 5 Е й «а Н К ° 0 Р Г ш < “-ГЧ ; с ? I о о _.. Ии т| р й 8 НИ |3 5< □ Т- N П + №Ф Г- Оы О йОйОООйОйОйО й < ?: < < < < < < . п. а. в. п. с ?|п|мМК№1я| *- N П ■* VI Шг- И хй № 041 о Рис. 8.25. Схема для исследования режима “С ТС ” Глава 8 168 Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATmegal6\8. 07 - Таймер 1 в ре­ жиме СТС. Л и с т и н г 8.7 . П р о г р а м м а t i m e r _ c o u n t e r l . с # in c lu d e // < a v r / io .h > Ф ункция v o id // З аголовочн ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого и н и ц и али зац и и tim e r c o u n te r l в подклю чает определен ия устрой ства, проекте тай м ера/счетчи ка 1 I N I T () { // Д елитель // т .е . на с пом ощ ью р а з р я д о в увели чен ие // е д и н и ц у у х о д и т 256 T C C R 1 B |= (1 « 2 ); TCCR1B &= - (1 « 1) счетн ого / = П ри / / и совп аден ии р еги стр а 10 & - (1 / / Р еж и м - " С Т С " (T C N T 1 T C C R 1B |= (1 « 3 ); // C S 1 0 -C S 1 2 зн ачен и я М Гц « как 256, TCNT1 на 0 ,0 0 0 0 2 5 6 с . // CS12=1 0 ); // сбрасы вается / / W GM12=1 сод ер ж и м ого сравнения задан р еги стр а при сч етн ого O CR1A в ы в о д CS11=0, CS10=0 равенстве р еги стр а O C IA с O CR1A) TCNT1 (P D 5 ) // п е р е к л ю ч а е т с я (и н в е р т и р о в а н и е с о с т о я н и я ) . T C C R 1 A |= (1 « 6 ); / / СО М 1АО=1 &= - ( 1 Т С C R IA « 7 ); // С О М 1А 1=0 } in t m a in (v o id ) { DDRD = P O R TD O xFF; = O C R 1A = // Вы воды п о р т а 0x00; // П одаем O xFE O B ; // Р еги стр у tim e r _ c o u n te r l_ IN IT ( ) ; w h ile (1 ) { } // // на D порт - вы ходы D O B сравнения п ри сваиваем И ниц иализац ии Б есконечны й 65035 тай м ера/счетчи ка 1 цикл } Таймер/счетчик 1 в режиме “Fast PWM” Реж им бы стродействую щ ей Ш И М с разреш ением 10 би т устанав­ ливаем с п о м ощ ью разрядов W G M X X регистров T C C R 1 A и T C C R 1 B . М ак си м а льн ы м значением сч етн ого регистра перед его п ереходом в 0 буд ет 1 023 (рис. 8.26). С п ом ощ ью разрядов С О М 1 А 1 и С О М 1 А О регистра T C C R 1 A опре­ д еля ем д ля вывода O C I A неинвертированны й Ш И М -с и гн а л . На нем б у ­ 169 Таймеры/счетчики ATmega16 дет устан овлен л о г. О при совпадении содерж им ого ТСЗМТ1 и регистра сравнения О С Ш А , а ло г. 1 — при п ереходе Т С Ш Т с м аксим альн ого своего значения (1 023) в н о ль (рис. 8.27). ТСМТ1 увеличилсяна1 ТОЧИ увеличилсяна425 ТСЫТ1 увеличилсяна1023 TCNT1 сбросился в0(насчитав всего1024подсчета) 262144цикловМК выводОС1А+5Вольт 425подсчетов TCNT1 599подсчетов TCNT1 выводОС1А всостояниилогическогонуля Рис. 8.26. Количество отсчетов TCNT1 при 10-разрядной ШИМ 1023 TCNT1 ==O C R 1 А = = 4 2 5 TCNT0=0• V в ы в о д PD 5(O C 1 A ) \í Y V \l \f V V \l V V V V V 5 9 9 4 2 5 5 9 9 425 5 9 9 4 2 5 5 9 9 4 2 5 5 9 9 4 2 5 5 9 9 4 2 5 5 9 9 Рис. 8.27. В ы ход O C 1 A при O C R 1 A = 425 С пом ощ ью разрядов C S 1 0 -C S 1 2 регистра T C C R 1 B вы бираем д ля предцелителя таймера/счетчика 1 коэффициент 256. Таки м образом, д ля увели чен и я значения T C N T 1 на еди н и ц у п отр ебуется 256 / 10 М Г ц = = 0,0000256 с. Ч астота ген ери руем ого сигнала: fctk' ^ Сп = т п ш т т 170 где Глава 8 ТОР — м аксим альное значение сч етн ого регистра (102 3); N — ко­ эффициент предц ели теля (2 5 6 ); f¿¡kjo — частота работы м и крокон трол­ лера (10 М Г ц ). Таким образом , частота си гн ала на вы воде O C I A (P D 5 ) составляет 10 М Г ц / (256 • (1 + 1 0 2 3 )) ~ 38,147 Гц. П ериод = 1 / 38,147 ~ 0,02621 с (и л и 26,21 м с) (рис. 8.28). Рис. 8.28. Период сигнала на вы воде ОС1А Д ли т ел ь н о ст ь п о ло ж и тельн о го им пульса: 0,0000256-425 = 0,01088 с. Д ли т ел ь н о ст ь н улев о го им пульса: (1 0 2 4 -4 2 5 ) • 0,0000256 = 0,0153344 с (рис. 8.29). С хем а и програм м а С хем а соединений для д ан н ого примера представлена на рис. 8.30, а программа, реализую щ ая ее работу, — в ли сти н ге 8.8. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATm egal6\8 . 08 - Таймер 1 в р е ­ жиме F a s t PWM. Л и с т и н г 8.8 . П р о г р а м м а f a s t P W M . с # in c lu d e < a v r / io .h > // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого в подклю чает устрой ства, проекте определен ия 171 Таймеры/счетчики ATmega16 Л и с т и н г 8.8 . О к о н ч а н и е // Ф ункция v o id и н и ц и али зац и и тай м ера/счетчи ка 1 t im e r _ c o u n t e r l_ I N I T () { // Р еж и м - "F a s t PWM" // T C N T 1 - 1 0 2 3 T C C R 1 A |= (1 « 1) T C C R 1B 3 ); |= (1 « // На // TCNT1==0CR1A и вы воде TCCR1A |= Д елитель // т .е . // единицу на i O C IA (1 // « с (1 0 (1 (P D 5 ) лог. бит, « 0 ); будет 1 при 7 ); // пом ощ ью р а з р я д о в уходи т / |= (1 &= ~ (1 << << W GM11=1 и W GM12=1 установлен зн ачен и я T C C R 1B // // 256 0 при С О М 1А 1=1 счетн ого 10 М Гц = & ~ (1 счетчика W GM10=1 лог. C S 1 0 -C S 1 2 « задан 0 ); как р еги стр а 0 ,0 0 0 0 2 5 6 2 ); 1) зн ач ен и е TCNT1==0 увели чен ие T C C R 1B м акси м альное 256, TCNT1 на с. // CS12=1 // CS11=0, CS10=0 } in t m a in (v o id ) { DDRD = PO RTD O xFF; = O C R 1A = // Вы воды порта 0x00; // П одаем на 0x01A9; // Р еги стр у tim e r c o u n te r lIN IT (); w h ile (1 ) { } // // D порт - вы ходы D O B сравнения И ни ц иализац и я Б есконечны й присваиваем 42 5 тай м ера/счетчи ка 1 цикл } *! f Itainiel С Рис. 8.29. Д лительность положительного и нулевого импульсов на выводе О С1А 172 Глава 8 S’ Hl H l “ ч * шо с. ^ к “ “ И Г и i *■ N ¡е Ё Е ё Ш i. iQ.üQ- о.i О-l g g | is = 5 S § § г ? а в в в !г i < — _Л □ ’-ГЧП ■*№•!> r- EE £ OOOOOGOO — S Cd, Й ¡3* ö *■ t О Й О ™ ü o i i XX T " cö o o o o o o ö Ш Ш Н l^ is ü ii B.B.B LB.O.a .B.B . 0.0.0.0.0.11.0.0. ?|(ч|й||п|н||ч|п|н| '|«|п|*|«|»|ф| sB jDlCNl О Рис. 8.30. Схема соединений для исследования режима “Fast PW M ” Таймеры/счетчики ATmega16 173 Таймер/счетчик 1 в режиме “Phase Correct PWM” Реж им “ Phase Correct P W M ” (10 б и т) устанавливаю т с п ом ощ ью разрядов W G M X X регистров T C C R 1 A и T C C R 1 B . В данном реж им е счетчик считает от 0 д о м акси м альн ого значения Т О Р (при 10 битах это 1023), а затем обратн о д о 0. Е сли в такой конф игурации и зм енить со ­ держ им ое регистра сравнения, то его обн о в лен и е произойдет н е в м о ­ мент изменения, а тольк о при достиж ении счетны м регистром св о его м аксим ального значения. С пом ощ ью разрядов С О М 1 А 1 и С О М 1 А О регистра T C C R 1 A в ы би ­ раем д ля вывода O C I A неинвертированны й Ш И М -си гн а л. П ри совпа­ дении содерж им ого счетн ого регистра и регистра сравнения на вы воде O C I A устанавливается лог. 0 при прям ом счете и лог. 1 при обратн ом (рис. 8.31). Рис. 8.31. Счетчик TCNT1 и в ы ход ШИМ С пом ощ ью разрядов C S 1 0 -C S 1 2 регистра T C C R 1 B вы бираем ко­ эффициент предцелителя 256. Э то значит, что при частоте 10 М Г ц на увели чен и е значения счетн ого регистра б уд ет ух о д и ть 256 / 10 М Г ц = = 0,0000256 с. Ч астота сигнала на выводе O C I A : f e Сл “ Z ’N- ТО Р где Т О Р — м о д уль счета (1 023); N — коэффициент /сшю — частота работы м икроконтроллера. предцелителя (256 ); Таким образом,/осп = Ю М Г ц / (2 • 256 • 1023) ~ 19,09 Г ц ; а период составляет 1 /foc п = 0,05237 с (и ли 52,37 м с) (рис. 8.32). Д ли тельн ость п о ло ж и т ельн о го и м п ульса: (43 + 4 1 ) ■ (256 / 10 М Г ц ) = 0,0021504 с. Д ли т ель н ост ь н у л е в о го и м п ульса : ((1023 + 1023) - (43 + 4 1 )) • (1024 / 10 М Г ц ) = 0,0502272 с (рис. 8.33). 174 Глава 8 Рис. 8.33. Д л и т е л ь н о с т ь п о л о ж и т е л ь н о г о и н у л е в о г о и м п у л ь с о в К о ли ч ест в о отсчетов ТС Ы Т1 показано на рис. 8.34. Таймеры/счетчики ATmega16 42 1 175 43 1022 256 10752 11008 циклов МК цикловМК циклов МК 42 1022 261888 цикловМК выводОС1А+5Вольт 43подсчётаTCNT1 41 513024 513280 циклов МК циклов МК 1962 подсчетов TCNT1 выводОС1Ав состояниилогическогонуля выводОС1А+5Вольт 41 подсчёт TCNT1 Р ис. 8.34. К о л и ч е с т в о о т с ч е т о в ТСЫТ1 д л я п о л о ж и т е л ь н о г о и н у л е в о г о и м п у л ь с о в С хем а и програм ма С хем а соединений д ля д ан н ого примера представлена на рис. 8.35, а программа, реализую щ ая ее работу, — в ли сти н ге 8.9. D2 ¡SIM M S Р и с. 8.35. С х ем а с о е д и н е н и й д л я и с с л е д о в а н и я реж им а “ P h a s e C o rre c t P W M ” Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATm egal6\8 .09 - Таймер 1 в р е ­ жиме Phase C o r r e c t PWM. Листинг 8.9. Программа ^ т е г _ с о и г ^ е г 1 .с # з.п с 1 и с 1 е // < a v r / io .h > // в в о д а -в ы в о д а З аголовочн ы й для ф айл устрой ства, подклю чает и сп ользуем ого оп ределен ия в проекте Глава 8 176 Л и с т и н г 8.9 . О к о н ч а н и е // Ф ункц ия и н и ц и а л и за ц и и т а й м е р а / с ч е т ч и к а v o id t im e r _ c o u n t e r l_ I N I T () 1 { // Р еж и м // счетчика - "P h a s e C orrect TCNT1 TCCR1A |= (1 T C C R 1B &= -(1 << « - 1) I 4) (1 П ри T C N T 1 = = 0 C R 1 A н а // лог. TCCR1A |= (1 TCCR1A &= ~ (1 // Д елитель // т .е . на прям ом « с &= бит, 3 ); вы воде O C IA и лог. 7 ); « (1 0 0 ); « счете 6 ); W GM11=1 и W GM10=1 W GM13=0 и W GM12=0 (P D 5 ) 1 при С О М 1А 1=1 // С О М 1А 0=0 C S 1 0 -C S 1 2 зн ачен и я счетн ого 1) / 10 М Гц = & ~ (1 « будет установлен обратном // р азр ядов « зн ачен и е // пом ощ ью -(1 м акси м альное // увели чен ие // е д и н и ц у у х о д и т 256 T C C R 1B |= ( 1 « 2 ); T C C R 1B « & ~ (1 // 0 при PWM" 1023 задан счете как р еги стр а 256, TCNT1 на 0 ,0 0 0 0 2 5 6 с . // CS12=1 0 ); // CS11=0, CS10=0 } in t m a in (v o id ) { DDRD = PO RTD O xFF; = O C R 1A = // Вы воды порта 0x00; // П одаем на O x002A; // Р еги стр у tim e r _ c o u n te r l_ IN IT (); w h ile (1 ) { } // // D порт - вы ходы D O B сравнения И ни ц иализац и я Б есконечны й п ри сваиваем 42 тай м ера/счетчи ка 1 цикл } И зм ен ен и е частоты и к оэф ф и ц и ен та зап ол н ен и я С п о м ощ ью разрядов W G M X X устанавливаем реж им 10 (со гла сн о спецификации A T m e g a ló ) работы таймера/счетчика 1 (н е ф иксирован­ н о е разреш ение Ш И М ). Д анны й пример отличается от п реды дущ его в озм ож н остью и зм е­ нять значение регистра сравнения и м аксим альное значение сч етн ого регистра. Д ля это го служ ат две кнопки (рис. 8.36): • S W 0 — изменение регистра сравнения O C R 1 A , что соответственно корректирует скважность Ш И М -с и гн а л а ; • SW 1 — изм енение регистра захвата IC R1 (в реж им е 10 таймера/ счетчика 1 задает разрядность счетн ого регистра), что корректирует частоту Ш И М -си гн а ла . П р ед ель н о е значение сч етн о го регистра определяет частоту Ш И М , а значение O C R 1 A — скважность (рис. 8.37). 177 Таймеры/счетчики ATmega16 PAIJADCD PAVAD01 PA2ÍADC2 РА^АОСЭ PAWADC* PAÄAOCS 2i_ P ASADOS Ш- PA 7/ADC? РВСУХСК/ТП PBim рвагмтжша РВзооагАИИ PB«/=S РBSW03I PBSM IBO РВ7ЙСК sw o PCQSCL PCireDA PC2TCK PC3TU3 PC«/TDO POSTOI POSTO801 PC7iT0SC2 скважность Ш ИМ частотаШИМ Р ис. 8.36. С п о м о щ ь ю д в у х кнопок м ож но к о р р ек т и р о в а т ь с к в а ж н о сть и ч а с т о т у Ш И М -си гнала 800 TOP(TCNT1 )=ICR1 =755 в ы в о д PD5 О С 1А И зм е н е н и е р е ги с т р а с р а в н е н и я И зм е н е н и е м о д у л я с ч е т н о го ре м е т р а п р о и с х о д и т п ри п р о и с х о д и т п ри T O P (T C N H ) м и н и м а л ь н о м е го зн а ч е н и и Р и с. 8.37. Ф о р м и р о в а н и е Ш И М -си гнала При T O P ( T C N T l ) = 755 и коэффициенте п редцелителя 256 частота Ш И М буд ет равна: f QСп = 10 М Г ц / (2 • 256 • 755) ~ 25,87 Гц, а значит пе- Глава 8 178 риод следования и м п ульсов на выводе O C I A составляет 1 / 25,87 = = 0,03865 с (и л и 38,65 м с) (рис. 8.38). Р и с . 8.38. П ер и о д с л е д о в а н и я и м п у л ь с о в на в ы в о д е О С 1 А П рограм м а, реализую щ ая работу схемы , показанной на рис. 8.36, представлена в ли сти н ге 8.10. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATm egal6\8 .10 - Изменение ч а с тоты и коээфициента заполнения. Л и с т и н г 8 .1 0. П р о г р а м м а t i m e r # in c lu d e // # in c lu d e // < a v r / io .h > З аголов оч н ы й для и н и ц и али зац и и ф айл устройства, < u t il/ d e la y .h > Ф ункция v o id // в в о д а -в ы в о д а c o u n te r l.c // Д ля // задер ж к и подклю чает и сп ользуем ого доступа тай м ера/счетчи ка к ф ункциям определения в проекте ц иклов 1 t im e r _ c o u n t e r l_ I N I T () { // Р еж и м - "P h a s e C orrect // з н а ч е н и е с ч е т ч и к а T C C R 1 A |= ( 1 « 1) ; Т С C R IB |= (1 « 4 ); PWM" (р е ж и м 10, за д а ется р еги стр ом / / W GM11=1 // W GM13=1 м акси м альн ое IC R 1 179 Таймеры/счетчики ATmega16 Л и с т и н г 8 .1 0 . П р о д о л ж е н и е // При TC N T1==0C R 1A на // л о г. 0 при TCCR1A |= (1 TCCR1A &= - (1 прямом « Д елитель // т .е . пом ощ ью р а з р я д о в // единицу ух о д и т на у в е ли ч ен и е |= (1 T C C R 1B &= -(1 O C IA л о г. 6 ); // T C C R 1B и 7 ); « с вы воде счете 256 << 2 ); « 1) (P D 5 ) 1 при // С О М 1А 1=1 // С О М 1А 0=0 C S 1 0 -C S 1 2 зн ачен и я счетн ого / = 10 & - (1 М Гц « будет задан счете как р еги стр а 0 ,0 0 0 0 2 5 6 0 ); установлен обратном 256, TCNT1 на с. // CS12=1 // CS11=0, CS10=0 } in t m a in (v o id ) { DDRD = PO RTD IC R 1 // Вы воды п о р т а 0x00; // П одаем 0x02F3; // Р еги стр у захвата // Р еги стр у сравнения O xFF; = = O C R 1A = tim e r // 0x002A; c o u n te rl К оррекц ия DDRB &= PORTB // скваж ности вы ходы п ри сваиваем И ни ц иализац и я кнопка изм ен ен и я 1 О С Н 1А Вы вод РВ7 - вход (1 << 7 ); // В ы вод РВ7 - с // соп роти влени ем п од тя ги ва ю щ и м частоты кнопка ~ (1 « 6 ); // В ы вод РВ6 - вход (1 « 6) ; // В ы вод РВ6 - с // соп роти влени ем // Б есконечны й // Е сли (1 ) 42 тай м ера/счетчи ка // изм енения 755 при сваиваем 7 ); I= w h ile - - D 0 В << К оррекц ия P O R TB // D порт -(1 |= DDRB &= IN IT O ; на 1СР1 п од тяги ваю щ и м цикл { i f (- P IN B & (1 << 7 )) { н апряж ен ие / / т .е . // О ж идаем // равно в 0, ц икле т .е . до как // в ы х о д и з ц и к л а w h i l e ( - P I N B & (1 << тех кнопка пор, только 7 )) { // // // Е сли больш е // р еги стр а, if его (O C R 1 A > зн ач ен и е обнуляем 755) = н апряж ен ие кнопку, р еги стр м ак си м альн ого р еги стр 0 В, на вы воде прои зой дет } П ауза Увеличи ваем O C R 1A = РВ7 _ d e la y _ lo o p _ 2 (6 5 5 3 5 ); d e l a y _ l o o p _ 2 (6 5 5 3 5 ) ; O C R 1A = O C R 1 A + 1 ; пока отпустят на наж ата сравнения для счетн ого сравнения, 0; } i f { (- P IN B & (1 << 6 )) // Е сли / / т .е . напряж ен ие кнопка на наж ата РВ 6 = 0 В, Глава 8 180 Л и с т и н г 8 .1 0 . О к о н ч а н и е // О ж идаем // равно 0, в цикле т .е . // в ы х о д и з ц и к л а w h ile (- P I N B & (1 до как « тех пор, только 6 )) { пока отпустят н апряж ен ие кнопку, _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); _ d e la y _ lo o p _ 2 (6 5 5 3 5 ); // П ауза IC R 1 // У величи ваем = IC R 1 на + 1 ; вы воде п р оизойдет р еги стр } захвата } } } Таймер/счетчик 1 в режиме “Phase and Frequency Correct PWM” Реж им Ш И М с точн ой фазой и частотой — восьм ой. Е го задаю т с п ом ощ ью разрядов W G M X X регистров T C C R 1 A и T C C R 1 B . В данном реж име м аксим альное значение счетчика T C N T 1 определяется р еги ст­ ром захвата IC R 1 . Е го отли ч и е от “ Phase C orrect P W M ” заклю чается в том, что при изменении разрядности м о д уля счета не появляю тся н е­ симметричны е и м п ульсы , п о ск о льк у обн ов лен и е регистра сравнения происходит при н улев ом значении T C N T 1 , в то время как в реж име “ Phase Correct P W M ” изм енение п р о и сх од и ло при м аксим альном значе­ нии T C N T 1 . С п ом ощ ью разрядов С О М 1 А 1 и С О М 1 А О регистра T C C R 1 A уста­ навливаем д ля вывода O C I A неинвертированный Ш И М -си гн ап . П ри совпадении значений сч етн ого регистра и регистра сравнения на выводе O C I A устанавливается ло г. 0 при прямом счете и лог. 1 при обратном. С п ом ощ ью разрядов C S 1 0 -C S 1 2 регистра T C C R 1 B вы бираем ко­ эффициент преддели теля 256. Э то значит, что при частоте 10 М Г ц на увели чен и е значения сч етн ого регистра буд ет ух о д и т ь 256 / 10 М Г ц = = 0,0000256 с. Ч астота сигнала на выводе O C I A : /огч “ 2 ■N “ т О Р где ТОР — м о д у ль счета (7 5 5 ); N — коэффициент п редделителя (256 ); /см/о — частота работы микроконтроллера. Таким образом, f OCn = 10 М Г ц / (2 • 256 • 755) ~ 25,87 Гц; а период составляет 1 /f 0Сп = 0,03866 с (и л и 38,66 мс). Д ли т ель н о ст ь п о ло ж и тельн о го им пульса: 0,0000256 • (555 • 2) = 0,028416 с. Таймеры/счетчики ATmega16 181 Д ли тельн ость н у л е в о го и м п ульса (рис. 8.39): 0,0000256 ■ ((755 + 755) - (555 • 2 )) = 0,01024 с. Inver: Рис. 8.39. Д л и т е л ь н о с т ь п о л о ж и т е л ь н о г о и н у л е в о г о и м п у л ь с о в на в ы в о д е О С 1 А С хем а и программ а С хем а соединений д ля д анного примера представлена на рис. 8.40, а программа, реализую щ ая ее работу, — в ли сти н ге 8.11. И сходны е ф ай лы этого при м ера д л я W in A V R , A V R S tu d io и P r o t e u s A T m eg a l6 \ 8 .11 жиме Phase and F re q u e n cy C o r r e c t PWM. п р и лагаем ом к к н и ге к о м п а к т -д и с к е в п а п к е находятся на Таймер 1 в р е ­ - Л и с т и н г 8.11. П р о г р а м м а t i m e r _ c o u n t e r l . c #include <avr/io.h> // // Ф ункция void // в в о д а -в ы в о д а З аголовочн ы й для и н и ц и али зац и и ф айл п о д к л ю ч а е т устрой ства, и сп ользуем ого тай м ера/счетчи ка определения в проекте 1 t i m e r _ c o u n t e r l _ I N I T () { // Р еж и м - // м акси м альное // "P h a s e and F requ en cy зн ач ен и е р еги стр ом за х в а т а T C C R 1 B |= (1 « 4); для C orrect сч етн ого PWM" (м а к с и м а л ь н о е р еги стр а задается IC R 1 // W GM13=1 Глава 8 182 Л и с т и н г 8 .1 1 . О к о н ч а н и е TCCR 1B &= T C C R 1 A &= ~ (1 -(1 << « 3) ; 1) // П ри T C N T 1 = = 0 C R 1 A // лог. 0 при TCCR1A |= (1 TCCR1A &= ~ (1 // Д елитель // т .е . // единицу на на прямом << 0) ; вы воде счете и O C IA лог. 7 ); « с (1 « & 6 ); // WGM12=0 // W GM11=0 и (P D 5 ) будет 1 при С О М 1А 1=1 // С О М 1А 0=0 пом ощ ью р азр ядов C S 1 0 -C S 1 2 увели чен ие зн ач ен и я счетн ого уходит / = TCCR1B |= (1 TCCR1B &= ~ (1 « 256 10 М Гц 1) & - (1 « задан 0 ); счете как р еги стр а 0 ,0 0 0 0 2 5 6 2 ); « установлен обратном // W GM10=0 256, TCNT1 на с. // CS12=1 // CS11=0, CS10=0 } in t m a in (v o id ) { DDRD = P O R TD IC R 1 O C R 1A O xFF; = = = // Вы воды " п о р та 0x00; // П одаем 0x02F3; // Р еги стр у захвата // Р еги стр у сравнени я 0x022В ; t im e r _ c o u n te r l_ IN IT ( ) ; w h ile (1 ) { } // // на D порт - вы ходы D O B п ри сваиваем И ни ц иализац и я Б есконечны й 755 п р и сваиваем 555 тай м ера/счетчи ка 1 цикл Р.Б5ЕТ pcirecL PC1(SDA XTAL1 РС2ГГСК XTAL2 РСЭГТОЗ PCfcTDO PAttAOCG PCSTDI PA1/A0C1 PCÖT0SC1 PA2.'ADC2 РС7ГГОЭС2 PA3TADC3 PA«/ADC* PDDÍFXD «1S PASAOCS Р01ГГХ0 PASTADOS PD2ÍIMTD ■16 PA7ÍADC? PKVIMTI ±Л_ PÖWOC1B рвахскгш PDSOC1A РВ1ГГ1 pds-cp рвггмтаяпш P0711002 рнзосогапн PB««S3 PBSMDSI PBSMISO AVCC РВ7ЙСК AREf Рис. 8.40. Схема соединений для режима “ Phase and Frequency Correct PW M ” Таймеры/счетчики ATmega16 183 И зм енение частоты и к оэф ф и ц и ен та заполнен ия Этот пример отличается от п р ед ы дущ его наличием кнопок Б’Ш д ля изменения м одуля счета и содерж и м ого регистра сравнения. П о ск о льк у регистр сравнения и м о д уль счета обн овляю тся о дн ов р ем ен ­ но, исклю чается возм ож ность появления несим м етричны х и м п ульсов (рис. 8.41). TOP(TCNT1)=ICR1=75S —у. OCR1A TCNT1 =0 вывод PD5 ОС1А И зменение м одуля счетного регистра происходит при Изменение регистра сравнения происходит при BOTTOM (TCNT1) минимальном его значении Рис. 8.41. Ф ормирование ШИМ-сигнала в режиме “ Phase and Frequency Correct PWM” С хем а соединений для данного примера показана на рис. 8.42, а со ­ ответствую щ ая програм м а — в ли сти н ге 8.12. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T m e g a l 6 \ 8 . 12 - Изменение ч а с ­ С тоты и коээфициента заполнения. Л и с т и н г 8 .1 2 . П р о г р а м м а t i m e r # in c lu d e # in c lu d e // < a v r / io .h > З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого c u til/ d e la y .h > Ф ункция v o id c o u n te r l. с // и н и ц и али зац и и в // Д ля // за д ерж к и подклю чает определения устройства, проекте доступа тай м ера/счетчи ка к ф ункциям циклов 1 t im e r _ c o u n t e r l_ I N I T () { // Д елитель // т .е . // единицу TC C R 1B с пом ощ ью р а з р я д о в на у в е ли ч е н и е |= уходи т (1 ТСC R IB &= - ( 1 256 << 2 ); « 1) зн ачен и я / 10 & ~ (1 C S 1 0 -C S 1 2 счетн ого М Гц = « 0 ); задан как р еги стр а 0 ,0 0 0 0 2 5 6 256, TCNT1 с. // CS12=1 // CS11=0, C S10=0 на 184 Глава 8 Л и с т и н г 8 .1 2 . П р о д о л ж е н и е // Р еж и м // м акси м альное - "P h a s e and F req u en cy зн ачен и е T C C R 1B |= (1 T C C R 1B &= - TCCR1A &= - (1 // П ри TCNT1==0CR1A на // л о г. 0 « TCCR1A |= (1 TCCR1A &= ~ (1 « « // 3 ); 1) & - (1 прямом << « 0) ; вы воде счете и O C IA л о г. 7 ); « PWM" зад ается 4 ); (1 при C orrect счетчи ка 6 ); // WGM12=0 // WGM11=0 и при 8, IC R 1 WGM13=1 (P D 5 ) 1 (р е ж и м р еги стр ом будет устан овлен обратном // С О М 1А 1=1 // С О М 1А 0=0 W GM10=0 счете } in t m a in (v o id ) { DDRD = PO RTD IC R 1 O xFF; = = // Вы воды п о р т а // П одаем // Р еги стр у захв ата // Р еги стр у сравнения 0x00; 0xO 2F3; O C R 1A = 0x022В ; t im e r _ c o u n te r l_ IN IT ( ) ; // // К ор р ек ц и я с к в а ж н о с т и DDRB &= - ( 1 « 7 ); PO R TB |= (1 « 7 ); // К о р р е к ц и я ч а с т о т ы DDRB &= ~ ( 1 « 6 ); PO R TB |= w h ile (1 - « - на (1 ) - вы ходы D O B присваиваем И ни ц иализац и я 755 п ри сваиваем 555 тай м ера/счетчи ка 1 к н о п к а и з м е н е н и я O CR1A / / В ы в о д РВ 7 - в х о д // В ы вод // соп роти влени ем кнопка б ); D порт РВ7 - изм енен и я с п од тя ги в а ю щ и м IC R 1 // В ы вод РВ 6 - вход РВ 6 - с // В ы вод // соп роти влени ем п о д тя ги ваю щ и м // Б есконечны й цикл { i f (- P IN B & (1 << 7 )) { // О ж идаем // равно 0, т .е . // вы ход из ц икла w h ile в ц икле (-P IN B & Е сли н апряж ен ие т .е . кнопка до как (1 // // « тех пор, только 7 )) { _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); O C R 1A } if = O C R 1A + 1 ; // больш е зн ачен и е Е сли // i f р еги стр а , обнуляем р еги стр (O C R 1 A > I C R 1 ) O C R 1A = 0 ; // = 0 В, н апряж ен ие кнопку, на вы воде п р оизойдет } П ауза У вели чи ваем // (-P IN B & (1 << 6 ) ) РВ7 _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); // его пока отпустят на наж ата реги стр м ак си м альн ого сравнения для счетн ого сравнения, Если напряжение на РВ6 = О В, 185 Таймеры/счетчики ATmega16 Л и с т и н г 8 .1 2 . О к о н ч а н и е { / / т .е . // О ж идаем в // равно 0, т .е . // вы ход из ц икла w h ile (- P IN B цикле & до как (1 << тех только 6 )) кнопка пор, { пока отпустят наж ата н апряж ен ие кнопку, _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ) ; // П ауза IC R 1 // У величи ваем = IC R 1 + 1 ; на вы воде п р оизойдет р еги стр } захвата } } } Рис. 8.42. С х е м а с о е д и н е н и й д л я и зм е н е н и я ч а с т о т ы и к оэ ф ф и ц и ен т а за п о л н е н и я Сторожевой таймер Сторож евой таймер н ео бх о д и м д ля перезагрузки м и крокон троллера в случ а е его “ зависания” . М и к р ок о н тр о ллер считается “ зависш им ” , если таймер д осчитал до заданного значения тайм -аута и не б ы л сброш ен ас­ сем блер н ой командой w d r и ли С-ф ункцией м с И :_ г е з е Ъ ( ) . В программе мы инициализируем вы воды порта В как вы ходы д ля подклю чения светодиодов (рис. 8.43). В ы воды Р 0 0 - Р 0 2 — входы для подклю чения кнопок. 186 Глава 8 С п ом ощ ью функции w d t _ e n a Ы e (Т\ГОТО_23) ; м ы вклю чаем сторож евой таймер с тайм -аутом 2 с. Д оступ н ы е значения тайм аута: ДОВТО_15МЗ, Ж >ТО_ЗОМЗ, WDTO_бOM S, W D TO _12 0MS, ЮБТС)_25 0МЗ, ИОТ<Э_500МЗ, Ю ВТО_18, W D TO _2S. В бесконечном ц икле проверяется нажатие кнопок. Е сли нажата кнопка 8\¥(), то сторож евой таймер отклю чается. П ри нажатии кнопки активизируется задержка на 1 с. П о ск о льк у тайм -аут сторож евого таймера составляет 2 с, до наступления тайм-аута б уд ет вызвана функ­ ция сброса таймера w d t _ r e s e t ( ) , м икроконтроллер перезагруж ен не будет, вы полн ение программы продолж ится. П ри нажатии кнопки Б\¥2 сторож евой таймер б уд ет проинициализирован новы м значением тайм-аута 500 мс. Теп ерь, если нажать кнопку 1 87 Таймеры/счетчики ATmega16 Б\¥1, задержка б уд ет превыш ать 500мс, функция сброса тайм -аута вы ­ звана не будет, и м икрокон троллер перезагрузится. За сбросом м и крокон троллера м ож но н аблю д ать на светодиодах, которы е вклю чаю тся п о очереди: Э 1, 0 2 , 0 3 и т.д. П р и установке та й м ­ аута в 500 мс (кнопка 8\У2) и п о с л е активизации задержки (кнопка 8\¥1) вклю чение светоди одов начнется с са м ого начала, с Б 1. В м есто би бли отеч н ы й функций, объ яв лен н ы х в заголов оч н ом фай­ л е a v r / w d t . h , д ля инициализации, сброса, вклю чения сторож ев ого таймера мож но обращ аться напрямую к регистрам, например: В к лю ч ен и е сторож евого таймера с тайм -аутом в 2 с: УГОТСЯ |= О хО Е ;_______________________________________________________________________________ С брос сторож евого таймера: азш( "здс1г") ; О тклю чен и е сторож евого таймера: WDTCR |= (1 WDTCR &= ~ (1 « 4) << | (1 << 3) ; 3) ; П рограмма Программа, реали зую щ ая р а боту схем ы , показанной на рис. 8.43, представлена в ли ст и н ге 8.13. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T m eg a l6 \ 8 .13 - Сторожевой т а й ­ мер. Л и с т и н г 8 .1 3 . П р о г р а м м а w a t c h d o g t i m e r . с # in c lu d e < a v r / io .h > # in c lu d e // З аголовочн ы й ф айл в в о д а -в ы в о д а для // и сп ользуем ого c u til/ d e la y .h > # in c lu d e < a v r / w d t .h > Ф ункция v o id // // вклю чен ия в подклю чает проекте // Д ля // задерж к и // Ф ункции д л я // тайм ером следую щ его определения устройства, доступа к ф ункциям работы со циклов стор ож евы м светоди ода l e d () { PO R TB = (P O R T B << 1 ); // С д ви гаем р азр яд ы // (н а п р и м е р , // станет если 00000010) порта бы ло В влево 00000001, то Глава 8 188 Л и с т и н г 8 .1 3 . О к о н ч а н и е i f (P O R T B = = 0 ) // PORTB |= ( 1 << 0 ) ; _d e lay _m s(3 0 0 ); Е сли / / в уж е н ечего р азр яд сдв и гать, 0 запи сы ваем то 1 // З а д е р ж к а в 3 0 0 м с } in t m a in (v o id ) { DDRB = P O R TB // O xFF; |= (1 Вы воды // << P D 0 -P D 2 DDRD &= ~ (1 PO RTD 0x07; = 0 ); « - 0) « 1) Вы воды // порта РВ0 В - подаем вы ходы +5 В & ~ (1 P D 0 -P D 2 « 2 ); н агруж ен ы п од тя ги в а ю щ и м и с о п р о т и в л е н и я м и (т .е . на ни х уж е +5 // В клю чаем с т о р о ж е в о й т а й м ер // (1 ) вы воды вы вод входы & ~ (1 // // w d te n a b le (W D T 0 2 S ); w h ile В се //Н а с т а й м -а у т о м Б есконечны й 2 В) с цикл { // П ри i f (- P IN D наж атии & (1 кнопки << 0 )) SW0 отклю чаем // Е сли на // О тклю чаем сторож евой вы воде PD0 тайм ер - 0 В { w d td is a b le (); сторож евой тайм ер } // П ри i f (- P IN D наж атии & (1 кнопки << 1 )) SW1 и м и т и р у е м // Е сли на // З адерж ка за в и сан и е вы воде PD 1 МК - 0 В { _ d e la y _ m s (1 0 0 0 ); } ~ // П ри i f наж атии (- P IN D & (1 кнопки << 2 )) SW2 // вклю чаем Е сли на в мс сторож евой вы воде PD2 тайм ер - 0 В { w d te n a b le (W D T O _ 5 0 0 M S ); // В клю чаем // с сторож евой т а й м -а у т о м в 500 тайм ер мс } } } le d (); // В клю чаем w d t_ r e s e t (); // С брасы ваем // зави с и следую щ ий светодиод сторож евой сбрасы вать его тайм ер не (т .е . надо) МК н е Глава А н а л о г о в ы й 9 к о м п а р а т о р ______ A T m и А Ц П e g a l ó В этой главе мы рассм отрим м етоды работы с периф ерией м и кро­ к он троллера A T m e g a ló , которая и сп ользуется при ан алоговы х и зм ере­ ниях и преобразованиях. Аналоговый компаратор Аналоговый компаратор сравнивает напряжение на выводах AIN0 и AIN1. Если напряжение на входе AIN0 больше напряже­ ния на выводе A IN 1 то устанавливается в 1 разряд 5 (A C O ) реги­ стра ACSR. В противном случае этот разряд обнуляется. В нашем примере мы на вход AIN0 внешнее напряжение для сравнения по­ давать не будем (рис. 9.1), а подключим внутренний источник опорного напряжения 1,22 В, установив разряд 6 регистра ACSR. Рис. 9.1. Схема соединений для исследования работы аналогового компаратора 190 Глава 9 Таким образом, если на входе AIN1 (РВЗ) напряжение меньше 1,22 В, то разряд A C O будет содержать 1; в противном случае — 0. Это сравнение реализуем в бесконечном цикле. Если A C O = 1 (1,22 В > AIN1), то на вывод PD0 подаем +5 В. Если A C O = 0 (1,22 В < AIN1), то на вывод PD1 подаем +5 В. П рограмма, реализую щ ая работу схем ы , показанной на рис. 9.1, представлена в ли сти н ге 9.1. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T m e g a l6 \ 9 .01 - Аналоговый ком­ паратор. Л и с т и н г 9.1 . П р о г р а м м а a n a l o g _ c o m p a r a t o r . с # in c lu d e < a v r / io .h > // З аголов оч н ы й ф айл п о д к л ю ч а е т // в в о д а -в ы в о д а для // и с п о л ь з у е м о г о в п р о е к т е < u t il/ d e la y ,h > // Д ля д о с т у п а к ф ункциям # in c lu d e // // Ф ункция v o id определен ия устройства, и н и ц и али зац и и циклов за д ер ж к и ан алогового ком паратора a n a lo g _ c o m p a r a to r _ IN IT () { ACSR &= ~ (1 « 0 ); // П одклю чаем к // внутренний источник ACSR |= (1 << // Зап исы ваем // р еги стр а // ан алоговы й неинвертирую щ ем у оп ор н ого 6 ); // 0 в ACSR р азр яд ком паратор) входу ком паратора напряж ен ия Р азр яд ACD (в к л ю ч а е м 1 ,2 2 A IN 0 В A C B G =1 } in t m a in (v o id ) { DDRB &= PO R TB // - (1 << &= ~ ( 1 3 ); << 3 ); P B 3 (A IN 1 ) - О тклю чаем вн утренн ее вход ком паратора // п од тя ги ва ю щ ее // вы воде сопротивление на РВЗ С ветодиоды DDRD PO RTD |= (1 << &= - ( 1 0) « | 0) (1 << & - (1 a n a lo g _ c o m p a r a to r _ IN IT ( ) ; w h ile { // // (1 ) 1 ); << //PD 0 и 0) ; //П одаем PD 1 на - вы ходы PD0 // И ни ц иализац и и // ком паратора и PD 1 0 В ан алогов ого // Бесконечный цикл 191 Аналоговый компаратор и АЦП ATmega16 Л и с т и н г 9 .1 . О к о н ч а н и е i f (A C S R & (1 « 5 )) // Е сли внутренние 1 ,2 2 В > // н а п р я ж е н и я н а в х о д е А Ш 1 (Р В З ), { PO R TD |= (1 PO RTD &= ~ (1 « 0 ); << 1 ); // то // а на // Е сли на вы вод вы вод РОО Р01 подаем - +5 В, 0 В _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ); } e ls e внутренние 1 ,2 2 В < // н а п р я ж е н и я н а в х о д е А1КГ1 ( Р В З ) , { PO RTD &= -(1 PO RTD |= (1 << « 0 ); 1 ); // то // а на на вы вод вы вод РОО п о д а е м Р01 подаем 0 В, +5 В _ d e la y _ lo o p _ 2 (6 5 5 3 5 ); } } } АЦП в режиме непрерывного преобразования А Ц П настроен след ую щ и м образом : • вход А Ц П — несим м етричны й (б ез предвари тельн ого у си лен и я ), вы вод РА1 (A D C 1 ); • частота преобразования — 16 М Г ц / 128 = 125 кГц; • источник о п ор н ого напряжения — 2,56 В; • реж им работы — непреры вное преобразование, т.е. ц и клы А Ц П осущ ествляю тся непрерывно. Н а вход А Ц П (A D C 1 ) подается напряж ение с д ели теля напряжения. Е го дискретное значение отображ ается на светодиодах, п о д к лю ч ен н ы х к м ик р ок он тр оллер у (рис. 9.2). В х о д м икроконтроллера A V C C аппаратно подклю ч ен д ля питания А Ц П . Н а него подаем напряж ение +5 В. Е сли А Ц П н е и сп ользуется, то питание на A V C C подавать не обязательно. П о ск о л ьк у разреш ение А Ц П 10 бит, т.е. 0 Ы 1 1 1 1 1 1 1 1 1 , то д ля отображ ения д искретн ого значения напряж ения мы и сп о льзуем 10 вы ­ водов: восем ь — порта D и два — порта С. А Ц П настроен на и сп ользован и е вн утрен н его источника оп ор н о го напряжения V r e f = 2,56 В, т.е. на вход A R E F м и крокон троллера п ода­ вать напряжение не нуж но. Результат преобразования определяется выражением: A D C = 1 024 •Vin/Vref. 4© ы Аналоговый компаратор и АЦП ATmega16 193 Т о гд а определить р езультат преобразования в вольтах м ож но из с л ед у ю щ его выражения: V in = (A D C • V r e f) / 1 024, где: A D C — дискретное значение напряж ения в десятичной си стем е счисления; V r e f — оп орн ое напряж ение А Ц П ; V in — напряж ение на в ходе А Ц П . М а к си м а льн ое напряж ение на в ходе А Ц П не д олж н о превы ш ать V in = (1 023 /1 024) • V r e f = 2,5575 В. Р езу ль т а т преобразования сохраняется в виде десятиразрядного д вои чн ого чи сла в регистрах A D C H и A D C L . Д л я его индикации м ы и с ­ п о ль зуем светодиоды , п одклю чен н ы е к вы водам портов С и D. Например, если в порт С вы ведено “ 01” , а в порту D — “ 10001111” , то р езульта т преобразования равен O b O l l O O O l l l l = 399. В таком с л у ­ чае, напряжение на вход е А Ц П составляет V in = (399 • 2,56) / 1 024 = = 0,9975 В. Н астройка р аботы А Ц П задается тремя регистрами: • A D C S R A — регистр управления и состояния А ; • A D M U X — регистр управления м ульти п лек сор ом А Ц П ; • S F IO R — регистр специальны х функций ввода-вывода. Д искретны й 10-разрядный р езульта т преобразования сохраняется в двух восьмиразрядны х регистрах данны х: A D C H и A D C L . П ри этом ш есть разрядов регистра A D C H и л и A D C L н е и спользую тся. Н епреры вное преобразование начинается с установки разряда A D S C регистра A D C S R A . Считы вать результаты п о сле каж дого ц и кла преобразования мож но п о сле установки ф лага A D IF регистра A D C S R A . П о с л е т о го как результа т считан, если не и сп ользую тся прерывания, ф лаг A D IF н еобходи м о програм м но сбросить. П рограмма, реализую щ ая р а б о т у схем ы , показанной на рис. 9.2, представлена в ли сти н ге 9.2. % И сходны е ф айлы Щ п р и лагаем ом этого при м ера д л я к кн и ге к о м п а к т -д и ск е WinAVR, AVR Studio в папке A T m eg a l6 \ 9 . и Proteus 02 - находятся на АЦП в режиме непреры вного преобразования. Л и с т и н г 9 .2 . П р о г р а м м а a d c . с # in c lu d e // < a v r / io .h > Ф ункция v o id ADC // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого и н и ц и а л и з а ц и и АЦП IN IT O в подклю чает устройства, проекте определения 194 Глава 9 Л и с т и н г 9.2 . П р о д о л ж е н и е { //AD C SRA - |= ADCSRA р еги стр (1 << уп равлени я 7 ); // Р азр яд и состояния 7 (A D E N ) - А р азр еш и ть // A D P S 2 = 1 , A D P S 1 = 1 , A D PS 0=1 - к оэф ф и ц и ен т A D C S R A |= (1 « 2) I (1 « 1) I (1 « 0 ); //В ы бор ADCSRA р еж и м а |= (1 // S F IO R // И сточн ик - // ADMUX |= - // Р азр яд // определяется // р еги стр а специальны х ста р тов ого 5 |= << (1 - реж и м р а б о т ы содер ж и м ы м р а з р я д о в S F IO R в в о д а -в ы в о д а AD TS2=0, уп равлени я 7) I (1 << AD TS1=0, м ульти п лексором 6 ); // В нутренний AD TS0=0, << ~ (1 0 ); << // 5 ); оп ор н ого // подклю ченн ы й (в = 0 напряж ен ием STK500 - к 2 ,5 6 В , в ы в о д у AREF снять перем ы чку AREF) З адей ствован //ADLAR АЦП источник // // ADMUX &= (A D A T E ) ф ункций си гн ала: // ADMUX АЦП 128 н еп реры вн ого п р еобр азов ан и я « 7) & - ( 1 « 6) & ~ ( 1 « 5 ); реги стр (1 - АЦП 5 ); р еги стр // т . е реж и м S F I O R &= ~ ( 1 ADMUX работы << работу дели теля - несим м етричны й вход AD C 1 правостороннее // вы равнивание // в р еги стр е результата д а н н ы х AD C преобразовани я (A D C H , AD CL) } in t m a in (v o id ) { A D C _IN IT ( ) ; // И ни ц иализац и я // Запускаем // од и н оч н ого // и сп ользуется // р азр яда АЦП преобразован и е. преобразовани я источник н еп реры вн ого или зап уск п р ограм м н ы й . Е сли стар тового ADSC п р о и з в о д и т с я // з а д а н н о г о ADCSRA I = (1 В р еж и м е - си гн ала, аппаратно после же установка в озн и к н овен и я преры вания. << 6 ) ; DDRD = O x ff; // Вы воды порта D - вы ходы DDRC = O x ff; // Вы воды п о р т а С - вы ходы // Б есконечны й w h ile то (1 ) цикл { // Р азр яд // преобразовани я 4 (A D IF ) // за п и сью "1 ") i f (A D C S R A & (1 << р еги стр а AD C SRA п о устан авли вается 4 )) // Е сли в окончании "1 " (с б р а с ы в а е т с я п р еобразован и е за в ер ш ен о Аналоговый компаратор и АЦП ATmega16 19 5 Л и с т и н г 9.2 . О к о н ч а н и е { PO RTD = AD C L; PORTC = AD CH ; ADCSRA |= (1 //В // порт //В порт << 4 ); (у с т а н о в и л а с ь 1 в р а з р я д е A D IF ) D - 8 б и т р е г и с т р а д а н н ы х ADCL С - 8 бит // О бнуляем // о р еги стр а р азр яд завер ш ен и и д а н н ы х ADCH A D IF , что // (о б н у л е н и е // е д и н и ц ы !). Е сли осущ естляется // преры вание по // п реобразовани я, // обнулялся бы говор и т преобразовани я за п и сью бы и с п о л ь з о в а л о с ь завер ш ен и и то этот р азр яд аппаратно. } } АЦП в режиме одиночного преобразования О тли ч и е схем ы в данном прим ере от рассм отренной вы ш е заклю ч а­ ется тольк о в п одклю чен н ой кнопке 8\У0 на вы воде РВО (рис. 9.3) и в реж им е работы встроен н ого А Ц П . П ри нажатии кнопку, устанавливается разряд А Б 8 С в реги стре А О С Б К А , тем самы м запуская оди н оч н ое преобразование. П о окон ча­ нии преобразования разряд А Б 8 С сбрасывается аппаратно. Резу ль т а т вы водится в порты Б и С т о л ь к о п о сле заверш ения п р е­ образования, если в реги стре А Б С 8 1 1 А устан овлен ф лаг А О П 7. П о с к о л ь ­ ку прерывание мы не и сп ользуем , этот ф лаг аппаратно сброш ен н е б у ­ дет, п оэтом у его н ео бх о д и м о сбросить програм м но (л и ст и н г 9.3). Исходные файлы этого примера д л я WinAVR, A V R Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке АТш еда16\9 .03 - АЦП в режиме одиночного преобразования. Л и с т и н г 9.3 . П р о г р а м м а a d c . с # in c lu d e // < a v r / io .h > Ф ункция v o id // З аголовочн ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого и н и ц и али зац и и в подклю чает определения устройства, проекте АЦП A D C _ IN IT () { / /ADCSRA - р е г и с т р у п р а в л е н и я A D C S R A |= ( 1 < < 7 ) ; / / Р а з р я д и 7 состояния А (A D E N ) - р а з р е ш и т ь // A D P S 2 = 1 , A D P S 1 = 1 , A D P S 0= 1 - к оэ ф ф и ц и ен т A D C S R A |= ( 1 < < 2 ) | (1 < < 1 ) | (1 < < 0 ) ; дели теля A D C S R A &= - -(1 « 5 ); // Р азр яд // преобразовани я AD ATE=0 реж и м р а б о т у АЦП - 128 оди н очн ого Глава 9 196 Л и с т и н г 9.3 . О к о н ч а н и е // ADMUX = ADMUX (1 р еги стр уп равлени я << 7 ) | (1 << 6) ; // оп ор н ого // подклю ченн ы й // ADMUX |= = (1 ADMUX &= << ~ (1 0 ); << // 5 ); м у л ь т и п л е к с о р о м АЦП // В н у т р е н н и й и с т о ч н и к (в н апряж ен ием STK500 - З адей ствован //AD LAR = 0 - 2 ,5 6 В , в ы в о д у AREF снять п ер ем ы чк у AREF) несим м етричны й вход ADC1 правостороннее // вы равнивание // в р еги стр е к р езультата д а н н ы х AD C преобразовани я (A D C H , AD C L) } in t m a in (v o id ) { ADC I N I T O ; // И ни ц иализац и я АЦП DDRD = O x ff; // Вы воды - вы ходы DDRC = O x ff; // Вы воды п о р т а С - вы ходы DDRB = 0x0 0; // Вы воды п о р т а В входы // Вы воды п о р т а В н агруж ен ы // р ези стор ам и // Б есконечны й PO R TB w h ile = O xFF; (1 ) порта Б - п од тя ги ва ю щ и м и цикл { if (-P IN B ADCSRA I (1 << 0 )) // Е сли (1 << 6 ); // устан авли ваем на вы воде // преобразовани е. // оди н очн ого / / АБ БС п о // // Р азр яд // п р еобр азован и я 4 (А 0 1 Р ) // зап и сью "1 ") i f (А Л С Э Н А & (1 << 4 )) { PO RTD = AD C L; PORTC = ADCH; ADCSRA 1= (1 Е сли (у с т а н о в и л а с ь //В порт // 4) ; о // то зап уская В реж и м е р азр яд преобразовани я в "0 ". окончании "1 " // порт << в // //В 0 В, сбрасы вается АЛСБНА п о устан авли вается - преобразовани я окончании аппаратно р еги стр а РВ 0 1 в АОЗС, (с б р а с ы в а е т с я п реобразован и е завер ш ен о 1 в р азр яде АБ1Р) Б - 8 бит р еги стр а д а н н ы х АОСЬ С - 8 бит р еги стр а д а н н ы х АОСН О бнуляем завер ш ен и и осущ естляется // мы и с п о л ь з о в а л и завер ш ен и и // р азр я д АБ1Р, п реобразован и я // // р азряд зап и сью что е д и н и ц ы !). преры вание по преобразовани я, то обнулился говор и т (о б н у л е н и е бы а п п а р а т н о . Е сли этот бы Аналоговый компаратор и АЦП А Ттеда16_________________________________ 197 Рис. 9.3. К выводу РВО подклю чена кнопка 198 Глава 9 АЦП в режиме дифференциального входа В таком реж им е А Ц П настроен на и сп ользован и е внеш него и сто ч ­ ника оп орн ого напряжения (в нашем случ а е A R E F = + 5 В ). В ходы : н еи н ­ вертирую щ ий + A D C 1 , инвертирую щ ий -A D C 0 . Коэф ф ициент усиления 10. В х о д н о е напряж ение вы числяется по ф орм уле: V in = A D C ■ V r e f / Gain -512, где G a in — коэффициент уси лен и я; V r e f — оп орн ое напряжение А Ц П ; A D C — р езультат преобразования в регистрах A D C H :A D C L . Рассм отрим два примера. 1. Результа т преобразования A D C = 0 Ь 0 0 1 0 0 1 1 0 0 1 =153. Т о гд а V in = 1 5 3 -5 В / 1 0 -5 1 2 = 0,14941 В. П о ск о льк у разряд 9 (зн ак) равен н улю , т о напряжение на п о ло ж и ­ тельн о м вход е б о л ь ш е напряжения на отрицательном входе на 0,149 В. 2. Р езульта т преобразования A D C = 0 Ы 0 1 1 1 0 1 1 1 0 . П о ск о льк у раз­ ряд 9 (зн ак) равен единице, то напряж ение на отрицательном входе б оль ш е напряж ения на п олож и тельн ом входе, и значение разности представлено в д о п о лн и тельн ом коде. П реобразовы ваем его из д о ­ п о лн и т ель н о го кода, инвертировав каждый разряд и прибавив к не­ м у единицу. П олуч аем О Ь О Ю 0 0 1 0 0 1 0 = 274. Таким образом, V in = 274 • 5 В / 5120 = 0,267578 В. М акси м альн ое значение регистра A D C = 0 Ы 1 1 1 1 1 1 1 1 = 511. Т о ­ гда м аксим альное значение напряжения при данны х настройках: 511 • 5 В / 10- 512 = 0,499 В. С хем а соединений д ля д анного примера показана на рис. 9.4, а со­ ответствую щ ая програм м а — в ли сти н ге 9.4. ^ % Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATmegal6\9. 04 - АЦП в режиме дифференциального входа. Л и сти н г 9.4. # in c lu d e # in c lu d e П рогр ам м а a d c . < a v r / io .h > с // З аголов оч н ы й ф айл // в в о д а -в ы в о д а для подклю чает определен ия устройства, // и с п о л ь з у е м о го в п р о е к т е c u til/ d e la y .h > // Д ля д о с т у п а к ф ункциям ц и к л о в // задерж ки работы АЦП в режиме д и ф ф ер е н ц и а ль н ого входа Аналоговый компаратор и АЦП А Ттеда16_________________________________________________ Рис. 9.4. Схема для 200 Глава 9 Л и с т и н г 9.4 . П р о д о л ж е н и е // Ф ункция v o id AD C и н и ц и али зац и и АЦП IN IT O { //AD C SR A ADCSRA // - |= р еги стр (1 AD PS2=1, << уп равлени я 7 ); AD PS1=1, ADCSRA |= (1 « 2) ADCSRA I= (1 << 5 ); // S F IO R // И сточн ик // т .е S F IO R // &= ADMUX |= « « 7) << -(1 << (A D E N ) - 1) // 5 ); (1 « 5 // определяется // р еги стр а I работу дели теля - - реж и м р а б о т ы содер ж и м ы м р а з р я д о в S F IO R в в о д а -в ы в о д а AD TS2=0, AD TS1=0, AD TS0=0, преобразовани я « б) << & - (1 « 5 ); м ульти п лексором 6 );/ / // оп ор н ого // подклю ченны й // (в 0 ); АЦП В н еш н и й и с т о ч н и к напряж ен ием к 5 В, в ы в о д у AREF STK500 - с н я т ь п ер ем ы ч к у AREF) // З а д ей ст в о в а н ы ди ф ф ерен ц и альн ы е входы +AD C 1, -A D C 0 с к оэф ф и ци ен том у с и л е н и я 1 0х //AD LAR = 0 - п р а в о с т о р о н н е е // вы равнивание // в р еги стр е р езультата д а н н ы х AD C преобразовани я (A D C H , AD C L) } in t m a in (v o id ) { A D C IN IT ( ) ; // И ни ц иализац и я // З ап ускаем // оди н оч н ого // и сп ользуется // р азр яда преобразован и е. п реобразован и я источник АЦП В р еж и м е н еп реры вн ого или зап уск п р ограм м н ы й . Е сли стар тового ADSC п р о и з в о д и т с я // з а д а н н о г о ADCSRA I = (1 - си гн ала, аппаратно после преры вания. << 6 ); DDRD = Oxff; // Вы воды порта D - вы ходы DDRC = Oxff; // Вы воды порта С - вы ходы // Б есконечны й w h ile { (1 ) _ d e la y _ m s ( 1000 ) ; АЦП 128 0 ); (A D A T E ) ф ункций си гн ала: << А р азр еш и ть коэф ф и ци ен т (1 & - (1 I - Р азр яд уп равлени я 7) 3) состояния 7 // & - (1 реги стр << и специальны х // ADMUX &= (1 н еп реры вн ого -(1 (1 Р азр яд AD PS0=1 стар тов ого -(1 - I реги стр реж и м ADMÜX &= ADMUX - // цикл то же установка в озн и к н овен и я 201 Аналоговый компаратор и АЦП А Ттеда16 Л и с т и н г 9.4. О к о н ч а н и е // Р азр яд // преобразовани я 4 (А 0 1 Р ) // И зап и сью (А О С З Я А "1 ") & (1 << р еги стр а 4 )) { РСЖ ТС = А Л С Н ; АЛСЗИА |= (1 //В // << // } } } // // РОЮТЭ = А О С Ь ; АОСБВА п о устан авли вается порт В порт 4 ); о // Е сли в окончании "1 " (с б р а с ы в а е т с я преобразовани е (у с т а н о в и л а с ь завер ш ен о X в р азр яде АВ1Р) Б - 8 бит р еги стр а д а н н ы х АОСЬ С - 8 бит р еги стр а дан н ы х АБСН О бнуляем заверш ени и осущ естляется // мы и с п о л ь з о в а л и заверш ени и // р азр яд АБ1Р, преобразовани я // // р азр яд запи сью что е д и н и ц ы !). преры вание по преобразовани я, то обнулился говор и т (о б н у л е н и е бы а п п а р а т н о . Е сли этот бы Глава И н т е р ф е й с ы ____________ 10 п е р е д а ч и А Т ш д а н н ы х е § а 1 6 В этой гла в е мы рассм отрим м етоды работы со след ую щ и м и интер­ фейсами передачи данных, доступ н ы м и в м икрокон троллере А Т ш е§а 1 6 : • Ш А Л Т (ун и версальн ы й синхронно-асинхронны й прием опередат­ чик); • 8Р1 — п оследовательн ы й интерфейс обм ен а данными с периферий­ ны ми устройствам и; • Т\¥1 — двухпроводн ой п оследовательн ы й интерфейс. Интерфейс иЭАРТ В этом примере м икрокон троллер с п ом ощ ью м о д у ля Ш А Я Т выво­ дит в терм инал текстовое м еню , п редлагаю щ ее вы брать вывод м икро­ контроллера, а также — д ли тельн ость сигналов вы сок ого и низкого уровня в м и лли секун д ах (рис. 10.1). □ И @1 1 -а | а ! Меню 1)Ножка РВО 2/3)В рем я н и зк о го уровня сигнала=5000 4 / 5 )в р ем я вы сокого уровня сигнала=5000 0 )з а п у с к стс1> Р ис. 10.1. М еню Вы бирая т о т и ли иной пункт м еню , мы передаем его ном ер из ком ­ пьютера в м икроконтроллер через Ш А Я Т . П о сл е выбора пункта м еню 0 запускается бесконечны й цикл, в котором вы полняю тся оп ределен н ы е операции с вы водом м икроконтроллера. Интерфейсы передачи данных А Ттеда16 203 С оединение С О М -п о р т а ком пью тера и интерф ейса Ш А Л Т м и кро­ контроллера д олж н о бы ть реализовано через преобразователь уровн ей (рис. 10.2). В начале програм м ы вызывается функция инициализации п рие­ ма/передатчика, в которую передается значение 64. Э то значение зап и ­ сывается в регистр и В Я Я , задаю щ ий скорость приема/передачи. Д ля о бы ч н ого асинхронн ого реж има значение и В Я И вы чи сляю т по ф орм у­ ле: ЦВЫ1 =/оьс / (16 • С к ор о сть) - 1 = 10 М Г ц / (16 • 9 600) - 1 = 64,104166. Значение, записы ваем ое в ЦВЮ 1, д олж н о бы ть ц елоч и слен н ы м , п о ­ это м у мы вы бираем 64, однако в результате скорость обм ен а буд ет ч уть выше 9 600 бод: С корость = / о зс / (16 ■ ( Ш Л Я + 1)) = 10 М Г ц / (16 • 65) = 9615, 3846. П о ск о льк у д оп усти м ое расхож ден и е в скорости составляет 0,5% , рассчитаем этот процент, чтобы убеди тся что мы его не превы сили. 9 6 1 5 ,3 8 4 6 - 9 6 0 0 = 15,3846. О дин процент от 9600 составляет 96. Т о гд а 15,38 бод — это 15,38 / 96 = 0,16 % , что м еньш е 0,5% , а значит допустим о. С пом ощ ью регистров и С Б Я С и и С Б Я В устанавливаем след ую щ и й режим работы и формат кадров: асинхронны й режим, один стоп-бит, восьмиразрядное сл о в о данны х, кон троль п о четности отклю чен. 204 Глава 10 Н азначаем порт В на вы ход и перенаправляем стандартны е потоки ввода-вывода на наш поток m y s t d o u t _ m y s t d i n . В цикле м икрокон­ тр о ллер передает через U S A R T текстовое меню , в п ерем ен н ую c h o o s e принимает ном ер вы бранного м еню , и, в зависимости от ее значения, вы полняет те и ли ины е действия. Е сли от U S A R T п о ступ и л си м вол “ 0” , происходит вы ход из цикла. С хем а соединений д ля д анного примера показана на рис. 10.3. Рис. 10.3. С х ем а с о е д и н е н и й д л я т ес т и р о в а н и я и н т ер ф ей са с и Б А Р Т П рограмма П рограм м а, реализую щ ая работу схем ы , показанной на рис. 10.3, представлена в ли сти н ге 10.1. 205 Интерфейсы передачи данных ATmega16 Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке А Т ш е д а 1 б \ю . 1 - u s a r t. Л и с т и н г 10.1. П р о г р а м м а u s a r t . с # in c lu d e < a v r / io .h > // З аголовочн ы й ф айл // в в о д а -в ы в о д а для // и сп ользуем ого // С тандартны е в подклю чает проекте # in c lu d e < s td io .h > tt in c lu d e // п о т о к а 's t r e a m ') < u t il/ d e la y .h > // Д ля д о с т у п а # in c lu d e < a v r / p g m s p a c e .h > // Ф ункция и н и ц и а ли за ц и и v o i d U S A R T _ IN IT (u n s ig n e d средства // задерж ки // Утилиты // пам ятью определения устрой ства, в в о д а -в ы в о д а к для ф ункциям работы с (д л я циклов F la s h - USART i n t U B R R _bau d) { // У станавливаем // в // UB RRL. два скорость р еги стр а: Д ля передачи /прием а. четы р ехр азр ядн ы й начала зн ач ен и е, хранящ ееся // с д в и га е м в п р а в о на 8 р а з р я д о в . UBRRH = ( u n s i g n e d c h a r ) ( U B R R b a u d > > // П оскольку // к // р азр ядов, // отброш ены вы п олняется восьм иразрядн ом у UBRRL = а все (u n s ig n e d // Д ля // в р азр яд обращ ения // требуем ы е Р еж и м р а б о т ы контроль // битов: // UCSZ0=1, // В асинхронном UCSRC UCSRB // = &= |= и USBS=0. UCSZ2 << URSEL) (0 << U PM 0) (1 « UCSZ0) // Р азр я д ы // и | I I 4) U2X=0 р азр яд В осем ь « << (0 и (1 бит за п и са н о р азр яда 8 м лад ш их будут и М РС М =0, 1 UCSRC. U M SEL=0. и О тклю чен U PM 0=0. данны х: U C SR B UM SEL) I О дин р азр яды стоп- U CSZ1=1, =0 | (0 (1 << << U PM 1) UCSZ1) | I U C P O L ); U C SZ2=0 передатчик « зап и са ть устан ови ть UC PO L=0 USBS) « эти м UPM 1=0 р еги стр а // | с р еги стр е р азр я ды (0 (0 2 ); при ем ни к « в реж и м е р а з р я д (1 (1 будет в осьм ого U C SR C н е о б х о д и м о асинхронны й: << 8 ); в UBRRL одноврем енно четн ости : р азряд - (1 в U B R R _bau d, c h a r )U B R R _ b a u d ; р азр я д ы р азр яд В клю чаем UCSRB по зап и сы в ается восьм иразрядн ы й преобразовани е после к р еги стр у нам // чи слу, старш ие URSEL, // явное О на UBRRH и 3 ); т .е . р еж и м м у л ь т и п р о ц е с с о р н о г о // (8 бит данны х) USART Р азр яды отклю чаем обм ена RXEN=1 и удвоение TXEN=1 скорости 206 Глава 10 Л и с т и н г 1 0.1. П р о д о л ж е н и е U C S R A &= - (1 « 1) & ~ (1 << 0 ); } // Ф ункция, // вы вод s ta tic in t которая будет вы зы ваться u a r t_ p u t c h a r (c h a r при s im v o l, обращ ении F IL E потока на »s tre a m ) { // О ж идаем // // готов UD R E ) освобож дени я принять р еги стр а сим вол для lo o p _ u n t il_ b it _ is _ s e t(U C S R A , UDR = s im v o l; re tu rn данны х, отправки т .е . к огд а (у с т а н о в и т с я он 1 в будет р азр яде 5 ); // П ередаем // в сим вол, перем ен ной содерж ащ ий ся s im v o l, в порт UART 0; }; // Ф ункция, // ввод s ta tic in t которая будет вы зы ваться u a r tg e t c h a r (F IL E при обращ ении потока на »s tre a m ) { // О ж идаем , // 1 пока в р азр яде за в ер ш и тся при ем сим вола в UART (у с т а н о в и т с я RXC) lo o p _ u n t il_ b it _ is _ s e t(U C S R A , 7 ); re tu rn верн ет UDR; // Ф ункция приняты й сим вол } // И ни ц иализац и я // С озд аем поток, // данны х, a в в о д а -в ы в о д а н азн ачи в u a rt_ g e tc h a r ф ункцию u a r t _ p u t c h a r - для ввода. для И сп ользуем вы вода в в о д -в ы в о д , // у с т а н о в и в ф л а г _FD E V _S E T U P _R W s t a t i c F IL E m y s t d o u t m y s t d in = F D E V _ S E T U P _ S T R E A M (u a r tp u tc h a r , // М асси вы с и м в о л о в , const char m enuO [ ] \ r \ n l ) Н ож ка const char хранящ и еся PROGMEM = u a rtg e tc h a r, _ F D E V _ S E T U P _ R W ); в пам яти п р огр а м м (F la s h ) " \ r \ n ------------------------------ \ r \ n М еню P B "; m e n u l[] PROGMEM = " \ r \ n 2 / 3 )В рем я н и зк ого уровня в ы сокого уровня с и гн а л а "; con st char m enu2 [ ] PROGMEM = " \ r \ n 4 / 5 )В р ем я с и гн а л а "; const in t c h a r m enu3 [ ] PROGMEM = "\ r \ n 0 )З а п у с к \ г\ п c m d > "; m a in (v o id ) { U S A R T _ IN IT (0 x 4 0 ); // зн ачен и е // П ередаем р еги стр а в UBRR: ф ункцию и н и ц и а л и з а ц и и USART 64, 10 т .е . 9600 бод при М Гц 207 Интерфейсы передачи данных ATmega16 Л и с т и н г 1 0 .1 . П р о д о л ж е н и е DDRB = PO R TB // // 0x00; char in t = s td o u t choose nogka in t = = Ц икл, = 0; в котором (c h o o s e != = = p r in tf("% d \ r \ n ", p r i n t f ( " % d \ r \ n 11, для USART по // П ерем енн ая // вы вода, // периоди чески // Д ли тельн ость // вы сокого // Ф ункция // поток // пам яти и з, сим вол уровня В" "+ 5 В" вы вода если p r in tf_ P строку, от USART принят // UART в ном ер наш F la s h - вы вода МК О тображ аем н и зк ого уровня м ен ю // си гн ала П родолж ен ие в в м ен ю си гн ала П родолж ен ие вы ведет храним ую О тображ аем П родолж ен ие длительность через "0 си гн ала "0 " // // си гн ала уровня состояние сим вол будем инвертировать н и зк ого // ном ера к отор ого Д ли тельн ость Вы ходим п р и н ятого хранения // длительность p r in tf_ P (& m e n u 3 [ 0 ] ) ; для // // // хранения состояние v r e m ja _ l_ s ig n a la ) ; // О тображ аем вы сокого уровня м ен ю перем ен ную choose = g e tc h a rO ; вы брано (c h o o s e == вы вод 1, '1 ') // Е сли // i f м ен яем (n o g k a // Е сли // н и зк ого уровня (c h o o s e == i f О В п ользовательск и й сим вола // p r in tfP (& m e n u 2 [ 0 ] ) ; Е сли на v r e m ja _ 0 _ s ig n a la ); // i f вы ходы В подаем П ерем енн ая n o g k a ); p r in tf_ P (& m e n u l[ 0 ] ) ; // потоки определеяется '0 ') p r i n t f ( "% d \ r\ n ", П ри ни м аем - // 5000; / / В ы в о д и м м ен ю p r i n t f P (fc m e n u O [ 0 ] ) // В порта // 5000; { choose порта вы воды стандартны е v r e m ja _ l_ s ig n a la w h ile вы воды все & m y s td o u t_ m y s td in ; v r e m ja _ 0 _ s ig n a la in t В се //Н а П еренап равляем s td in // O xFF; = с ном ер == 8 ) вы брано // Е сли // i f н и зк ого (c h o o s e // Е сли вы вод 8 на 0 nogka = 0; 2, увели чиваем 3, уровня == ' 3 ' ) вы брано м еняем н ом ер ом '2 ') вы брано то 4, МК nogka++; то (т .е . так ого вы вода н е т ), длительность тогд а си гн ала v r e m j a _ 0 _ s i g n a l a = v r e m j a _ 0 _ s i g n a l a + 1 0 00 ; то ум ен ьш аем длительность си гн ала v r e m ja _ 0 _ s ig n a la = v r e m ja _ 0 _ s ig n a la - 1 0 0 0 ; то увели чиваем длительность си гн ала 208 Глава 10 Л и с т и н г 10. 1. О к о н ч а н и е // в ы сокого i f (c h o o s e // Е сли // в ы сокого if (c h o o s e уровня == '4 ') вы брано 5, v r e m ja _ l_ s ig n a la = v r e m ja _ l_ s ig n a la + 1 0 0 0 ; то ум ен ьш аем длительность си гн ала уровня == '5 ') v r e m ja _ l_ s ig n a la = v r e m ja _ l_ s ig n a la - 1 0 0 0 ; } w h ile (1 ) // Б есконечны й (1 << цикл { P O R TB |= n o g k a ); // // Устанавливаем вы воде _ d e la y _ m s (v r e m ja _ l_ s ig n a la ); PO R TB &= ~ (1 << n o g k a );/ / порта лог. 1 на зад а н н ом В // Задерж ка // длительность // в ы сок ого У станавливаем в мс уровня лог. // в ы в од е п о р т а В _ d e la y _ m s (v r e m ja _ 0 _ s ig n a la ) ; // Задерж ка на си гн ала О на в мс // длительность // н и зк ого задан н ом на си гн ала уровня } } Интерфейс SPI. Подключение 12-разрядного ЦАП МСР4821 М и кр осхем а М С Р4821 представляет собой 12-разрядный Ц А П с ин­ терф ейсом S PI. Ее выводы: • V DD — в ход питания 2,7..5,5 В; • /CS — вход выбора м икросхем ы (напряж ение Vdd в м ом енты про­ стоя, 0 В в моменты передачи данны х); • S C K — вход тактовы х и м п ульсов (0 В в реж име п ростоя); • S D I — вход данны х; • / L D A C — синхронизирую щ ий вход, служ ащ и й д ля передачи дан­ ны х с вход н ого регистра в вы ходной при подаче на н его 0 В (е го мож но деактивировать, п одклю чив к “ н у л ю ” ); • /S H D N — вход отклю чения м икросхем ы (д ля перевода микросхемы во вклю ченное состояние н ео бх о д и м о подать напряжение питания); • A V s s — вход питания 0 В ( “ зем ля” ); • V oûta — вы ход циф ро-аналогового преобразования. Данны е, передаваемы е в м икросхем у, — 16-разрядные (рис. 10.4): • биты 12-15 — конф игурационные: Интерфейсы передачи данных А Ттеда16 209 15 (А /В ) — вы бор вы хода Ц А П преобразования (0 — А , 1 — В ); п о ск о льк у у нас тольк о канал А , мы передаем 0; о 14 — не и спользуется; о 13 ( С А ) — вы бор коэффициента уси лен и я вы хода Ц А П (У о Ш = = 2,048 • данны е / 4 096): 1 — коэффициент 1; 0 — коэф ф ициент 2; о 12 ( 8 Ш Ж ) — програм м н ое отк лю ч ен и е (0 ) и в клю чен и е (1 ) м и к­ росхемы ; • биты 0-11 — данны е д ля установки тр еб уем о го в ы ход н ого напря­ жения. о Upper Half: W-x W-x W-x W-0 W-X W-X W-x W-x А/В — GA SHDN 011 D10 D9 D8 Ь№ 15 bit8 Lower Half: W-x W-x W-X W-X W-X W-X W-X W-X D7 D6 D5 D4 D3 D2 D1 DO bit 7 bitO Рис. 10.4. С лово данны х, передаваемы х в микросхему МСР4821 Передача долж н а осущ ествляться, начиная со старш его, 15-го, р а з­ ряда, и т. д. до нулевого. И нструкция д олж н а передаваться в Ц А П в след ую щ ей п о след о в а ­ тельн ости (рис. 10.5). 1. Н а вывод /СБ подать 0 В (перед этим на выводе д олж н о п ри сутст­ вовать напряж ение питания). 2. П ередать 16 бит данных. 3. Н а вывод /СБ подать +5 В. « Л ____________________________________________________ __________________ г 0 scK ; П 1 2 П П - config bits * - SDI 3 4 5 6 7 8 9 10 11 12 13 14 П П П П П П П П П П П П 15 П -12 data bits • АВУ — XGAiSHDN^ D n ;fa l0 )( D 9 ) ( D 8 ) ( D 7 'i(D 6 )( D 5 )( D 4 )[D 3 ) ( D 2 ) ( D l) ( D 0 LDAC Рис. 10.5. Последовательность передачи сигналов в ЦАП (M ode 1,1) (Mode ö,o) 210 Глава 10 В х о д Ь Э А С мы не и сп о льзуем (о н соединен с “ н ул ем ” ). Д анны е м о ­ м ентально попадаю т в вы ходной регистр п о сле приема 16 би т и уста­ новки вы сок ого уровня на входе /СБ. П рограм м а В н ачале програм м ы (л и ст и н г 10.2) мы вызываем ф ункцию инициа­ лизации аппаратного в Р Ь м о д у л я З Р 1 _ М а з 1 :е г 1 п л .Ь ( ) , в которой наст­ раиваем интерфейс м и крокон троллера таким образом, чтоб он соотв ет­ ствовал конф игурации приема данны х м икросхем ой М С Р 4 8 2 1. Ц А П на­ строен на считы вание данны х по нарастаю щ ему фронту сигнала ЭС К, прием данны х, начиная со старш его разряда, перевод вы вода выбора микросхем ы /С8 в состояние л о г. 1 в реж име ожидания. У стан авли ваем ое напряж ение на вы ходе Ц А П ( У о ш а ) соответству­ ет 12-разрядному значению. Д ля его хранения в програм м е объявлен а гло ба льн ая переменная с о п £ 1 д _ М 1 ;з _ а п с 1 _ с 1 а Ь а . Д ля т о го чтобы п о лу ч и ть возм ож ность повыш ать или пониж ать на­ пряжение на вы ходе Ц А П , к м и к р ок он тр оллер у п одклю чен ы две кноп­ ки, нажатие которы е инкрем ентирует и ли декрем ентирует п ерем ен н ую с о п £ 1 д _ Ь ^ з _ а п с 1 _ с 1 а С а , а также отправляет ее значение. При нажатии кнопки 8\У0 (рис. 10.6) напряжения на выводе Р Э 7 понижается с +5 В д о 0 В, в результате ч его ум еньш ается значение п е­ рем енной с о п £ 1 д _ Ь з.С з_ а п с 1 _ с 1 а С а , и обн уляю тся все разряды п о сле 12-го. Д л я о бн улен и я и сп ользуется поразрядный оператор & (“ И ” ). П о с к о л ь к у п о сле разряда 12 значение 0 x 0 Р Р Р содерж ит н ули , то операция “ И ” , примененная к перем енной с о п £ 1 д _ Ь д ^ з _ а п с 1 _ с ^ а и этом у значении, даст в р езультате д вои чн ое чи сло, в котором все раз­ ряды старш е 12-го б уд ут содерж ать 0. Д а л ее в програм м е вызывается функция З Е Т _ \ / о 1 С а д е ( ) , которая реализует п роцедуру отправки данных. На выводе /8Б устанавливается 0 В, и вызывается функция отправки Э Р 1 _ М а з 1 :е г Т г а п з т :1 1 ; ( ) , кото­ рая передает восем ь старш их би т (ч еты ре конф игурационны х бита и че­ ты ре бита данны х). П оск ольк у функция З Р 1 _ М а з Ь е г Т г а п з т п ^ ( ) за один раз мож ет отправить тольк о восем ь би т данны х, след ую щ и е в о ­ семь бит отправляем, вызвав ее повторно. П о окончании передачи вы ­ вод /88 переводится в состояние л ог. 1. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T m egal6 \iO . 02 - s p i - цап. Интерфейсы передачи данных А Ттеда16 Рис. 10.6. Схема подклю чения ЦАП МСР4821 211 212 Глава 10 Л и с т и н г 1 0.2. П р о г р а м м а s p i _ m c p 4 8 2 1 . c # in c lu d e < a v r / io .h > // З аголовочн ы й ф айл // в в о д а -в ы в о д а для // // определен ия // и с п о л ь з у е м о г о в п р о е к т е < u t il/ d e la y .h > // Д ля д о с т у п а к ф ункциям # in c lu d e Ф ункция v o id подклю чает устрой ства, и н и ц и али зац и и ц иклов зад ерж к и нтерф ейса SPI S P I M a s t e r l n i t () { // Вы воды // РВ4 DDRB - |= PO R TB /SS, /SS, (1 |= « (1 // В к лю чаем // на // SPR0 // си гн ала SCK, РВ 7 4) << SPR1 // си гн ала С РИ А (р а з р я д // CPOL // полярности // M STR "M a s te r" // DORD // начиная (р а з р я д // SPE (р а з р я д со (р а з р я д |= (1 << | передачи (1 « /SS (у с т р о й с т в о , // отклю чено) "M a s te r", 10 - вы ходы 5 ); На в ы воде // = данны х) M O SI устан авли ваем подклю ченное частота М Гц так тового / 2 = 5 5 В к S P I, си гн ала М Гц SPC R) = 0 - частота так тового SPC R) = 0 - частота так тового SPC R) = 0 - обработка 3 р еги стр а SPC R) = 0 - им пульсы 4 р еги стр а SPC R) = 1 - реж и м 5 р еги стр а SPC R) = 0 - 1 р еги стр а fc k / 2 2 р еги стр а по полож ительной работы передача SPI - данны х, р азр яд а 6 р еги стр а SPC R) = 7 р е г и с т р а SPC R) | (1 « 4) ; 0 ); данны х си гн ала стар ш его // S P IE (р а з р я д S PC R = ( 1 « 6) SPSR 7) fc k / 2 ф ронту (р а з р я д // « - fc k / 2 SCK = переднем у (1 0 р еги стр а (р а з р я д // РВ 5 реж и м SCK = // (л и н и я SCK, // SCK = (р а з р я д // | M OSI 4 ); S P I, вы воде - // S P I2 X // частота 1 = (р а з р я д 0 S P I -и н т е р ф е й с - преры вания 0 р еги стр а так тового вклю чен зап р ещ ен ы SPSR) си гн ала = SCK = 1 - fc k / 2 } // Ф ункция п е р е д а ч и б а й т а п о и н т е р ф е й с у S P I u n s ig n e d c h a r S P I_ M a s t e r T r a n s m it (c h a r c D a ta ) { SPD R = w h ile c D a ta ; (- S P S R & (1 // П ередаем << 7 )) {}; байт // // re tu rn SPD R; в сдви говы й О ж и даем р еги стр отправки (п о я в и т с я S PD R байта 1 в р азр я де // р еги стр а // В озвр ащ аем S P IF SPSR) приняты й байт 213 Интерфейсы передачи данных ATmega16 Л и с т и н г 1 0.2. П р о д о л ж е н и е // П ерем енн ая // устан авли ваем ом у для хранения на // к он ф и гур ац и он н ы е биты данны х, вы ходе соответствую щ и х ЦАП плю с - 16 данны е, бит определяю щ и е / / н а в ы х о д е ЦАП s t a t i c u n s ig n e d i n t c o n fig _ b its _ a n d _ d a ta // 16 Ф ункция s ta t ic отправки v o id бит данны х по напряж ен ию , данны х, = напряж ен ие 0x0000; ин терф ей су SPI S E T _ V o lta g e () { PORTB &= ~ (1 << 4 ); по // вы воде // О тправляем // к он ф и гур ац и он н ы е, // которое // О тправляем старш ие // п ерем ен ная c o n fig _ b its _ a n d _ d a ta // старш ие // и будет 8 бит присваиваем SPI На (O X O ID D D D ). остальны е установлено вправо р азр яду П ер вы е (1 1 - 0 ) на 8 бит данных О тправляем no SPI (8 - 1 5 ) . - м ладш ие |= (1 << 4 ); // (1 5 - 1 2 ) - н апряж ен ия, П оскольку 1 6 -р а зр я д н а я , отправляем 8 бит 0 В ЦАП старш ие (к о н ф и г у р а ц и о н н о м у ) S P I_ M a s t e r T r a n s m it (c o n fig _ b it s PORTB бита данны е / / в ы в о д и м ЦАП и з р е ж и м а SHDN S P I_ M a s te r T r a n s m it( (c o n fig _ b it s _ a n d _ d a t a // устан авли ваем 4 - вы ходе (п е р в ы м и 4 /SS >> данны х 8) сд ви га ем 8 бит) единицу, | (1 << т .е . 4 )); (0 - 7 ) a n d _ d a ta ); На вы воде /SS устан авли ваем +5 } in t m a in (v o id ) { S P I_ M a s t e r In it( ) ; // Кнопка // ин струкц ии DDRD &= PO RTD установки - (1 |= (1 ЦАП + 1 (п е р е д а ч а // Вы вод PD 7 - вход Вы вод PD 7 - с // соп роти влени ем напряж ен ия установки "M a s te r" по SPI н апряж ен ия) // установки (1 р еж и м е 7 ); К нопка ~ (1 на в 7 ); ин струкц ии |= н апряж ен ия установки SPI << // PO RTD И ни ц иализац и я « // DDRD &= // на ЦАП -1 п од тяги ваю щ и м (п е р е д а ч а по SPI н апряж ен ия) « б ); // В ы вод PD 6 - вход << 6 ); // В ы вод PD 6 - с // соп роти влени ем w h ile d ) // Б есконечны й п од тяги ваю щ и м цикл { i f (- P IN D { & (1 << 7 )) // с // Е с л и н ап р яж ен и е н а в ы в од е п од тяги ваю щ и м с о п р о т и в л е н и е м В 214 Глава 10 Л и с т и н г 1 0.2. О к о н ч а н и е // // О ж идаем , к огд а стало равны м н апряж ен ие на 0 вы воде (к н о п к а наж ата) станет равны м // К ак т о л ь к о о т п у с т я т к н о п к у , п р о и з о й д е т в ы ход и з w h ile (- P I N D & (1 « 7 )) { _ d e l a y _ l c o p _ 2 (6 5 5 3 5 ); } _ d e la y _ lo o p _ 2 (6 5 5 3 5 ); // И нкрем ен тирован ие // 1 2 -го c o n fig _ b its _ a n d _ d a ta // и = 0. ц икла П ауза зап и сь нулей во все р азр яды (c o n fig _ b its _ a n d _ d a t a + 1) п осле & O xO FFF; S E T V o lta g e ( ) ; // П ередача // Е сли ин струкц ии в ЦАП } if(- P IN D & (1 « б )) { / / с // // О ж идаем , к огд а н апряж ен ие п од тяги ваю щ и м стало напряж ен ие равны м на 0 вы воде на вы воде соп роти влени ем (к н о п к а наж ата) станет равны м // К ак т о л ь к о о т п у с т я т к н о п к у , п р о и з о й д е т в ы х о д и з w h ile (- P I N D & (1 « 6 ) ) { _ d e la y _ lo o p _ 2 (6 5 5 3 5 ); } _ d e l a y _ l o o p _ 2 (6 5 5 3 5 ) ; // Д ек р ем ен ти р ован и е // 1 2 -го c o n fig b its a n d d a ta // и = зап и сь 0. ц икла П ауза нулей во (c o n fig b its a n d все р азр я д ы d a ta - 1) п осле & O xO FFF; S E T _ V o lta g e ( ) ; // П ередача ин струкц ии в ЦАП } } } Интерфейс SPI. Работа с памятью EEPROM В этом примере мы в осп ользуем ся м икросхем ой энергонезависим ой памяти М 95040. Ее объем — 512 байт. Одна страница содерж ит 16 байт. М аксим альная частота тактового си гн ала на выводе S C K — 5 М Г ц . М и к р ок он тр оллер вы ступает в р о ли связую щ его звена м еж ду ком ­ п ью тером и памятью. Е го интерфейс S P I п одклю чен к м и кросхем е па­ мяти М 95040, а интерфейс U S A R T — к C O M -порту (интерф ейс R S 232 ) компью тера. С пом ощ ью програм м ы H yperTerm inal мы передаем ко­ манды м икроконтроллеру, который, в свою очередь, обм енивается и н ­ формацией с памятью, исп ользуя S P I-интерфейс (рис. 10.7). Рис. 10.7. Схема обмена данными 215 Интерфейсы передачи данных ATmega16 С хем а соединений д ля данного примера показана на рис. 10.8. О О О о Ô гч О S Р г; И < 1 N О щ | g ë lg s ie s о £< _ \т ч т * ni - N П + V, ■. CN dl x 1/ in ICl// Рис. 10.8. Схема соединений для работы с памятью EEPROM 21 6 Глава 10 М ик р осхем а памяти поддерживает два реж има обм ена данными (рис. 10.9): • S PI M O D E 0 — если разряды C P O L ; С Р Н А регистра S P C R содер­ жат 0, активный уровен ь и м п ульсов — высокий в реж им е передачи и низкий в реж име ожидания (сначала фиксация, затем сдви г) • S P I M O D E 3 — если разряды C P O L ; С Р Н А регистра S P C R содер­ жат 1, активный уровен ь и м п ульсов — низкий в реж име передачи и высокий в реж име ожидания (сначала сдвиг, затем фиксация). СPOL СРНА о о с 1 1 “ “ 1 с D О _ П ~ У MSB X __________Г ~ — I __________ г X I ~ I— I I_____ ____ I )--------^ MSB X X Рис. 10.9. Режима обмена данны м и м икросхем ы М95040 В х о д н ы е данны е (вы вод D ) д ля о бои х реж имов ф иксирую тся по возрастаю щ ем у ф ронту тактового сигнала (вы вод С ). В ы ход н ы е данны е д ля о б о и х реж имов д оступ н ы по ниспадаю щ ем у ф ронту тактового си г­ нала. В п рограм м е (л и ст и н г 10.3) вначале вызывается функция инициали­ зации интерфейса U S A R T м и кроконтроллера U S A R T _ I N I T ( 0 x 4 0 ) . П арам етру 0 x 4 0 соответствует следую щ ая конфигурация: 9600 бод при частоте м икроконтроллера 10 М Г ц ; контроль по четности отсутствует; один стоповы й бит; восемь бит данных. Д а л ее вызывается функция S P I _ M a s t e r I n i t ( ) инициализации интерфейса S P I со след ую щ ей конф игурацией: частота тактового сигна­ л а S C K — Уск/2; им п ульсы п олож и тельн ой полярности; обработка дан­ ны х по переднем у ф ронту сигнала; передача данны х, начиная со стар­ ш его разряда; режим работы “ M aster” . В бесконечном ц икле с п ом ощ ью функции p r i n t f _ P вы водим че­ рез интерф ейс U S A R T в C O M -порт компью тера текстовое меню . Зате­ ем, и сп ользуя функцию g e t c h a r ( ) , ожидаем приема си м вола (в ы ­ бранного пункта м ен ю ) от интерфейса RS232 компью тера и присваива­ ем принятый сим вол перем енной c h o o s e . В зависимости от вы бранно­ го пункта м еню , с п ом ощ ью оператора s w i t c h вы полняем т у и ли иную ф ункцию. Интерфейсы передачи данных ATmega16 1. 217 У с т а н о в к а т р и г г е р а р а з р е ш е н и я з а п и с и . Ф ункции WREN ( ) . П е ­ ред тем как установить разреш ение на запись, н ео бх о д и м о п рове­ рить, не занята ли микросхем а памяти операцией записи. Е сли заня­ та, н еобходи м о дож даться заверш ения записи. П роверить это м о ж ­ но, прочитав регистр состояния памяти. Е сли разряд W IP = 1, то память занята. Е сли W IP = 0, то пам ять готова к работе. И н струкци я разреш ения записи описана в спецификации М 95040. Сначала вы ­ бираем (в к лю ч а ем ) память E E P R O M , подав О В на вы вод /SS. О т ­ правляем с п о м ощ ь функции S P I _ M a s t e r T r a n s m i t ( ) инструк­ цию 0 0 0 0 X 1 1 0 , п о сле ч его отклю чаем обм ен с пам ятью E E P R O M , подав на вы вод /SS напряжение +5 В. П о с л е т о г о как триггер раз­ реш ения записи установлен, стаю т д оступ н ы инструкции WRSR и W R IT E . Т р и ггер автоматически сбрасывается п о сле вы п олн ен и я инструкции WRSR и ли W R ITE . 2. С б р о с т р и г г е р а р а з р е ш е н и я з а п и с и . Ф ун к ция W RDI ( ) — отправ­ ляет инструкцию , запрещ аю щ ую л ю б у ю запись в память. 3. Ч т е н и е р е г и с т р а с о с т о я н и я . Ф ун к ци я RD SR ( ) — передает п о и н ­ терф ейсу S P I инструкцию чтения регистра состояния, приним ает от м икросхемы памяти значение регистра состояния и возвращ ает его в вы зы ваю щ ую программу. Р езульта т RD SR ( ) передаем через и н ­ терфейс U S A R T в C O M -порт ком пью тера с п ом ощ ью стандартной 4. З а п и с ь р е г и с т р а с о с т о я н и я . С п о м ощ ью функции ф орматирован­ функции p r i n t f _ Р ( ) . н ого ввода s c a n f _ P ( ) принимаем в п ерем енную s t a t _ r e g ч и сло в ш естнадцатеричной систем е сч и слен и я и передаем его в ф ункцию записи в регистр состояния WRSR ( ) .П еред этим разреш аем запись, вызвав функцию WREN ( ) , и разреш аем обм ен данны ми с м и кро­ схем ой, установив лог. 0 на вы воде /S. П ередаем и нструкцию зап и ­ си в регистр состояния, передаем н о в ое значение регистра со стоя ­ ния. Запрещаем м икросхем е обм ен данны ми, установив ло г. 1 на вы воде \S. 5. Ч т е н и е д а н н ы х с м а с с и в а п а м я т и . Ф ун кци я READ ( ) . Д ля чтения нам необходи м ы два значения: с какого адреса м и кросхем ы н ачи­ нать чтение и к оли чество считы ваем ы х байт. С п ом ощ ью ф ункции f g e t s О принимаем по интерф ейсу U S A R T адрес памяти, с кото­ р о го начинается чтение. П о с к о л ь к у функция работает с данны м и в сим вольном формате, принятый адреса, содерж ащ ийся в массиве f r o m _ u a r t _ a d d r e s s [ 4 ] , преобразовы вается в ц ело ч и сл ен н у ю перем енную a d d r e s s . Д а лее приним аем п о US A R T ч и сло (к о л и ч е ­ 218 Глава 10 ство байт, которое н ео бх о д и м о считать из пам яти) в массив и пре­ образовываем его в ц ело ч и слен н ую п ерем енную . П еред чтением убеж даем ся, что память не занята п роцессом записи. Е сли она заня­ та, ож идаем ее освобож дения (установится 0 в разряде W IP реги ст­ ра состояния). Разреш аем обм ен данны м и с памятью, установив лог. 0 на вы воде /SS. В зависимости от того, с какого адреса начинается чтение памяти, отправляю тся разные инструкции чтения. Е сли чте­ ние вы полн яем д о адреса 255 вклю чи тельн о, то п о S P I отправляем и нструкцию 0 0 0 0 0 0 1 1 , в противном с л у ч а е — 0 0 0 0 1 0 1 1 . В цик­ л е при п ом ощ и функции S P I _ M a s t e r R e s e i v e ( ) считываем по­ байтно данны е из интерфейса S P I и вы водим и х в терм инальны й клиент компью тера, п о сле ч его устанавливаем уровен ь л о г. 1 на вы ­ воде /SS. 6. З а п и с ь д а н н ы х в м и к р о с х е м у п а м я т и . Ф ункция W R IT E ( ) , в кото­ рой через интерфейс U S A R T принимается два значения: 16 байт данны х, которы е б у д у т записаны в м и кросхем у памяти, и адрес па­ мяти, с к оторого н ео бх о д и м о начать запись. Е сли адрес записи л е ­ жит в п ред елах нижней п олови н ы памяти, то отправляем инструк­ цию 0 0 0 0 0 0 1 0 , в противном случ а е — 0 0 0 0 1 0 1 0 . Отправляем адрес, с к о тор о го начинается запись. С о гла сн о спецификации, от­ правляемы й адрес — это восьм иразрядное значение, а значит мы не мож ем отправить адрес б о л ь ш е 255. Д ля записи в ячейку 256 памя­ ти отправляется н улев ой адрес байта, т.е “ адрес м инус 256” . В цик­ л е побай тн о передаем через интерф ейс S P I данные д ля записи, п о­ сл е ч его устанавливаем уровен ь ло г. 1 на выводе /SS. 7. Ч т е н и е в с е й п а м я т и . Ф ун кци я R E A D _ A L L ( ) — считывает все 512 ячеек памяти и выводит их содерж им ое через U S A R T в С О М -п о р т компью тера. П о с л е каждой страницы д ля н аглядн ого отображ ения содерж и м ого памяти передаю тся си м волы “ \п” (п еревод строки) и “ \г” (возврат каретки). П о завершения инструкции чтения уста­ навливается уровен ь лог. 1 на выводе /SS. В о время обм ена данны ­ ми по интерф ейсу S PI (о т выбора устройства S PI до окончания о б ­ мена) нельзя обращ аться к други м интерфейсам м и кроконтроллера (т.е. прерывать работу с S P I) и вы полнять какие-либо в ы ч и сли тель­ ны е операции посреди инструкций. В неш ние функции, и сп ол ь зуем ы е в програм м е c h a r * fg e ts (c h a r * __ str , i n t __ siz e , F IL E * __ stre a m ) Считы вает из п о т о к а ___ s t r e a m строку си м волов и пом ещ ает ее в __s t r . В вод завершается п о с л е приема s i z e - 1 сим волов и ли при по- Интерфейсы передачи данных ATmega16 219 луч ен и и сим вола перехода на с л ед у ю щ у ю строку. Е сли ввод заверш и л­ ся си м волом новой строки (О хО А , (в терм и н але — ком бинация клавиш <C trl+ J > ), то он также буд ет записан в ___ s t r . П ри задании размера __s t r след ует учиты вать, что функция автоматически заверш ает стр о­ к у н улевы м байтом “ \0” ( 0 x 0 0 ) д ля индикации ее окончания. Пример: char fr o m _ u a r t_ a d d r e s s [4 ]; fg e t s (fr o m _ u a r t _ a d d r e s s , 4, s td in ); М асси в f r o m _ u a r t _ a d d r e s s состои т из четы рёх элем ен тов (о т [0] д о [3 ]). С п о м ощ ью функции f g e t s в него м ож н о п ом ести ть м акси­ мум три символа, т.к. п о сле п о сле д н его введенного си м вола функция заверш ит строку н улев ы м байтом “ \0” . Ф унк ция приним ает м аксим ум три байта ( s i z e - 1 ) в массив f r o m _ u a r t _ a d d r e s s . Е сли мы ввели два байта и заверш или ввод сим волом новой строки, то в элем ен т [ 2 ] запишется си м в ол ОхОА, а в элем ен т [3] — си м вол конца строки 0 x 0 0. ch a r * g e ts (c h a r * __ str) Считы вает байты из потока s t d i n в с т р о к у ___ s t r до т е х пор, пока не встретит признак новой строки. В о тли ч и е от функции f g e t s , здесь си м вол ОхОА не записывается. С трока завершается си м в олом конца строки 0 x 0 0. Р а з м е р ___ s t r д олж ен бы ть д остаточн о б ольш и м , ч тобы вместить все, что приходит из потока, вклю чая си м вол конца строки. in t s c a n f_ P (c o n s t c h a r * __ fm t, a r g l , a r g 2 ...) Ф унк ция s c a n f _ P ( ) считывает из в ход н ого п отока s t d i n значе­ ния в формате, оп ред елен н ом в с т р о к е ___ f m t , и сохраняет и х в п ере­ менны х, адреса которы х переданы ей в качестве аргум ентов. Ф ун к ц и я идентична s c a n f , за исклю чен и ем т о го ч то с т р о к а ___ f m t размещ ается в памяти программ, чтобы не занимать О З У . А р гум ен т ы в строке ___ f m t оп ределяю т тип вводим ы х д анны х и м о гу т бы ть след ую щ и м и : • • %d — десятичное ц елое; %i — ц елое, которое м ож ет бы ть восьм ери чн ы м (с 0 слев а ) и л и ш е­ стнадцатеричны м (с Ох и ли 0Х слев а); • %о — восьм еричное ц ело е (с н у л е м слева и ли без н его); • • %и — беззнаковое д есятичное ц елое; %х — ш естнадцатеричное ц е ло е (с О х и ли 0Х слева и ли без н и х). 220 Глава 10 in t a to i (c o n s t c h a r *s) П реобразует массив A S C II-си м волов (ц и ф р) в значение типа i n t . Строка п ередаваем ая в ф ункцию долж н а оканчиваться си м в олом ' \ 0 ' (0 x 0 0 ). P S T R (cT p oK a в п а м я т и п р о г р а м м ) С луж и т д ля объявления статических указателей на строку в памяти программ. О п ред елен а след ую щ и м образом: PSTR(s) ( ( c o n s t PROGMEM c h a r * ) ( s ) ) О п и сан и е м и к р осхем ы M 95040 В ы воды М 95040: • Q — последовательн ы й вы ход данны х (данны е сдвигаю тся по н и с­ падаю щ ем у ф ронту си н хрои м п ульсов на выводе С ); • D — последовательн ы й вход данны х, на которы й п оступ аю т инст­ рукции д ля работы с пам ятью и данны е д ля записи (данны е вы би­ раются по нарастаю щ ем у ф ронту си н хрои м п ульсов на выводе С ); • С — вход си н хр ои м п ульсов п оследовательн ой шины; • S — вы бор устройства: +5 В — устройство отк лю ч ен о; 0 В — у с т ­ ройство вклю чен о; • H o ld — и сп ользуется д ля приостановки л ю б о г о обм ена инф ормаци­ ей с устройством , без отклю чения устройства с п ом ощ ью вывода S: 0 В — приостановка обм ена; +5 В — обм ен информацией. • A V — установка защиты от записи; запрещает и сп ользовани е инст­ рукций записи, когда на выводе присутствует 0 В, разреш ает — ко­ гда на вы воде +5 В; • V S S — “ зем ля” ; • V C C — напряжение питания. И нструкции м икросхем ы М 95040 перечислены в табл. 10.1 Таблица 10.1. Инструкции м икросхемы М95040 И нструкция О писание WREN У с т а н о в к а т р и г г е р а р а з р е ш е н и я за п и с и 0000 Х110 W RDI С б р о с тр и ггер а р азр еш ен и я за п и си 0000 Х100 R D SR Ч тен и е р еги стр а состоян и я 0000 Х101 WRSR З ап и сь р еги стр а состоян и я 0000 X001 READ Ч т е н и е д а н н ы х и з м а с с и в а п а м я ти 0000 А в0 1 1 W R IT E З а п и сь д а н н ы х в м а сси в пам яти 0000 А 80 1 0 о; Ф о р м а т ин струкц ии * х — 1 или а 8 - 1 для второй половины массива памяти (с 256 до 511 байта) и 0 для первой половины (с 0 до 255 байта). 221 Интерфейсы передачи данных ATmega16 И н с т р у к ц и я w r e n — “У с т а н о в к а т р и г г е р а р а з р е ш е н и я з а п и с и ” П о след ов а тельн о сть вы п олн ен и я инструкции WREN и ллю ст р и р ует рис. 10.10. " Л / . 0 1 2 3 4 5 6 7 ш и и ш ш Instruction Л £ Г \ £ High Impedance Р и с . 1 0 .1 0 . П о с л е д о в а т е л ь н о с т ь в ы п о л н е н и я и н с т р у к ц и и wren Каждая операция записи в память долж н а начинается с инструкции разреш ения записи. 1. У стан ов и ть на вы воде /S напряжение 0 В. 2. П ередать м икросхем е памяти инструкцию 0 00 0 X I 10. 3. У стан ови ть на вы воде /S напряжение +5 В. Три ггер сбрасывается автоматически п о сле операции записи. И н ст р у к ц и я w r d i — “С б р о с т р и г г е р а р а з р е ш е н и я з а п и с и ” П о след ов а тельн о сть вы п олн ен и я инструкции W RDI и ллю ст р и р ует рис. 10.11. “ / Л 0 1 2 3 4 5 6 7 иииииии Instruction А U \ —L High Impedance Рис. 10.11. П оследовательность вы полнения инструкции w rdi 222 Глава 10 1. У стан о в и ть на вы воде /S напряжение 0 В. 2. П ередать м икросхем е памяти инструкцию 0 0 0 0 3. У стан ов и ть на вы воде /S напряжение +5 В. Х100. О дин из сп особов сброси ть триггер разреш ения записи — отпра­ вить инструкцию сброса. Тр и ггер разреш ения записи так ж е сбрасы ва­ ется при след ую щ и х собы тиях: • вклю чение; • вы полнении инструкции W RD I; • вы п олн ен и е инструкции WRSR; • вы полнение инструкции W R IT E ; • появлен и е л ог. 0 на вы воде AV. И н с т р у к ц и я r d s r — “Ч т е н и е р е г и с т р а с о с т о я н и я ” П о след ов а тельн о сть вы п олн ен и я инструкции RDSR и ллю стр и р ует рис. 10.12. ¡Л 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 — 1л п л л т л л л п я л ж .ш и ш ш и ш п :: +----- X Instruction ------► гт \г High Impedance ' Status Register Out Status Register Out 3 0 0 3 0 0 0 ® э о о о о о о а :::: MSB MSB Р и с . 1 0 .1 2 . П о с л е д о в а т е л ь н о с т ь в ы п о л н е н и я и н с т р у к ц и и r d s r 1. Н а вывод /S подать напряжение 0 В. 2. П ередать код инструкции 0 0 0 0 3. П ринять байт информации (регистр состояния). 4. Н а вы вод /S подать +5 В. Х101. Регистр состояния состои т из восьм и бит, из которы х разряды 4 -7 всегда содерж ат 1. Разряды 2, 3 (В Р 0 и В Р 1 ) служ ат д ля зашиты от запи­ си в сектор памяти. К огд а они оба содерж ат 0, защита не исп ользуется. Эти разряды энергонезависимы. Разряд 1 (W E L ) отображ ает состояние триггера записи. Три ггер за­ писи устанавливается и сбрасы вается инструкциями WREN и W RD I. К о ­ Интерфейсы передачи данных ATmega16 223 гда W E L = 0, инструкции W R IT E и л и WRSR устройством н е п ри н и м аю т­ ся. Разряд О (W I P ) показывает, занята л и память операцией записи: 1 — занята; 0 — нет. И н с т р у к ц и я w r s r — “З а п и с ь р е г и с т р а с о с т о я н и я ” П ослед ов а тельн о сть вы п олн ен и я инструкции WRSR и ллю ст р и р ует рис. 10.13. "Л 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ш ш яплш ш пш ш ш ■*-------- ■*-------- Instruction А Status Register In Z \_ A D © 0 0 0 O Q d X High Impedance MSB Р и с . 1 0 .1 3 . П о с л е д о в а т е л ь н о с т ь в ы п о л н е н и я и н с т р у к ц и и w rsr И з восьми разрядов регистра состояния м ож но записать т оль к о два разряда защиты от записи: ВРО и ВР1. Запись регистра состояния не примется и не вы полнится, если: • перед данной инструкцией не бы ла вы полнена инструкция WREN, т.е. устан овлен разряд W E L в регистре состояния; • если осущ ествляется цикл записи; • если вы вод зашиты от записи /W находится в состоян и и л о г. 0. П роц есс записи регистра состояния д олж ен бы ть следую щ и м . 1. Н а вывод /S подать 0 В. 2. Передать инструкцию 0 0 0 0 Х0 01. 3. Передать тр еб уем о е значение р егистра состояния. 4. Н а вывод /S подать +5 В. И н с т р у к ц и я r e a d — “Ч т е н и е д а н н ы х и з м а с с и в а п а м я т и ” П о след ов а тельн о сть вы п олн ен и я инструкции READ и ллю стр и р ует рис. 10.14. 224 Глава 10 "Л. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ги и и и ш п п п л ш и и и ш ш ш п л и л ^ Instruction - B yte A d dre ss - :х Data O ut H igh Im pedance 000000Ö ® — Р и с . 1 0 .1 4 . П о с л е д о в а т е л ь н о с т ь в ы п о л н е н и я и н с т р у к ц и и r e a d П роц есс чтения данны х из массива памяти долж ен бы ть с л е д у ю ­ щим. 1. Н а вывод /S подать 0 В. 2. П ередать инструкцию 0 0 0 0 О О Н д ля чтения данны х из первой половины памяти (адреса с 0 по 255) и ли 0 0 0 0 из второй полови н ы (адреса с 256 по 511). 1 0 1 1 — для чтения 3. П ередать адрес памяти, с которого начинается чтение данных. 4. Н ачать прием данны х (п оба й тн ы й ) из массива памяти. 5. П о с л е прием а н ео бх о д и м о го количества байт подать на вывод /S на­ пряжение +5 В. Е сли п о сле приема первого байта на вывод /S не подать +5 В, т о ад­ рес автоматически инкрементируется, и м ож но принимать следую щ и й байт информации. Е сли д ости гн ут последн и й адрес памяти (511 ), он становится рав­ ным 0, и мож но продолж ать чтение массива памяти с сам ого начала. Все данны е массива памяти м огут бы ть прочтены, и сп ользуя одн у и нст­ рукцию READ. Прервать прием можно, установив +5 В на выводе /S. И нструкция н е принимается и не вы полняется, если вы полняется запись в память, п о этом у перед вы полнением данной инструкции н еобходи м о дождаться установки 0 в разряде W IP регистра состояния. И н с т р у к ц и я w r i t e — “З а п и с ь д а н н ы х в м а с с и в п а м я т и ” П о след ов а тельн о сть вы полнения инструкции W R IT E и ллю стри р ует рис. 10.15. 225 Интерфейсы передачи данных ATm ega16 ________________________________________________________________ i О с . Ж 1 2 3 4 5 6 7 П П П П И --------- Instruction D \ _ / © ^ 8 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1 1 1 1 1 1 1 I I 1 1 1 1 1 1 1 1 1 1 1 1 I I 1 1 1 1 1 I I 11 ► ■* y \ 9 j 0 ■ Byte Address ■ ...... ► ■* © © 0 0 0 0 6 m Data Byte w ► m H»gh Impedance О — ---------------------------------------------------------------------------------------------------------------------------------------------- Рис. 10.15. П оследовательность вы полнения инструкции w r i t e Процесс записи данных в массив памяти должен быть следующим. 1. Выполнить инструкцию WREN, чтобы разрешить запись. 2. На вывод /S подать 0 В. 3. Передать инструкцию 0 0 0 0 0 0 11 для записи данных в первую по­ ловину памяти (адреса с 0 по 255) или 00 00 1 0 1 1 — для записи во вторую половину (адреса с 256 по 511). 4. Передать адрес байта (восьмиразрядное число, т.е. не больш е 255), с которого начинать запись данных. Если адрес больш е 255, то ад­ рес 256 считается нулевым. 5. Передать от одного до 16 байт данных (размер одной страницы) для записи. 6. На вывод /CS памяти подать +5 В. Если после передачи одного байта для записи продолжать переда­ вать данные, то они будут записаны в последующ ие ячейки памяти, но не более 16 байт. Когда достигнут конец текущей страницы, и запись продолжается, данные начнут перезаписываться с начала текущей страницы (одна страница — 16 байт). Инструкция W R ITE не будет принята и не выполнится, если: • уже выполняется цикл записи; • вывод защиты от записи /W в состоянии лог. 0 или предпринята по­ пытка записи в область, защищенную разрядами BP 1 и ВР0 регист­ ра состояния. Программа Программа представлена в листинге 10.3. 226 Глава 10 Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке А Т ш е д а 1 6 \ 1 0 . 03 - S P I - EEPROM. Листинг 10.3. Программа S P i j m 9 5 0 4 0 . с " in c lu d e < a v r /io .h > # in c lu d e < s td lib .h > # in c lu d e < s td io .h > // Заголовочны й файл // в вода-вы вод а для // используем ого // Общие // интересует Стандартны е // USART) // функции < u t il/d e la y .h > # in c lu d e < a v r /p g m s p a c e .h > # in c lu d e // < s tr in g .h > (в // Функция инициализации p u tch a r, задерж ки Утилиты // памятью // Утилиты (в функция нтерф ейса к нас g ets, работы для работы с s c a n f_ P ) циклов F la s h - со примере для интересую т ф ункциям для данном нас ввода-вы вод а примере доступа // // v o id fg e ts , примере a to i) средства // // данном данном Для определения проекте (в функция // # in c lu d e в утилиты подклю чает устройства, строками нас интересует s trle n ) SPI S P I M a s t e r l n i t () { // Выводы // PB4 - /SS, /SS, SCK, PB7 - DDRB I = <1 < < 4 ) I PORTB |= ( 1 « 4 ); MOSI (л и н и я SCK, РВ5 (1 « 7) // DDRB & = -(1 б);// « // // // // // // // // // // // // // // // Вклю чаем на S P I, выводе SPR0 (р а з р я д сигнала SPR1 SCK СPOL 0 « = - выходы 5) ; выводе /SS устанавливаем подклю ченное к (Р В 6 ) M IS O байт 10 - от вход частота МГц (п о внеш них (р а зр я д / 2 = 5 этой линии тактового сигнала МГц SPCR) = 0 - частота тактового 1 регистра SPCR) = 0 - частота тактового fc k / 2 2 регистра SPCR) обработка данных (р а з р я д начиная со по сигнала 3 регистра SPCR) = 0 - импульсы 4 регистра SPCR) = 1 - режим 5 регистра SPCR) полож ительной работы SPI "M a ster" DORD В устройств) полярности MSTR 5 S P I, отклю чено) "M a ster", регистра ф ронту (р а з р я д (1 (у с т р о й с т в о , принимаем fc k / 2 данных) MOSI fc k / 2 = (р а з р я д переднему = = (р а з р я д сигнала СРНА SCK Вывод режим SCK I / / Н а // передачи - старш его разряда п ередача данны х, 227 Интерфейсы передачи данных ATm ega16 Листинг 10.3. Продолжение // SPE // S P IE 6 регистра (р а з р я д SPCR = SPSR |= (р а зр я д 7 6) | (1 « (1 << SPCR) регистра (1 0 ); << = SPCR) 1 - S P I -и н тер ф ей с = 0 - прерывания (р а зр я д 0 регистра вклю чен запрещ ены 4 ); // S P I2 X // частота тактового SPSR) сигнала SCK = = 1 - fc k / 2 } // Ф ункция u n s ig n e d приема char байта по интерф ейсу SPI S P I M a s t e r R e s e i v e () { SPDR = OxFF; w h ile (~ S P S R retu rn & (1 // Для // начать // передаем << SPDR; того V) ) { } ; чтобы начать передавать по // интерф ейсу Ожидаем до // отправится // разряде //Возвращ аем прием, им пульсы поэтому лю бой пор, байт пока 1 (п о я в и т ся S P IF принятый SPI тех необходимо SCK, регистра байт в SPSR байт } // Ф ункция u n s ig n e d передачи char байта по интерф ейсу S P I_ M a s te rT ra n s m it(c h a r SPI cD ata) { SPDR = w h ile cD ata; (-S P S R & (1 // П ередаем << 7 )) байт { } ; // в // retu rn SPDR; сдвиговы й Ож идаем регистр отправки (п о я в и т с я 1 // регистра // В озвращ аем в SPDR байта разряде S P IF SPSR) принятый байт } // Функция v o id инициализации U S A R T _ IN IT (u n s ig n e d USART in t UBRR_baud) { // Устанавливаем // в // UBRRL. // сдвигаем два UBRRH // = скорость регистра: Для начала в право (u n s ig n e d П оскольку // к // разрядов, // отброш ены значение, на UBRRL = все (u n s ig n e d // Для // в обращ ения // требуемы е разряд восьмиразрядны й хранящ ееся в UBRR_baud, явное числу, старш ие в >> 8); преобразование UBRRL после будет восьм ого записано разряда 8 младш их будут c h a r)U B R R b a u d ; к URSEL, нам записы вается и c h a r)(U B R R b a u d восьм иразрядном у Она UBRRH 8 разрядов. вы полняется а передачи/приема. четы рехразрядны й регистру и UCSRC одновременно разряды в необходимо с регистре этим записать установить UCSRC. 1 22 8 Глава 10 Листинг 10.3. Продолжение // Режим // контроль // битов: // U C S Z 0 = i, // В по асинхронны й: четности: разряд разряд = UCSRB (1 << URSEL) (0 << UPM0) (1 << &= ~ (1 Вклю чаем UCSRB |= « I 4) и (1 (0 « Разряды U2X=0 м ультипроцессорного ~ {1 << 1) & -(1 стоп- UCSZ1=1, =0 (0 (1 << << UPM1) | ÜCSZ1) I (8 т .е . << бит данных) USART // и &= Один разряды U C P O L ); 3 ); МРСМ=0, | I UCSZ2 = 0 // UCSRA UCSRB Отклю чен UPM0=O. UCPOL=0 передатчик << и данных: UMSEL) // режим бит USBS) // | и « << 2 ); приемник (1 (0 (0 UMSEL=0. UPM1=0 регистра разряд | I UCSZ0) << Восемь UCSZ2 режиме разряд разряды USBS=0. асинхронном UCSRC // работы Разряды отклю чаем RXEN=1 и TXEN=1 удвоение скорости обмена 0) ; } // Ф ункция, // вывод s ta tic in t которая будет вы зы ваться u a rt_ p u tc h a r(c h a r при s im v o l, обращ ении F IL E потока на ‘ stream ) { // Ожидаем // готов // UDRE) освобож дения принять регистра символ для lo o p _ u n til_ b it_ is _ s e t(U C S R A , UDR = s im v o l; retu rn данных, отправки т .е . когда 1 (у с т а н о в и т с я он в будет разряде 5 ); // П ередаем // в символ, переменной содерж ащ ийся s im v o l, в порт UART 0; }; // Функция, // ввод s ta tic in t которая будет вы зы ваться u a rtg e tc h a r(F IL E при обращ ении потока на ‘ stream ) { // О жидаем, // 1 в пока разряде заверш ится прием сим вола lo o p u n t ilb it is s e t (U C S R A , 7 ); retu rn вернет UDR; в UART (у с т а н о в и т с я RXC) // Ф ункция принятый сим вол } // И нициализация // С оздаем поток, // данных, a // установив s ta tic F IL E ввода-вы вод а назначив u a rt_getch a r ф лаг функцию - для _FD EV_SE TU P_R W m y s td o u t_ m y s td in = u a rt_p u tch ar ввода. для И спользуем вывода ввод-вы вод, 229 Интерфейсы передачи данных A Tm ega16 Листинг 10.3. Продолжение F D E V _ S E T U P _ S T R E A M (u a rt_ p u tc h a r, u a rt_ g e tc h a r, _FD EV _SE TU P_R W ); / / Ф у н к ц и я R D S R п е р е д а е т п о S P I в п а м я т ь E EPROM к о д и н с т р у к ц и и / / RDSR. В о т в е т п о л у ч а е т з н а ч е н и е р е г и с т р а с о с т о я н и я s t a t i c c h a r R D S R () { char sp i_ re c e iv e ; PO R T B SPI M sp i_ re PO R T B re tu rn / / / / 4); П ерем енная для х ран ен и я содерж им ого регистра состояния &= - ( 1 < < / / На вы вод /S S п о д а е м 0 В / / (разреш аем у с тр о й с т в у , / / подклю ченном у к S P I, п е р е д а в а т ь / / нам информацию ) a s t e r T r a n s m i t (0x05) ; / / О тп р ав л яем по S P I / / и н струкц и ю 0000 Х101 c e iv e = S P I_ M a ste rR e se iv e (); / / Принимаем со д ерж и м ое / / регистра состояния |= (1 << 4 ) ; / / На вы вод /S S п о д а е м 5 В / / (зап рещ аем у с т р о й с т в у , / / подклю ченному к S P I , п е р е д а в а т ь / / нам информацию ) sp i_ re c e iv e ; / / Ф ункция в о зв р ащ а ет содерж им ое / / регистра состояния триггер разреш ения } / / Ф у н к ц и я WREN у с т а н а в л и в а е т / / в п а м я т ь EEPROM s t a t i c v o i d W R E N () записи по SPI { / / Е с л и п а м я т ь EEP RO M з а н я т а п р о ц е с с о м з а п и с и , т о о ж и д а е м , / / к о г д а о н а о с в о б о д и т с я . О ж и д а е м п о я в л е н и я 0 в р а з р я д е W IP / / р еги стр а состоян и я ( т . е . микросхема освобод и тся от / / преды дущ его ц и к л а зап и си ) d o {} w h i l e (R D S R () & ( 1 << 0 ) ) ; PO R T B &= ~ ( 1 < < 4 ) ; / / На вы вод /S S п о д аем 0 В S P I_ M a s te r T ra n s m it(0x06) ; / / О тправляем по SPI / / инструкцию 0000 Х 110, / / разреш аю щ ую н ам з а п и с ь PO R T B | = ( 1 < < 4 ) ; / / Н а в ы в о д /S S п о д а е м +5 В } / / Ф у н к ц и я WRDI / / в память s t a t i c v o id сбрасы вает триггер разреш ения записи по SPI EEPROM W R D I () { PO R T B &= - ( 1 < < 4 ) ; S P I_ M a ste rT ra n sm it(0 x 0 4 ); // // На вы вод /S S п о д аем О тправляем по SPI 0 В 230 Глава 10 Листинг 10.3. Продолжение PORTB |= (1 << 4 ); // инструкцию 0000 // разреш ения записи / / Н а вывод /SS Х100 сброса подаем +5 В } // Функция s ta tic WRSR. v o id Запись нового W R S R (u n s ig n e d in t значения в регистр состояния, S ta tu s r e g is te r ) { WRENO; PORTB &= // В ы зы ваем // инструкцию ~ (1 << ф ункцию , которая разреш ения 4 ); // На // вывод /SS // подклю ченное // разреш аем (1 << 4 ); / / Н а // // Функция s ta tic READ v o id чтения // инструкции состояния // SPI /SS (о т к л ю ч а е м В S P I, данными по SPX МК) регистра Х001 новое регистра подаем с код записи 0000 П ередаем значение 5 состояния В устройство, подклю ченное // запрещ аем из шине // вывод 0 обмен О тправляем // данных к // // памяти устройство, ему S P IM a s te rT ra n s m it(S ta tu s re g is te r); |= подаем (з а д е й с т в у е м S P I M a s t e r T r a n s m i t (0 x 0 1 ) ; PORTB передает записи к ему м ассива шине S P I, обмен памяти данными с МК) SPI READ () { // Принимаем // начать по USART чтение число памяти p r i n t f P ( P S T R ( п\ г \ п В в е д и т е 5 1 1 ), для char с П ринимаем // потока номер которого максимум 3 // address = 0 ; // = адреса байта в памяти начинать М ассив 4, П еременная / / п о address котором у необходим о (о т чтение //выводим из массив 4-х 000 до д а н н ы х (C T R L + J инструкцию байт fro m _ u a rt_ a d d r e s s из s td in (U S A R T ) fg e t s (& fr o m u a r t a d d r e s s [0] , in t по за в е р ш е н и я )\ г\ п ")) ; fr o m u a r t a d d r e s s [4 ]; // (а д р е с , S P I) которому s td in ); для хранения начинается a to i(fr o m u a r ta d d r e s s ); // П ринимаем // всю по память, USART - число: адреса чтение // П реобразуем // fr o m _ u a rt_ a d d r e s s // в // in t количество количество байт байт, массив перем енную типа (a d d re s s ) для чтения 511) p r in t f_ P (P S T R ( "\г\п В веди те памяти, данных которы е (е с л и 231 Интерфейсы передачи данных ATm ega16 Листинг 10.3. Продолжение необходимо до 512) считать (C T R L + J из SPI з а в е р ш е н и я )\ г\ п ")) ; char fro m _ u a rt_ k o lic h e s tv o _ b a it[4 ]; // П ринимаем в // количество массив байт, м икросхемы // Выводим // М ассив необходимо считать 4х по из памяти 4, in t // П еременная для // количества байт, // необходимо считать // памяти // П реобразуем // типа in t = 0 ; массив // Если // когда она // равен 1, // память do { } // память = занята освободится. память готова к процессом Если занята из переменной хранимое в ~ (1 & (1 « памяти циклу байты , address, переменной << // О тправляем // данных // код // i f 5 1 1 ). (a d d re s s e ls e { 4 ); из fo r по SPI 1011 > цикле принимаем i= 0; i < состояния Если 0, то п а м я т и :\ г \ п ")) ; со На вывод /SS (з а д е й с т в у е м // подклю ченное // разреш аем инструкции второй { ож идаем, значения, храним ого считы ваемы х байт, k o lic h e s tv o _ b a it половины из 255) код то записи количество памяти половины подаем к ему 0000 байты из 0 В устройство, шине S P I, обмен ООН (а д р е са памяти данными для с 0 с МК) чтения по 255) (а д р е с а S P I_ M a s te r T r a n s m it( 0 x 0 В ); S P I_ M a s te rT ra n s m it(0 x 0 3 ); (in t перем енную регистра записи. начиная общ ее // первой W IP ячейки S P I_ M a s te rT ra n s m it(a d d re s s ); / / В в 0 )); // 0000 из SPI записи, разряд процессом следую щ ему (R D S R O Считы ваем &= которы е a to i(fro m _ u a rt_ k o lic h e s tv o _ b a it); EEPROM то w h ile P0RTB хранения fro m _ u a rt_ k o lic h e s tv o _ b a it p r i n t f _ P (P S T R ( "\ г\ п З а п р ош ен н ы е / / в SPI s td in ); (k o lic h e s tv o _ b a it) k o lic h e s tv o b a it // байт USART fg e ts (fro m _ u a rt_ k o lic h e s tv o _ b a it, k o lic h e s tv o _ b a it 001 инструкцию из fro m _ u a rt_ k o lic h e s tv o _ b a it которы е (о т для с 256 или по } } // О тправляем // которого памяти k o lic h e s tv o b a it; и адрес, начать выводим их с считы вание через USART i+ + ) { p u tc h a r(S P I_ M a s te rR e s e iv e ( ) ) ; } // Считать байт данных 232 Глава 10 Листинг 10.3. Продолжение PORTB |= (1 « 4 ); / / Н а // вывод /SS (о т к л ю ч а е м подаем 5 В устройство, // подклю ченное // запрещ аем к ему шине S P I, обмен данными с МК) } // Функция s ta tic W R IT E v o id записи по SPI в память Е Е PR O M W R IT E () { // П ринимаем по USART данные p r in t f_ P (P S T R ( "\г\пВ ведите одной (C T R L + J fro m _ u a rt_ d a ta [1 7 ]; // П ринимаем // записи в байты по П ринимаем необходимо по USART начать 16 -й // строки // 15 П ринимаем // Ф ункция в (а д р е с address = // П реобразуем // в перем енную address = 0; массив Функция g ets м ассив под конца все для принимает автоматически // ' \ 0 1 следую щ ий // записанного. // не // перевода в памяти, 4, байта с которого памяти) (о т 0 до // М ассив // сим волов для // и заверш аю щ его // в ячейке по начать 5 1 1 ), с данных, символов в хранения 3 -х [0]- [2 ] сим вола \0 ячейка [3 ] интерф ейсу USART п р о гр а м м и р о в а н и е ). -1 , поэтому 4. s t d in ); П еременная для с начинается которого типа char хранения адреса запись памяти, данных (fro m _ u a r t_ a d d r e s s ) (a d d re s s ) u art функция символ з а в е р ш е н и я )\ г\ п ") ) ; количество in t того, массив програм м ирование которого перем енную символом после строки. fro m _u a rt_a d d res s с элемент Кроме микросхему адрес и заверш ает записы вает (а д р е с в байты fro m _ u a rt_ d a ta // a to i(fc fro m байт заполнены fro m _u a rt_d a ta // типа 16 место символа будут // для fg e ts (fr o m u a r ta d d r e s s , lo n g хранения для (е с л и SPI элем ентов) начинать памяти, принимает элем ент в число м ассив для П редусм отрено // запись (C T R L + J число за в е р ш е н и я )\ г\ п ") ) ; // f r o m _ u a r t _ a d d r e s s [4 ] ; // (р а зм е р для П еременная в данных памяти которого // байт програм м ирования данны х. p r in t f_ P (P S T R ( "\г\пВ ведите char 16 для // g e ts (& fro m _ u a rt_ d a ta [0 ]);/ / // записи до // USART м икросхему // 1 страницы ) памяти, char для от a d d r e s s [0] ) ; 233 Интерфейсы передачи данных ATm ega16 Листинг 10.3. Продолжение // Запись в // байтов fro m _ u a rt_ d a ta . микросхему // триггер разреш ения WREN( ) ; PORTB &= памяти, // Функция, разреш ения << которая О тправляем // ООО // 1010, i f (a d d re ss 0010, 4 ); по // SPI если если код запись запись > адреса address необходимо установить во передает памяти инструкцию SPI записи На // // с записью записи // -(1 начиная П еред вывод /SS // подклю ченное // разреш аем инструкции в подаем (з а д е й с т в у е м первую вторую 0 В устройство, к ему шине S P I, обмен данными програм м ирования половину половину памяти с МК) памяти или ООО памяти 255) { S P I_ M a s t e r T r a n s m it (О х О А ); address = address - 256; } e ls e { S P I_ M a s te rT ra n s m it(0 x 0 2 ); S P IM a s te rT ra n s m it(a d d re s s ); // В fo r цикле (in t передаем i= 0; памяти SPI } // О тправляем адрес, // с начинать которого данные для i< s t r le n (fr o m u a r t d a t a ); запись записи i+ + ) { S P I_ M a s te rT ra n s m it(fro m _ u a rt_ d a ta [i]) ; // // один О тправляем элемент массива } PORTB |= (1 << 4 ); / / Н а // вывод /SS (о т к л ю ч а е м подаем 5 В устройство, // подклю ченное // запрещ аем к ему шине обмен S P I, данными с МК) } // Функция // содерж им ого s ta tic READ_ALL v o id чтения через READ всей памяти S P I. Вывод ее USART ALLO { // Если // когда память она // равен 1, // память do { } EEPROM то память готова w h ile занята освободится. к (R D S R O занята следую щ ему & (1 p r i n t f _ P ( P S T R ( 11\ г \ п П а м я т ь PORTB &= ~ (1 « 4 ); << разряд записи W IP процессом циклу то, ож идаем, регистра записи. Если записи 0) ) ; с о д е р ж и т : \ r \ n 11) ) ; / / Н а // процессом Если вывод /SS (з а д е й с т в у е м подаем 0 В устройство, состояния 0, то 234 Глава 10 Листинг 10.3. Продолжение // О тправляем // (н а ч а т ь по SPI чтение с код // подклю ченное // разреш аем инструкции первой S P I_ M a s te rT ra n s m it(0 ); in t // p e r e n o s s tr a n ic i В цикле fo r (in t принимаем i= 0 ; i< 5 1 2 ; = // Первая О тправляем памяти 0000 с МК) А8011 // начать страница адрес, с считывание памяти которого 0) (я ч ей к а 15; байты из памяти i+ + ) и // От // 512 p u t c h a r ( S P I M a s t e r R e s e i v e () ) ; // <= выводим адреса их 0 до по USART 511 (в с е г о байт) Считать / / и (p e r e n o s s tr a n ic i S P I, данными памяти) // { i f шине обмен чтения половины S P I_ M a s te rT ra n s m it(0 x 0 3 ); к ему байт отправить данных по USART i) { // Вывод ф орматированный по 16 байт на одну строку p r i n t f _Р ( P S T R ( " \ г \ п " ) ) ; p e r e n o s s tr a n ic i = peren os s tr a n ic i + 1 6 ; } } PORTB |= (1 << 4 ); / / Н а // вывод /SS (о т к л ю ч а е м подаем 5 В устройство, // подклю ченное // запрещ аем к ему шине обмен SPX, данными с МК) } in t m a in (v o id ) { U S A R T _IN IT (0 x 4 0 ); // П еренаправляем s td in = std ou t = Инициализация // значение // 10 стандартны е (1 ) USART. регистра Передаем UBRR: 64 - ф ункции 9600бод при МГц & m ystdou t S P IM a s te r ln it (); w h ile // потоки на пользовательский m y s td in ; // И нициализации // "M aster" // Б есконечны й интерф ейса SPI в режиме цикл { // Выводим через USART меню p r i n t f _ P ( P S T R ( " \ r \ n -----------------\ г \ п М е н ю : \ r \ n l ) И н с т р у к ц и я Установка триггера p r i n t f P ( P S T R ( "\ r\ n 2 )И нструкция разреш ения разреш ения WRDX - Сброс WREN триггера з а п и с и \ г\ п ")) ; p r i n t f P ( P S T R ( "\ r\ n 3 ) И нструкция состоян и я\ г\ п ") ) ; RDSR - Чтение - з а п и с и \ г\ п ")); регистра 235 Интерфейсы передачи данных ATmega16 Листинг 10.3. Продолжение p r i n t f _ P ( P S T R ( 11\ r \ n 4 ) И н с т р у к ц и я WRSR - Запись регистра READ - Чтение данных с о с т о я н и я \ г \ п ")) ; p r i n t f P ( P S T R ( " \ r \ n 5 (И н с т р у к ц и я массива p r in t f_ P (P S T R ( "\ r\ n 6 ) И нструкция массив с п ам яти \ г\ п ") ) ; W R IT E - Запись данных в п ам яти \г\п ") ) ; p r in tf_ P (P S T R ( "\ r\ n 7 ) Чтение всей SPI памяти и вывод её с о д е р ж и м о го \ г\ п ")) ; p r in t f_ P (P S T R ( "c m d :" ) ) ; char Выводим // командной приглаш ение строки choose; choose // // = Если g e tc h a rO ; выбрали if(c h o o s e == "0 ", // П ринимаем // в то через перем енную выходим из USART сим вол choose бесконечного цикла ’ O ') { p r i n t f _ P ( P S T R ( " \г\пВ ы хож у. break; } // В // иную зависим ости s w itc h ф ункцию от вы бранного работы с пункта памятью по меню вы зы ваем ту или SPI (c h o o s e ) { case Ч ' : WRENO; break; case '2 ': W R D I( ) ; break; case '3 ': { p r i n t f P ( P S T R ( "Ч тен и е регистра % x (h e x ) \ r \ n " ) , состояния: R D S R O ); }; break; case 14 1 : { // П ринимаем // регистра no USART число p r in t f_ P (P S T R ( "\г\пВ ведите регистра // П еременная // регистра u n s ig n e d для новое in t нового число // ф ормате перем енную в в ш естнадцатеричном s ta t_ re g s c a n fP (P S T R ("% х "), & s ta t_ re g ); // записи Вызы ваем функцию break; READ О ; case ' 6 ': W R IT E ( ) ; case '7 ': READ break; break; A L L O ; значения s ta t_ re g ; П ринимаем '5 ': значение состоян и я(h e x )\ r\ n ")); хранения // case значение состояния W R S R (s ta t_ re g ); }; (н о в о е состояния) break; регистра состояния 236 Глава 10 Листинг 10.3. Окончание d e fa u lt: p r in t fP (P S T R ("? ? ?\ r\ n ") ) ; } } p r in tf_ P (P S T R { "\г\п зк ш лк") ) ; } Экран программы HyperTerminal для чтения всей памяти EE PR O M показан на рис. 10.16. меню: 1 )инструкция wren - Установка триггера разрешения записи 2 )инструкция wrdi - сброс триггера разрешения записи 3)инструкция rdsr - чтение регистра состояния 4 )инструкция wrsr - Запись регистра состояния 5)инструки,ия read - чтение данных с массива памяти 6)инструки,ия write - запись данных в массив памяти 7)чтение всей SPI памяти и вывод её содержимого cmd: 7 память содержит: 1234 567890abcdef 2222222222222222 яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя tyui opasdfghqwer яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя яяяяяяяяяяяяяяяя SBqRJqqqqqqqq меню: Рис. 10.16. Чтение всей памяти ЕЕР130М в программе Н у р е г Т е гт т а ! И н т е р ф е й с ЭР1. Р а б о т а с д а т ч и к о м тем пературы ТС77 Все выводы портов А и С настроены как выходы. К ним подключе­ ны светодиоды для отображения полученного значения температуры от термодатчика ТС77 (рис. 10.17). Интерфейсы передачи данных А Т т е д а 1 6 Рис. 10.17. Схема для исследования работы датчика тепературы 237 238 Глава 10 Для использования выводов РС 2 -РС 5 порта С для ввода-вывода не­ обходимо отключить интерфейс Л А С (рис. 10.18). STK500inISPmode withATmegal6 Fuse 0CDEN JTAGEN SPIEN ЕЕSAVE BOOTSZ B00TRST CKOPT BODLEVEL BODEN SUTJXSEL HIGH LOW I Value □ I 4 ОТКЛЮЧИЛИ m ; Boot Flash size=1024 words start address=$1 COO ▼ □ □ Brown out detection at VCC=2.7 V ▼ □ Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK + 64 ms ж 0xD9 OxCF W Auto read W Smart warnings W Verify after programming Program | Verify Read Setting mode and device parameters.. OK! Entering programming mode. OK! Reading fuses address 0 to 1 . OxCF, 0xD9.. OK! Leaving programming mode.. OK! Рис. 10.18. Должен быть сброшен флажок JTAGEN В программе инициализация интерфейса SPI реализована в функ­ ции S P I _ M a s t e r I n i t ( ) . Поскольку микроконтроллер используется как ведущее устройство, вывод S C K (тактовый сигнал) назначаем как выход (тактирующих импульсов для ведомого устройства). Вывод SS ведомого устройства определяем как выход. Он будет подключен к выводу CS датчика температуры Т77. На вывод SS подаем +5 В. Согласно диаграмме, датчик передает значение температуры по низкому уровню сигнала на выводе CS, т.е. изначально ТС77 для обме­ на данными не выбран. Вывод M ISO , по которому будем принимать значения температуры, определяем как вход. Вывод M O SI, который служит для передачи дан­ ных ведомым устройством (микроконтроллером) ведущему, мы исполь­ зовать не будем. 239 Интерфейсы передачи данных ATmega16 С помощью регистров SPCR и SPSR задаем тактовую частоту на выводе SCK: fc k / 16 = 10 М Г ц / 16 = 625 КГц. Максимальная частота обмена данными для датчика температуры, согласно спецификации, со­ ставляет 7 М Гц. Включаем м одуль SPI, задаем режим “ Master” . Полярность тактово­ го сигнала (разряд C P O L ) SCK: высокий уровень, когда есть данные, низкий, когда данных нет. Фаза тактового сигнала (разряд С Р Н А ): обра­ ботка данных по переднему фронту импульсов S C K П осле инициализации SPI в бесконечном цикле принимаем содер­ жимое регистра T E M P ведомого устройства (Т С 7 7 ) и отображаем его на светодиодах. Для того чтоб начать прием данных от ведомого устройства, его не­ обходимо вначале выбрать. Для этого подаем 0 В на вывод термодатчи­ ка SS. Принимаем байт с помощью функции S P I _ M a s t e r R e s e i v e ( ) . Для приема байта данных необходимо запустить тактовые им пуль­ сы SCK. Для этого достаточно передать датчику температуры лю бы е данные. М ы передаем байт 1 1 1 1 1 1 1 1 , записав его в восьмиразрядный сдвиговый регистр SPDR. Одновременно с передачей происходит прием в восьмиразрядный буфер. Окончанием обмена данными будет наличие единицы в разряде SPIF регистра SPSR. П осле этого можно считать со­ держимое буфера, обратившись к сдвиговому регистру SPDR. Возвра­ щаем принятый байт и выводим его в порту А для отображения на све­ тодиодах. Регистр TE M P, содержащий в ТС77 значение температуры, состоит из двух байт, поэтому в программе необходимо еще раз вызвать функ­ цию S P I _ M a s t e r R e s e i v e ( ) . Принятое значение выводится в порт С. Затем отключаем прием данных от ТС77 и ожидаем 400 мс окончания следую щ его преобразования. Преобразование значения температуры из двоичной в десятичную форму Значение температуры поступает от датчика в виде двух байт (раз­ ряды 0-15), из которых используются только 12 (3-15). Старшему байту (разряды 7-15) соответствуют целая часть значения и знак, а младшему (разряды 3 -6 ) — дробная часть. Единице в том или ином разряде (кроме 15) соответствует определенный весовой коэффициент (рис. 10.19). Бит Значение 15 14 13 12 11 10 9 8 7 6 5 4 3 Знак 128 64 32 16 8 4 2 1 0,5 0,25 0,125 0,0625 Рис. 10.19. Формат значения температуры, выдаваемого датчиком ТС77 240 Глава 10 Для того чтобы представить значение положительной температуры в десятичной системе, необходимо сложить все весовые коэффициенты для тех разрядов, в которых указана единица. Например: 0010 1010 1,001 0 = (+ ) 64 + 16 + 4 + 1 +0,125 = 85,125 (°С ); 0011 1110 1,000 0 = (+ ) 64 + 3 2 + 16 + 8 + 4 + 1 = 125 (°С ). В микроконтроллере для перевода положительного значения темпе­ ратуры в градусы Цельсия необходимо умножить его на 0,0625 или раз­ делить на 16. Умножается на 0,0625 потому, что единица полученного значения — это 0,0625 градусов. Например: 000000111000 = 56, т.е. 56 раз по 0,0625 =3,5 (°С ). Отрицательная температура (1 в разряде 15) переводится из двоич­ ной системы счисления в десятичную несколько иначе. Значение инвер­ тируется (т.е. все нули заменяются единицами, и наоборот) и к нему прибавляется 1 в младшем разряде. Таким образом получается так на­ зываемый дополнительный код, который затем преобразуется в значе­ ние температуры, как бы ло описано выше. Например, получено значение 1111 1111 1,111 1. Инвертируем его в 1000 0000 0,0000 и прибавляем 1: 1000 0000 0,0001 = -0,0625 (°С ). Еще два примера... Получено значение 1111 0011 1,000 0. П осле инвертирования: 1000 1100 0,1111. П осле добавления единицы в младший разряд: 1000 1100 1,0000, что соответствует (-) 16 + 8 + 1 = -25 (°С ). П олучено значение 111110000,1011. П осле инвертирования: 1000 0111 1,0100. Дополнительный код: 100001111,0101, что соответствует (-) 8 + 4 + 2 + 1 +0,25 + 0,0625= 15,3125(°С). Д ля перевода отрицательного значения в микроконтроллере необ­ ходимо умножить его на -1 для получения дополнительного кода, а за­ тем умножить на 0,0625. Например, получили значение 111100001011. Умножаем его на -1, чтобы получить 000011110101 = 245. Теперь 245 • 0,0625 = 15,3125 (°С ). Сигнал на линии данных датчика для значения 28 градусов Цельсия (двоичное 00001110 00000111) показан на рис. 10.20. Верхний график — сигнал на входе /CS, средний — на входе SC K (тактовые импульсы), нижний — •на линии M IS O (значение температуры). 241 Интерфейсы передачи данных ATm ega16 Р и с . 10.20. С и г н а л ы на в ы в о д а х д а т ч и к а т е м п е р а т у р ы Т С 7 7 Программа Программа, реализующая прием данных от датчика температуры по интерфейсу SPI представлена в листинге 10.4. Исходные файлы этого примера для W i n A V R , A V R S t u d i o и P r o t e u s находятся на прилагаемом к книге компакт-диске в папке ATm egal6\lO . 04 - SPI - Датчик температуры. Листинг 10.4. Программа # in c lu d e < a v r/ io .h > # in c lu d e // s p i . c Заголовочны й файл // ввода-вы вод а для // используем ого < u til/ d e la y .h > Функция v o id 65 // инициализации в // Для // задерж ки подклю чает проекте доступа нтерф ейса определения устройства, к функциям циклов SPI S P I M a s t e r l n i t () { // Выводы // РВ4 DDRB PORTB - |= |= /SS, /SS, (1 (1 « SCK, PB7 4) << 4 ); | MOSI SCK, (1 « (ли н и я РВ5 - 7) | // На передачи данных) - выходы MOSI (1 << 5 ); выводе /SS устанавливаем 5 В 242 Глава 10 Листинг 10.4. Продолжение // // DDRB &= ~ (1 6);/ / « Вывод // // Вклю чаем // на SPSR &= SPCR = SPCR SPCR SPCR S P I, выводе ~ (1 (1 &= « « -(1 &= "M a ster", fc k / 1 6 . | (1 << 2 ); « 5 ); подклю ченное - от | (1 вход частота « (п о внеш них Прерывания 4) 3) ; « ~ (1 байт 0 ); 6) « ~ (1 &= = (Р В 6 ) M IS O принимаем режим SCK (у с т р о й с т в о , к S P I, отклю чено) тактового от SPI // S P I2 X = 0 SPE=1, // SPR0=1 CPOL=0 // полярности - импульсы // СРНА=0 // переднему - // DORD=C) // со - сигнала ф ронту MSTR=1, полож ительной обработка данных по сигнала передача старш его линии запрещ ены 0 );/ / // этой устройств) данных, начиная разряда } // Функция u n s ig n e d приема char байта по интерф ейсу SPI S P I_ M a s t e r R e s e iv e () { SPDR = OxFF; w h ile (-S P S R retu rn & (1 SPDR; // Для // начать // передаем << того 7 ) ) { } ; чтобы начать передавать по интерф ейсу // О жидаем // отправится // разряде //Возвращ аем прием, им пульсы до тех поэтому лю бой пор, байт пока (п о я в и т с я S P IF принятый SPI необходим о SCK, регистра 1 байт в SPSR байт } in t m a in (v o id ) { // Порты DDRA = PORTA DDRC PORTC А и используем OxFF; = = 0x00; OxFF; = 0x00; // для Выводы // На // Выводы / / Н а подклю чения порта выводы А порта порта выводы С S P I_ M a s te rIn it(); // Инициализации // Задерж ка w h ile { (1) (п о с л е А // специф икации // Бесконечны й подаем С подаем первым В 0 В ТС77 БР1 приемом п и т а н и я ), цикл 0 выходы интерф ейса перед подачи светодиодов выходы - порта _ d e l a y _ m s (3 0 0 ) ; // - 3 00 согласно мс 243 Интерфейсы передачи данных ATm ega16 Листинг 10.4. Окончание PORTB // &= -(1 П ринимаем PORTA PORTC PORTB d e la y = << и 4 ); выводим // на На S P I_ M a s te rR e s e iv e ( ) ; |= (1 << m s(4 0 0 ); 4 ); /SS светодиоды S P I_ M a s te rR e s e iv e ( ) ; = вывод подаем принятые Старш ие // TEMP // М ладш ие // TEM P(7 -0 ) На // Задерж ка вывод /SS В два байта 8 разрядов // // 0 регистра (1 5 -8 ) 8 разрядов подаем перед +5 регистра В следую щ им приемом } } И н т е р ф е й с S P I. Р а б о т а с F la s h - п э м я т ь ю К интерфейсу SPI микроконтроллера подключена микросхема Flash памяти AT25F2048 объемом 256 Кбайт (262 144 байт). Пространство адресов поделено на четыре сектора по 64 Кбайт (64 х 1 024 = 65 536 байт) каждый — 256 страниц на сектор (65 536 байт / 256 = 256 байт од­ на страница). Микросхема памяти может обмениваться данными в од­ ном из двух режимов: SPI M O D E 0 или SPI M O D E 3. Максимальная частота тактового сигнала S C K — 20 М Гц. Д ля наглядности операций с памятью (чтение, запись, очистка) мы будем использовать интерфейс U S A R T микроконтроллера, подключен­ ный к C O M -порту компьютера (рис. 10.21). Микроконтроллер через US A R T передает меню работы с Flash-памятью (рис. 10.22). В зависи­ мости от того, какой пункт выбран (на компьютере), выполняется то или иное действие с памятью через интерфейс SPI. В начале программы инициализируются два интерфейса микрокон­ троллера: U S A R T (функция U S A R T _ I N I T ( ) ) и SPI (функция S P I _ M a s t e r I n i t ( ) ). В функции инициализации интерфейса SPI назначаем выводы: • /SS — выбор подчиненной микросхемы; • S C K — тактовая частота SPI-интерфейса; • M O S I — настраиваем как выход (для подчиненного устройства — вход); • M IS O — настраиваем как вход (для подчиненного устройства — выход). Поскольку микроконтроллер управляет подчиненным устройством с помощью регистра SPCR, задаем режим “ Master” . Используя регистр SPCR и SPSR, задаем тактовую частоту на выводе S C K /ск / 4 = 1 0 М Г ц / 4 = 2,5 М Гц. 24 4 Глава 10 Н|П|й|1 ¿O O ooiJ t ® еcрtгt "’- < "■ n X ’-Sio ?t5500f||p s s g a s s lE O ’ - г Ч П * VI Ф г- Ifc за l! U н;и; я| г?.г1г№1?Ы о о о о о о о о С 2 ■& £ На, — _ сой* я ш з ш del 9|п1н|п1к|ф|п| Ф Н " W AV Hgi 8 ДДДД IIP У7Д7 Рис. 10.21. Схема соединений для работы с Flash-памятью по интерфейсу SPI Интерфейсы передачи данных ATm ega16 245 V irtu a l T e rm in a l В регистр состояния было записано -значение=80 (hex) Меню: * 1)Инструкцйя RDID - вывод изготовителя и идентификационного номера памяти подключенной по SPI 2)Инструкция RDSR - вывод содержимого регистра состояния памяти 3)Инструкция V/RSR - программирование регистра состояния памяти Ц)Инструкция WREN - установка триггера разрешения записи 5)Инструкция CHIP ERASE - очистка всего чипа 6)Инструкция SECTOR ERASE - очистка определенного сектора(одного из Мрех) 7)Инструкция READ - чтение данных 8)Инструкция PROGRAM - программирование памяти 9)Функция чтения одного байта данных end:| Рис. 10.22. Меню команд для работы с Flash-памятью В бесконечном цикле с помощью функции p r i n t f _ P выводим че­ рез U S A R T микроконтроллера в C O M -порт компьютера меню для рабо­ ты с Flash-памятью. Функция p r i n t f _ P выводит данные, которые хра­ нятся в памяти программ, чтобы не занимать О ЗУ микроконтроллера. Данные объявлены как PS TR ( ) . Это тип, объявленный в файле < a v r / p g m s p a c e . h > как ( ( c o n s t PROGMEM c h a r * ) ( s ) ) , т.е. данные, которые находятся в памяти программ микроконтроллера. П осле вывода меню функция g e t c h a r ( ) ожидает передачи сим­ вола от компьютера, т.е. выбора пункта меню. Принятый символ запи­ сывается в переменную c h o o s e . В зависимости от ее содержимого, оператор s w i t c h выполняет ту или иную последовательность дейст­ вий. Если принят символ “ 1” , то вызывается функция R D ID ( ) , которая передает по интерфейсу SPI Flash-памяти) инструкцию 0 0 01 X I 01. П осле передачи инструкции, которая занимает восемь циклов (тактовых сигналов SC K ), мы принимаем от микросхемы памяти ответ (код изго­ товителя и идентификационный код) и передаем его через U S A R T мик­ роконтроллера в C O M -порт компьютера. Описание микросхемы AT25F2048 Схема питания микросхемы Flash-памяти AT25F2048 представлена на рис. 10.23. 246 Глава 10 OUT Рис. 10.23. Схема питания микросхемы АТ25Р2048 Инструкции управления РкэИ-памятью перечислена в табл. 10.2. Таблица 10.2. Инструкции управления Р1азИ-памятью Инструкция Код Операция W R EN 0000X110 WRDI 0000X100 RDSR 0000X101 WRSR 0000X001 READ 0000X011 PROGRAM 0000X010 Установка триггера разрешения записи Сброс триггера разрешения записи Чтение регистра состояния Запись регистра состояния Чтение данных из массива памяти Запись данных в массив памяти Стереть один сектор в массиве памяти Стереть все сектора в массиве памяти Считать код изготовителя и идентифика­ ционный номер продукта SECTOR C H IP ERASE ERASE R D ID 0101X010 0110X010 0001X101 *х — 0 или 1 Инструкция ИБ1В — “Получение кода изготовителя и идентифи­ кационного номера устройства” Последовательность выполнения инструкции ИБЮ иллюстрирует рис. 10.24. 1. На вывод /СБ памяти подать 0 В. Передать инструкцию 0001 Х101. Принять байт данных (код изготовителя). Принять байт данных (номер устройства). На вывод /С8 памяти подать +5 В. 247 Интерфейсы передачи данных ATmega16 ÜS О s» 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 J lT L T lJ T J ir iJ T J R J T J ^ si w . . o / m y / r t х х х х х х х х х х х X X х HIGH IMPEDANCE SO DATA OUT Ч ч J ”X E K E >(E <iX iX iX ïX ô>- MANUFACTURER CODE (ATMEL) DEVICE CODE Рис. 10.24. П оследовательность вы полнения инструкции r d i d Инструкция — “Чтение регистра состояния памяти” r d sr Последовательность выполнения инструкции RDSR иллюстрирует рис. 10.25. С5 Л___________________________________ 0 so 2 3 А 5 6 8 7 9 10 11 12 13 14 15 4 iJ iJ iJ iJ T J T n j a j T r u i^ ^ sck Sl 1 Г Х \ H INSTRUCTION HIGH IMPEDANCE H V X H DATA OUT МЭВ Рис. 10.25. П оследовательность вы полнения инструкции 1. ебэй На вывод /С8 памяти подать 0 В. 2. Передать инструкцию 0 0 0 0 Х 1 01 . 3. Принять байт данных (регистр состояния). 4. На вывод /СБ памяти подать +5 В. Регистр состояния РквИ-памяти АТ25Р2048 показан на рис. 10.26. 248 Глава 10 Бит 7 Бит 6 Бит 5 WPEN — — Бит 4 — Бит 3 Бит 2 Бит 1 Бит 0 ВР1 ВР0 WEN /RDY Рис. 10.26. Регистр состояния Flash-пэмяти AT25F2048 Назначение разрядов регистра состояния: • /R D Y: 0 — устройство готово; 1 -— происходит цикл записи; • W E N : 0 — включено разрешение записи; 1 — разрешение записи отключено; • ВР0:ВР1 — определяют, какие сектора памяти будут защищены от записи; • W P E N — разрешает/запрещает запись независимо от состояния вы­ вода /WP. Аппаратная зашита от записи включена, когда вывод /WP находится в состоянии лог. 0 и W P E N = 1. Аппаратная зашита от записи отключена, когда вывод /WP находится в состоянии лог. 1 или W P E N = 0. Функция вывода /WP блокирована, когда W P E N = 0, и активна, когда W P E N = 1. Инструкция памяти” w rsr — “Программирование регистра состояния Последовательность выполнения инструкции WRSR иллюстрирует рис. 10.27. Ü5 Г I 0 1 2 3 4 5 6 7 8 9 Ч lЛ J г ílЛ J l) гlЛ J m 10 Х Д INSTRUCTION / 12 13 14 15 л J г r ш J lл . . SI 11 DATA IN j C A 6 S 4 /l) < l\ l HIGH IMPEDANCE SO — ---- -----------------------------------------------------------------------Рис. 10.27. Последовательность выполнения инструкции w r s r 1. На вы вод/CS памяти подать 0 В. 2. Передать инструкцию 0 000 Х001. 3. Передать байт данных (регистр состояния). 4. На вывод /CS памяти подать +5 В. o J 249 Интерфейсы передачи данных ATmega16 Инструкция program — “Запись данных в массив памяти” Последовательность выполнения инструкции WRSR иллюстрирует рис. 10.28. 1st BYTE DATA-IN 3-BYTE ADDRESS SI SQ У Щ INSTRUCTION 256tti BYTE DATA-IN *. / Д HIGH IMPEDANCE__________________________________________________________________________________ Рис. 10.28. Последовательность вы полнения инструкции p r o g r a m Перед программированием памяти необходимо выполнить инст­ рукцию WREN (разрешить запись). П осле программирования разрешение записи автоматически сбросится. 1. На вывод /CS памяти подать 0 В. 2. Передать инструкцию 0000 Х 010. 3. Принять три байта, указывающие с какого адреса начинать запись. 4. Передать 256 байт данных. 5. На вывод /CS памяти подать +5 В. Одна инструкция записи не может записать больш е 256 байт за раз. Если размер записываемых данных меньше 256 байт, то все остальные данные останутся неизмененными. Если в процессе записи достигнут конец страницы (256 байт), то программирование продолжится с перво­ го байта текущей страницы. Один и тот же байт не может быть перезаписан без стирания всего сектора. В микросхеме АТ25Р2048 всего четыре сектора: • 1 — адреса 000000..ООРРРР (от 0 до 65 535 байт); • 2 — адреса 010000..О Н Р РР (от 65 536 до 131 071 байт); • 3 — адреса 020000.,02РРРР (от 131 072 до 196 607 байт); • 4 — адреса 030000..ОЗРРРР (от 196 608 до 262 143 байт). 250 Глава 10 Инструкция памяти” c h ip erase — “Очистка всех секторов в массиве Последовательность выполнения инструкции C H IP стрирует рис. 10.29. E R A S E и ллю ­ г 0 1 2 3 4 5 6 7 s'* __JlTlJTJTJirin_ri Sl ~ У У !,°Л ~ А о х о /Д о SO HIGH IMPEDANCE Рис. 10.29. П оследовательность выполнения инструкции CHIP erase Перед очисткой микросхемы памяти необходимо выполнить инст­ рукцию WREN (разрешить запись). П осле очистки разрешение записи автоматически сбросится. 1. На вывод /CS памяти подать 0 В. 2. Передать инструкцию 0 1 10 Х010. 3. На вывод /CS памяти подать +5 В. Инструкция ве памяти” sector erase — “Очистка одного сектора в масси­ Последовательность выполнения инструкции S E C T O R E R A S E ил­ люстрирует рис. 10.30. Перед очисткой сектора микросхемы памяти необходимо выпол­ нить инструкцию WREN (разрешить запись). П осле очистки разрешение записи автоматически сбросится. 1. На вывод /CS памяти подать 0 В. 2. Передать инструкцию 0 1 0 1 Х010. 3. Передать три байта, указывающие адрес сектора. 4. На вывод /CS памяти подать +5 В. 251 Интерфейсы передачи данных ATm ega16 Ü5 \ О 1 2 3 4 5 6 7 8 _ _ _ п г и sck 9 10 11 28 29 30 31 нн INSTRUCTION si K 4 0/ V \ ° / i \ x 3-BYTE ADDRESS о/ HIGH IMPEDANCE so Рис. 10.30. П оследовательность вы полнения инструкции s e c t o r e r a s e Инструкция read — “Чтение данных из массива памяти” Последовательность выполнения инструкции READ иллюстрирует рис. 10.31. У es О «* 1 2 3 4 5 6 7 8 9 10 11 28 29 30 31 32 33 34 35 36 37 38 39 Ч т п п п п п п п п и п щ п „д п гп п г а п л л л л л л л . 3-BYTE ADORES _ ïE H 2 ïïi_ V so ’|Э@^-^бХЮ®(НЗХХХХХХ2 HIGH IMPEDANCE Рис. 10.31. П оследовательность вы полнения инструкции r e a d 1. На вывод /CS памяти подать 0 В. 2. Передать инструкцию 0 0 0 0 Х011. 3. Передать три байта, указывающие адрес, с которого необходимо начать чтение данных. 4. Прочитать байт данных. Микросхема автоматически перейдет к сле­ дующему адресу памяти. Таким образом, одной инструкцией можно прочитать всю память. 252 5. Глава 10 На вывод /CS памяти подать +5 В. Инструкция w ren — “Установка триггера разрешения записи” Последовательность выполнения инструкции READ иллюстрирует рис. 10.32. cs sck si ___________________________ T l i l J T _ n j T J l _ r L r L 7Т7Т ^/ / / / / ! / / / 7Х w ren°p~ code ~ХУ/ / / / / hi-г so Рис. 10.32. Последовательность выполнения инструкции шгвы Каждая операция записи памяти должна начинаться с инструкции разрешения записи. 1. Установить на выводе /СБ 0 В. 2. Передать микросхеме памяти инструкцию 00 00 Х110. 3. Установить на выводе 1СБ +5 В. Программа Программа представлена в листинге 10.5. * Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T m e g a l 6 \ l O . 05 - S P I - F l a s h . Листинг 10.5. Программа 6 7 _ S P I _ A T 2 5 F 2 0 4 8 . с # in c lu d e # in c lu d e # in c lu d e < a v r /io .h > < s td lib .h > < s td io .h > // Заголовочны й файл // в вода-вы вод а для // используем ого // Общие // интересует в утилиты Стандартны е // USART) // ф ункции fg e ts , < u t il/d e la y .h > // // задерж ки # in c lu d e < a v r /p g m s p a c e .h > / / Утилиты // памятью / / Утилиты # in c lu d e « s tr in g .h > // Для (в данном примере ввода-вы вод а примере pu tch ar, доступа к нас g ets, работы для работы примере с со нас для интересую т функциям для данном нас a to i) средства данном # in c lu d e определения проекте (в функция // (в подклю чает устройства, s c a n f_ P ) циклов F la s h строками интересует 253 Интерфейсы передачи данных ATmega16 Листинг 10.5. Продолжение // // Функция v o id инициализации ф ункция нтерф ейса s trle n ) SPI S P I _ M a s t e r I n i t () { // Выводы // РВ4 DDRB - |= PORTB /SS, /S S , (1 |= « (1 SCK, РВ7 4) << MOSI - (л и н и я SCK, | (1 РВ5 « 4 ); 7) | // На // // DDRB &= -(1 6);/ / << Вывод // // Вклю чаем // на = &= -(1 « 0 ); SPCR &= -(1 « 1) SPCR = (1 6) « // М икросхема // Устанавливаем SPCR SPCR &= - (1 &= ~ (1 &= - (1 Функция u n s ig n e d (1 << << /SS устанавливаем подклю ченное 5 к В S P I, отклю чено) (Р В 6 ) байт - от вход 4 ); этой SPI сигнала запрещ ены S P I2 X = 0 // SPR1=0, // SPE=1, реж им линии устройств) тактового от 0 ); (п о внеш них частота Прерывания поддерж ивает 2) ; << выходы 5 ); (у с т р о й с т в о , M IS O « - Mode SPR0=0 MSTR=1 0. его 3) ; 5) ; приема char -(1 памяти << « выводе // & I (1 "M a ster", fc k / 4 . данных) MOSI принимаем режим SCK SPSR SPCR // S P I, выводе передачи - байта по // СРО Ь=0 // полярности - импульсы // СРН А=0 // переднему // ИОНО=0 // со - обработка - ф ронту данных по сигнала передача старш его интерф ейсу полож ительной данных, начиная разряда SPI S P I M a s t e r R e s e i v e () { SPDR = OxFF; w h ile (~ S P S R retu rn & (1 SPDR; // Для // начать // передаем << того 7 ) ) { } ; чтобы начать передавать по интерф ейсу // Ожидаем // отправится // разряде / /Возвращ аем прием, им пульсы до тех поэтому лю бой пор, байт пока (п о я в и т ся S P IF принятый SPI необходимо SCK, регистра 1 байт в SPSR байт } // Функция u n s ig n e d передачи char байта по интерф ейсу S P I_ M a s te rT ra n s m it(c h a r SPI cD ata) { SPDR = cD ata; // П ередаем байт в сдвиговы й регистр SPDR 254 Глава 10 Листинг 10.5. Продолжение w h ile (-S P S R & (1 << 7 )) { } ; // Ожидаем // retu rn SPDR; отправки (п о я в и т ся 1 // регистра // Возвращ аем в байта разряде S P IF SPSR) принятый байт } // Функция v o id инициализации USART U S A R T _ IN IT (u n s ig n e d in t UBRR baud) { // Устанавливаем // в // UBRRL. // сдвигаем два UBRRH // = Для // к // разрядов, // отброш ены = Для // в // требуемы е // Режим // контроль // битов: // UCSZ0=1, по UCSRB &= |= << URSEL) UPM0) (1 << Разряды режим UCSRA &= в 4) будет 8 младш их записано разряда | и 1) необходим о (0 « « (0 и (1 будут & -(1 UCSRC. и UCSRB О тклю чен UPM0=0. данных: UMSEL) I Один разряды стоп- UCSZ1=1, =0 | (0 (1 « << UPM1) UCSZ1) | I U C P O L ); UCSZ2=0 3 ); « 1 UCPOL=0 передатчик МРСМ=0, записать установить UMSEL=0. бит USBS) « << этим UPM1=0 регистра (0 I с разряд (8 бит данных) USART // т .е . м ультипроцессорного « ); восьм ого регистре // приемник - (1 UBRRL В осемь 2 ); U2X=0 8 >> преобразование UCSRC разряд | I UCSZ0) « U BRR_baud, разряды UCSZ2 режиме « (1 в USBS=0. (0 << в одновременно четности: (1 В клю чаем UCSRB и разряд - (1 хранящ ееся после регистру разряды асинхронном = числу, асинхронный: разряд восьмиразрядны й ch ar) U BRRbaud; к нам явное старш ие URSEL, работы записы вается и c h a r)(U B R R _ b a u d все обращ ения разряд UCSRC / / и а Она UBRRH 8 разрядов. вы полняется (u n s ig n e d // // значение, на восьм иразрядном у UBRRL // право (u n s ig n e d передачи/приема. четы рехразрядны й начала в П оскольку / / В скорость р еги стр а: Разряды отклю чаем RXEN=1 и удвоение TXEN=1 скорости обмена 0 ); } // Функция, // вывод s ta tic in t которая будет вы зы ваться u a rtp u tc h a r(c h a r s im v o l, при обращ ении F IL E потока на ‘ stream ) { // Ожидаем освобож дения регистра данных, т .е . когда он будет 255 Интерфейсы передачи данных A Tm egal6 Листинг 10.5. Продолжение // готов // UDRE) принять сим вол для отправки lo o p _ u n til_ b it_ is _ s e t(U C S R A , UDR = s im v o l; // retu rn в разряде 5 ); П ередаем / / в 1 (у с т а н о в и т с я символ, переменной содерж ащ ийся s im v o l, в порт UART 0; }; // Ф ункция, // ввод s ta tic in t которая будет вы зы ваться u a rt_ g e tc h a r(F IL E при обращ ении потока на ‘ stream ) { // Ожидаем, // 1 в пока разряде заверш ится прием символа в UART (у с т а н о в и т с я RXC) lo o p _ u n til_ b it_ is _ s e t(U C S R A , 7 ); retu rn вернет UDR; // Ф ункция принятый сим вол } // И нициализация // Создаем поток, // данных, a // установив s ta tic F IL E ввода-вы вод а назначив u a rt_getch a r ф лаг ф ункцию - для // Ф ункция R D ID // в принимает s ta tic v o id p u tch a r для И спользуем вывода ввод-вы вод, _FD EV_SE TU P_R W m y s td o u t_ m y s td in = F D E V _S E T U P _S T R E A M (u a rt_p u tc h a r, ответ u art ввода. передает код u a rt_ge tc h a r, F la s h -п ам яти код изготовителя и _F D E V _S E T U P _R W ); инструкции ID R D ID , памяти, R D ID () { char PORTB s p i_ r e c e iv e [2 ]; &= ~ (1 << 4 ); // М ассив // хранения принятых // На /SS // из вывод двух (р а з р е ш а е м элем ентов подаем // подклю ченному нам к О тправляем по // инструкции "0 0 0 1 = S P I_ M a s te rR e s e iv e О ; // = S P I_ M a s te rR e s e iv e ( ) ; / / ID PORTB 4 ); // // // Выводим через USART На вывод Код /SS (з а п р е щ а е м подклю ченному нам изготовителя 5 В к S P I, передавать инф ормацию ) принятых and код X I 01" устройства подаем // два SPI устройству, // p r in t f_ P (P S T R ( "M a n u fa c tu rer передавать // s p i _ r e c e i v e [1 ] << S P I, информацию) s p i _ r e c e i v e [0 ] (1 О В устройству, // S P I_ M a s t e r T r a n s m it (0 x 1 5 ) ; |= для байт байта Product ID : % x % x (h e x )\ r\ n ") , s p i _ r e c e i v e [ 0] , s p i _ r e c e i v e [1 ] ) ; 256 Глава 10 Листинг 10.5. Продолжение } // Функция // в WREN устанавливает триггер разреш ения записи по подаем 0 SPI F la s h -п ам ять s ta tic v o id WREN() { &= ~ (1 PORTB SPI « 4 ); / / Н а M a s te r T ra n s m it(0 x 0 6 ); PORTB I= (1 « // 4 ); вывод /ЭЭ О тправляем по // инструкцию 0000 // разреш аю щ ую / / Н а X I I 0, нам /ЭЭ вывод В БР1 запись подаем +5 В } // Функция RDSR // RDSR. ответ s ta tic В v o id передает по получает SPI в F la s h -п ам ять значение регистра код инструкции состояния RD SR() { char PORTB s p i_ re c e iv e ; &= ~ (1 << // П еременная // регистра 4 ); // для На // вывод PORTB |= = (1 /SS (р а з р е ш а е м 4 ); подклю ченному нам / / Н а // // Выводим через // системе счисления) USART p r in t f_ P (P S T R ( "R ead подаем // В к S P I, передавать // О тправляем по // инструкцию 0000 вывод SPI Х101 // П ринимаем // регистра /SS (з а п р е щ а е м подаем содерж имое состояния 5 В устройству, // подклю ченному // нам к S P I, передавать информацию) принятый S tatu s 0 информацию) S P I_ M a s te rR e s e iv e ( ) ; « содерж им ого устройству, // S P I M a s t e r T r a n s m i t (0 x 0 5 ) ; s p i_ re c e iv e хранения состояния байт (в R e g is te r: ш естнадцатиричной % x (h e x )\ r\ n ") , s p i_ r e c e iv e ); } // Функция s ta tic v o id WRSR. Запись нового W R S R (u n s ig n e d in t значения в регистр состояния, s ta tu s _ re g is te r) { WREN О ; PORTB &= // Вызы ваем // инструкцию ~ (1 << 4 ); функцию , которая разреш ения // // На вывод передает памяти SPI записи /SS (з а д е й с т в у е м // подклю ченное // разреш аем ему подаем 0 В устройство, к шине обмен S P I, данными с МК) 257 Интерфейсы передачи данных ATmega16 Листинг 10.5. Продолжение S P I_ M a s te rT ra n s m it(0 x 0 1 ); // О тправляем по // инструкции записи // состояния S P I_ M a s te rT ra n s m it(s ta tu s _ re g is te r); // PORTB |= (1 « 4 ); // На // _ d e la y _ m s (6 0 ); // Выводим через USART p r i n t f P ( P S T R ( "\r\n B // /SS (о т к л ю ч а е м подклю ченное // запрещ аем // Ожидаем // техническом у регистр значение=% х Х001 новое регистра подаем код регистра 5 состояния В устройство, // описание 0000 П ередаем значение вывод SPI к ему 60 шине обмен мс S P I, данными с МК) (с о г л а с н о описанию микросхемы ) инструкции состояния бы ло записано (h e x )\ r\ n "), S t a t u s r e g is t e r ); } // Функция s ta tic C H IP _E R A S E v o id очистки всей F la s h -п ам яти C H IP _ E R A S E () { WRENO; PORTB &= // В ы зы ваем // инструкцию ~ (1 << функцию , 4 ); // // На |= (1 << 4 ); вывод подклю ченное // разреш аем // _ d e l a y _ m s (4 0 0 0 ) ; /SS // // передает На памяти подаем к ему шине обмен // О тправляем // инструкции // состояния вывод /SS (о т к л ю ч а е м В S P I, данными по SPI записи ОНО подаем 5 Ф ункция s ta tic SECTO R_ERASE v o id подклю ченное // запрещ аем ему // Ожидаем с // техническом у очищ ает сектор регистра В к шине обмен S P I, данными Выводим приглаш ение char choose; коммандной Какой сектор описанию МК) микросхемы ) F la s h -п ам яти строки памяти с (с о гл а с н о { // МК) Х010 SECTOR_ERASE() p r in t fP (P S T R ( "\ r\ n с код устройство, // 4 0 устройство, } // SPI записи (з а д е й с т в у е м S P I_ M a s te rT ra n s m it(0 x 6 2 ); PORTB которая разреш ения очистить?\г\п 1 )S ector 1 (0 0 0 0 0 0 до 0 0 F F F F )\ г\ п 2 )S ector 2 (0 1 0 0 0 0 до 0 1 F F F F )\ г\ п 3 )S ector 3 (0 2 0 0 0 0 до 0 2 F F F F )\ г\ п 4 )S ector 4 (0 3 0 0 0 0 до 0 3 F F F F )\ r\ n c m d :" ) ) ; 258 Глава 10 Листинг 10.5. Продолжение choose lo n g = in t s w itc h g e tc h a rO ; address = 0; // П ринимаем // в сим вол // П еременная // сектора переменную через UART choose для хранения адреса (c h o o s e ) { case 11 ' : address = 0; case ' 2 ' : address = 0x 1 0 0 0 0 ; case '3 ': address = 0x 2 0 0 0 0 ; break; case 14 1 : address = 0x30000; break; break; break; d e fa u lt:p r in tf_ P (P S T R (" ? ??\ r\ n ") ) ; } WREN( ) ; PORTB &= // Вы зы ваем // инструкцию -(1 << ф ункцию , 4 ); // На // SPI О тправляем // Вначале адрес, отсы лаем вывод Затем - средние // подклю ченное разреш аем которы й первые 8 бит Н аконец, последние 8 подаем к ему шине обмен О тправляем // инструкции // состояния необходим о два бита памяти SPI 0 В устройство, // S P I, данными по SPI записи 0101 с МК) код регистра Х010 очистить адреса >> 1 6 )); >> 8) ) ; адреса S P I_ M a s te rT ra n s m it( (c h a r )(a d d r e s s // /SS // S P I_ M a s te rT ra n s m it( (c h a r )(a d d r e s s // передает записи (з а д е й с т в у е м M a s t e r T r a n s m it (0 x 5 2 ) // которая разреш ения бит адреса S P I_ M a s te rT ra n s m it( (c h a r )(a d d r e s s )); PORTB I= (1 « 4 ); / / Н а // _ d e la y _ m s ( 1000); вывод /ББ (о т к л ю ч а е м подаем // подклю ченное // запрещ аем ему // Ожидаем с // техническом у 1 5 В устройство, к шине обмен БР1, данными с МК) (с о г л а с н о описанию микросхем ы ) } // Ф ункция s ta tic v o id READ чтения данных из м ассива памяти SPI RE AD () { // Принимаем // начать по чтение USART число памяти p r in t f_ P (P S T R ( "\г\п В веди те с которого заверш ения char (а д р е с , по котором у необходим о S P I) адрес начинать байта в в о д а )\ г\ п ") ) ; fro m _ u a rt_ a d d re s s [7 ]; // (о т чтение М ассив из 0 до данных 2 6 2 1 4 3 ), (C T R L + J //выводим 7 байт для инструкцию 259 Интерфейсы передачи данных ATmega16 Листинг 10.5. Продолжение // П ринимаем в // памяти, которого с массив fr o m _ u a rt_ a d d r e s s начинать f g e t s (& fr o m _ u a r t _ a d d r e s s [0 ] , lo n g in t address address = = 0 ; П ринимаем // всю по память, USART - 7, // памяти, // чтение данных // Адресс 1 8 -р азр я д н ы й , // быть число: до для равен количество считать 262144) (C T R L + J из в // количество массив байт, П реобразуем // типа lo n g которы е массив in t k o lic h e s tv o b a it // Если память // когда она // равен 1, // память П реобразуем // fr o m _ u a rt_ a d d r e s s // в // lo n g массив перем енную байт in t для типа (a d d re s s ) чтения (е с ли которы е микросхемы Выводим // необходимо = 0 ; 7, (о т 1 заверш ения инструкцию М ассив из считать 7 по из байт USART памяти SPI s td in ); // П еременная для // количества байт, // необходимо считать // памяти хранения которы е из SPI fro m _ u a rt_ k o lic h e s tv o _ b a it = в переменную a t o l (fro m _ u a rt_ k o lic h e s tv o _ b a it); занята освободится. память готова мож ет 262143. (k o lic h e s tv o _ b a it) EEPROM то S P I. т .е . fro m _ u a rt_ k o lic h e s tv o _ b a it k o lic h e s tv o _ b a it // памяти // байт, для // fg e ts (fro m _ u a rt_ k o lic h e s tv o _ b a it, in t из адреса начинается максимум SPI fro m _ u a rt_ k o lic h e s tv o _ b a it[7 ]; П ринимаем хранения которого количество в в о д а )\ г\ п ") ) ; lo n g с 262144) необходимо // адрес std ix i) ; П еременная p r in t f_ P (P S T R ("\г\п В веди те char USÄRT // a t o l(fr o m u a r ta d d r e s s ); // по чтение к процессом Если занята разряд записи, W IP процессом следую щ ему циклу то ож идаем, регистра записи. состояния Если 0, то записи p r i n t f _ P ( P S T R ( " \ r \ n ------С ч и т а л и ------ \ r \ n " ) ) ; // С читы ваем / / в // хранимое PORTB из переменной &= в -(1 памяти байты , address, переменной << 4 ); // О тправляем адрес, с На значения, вывод /SS храним ого считы ваемы х подклю ченное // разреш аем // подаем (з а д е й с т в у е м // // // со количество байт, k o lic h e s tv o _ b a it // S P I_ M a s te rT ra n s m it(0 x 0 3 ); начиная общ ее 0000 которого к ему О тправляем 0 В устройство, по шине обмен SPI S P I, данными код Х011 считывания начать считы вание с МК) инструкции памяти 260 Глава 10 Листинг 10.5. Продолжение // Вначале отсы лаем последние два бита S P IM a s te r T r a n s m it( (c h a r )(a d d r e s s // Затем 8 средние бит Н аконец, 8 последние 1 6 )); >> 8) ) ; адреса S P I_ M a 3t e r T r a n s m i t ( ( c h a r ) ( a d d r e s s // адреса >> бит адреса S P I_ M a s te rT ra n s m it( (c h a r) (a d d r e s s )) ; / / В fo r цикле (in t принимаем i= 0; i < байты из памяти k o lic h e s tv o _ b a it; и выводим их через USART i+ + ) { p u tc h a r(S P I_ M a s te rR e s e iv e ( ) ) ; // С читать байт данных } PORTB j= (1 << 4 ); // На // вывод /SS (о т к л ю ч а е м подаем 5 В устройство, // подклю ченное // запрещ аем к шине ему S P I, обмен данными с МК) } // Ф ункция s ta tic PROGRAM v o id записи по SPI в F la s h -п ам ять PROGRAMO { // П ринимаем по USART данные p rin tf_ P (P S T R ("\ r\ n B B e fln T e для от 1 записи до програм м ирования 256 SPI байт данных памяти, для (C T R L + J для хранения 257 з а в е р ш е н и я )\ г\ п ") ) ; char fr o m _ u a r t_ d a ta [2 5 7 ];/ / // П ринимаем // записи в байты по П еременная // данных. // 2 5 7-й // строки // 2 56 USART м икросхему в для П редусмотрено элемент для (е с л и будут место символа байт под конца заполнены все элементов) м ассив fro m _ u a rt_ d a ta для памяти g e t s (& fro m _ u a rt_ d a ta [О ]) ; // П ринимаем // необходимо по USART начать число p r in t f_ P (P S T R ( "\г\пВ ведите которого (C T R L + J char (а д р е с запись в адрес начинать для П ринимаем // число в (а д р е с g e t s ( & f г om массив байта с которого (о т 0 до 2 6 2 1 4 3 ), програм м ирование // М ассив // сим волов в с данных, хранения ячейка / / и заверш аю щ его ячейке которого u a rt_ a d d re s s [0] ) ; для // в fro m _u a rt_a d d res s памяти, с памяти) з а в е р ш е н и я )\ г\ п ")) ; fro m _ u a rt_ a d d re s s [7 ]; // памяти, микросхему по начать 6 [ 0 ] - [5 ] символа \0 [6 ] интерф ейсу USART п р о гр а м м и р о в а н и е ), 261 Интерфейсы передачи данных ATmega16 Листинг 10.5. Продолжение lo n g in t address // П реобразуем // в памяти, // запись // 18 // равен типа lo n g in t Запись в // байтов fro m _ u a rt_ d a ta . // триггер м икросхему разреш ения WREN( ) ; хранения Адресс т .е . максимум адреса начинается состоит мож ет из быть 262143. (fro m _ u a rt_ a d d re s s ) (a d d re s s ) // Функция, разреш ения ~ (1 << которая 4 ); // // Вначале адрес, отсы лаем 8 На с вывод последние /SS // подклю ченное // разреш аем // address установить SPI инструкцию подаем к шине по начинать два бита В S P I, обмен SPI програм м ирования которого 0 устройство, ему О тправляем последние бит памяти (з а д е й с т в у е м данными код памяти с МК) инструкции 0000 Х010 запись адреса >> 1 6 )); >> 8)); адреса S P I_ M a s te rT ra n s m it( (c h a r )(a d d r e s s Н аконец, адреса необходимо передает S P I_ M a s te rT ra n s m it( (c h a r )(a d d r e s s средние с записью записи // О тправляем начиная записи // // // данны х. char П еред S P I_ M a s te rT ra n s m it(0 x 0 2 ); Затем для которого разрядов, памяти, // // с a t o l (& fro m _ u a rt_ a d d re s s [0] ) ; = &= П еременная // типа // PORTB // перем енную перем енную address = 0 ; 8 бит адреса S P I_ M a s te rT ra n s m it( (c h a r )(a d d r e s s )) ; in t // d lin _ s tro k i В fo r цикле (in t = s t r le n (fr o m u a r t d a t a ); передаем i= 0; памяти SPI i< d lin _ s tro k i; данные для записи i+ + ) { S P I_ M a s te rT ra n s m it(fro m _ u a rt_ d a ta [ i ] ) ; // // один О тправляем элемент массива } PORTB |= (1 << 4 ); / / Н а // вывод /SS (о т к л ю ч а е м подаем 5 В устройство, // подклю ченное // запрещ аем к ему шине обмен S P I, данными с МК) } // Функция s ta tic v o id R E A D _B yte READ чтения одного байта данных из F la s h -п ам яти B yteO { // П ринимаем // необходим о по USART начать число чтение (а д р е с данных) памяти, с которого 262 Глава 10 Листинг 10.5. Продолжение p r in t f_ P (P S T R ("\г\пВ ведите которого (C T R L + J char адрес байта начинать для (о т 0 до 2 6 2 1 4 3 ), програм м ирование с данных, з а в е р ш е н и я )\ г\ п ")) ; fro m _ u a rt_ a d d re s s [7 ]; // П ринимаем // считать в массив байт через USART адресс fg e ts (fro m _ u a rt_ a d d re s s , 7, lo n g // П еременная // памяти, // запись // 18 // равен in t address // П реобразуем // в = 0 ; переменную переменную address памяти, с которого данных типа lo n g s t d in ); хранения которого данных. разрядов, типа in t для с Адресс т .е . максимум char адреса начинается состоит мож ет из быть 262143. (fro m _ u a rt_ a d d re s s ) (a d d re s s ) a t o l (& fr o m _ u a r t_ a d d r e s s [0] ) ; = p r i n t f ( " \ г\ п Б а й т -\ г\ п "); PORTB &= ~ (1 << 4 ); // На вывод /SS подаем // (з а д е й с т в у е м // п о д к лю ч ен н о е // р а зр еш а ем S P I_ M a s te rT ra n s m it(0 x 0 3 ); // // О тправляем // Вначале адрес, отсы лаем с О тправляем которого последние Затем средние 8 бит Наконец, последние по SPI памяти бита В S P I, данными код 0000 с МК) инструкции Х011 считы вание адреса >> 1 6 )); » 8)); адреса S P I_ M a s te rT ra n s m it( (c h a r )(a d d r e s s // шине обмен начинать два S P IM a s te r T r a n s m it( (c h a r)(a d d re s s // к ему // сч и ты в а н и я 0 устройство, 8 бит адреса S P IM a s te rT ra n s m it( (c h a r )(a d d r e s s )); // П ринимаем байт из S P I-п ам яти p u te (S P IM a s te rR e s e iv e (), PORTB |= (1 << 4 ); и выводим через USART & m y s td o u t_ m y s td in ); / / Н а // вывод /SS (о т к л ю ч а е м подаем 5 В устройство, // подклю ченное // запрещ аем ему к шине обмен S P I, данными с МК) } in t m a in (v o id ) { U S A R T IN IT (0 x 4 0 ); // И нициализация // значение // 10 МГц USART. регистра П ередаем UBRR: 64 - ф ункции ЭбООбод при 263 Интерфейсы передачи данных ATmega16 Листинг 10.5. Продолжение // П еренаправляем s td in = std o u t = стандартны е S P IM a s te r ln itО ; W R S R (0 x 8 0 ); w h ile потоки на пользовательский & m y s td o u t_ m y s td in ; (1 ) // И нициализации // "M a ster" // Задействуем // в // Бесконечны й разряд интерф ейса вывод WPEN /WP, SPI в записав регистра режиме 1 состояния цикл { // Выводим через USART меню p r i n t f _ P ( P S T R ( " \ r \ n ----------------- \ г \ п М е н ю : \ r \ n l ) И н с т р у к ц и я вывод изготовителя номера памяти RDSR состояния p r in t f_ P (P S T R ( "\ r\ n 3 ) И нструкция регистра разреш ения - - по S P l\ r\ n ")); вывод содерж им ого п ам яти \ г\ п ") ) ; WRSR состояния p r i n t f P ( P S T R ( "\ r\ n 4 )И нструкция R D ID идентиф икационного подклю ченной p r in t f_ P (P S T R ("\ r\ n 2 )И нструкция регистра и - програм м ирование п ам яти \ г\ п ") ) ; WREN - установка триггера зап и си \г\ п ") ) ; p r in t f_ P (P S T R ( "\ r\ n 5 )И нструкция C H IP ERASE - очистка в сего ч и п а\г\п ") ) ; p r in tf P ( P S T R ( 11\ r \ n 6 ) И н с т р у к ц и я определенного SECTOR ERASE с е к т о р а (о д н о го p r i n t f _ P ( P S T R ( п\ г \ п 7 ) И н с т р у к ц и я READ - из - очистка 4 р е х )\ г \ п ")); чтение дан н ы х\г\п ") ) ; p r in t f_ P (P S T R ( "\ r\ n 8) И нструкция PROGRAM - програм м ирование п ам яти \г\п ") ) ; p r i n t f P ( P S T R ( n\ r \ n 9 ) Ф у н к ц и я чтения одного байта д а н н ы х\г\п ") ) ; p r in tf char i f // Выводим // командной приглаш ение строки choose; choose // P (P S T R ( "c m d :") ) ; = Если g e tc h a rO ; вы брали (ch o o se == "0 ", // П ринимаем // в то через переменную выходим из USART сим вол choose бесконечного цикла 10 1) { p r i n t f P ( P S T R ( "\г\пВ ы хож у. break; } // В // иную зависимости s w itc h функцию от вы бранного работы с (c h o o s e ) { case Ч 1: R D ID ( ) ; пункта памятью break; по меню SPI вы зы ваем ту или 264 Глава 10 case 12 1 : RDSR( ) ; case 13 1 : { break; u n s ig n e d // in t Выводим s ta t_ re g ; // // для // значения через хранения USART регистра Форматированный s c a n f( "% х", } новое // ф ормате r e g ) ; // в в значение данных // П ринимаем ш естнадцатиричном переменную Вызы ваем // WRSR, // значение s ta t_re g функцию передав ей регистра новое состояния break; WREN; { ввод значение состояния состоян и я(h e x )\ r\ n ")); fc s t a t r e g ); // W R S R (s ta t регистра инструкцию p r i n t f P ( P S T R ( "\г\п В веди те // П еременная нового break; C H IP E R A S E ( ) ; p r i n t f P (P S T R (" \ r \ n S P I fla s h память о ч и щ е н а \ г \ п ")) ; } break; case ' 6 ': SECTORERASE( ) ; case '7 '; READ( ) ; case ' 8 '; PROGRAM O; d e fa u lt: break; break; break; p rin tf_ P (P S T R ("? ? ?\ r\ n ") ) ; } } p r i n t f P ( P S T R ( " \ r \ n B M i u r a n) ) ; } И н т е р ф е й с S P I. Р а б о т а с т е м п е р а т у р н ы м п р еобр азователем М АХ6675 Микросхема М АХ6675 представляет собой цифровой 12-разрядный температурный преобразователь для термопар К-типа (хромель-алюмель). Измеряет температуру от 0°С до +1024°С. Выводы М АХ6675: • G N D — вход питания 0 В (“ земля” ); • Т ----- алюмелевый вход термопары (также должен быть соединен с “ землей” ); • Т + — хромелевый вход термопары; • V C C — вход питания 3..5 В (для защиты от помех должен быть зашунтирован конденсатором 0,1 мкФ на “ землю” ); • S C K — вход тактовых импульсов; 265 Интерфейсы передачи данных ATmega16 • /С § — вход выбора микросхемы (напряжение питания во время преобразования данных, О В во время передачи данных); • 8 0 — последовательный вывод данных; • N .0 . — не подключен. Температурный преобразователь передает 16 бит данных с выбор­ кой по ниспадающему фронту тактовых импульсов (первым передается старший разряд): • разряд 15 — фиктивный, всегда содержит 0; • разряды 5-14 — целая часть значения температуры в градусах Ц е­ льсия; • разряды 3—4 — дробная часть значения температуры в градусах Ц е­ льсия; • разряд 2 — 0, когда термопара подключена; 1, когда термопара не подключена; • разряд 1 — идентификационный номер устройства (возвращает 0); • разряд 0 — третье состояние. Микросхема М АХ6675 измеряет температуру с разрешением 0,25 °С. Значение температуры можно вычислить следующим образом: Полученное значение • 0,25 = Температура (°С ). Например, в разрядах 3-14 получено значение 0 Ы 1 0 0 0 0 0 0 0 0 0 0 = = 12 288. Умножаем его на 0,25 и получаем 768°С. Д ля использования выводов РС 2 -РС 5 порта С для ввода-вывода не­ обходимо отключить интерфейс Л А О (рис. 10.33). STK500 inISP mode with ATmegal6 Main | Program Fuses |LockBits | Advanced ] HW Settings | HWInfo | Auto Fuse Value 0CDEN □ JTAGEN ] -------------- SPIEN *■ ЕЕSAVE B00TSZ □ Boot Flash size=1024 words start address=$1 COO B00TRST □ СК0РТ n Brown-out detection at VCC=2.7 V ▼ □ Ext. Crystal/Resonator High Freq.; Start-up time: 16K CK + 64 ms ▼ B0DLEVEL B0DEN SUT.CKSEL . . . _________ ▼ _______ Рис. 10.33. Интерф ейс Л А С должен быть отклю чен Схема соединений показана на рис. 10.34. . 266 Глава 10 Рис. 10.34. Схема соединений для исследования работы преобразователя МАХ6675 267 Интерфейсы передачи данных ATmega16 Для вывода принимаемых данных с М А Х 6675 мы используем 16 светодиодов, подключенных к портам А и С (их выводы назначены как выходы). Функция S P I _ M a s t e r I n i t ( ) настраивает интерфейс SP1 микроконтроллера согласно специфике передачи данных температурно­ го преобразователя. В бесконечном цикле принимаем 16 бит данных. Поскольку регистр данных (S P D R ) интерфейса SPI микроконтроллера — восьмиразряд­ ный, принимаем восемь бит, отображаем их на светодиодах, а затем — принимаем остальные восемь бит с последующ ей индикацией на свето­ диодах. Программа Программа, реализующая работу схемы, показанной на рис. 10.34, представлена в листинге 10.6. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке ATmegal6\10.06 - SPI - Преобра­ зователь МАХ6675. Листинг 10.6. Программа # in c lu d e < a v r/ io .h > # in c lu d e // _ p i m ax 6675 . с // Заголовочны й файл // ввода-вы вод а для // используем ого c u til/ d e la y .h > Ф ункция v o id 68_s инициализации в // Для // задерж ки подклю чает проекте доступа нтерф ейса определения устройства, к ф ункциям циклов SPI S P I _ M a s t e r I n i t () { // Выводы DDRB |= PORTB /SS (1 |= << (1 (Р В 4 ) 4) « | и SCK (1 « 4 ); (Р В 7 ) // На // // D D RB &= ~ (1 6);/ / « // // В клю чаем // на SPCR S P I, выводе = (1 6) « Вывод = | SPSR &= -(1 « 0 ); SPCR &= ~ (1 « 3 ); выводе << 4) /SS устанавливаем подклю ченное к 5 В S P I, отклю чено) (Р В 6 ) M IS O байт "M a ster", fc k / 1 6 . (1 выходы (у ст р о й с т в о , принимаем режим SCK - 7 ); - от частота Прерывания | (1 вход « (п о внеш них от тактового SPI SPE=1, // SPR0=1 // S P I2 X = 0 CPOL=0 // полярности - импульсы линии сигнала запрещ ены 0 );/ / // этой устройств) MSTR=1, полож ительной 268 Глава 10 Листинг 10.6. Продолжение ЭРС!* |= ЭРСИ // (1 &= << - (1 Функция u n s ig n e d 2 ); << 5 ); приема ch ar байта // СРНА=1 // заднем у // Б (Ж В = 0 // со по - обработка ф ронту - передача старш его интерф ейсу данных по сигнала данных, начиная разряда SPI S P I M a s t e r R e s e i v e () { SPDR = OxFF; & w h ile (~ S P S R // retu rn (1 // Для // начать // передаем << 7 )) отправится SPDR; того {}; чтобы начать передавать / / (п о я в и т ся //Возвращ аем по интерф ейсу О ж идаем 1 прием, им пульсы в до тех разряде принятый SPI необходим о SCK, пор, S P IF поэтом у лю бой байт пока байт регистра SPSR байт } in t m a in (v o id ) { // Порты DDRA = PORTA DDRC А и С используем OxFF; = = // 0x00; / / Н а подклю чения порта выводы А Выводы // На S P I_ M a s te rIn it( ) ; // Инициализации w h ile // Б есконечны й // Задерж ка = 0x00; (1 ) порта выводы - порта // PORTC OxFF; для Выводы С А - порта светодиодов выходы подаем 0 В 0 В выходы С подаем интерф ейса SPI цикл { _ d e la y _ m s (2 2 0 ); // PORTB // (у х о д и т &= ~ (1 П ринимаем на << и 4 ); // выводим на На = S P I_ M a s te rR e s e iv e (); PORTC = S P IM a s te rR e s e iv e (); PORTB |= << 4 ); // приемом согласно вывод /SS светодиоды PORTA (1 перед преобразование На данных (0 ,2 2 подаем принятые 0 В два байта // Старш ие 8 разрядов // М ладш ие 8 разрядов вывод /SS с специф икации) подаем +5 В } } И н т е р ф е й с S P I. Р а б о т а с т е м п е р а т у р н ы м п р еобр азователем М АХ6674 Микросхема М А Х 6674 представляет собой цифровой 10-разрядный температурный преобразователь для термопар К-типа (хромель-алюмель). Измеряет температуру от 0°С до +128°С. Интерфейсы передачи данных А Т те д а 1 6 269 К выводам Т-, Т + мы подключили термопару (рис. 10.35). Рис. 10.35. Схема соединений для исследования работы преобразователя МАХ6674 270 Глава 10 Никаких данных температурный преобразователь не принимает, по­ этому вывод МОБ1 микроконтроллера не подключен. Выводы М А Х6674: • ОЫЭ — вход питания 0 В (“ земля” ); • Т ----- алюмелевый вход термопары (также должен быть соединен с “ землей” ); • Т + — хромелевый вход термопары; • У С С — вход питания 3..5 В (для защиты от помех должен быть зашунтирован конденсатором 0,1 мкФ на “ землю ” ); • Б С К — вход тактовых импульсов; ® /С Б — вход выбора микросхемы (напряжение питания во время преобразования данных, 0 В во время передачи данных); • БО — последовательный вывод данных; • N .0 . — не подключен. Температурный преобразователь передает 16 бит данных с выбор­ кой по ниспадающему фронту тактовых импульсов (первым передается старший разряд): • разряд 15 — фиктивный, всегда содержит 0; • разряды 5-14 — значение температуры в градусах Цельсия; • разряд 4 — 0, когда термопара подключена; 1, когда термопара не подключена (этот разряд будет устанавливаться верно только в том случае, если “ минус” питания микросхемы соединен с “ минусом” термопары); • разряд 3 — идентификационный номер устройства (возвращает 0); • разряды 0-2 — третье состояние. Десять бит данных температуры позволяют закодировать макси­ мальное число 1 023. Единица данного числа составляет 0,125 градусов Цельсия. Например, в разрядах 3-14 получено значение О Ь О О О О О Ш Ш = = 63. Умножаем его на 0,125 и получаем 7,875°С. Д ля индикации данных, принятых от М АХ6674, мы используем 16 светодиодов, подключенных к портам А и С (их выводы назначены как выходы). При этом следует помнить о необходимости отключить ин­ терфейс ЛАХ З (см. рис. 10.33). Функция З Р 1 _ М а з Ь е г 1 п 1 Ь ( ) настраивает интерфейс БР1 микро­ контроллера согласно специфике передачи данных температурного пре­ образователя. В бесконечном цикле принимаем 16 бит данных. Поскольку регистр данных (Б Р О Я ) интерфейса БР1 микроконтроллера — восьмиразряд- 271 Интерфейсы передачи данных ATmega16 ный, принимаем восемь бит, отображаем их на светодиодах, а затем — принимаем остальные восемь бит с последующ ей индикацией на свето­ диодах. Программа Программа, реализующая работу схемы, показанной на рис. 10.35, представлена в листинге 10.7. Чк Щ Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке АТшеда16\10. 07 - SPI - Преобра­ зователь МАХ6674. Листинг 10.7. Программа # in c lu d e < a v r/ io .h > # in c lu d e // _ m a x 6 6 7 4 .с Заголовочны й файл // ввода-вы вод а для // используем ого < u til/ d e la y .h > Функция v o id s p i // инициализации в // Для // задерж ки подклю чает проекте доступа нтерф ейса определения устройства, к функциям циклов SPI S P I _ M a s t e r I n i t () { // Выводы DDRB |= PORTB /SS (1 |= (Р В 4 ) « (1 4) << и | SCK (X « (Р В 7 ) 4 ); / / Н а // // DDRB &= ~ (1 6);/ / << // // Вклю чаем // на SPCR S P I, выводе (1 = 6) « = | SPSR S== ~ ( 1 « 0) ; SPCR &= « 3 ); SPCR SPCR -(1 (1 |= &= -(1 Вывод « 4) 2) ; « « выводе 5) ; /SS (Р В 6 ) байт - от частота Прерывания | (1 // Функция приема char « от байта по к 5 В S P I, тактового SPI БРН0=1 // БР12Х=0 полярности - // СРНА=1 // заднему // DORD=0 // со - им пульсы - SPI MSTR=1, данных по сигнала передача старш его сигнала полож ительной обработка ф ронту линии запрещ ены БРЕ=1, СРОЬ=С) этой устройств) // // интерф ейсу (п о 0 );/ / // S P I_ M a s te rR e s e iv e О вход внеш них } u n s ig n e d устанавливаем подклю ченное отклю чено) M IS O "M a ster", fc k / 1 6 . (1 выходы (у ст р о й с тв о , принимаем реж им SCK - 7 ); данных, разряда начиная 272 Глава 10 Листинг 10.7. Окончание { SPDR = OxFF; w h ile (-S P S R retu rn & (1 SPDR; // Для // начать // передаем << того чтобы начать передавать V) > { } ; по // интерф ейсу Ожидаем до // отправится // разряде //Возвращ аем прием, им пульсы тех поэтому лю бой пор, байт пока 1 (п о я в и т ся S P IF принятый SPI необходимо SCK, регистра байт в SPSR байт } in t m a in (v o id ) { // Порты DDRA = PORTA DDRC PORTC А и С используем OxFF; = = // 0x00; / / Н а OxFF; = // 0x00; для Выводы выводы Выводы / / Н а подклю чения порта А порта порта выводы С // И нициализации w h ile // Бесконечны й // Задерж ка // (у х о д и т светодиодов выходы А - порта S P IM a s te r ln it (); (1 ) - подаем О В выходы С подаем интерф ейса 0 В SPI цикл { d e l a y m s (2 2 0 ); // PORTB // &= -(1 Принимаем << и перед на выводим // на На S P I_ M a s te r R e s e iv e () ; PORTC = SPI PORTB |= M a s te rR e s e iv e ( ) ; 4 ); вывод /SS светодиоды = << данных (0 ,2 2 с согласно специф икации) 4 ); PORTA (1 приемом преобразование / / Н а подаем принятые 0 В два байта // Старш ие 8 разрядов // М ладш ие 8 разрядов вывод /SS И н т е р ф е й с S P I. Р а б о т а с А Ц П подаем +5 В М АХ1241 К интерфейсу SPI микроконтроллера подключен аналого-цифровой преобразователь М А Х 1241. Этот А Ц П требует внешнего опорного на­ пряжения (вывод RE F) от 1 до V D D + 50 мВ и питания (вывод V D D ) от 2,7 В до 5,25 В. Разрешающая способность А Ц П — 12 бит. Микросхема кодирует измеряемое напряжение и передает данные по SPI интерфейсу. Так, ис­ пользуя 12 бит, максимально можно закодировать число 4 096. Единица данного числа будет равна определенному значению в вольтах. Интерфейсы передачи данных А Т те д аЧ б Рис. 10.36. Схема подключения АЦП МАХ1241 273 274 Глава 10 Например, при опорном напряжении 1 В единица закодированного числа составляет: 1 В / 4 096 = 0,000244140625 В. Или, например, с выхода SP1 А Ц П получено число 2 048 при 5 В опорного напряжения. Это означает, что напряжение, поданное на вход A IN , бы ло равно 5 / 4 096 ■2 048 = 2,5 В. Для отображения числа, кодирующего вольты на входе А Ц П , к мик­ роконтроллеру подключены 12 светодиодов, поэтому в основной про­ грамме порты А и С инициализируются как выходы. Вывод РВЗ назначаем как выход. С его помощью мы будем вклю­ чать/выключать режим работы А Ц П . В функции S P I _ M a s t e r I n i t ( ) задаем режим работы интерфейса SPI микроконтроллера. Выводы /SS (выбор подчиненной микросхемы), S C K (тактовая частота интерфейса SPI), M IS O — входы. Д ля управле­ ния подчиненным устройством служит регистр SPCR. Задаем режим “ Master” . Согласно спецификации А Ц П , максимальная частота обмена данными S C K = 2,1 М Гц, поэтому, с помощью регистров S P C R и SPSR задаем тактовую частоту на выводе S C K меньшей или равной 2,1 МГц. В нашем случае мы задали fc k / 1 6 = 10 М Г ц / 16 = 625 кГц. В бесконечном цикле принимаем 16 бит дынных от А Ц П и выводим их на светодиоды. Для начала преобразования выводим А Ц П из режима пониженного энергопотребления. Он начинает измерять напряжение на выводе A IN и преобразовывать его в 12-разрядное число после подачи на вывод /CS уровня лог. 0. Результат преобразования будет готов через время ícoNv- Дождавшись завершения преобразования, вызываем функ­ цию S P I _ M a s t e r R e s e i v e ( ) , которая активизирует импульсы син­ хронизации /SCK и принимает восемь старших бит. Принятые данные выводим в порт А микроконтроллера. Аналогичным образом, с помощью S P I _ M a s t e r R e s e i v e ( ) при­ нимаем восемь младших бит и выводим их в порт С. Интерфейс SPI микроконтроллера устроен так, что для приема данных по линии M ISO мы должны что-либо отправить (в нашем примере — значение OxFF). После приема данных отключаем преобразование и переводим А Ц П в режим пониженного энергопотребления. Процесс приема данных Процесс приема данных от А Ц П М А Х 1241 проиллюстрирован на рис. 10.37. Интерфейсы передачи данных ATmega16 27 5 ЕОС •WHEN CS IS HIGH. DOUT = HIGH -Z Рис. 10.37. Процесс приема д анны х от АЦП МАХ1241 Интерфейс SPI микроконтроллера необходимо настроить следую ­ щим образом: • M S T R = 1 — режим SPI “ Ведущий” ; • C P O L = 0 — тактовые импульсы положительной полярности, когда на выводе S C L K нет состояния лог. 0; • С Р Н А = 0 — обработка данных по переднему фронту сигнала на выводе SC LK ; • D O R D = 0 — - передача данных, начиная со старшего разряда; • частота импульсов S C L K — не выше 2,1 М Гц. До начала преобразования и обмена данными с М А Х 1241 на выводе /SHDN должно быть 0 В, а на /CS — +5 В. Для активизации процесса преобразования необходимо подать на вывод /SHDN напряжение +5 В, дождаться выхода из режима понижен­ ного энергопотребления, установить 0 В на выводе /CS, выждать время преобразования или появления +5 В на выводе D O U T , запустить такто­ вые импульсы SC LK . Первый импульс на S C L K готовит М А Х 1241 к передачи данных. Первый принятый бит (D 12) не несет информации о преобразованном напряжении, а последующ ие (D 1 1 -D 0 ) говорят о том, какое напряжение бы ло на выводе A IN микросхемы М А Х 1241. П осле того как данные приняты, устанавливаем на выводе /CS +5 В и информируем М А Х 1241 о переводе А Ц П в режим пониженного энергопотребления установкой 0 на выводе /SHDN. Итак, процесс преобразования и приема данных выглядит следую ­ щим образом. 1. Подать +5 В на вывод /SHDN М А Х 1241, чтобы вывести А Ц П из режима пониженного энергопотребления. 2. Выждать время /wake выхода из режима пониженного энергопо­ требления. 3. Разрешить работу М АХ1241, подав 0 В на вывод /CS. 276 Глава 10 4. Выждать время í c o n v сигнала в цифровой. завершения преобразования аналогового 5. Принять первый, а затем — второй байт данных с вывода D O U T. 6. Запретить работу М А Х1241, подав +5 В на вывод /CS. 7. Перевести М А Х 1241 в режим пониженного энергопотребления, по­ дав 0 В на вывод /SHDN. до Из принятых 16 бит данных нам необходимы только 12. Из первого принятого байта (старшего) нам потребуются семь бит информации (0 6), а из второго (младш его) — пять бит (3-7 ). Программа Программа, реализующая работу схемы, показанной на рис. 10.36, представлена в листинге 10.8. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом ккниге компакт-диске в папке ATmegal6\10. 08 - SPI - АЦП. Листинг 1 0 .8 . # in c lu d e < a v r/ io .h > # in c lu d e // adc m a x l2 4 l. с // Заголовочны й файл // в вода-вы вод а для // используем ого < u til/ d e la y .h > Функция v o id Программа инициализации в // Для // задерж ки подклю чает проекте доступа нтерф ейса определения устройства, к функциям циклов SPI S P I M a s t e r l n i t () { // Выводы DDRB PORTB /SS (1 |= |= (Р В 4 ) « (1 4) << и SCK (1 I « 4 ); (Р В 7 ) / / Н а // // DDRB &= ~ (1 << 6);/ / // // В клю чаем // на SPSR &= SPCR = SPCR SPCR S P I, выводе &= &= - (1 (1 « ~ (1 ~ (1 « Вывод = выходы выводе (Р В 6 ) байт - от << << I 3 ); 2 ); (1 << 4) I (1 вход « (п о внеш них частота Прерывания 0 ); 6) устанавливаем подклю ченное к 5 В S P I, отклю чено) M IS O "M a ster", fc k / 1 6 . /SS (у с т р о й с т в о , принимаем режим SCK - 7) ; тактового от SPI // S P I2 X = 0 SPE=1, // SPR0=1 CPOL=0 // полярности - // CPHA=0 // переднему - импульсы сигнала MSTR=1, полож ительной обработка ф ронту линии запрещ ены 0 );/ / // этой устройств) данных сигнала по 277 Интерфейсы передачи данных ATmega16 Листинг 10.8. Окончание SPCR &= -(1 « 5 ); // DORD=0 // со - передача старш его данных, начиная разряда } // Функция u n s ig n e d приема char байта по интерф ейсу SPI S P I_ M a s te rR e s e iv e О { SPDR = OxFF; w h ile (-S P S R retu rn & (1 // Для // начать // передаем << SPDR; того 7 ) ) { } ; чтобы начать передавать по интерф ейсу // Ож идаем // отправится // разряде //Возвращ аем прием, импульсы до SPI тех необходимо SCK, пор, S P IF байт пока 1 (п о я в и т ся принятый поэтому лю бой регистра байт в SPSR байт } in t m a in (v o id ) { // Порты DDRA = PORTA DDRC PORTC DDRB А и С используем OxFF; = = 0x00; OxFF; = 1= (1 Выводы // На // Выводы / / Н а 0x00; 3) ; // << // PORTB &= ~ (1 << w h ile РВЗ (1) выводы А А подаем 0 В 0 В ■ выходы С порта выход светодиодов выходы порта порта выводы - подклю чения порта (к С подаем нему подклю чен вывод /вНОЫ АЦП 3) ; S P I_ M a s te rIn it(); для // // П ереводим // пониж енного // И нициализации // Бесконечны й МАХ1241 в режим энергопотребления интерф ейса ЭР1 цикл { PORTB 1= (1 « 3 ); _ d e la y _ u s (5 ); PORTB &= -(1 << 4) _ d e la y _ u s (7 .5 ); // П ринимаем и выводим // // // // // // на Выводим время На /SS Выжидаем S P I_ M a s te r R e s e iv e () ; = |= (1 PORTB &= ~ (1 « 4 ); « d e la y m s(1 0 0 0 ) ; 3) / / Н а tW AKE tCO N V 0 В до преобразования светодиоды S P I_ M a s te r R e s e iv e () ; режима подаем время заверш ения = PORTC вывод из энергопотребления Выжидаем PORTA PORTB МАХ1241 пониж енного принятые два байта // Старш ие 8 разрядов // Младш ие 8 разрядов вывод /БЭ // П ереводим // пониж енного // Задерж ка подаем МАХ1241 в +5 В реж им энергопотребления перед следую щ им опросом 278 Глава 10 И н терф ей с TW I М ы рассмотрим работу с двухпроводным интерфейсом T W I на примере обмена данными с датчиком температуры МСР9801. Этот дат­ чик способен измерять температуру в пределах от -55°С до +125°С. Значение температуры преобразуется в двоичный код и предоставляется с настраиваемым разрешением от 9 до 12 бит, т.е. от 0,5°С/бит до 0,0625 °С/бит. Датчик температуры содержит пять регистров: • Register Pointer — указатель регистра; • Configuration — конфигурационный регистр; • Т emperature — регистр температуры; • T H Y S T — гистерезис для TSET; • TSE T Register — регистр предела температуры. К лю бом у регистру можно обращается только после того как его номер записан в Register Pointer. По умолчанию после подачи питания датчик настроен следующим образом. • В Register Pointer записан номер регистра Temperature. Это говорит о том, что мы можем сразу же считать значение температуры; • Конфигурационный регистр по умолчанию настроен на непрерыв­ ное преобразование температуры с разрешением 9 бит. Диаграмма чтения регистра температуры показана на рис. 10.38. I 1 2 3 4 5 6 7 6 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 зс 1 -т и и Ш Я Л Л П Ш И 1 Л Л Л Я П Ш Ш 1 Ш Ш Л Л Л Ш 1 ^ I SDA Ь Ь УоУоЬУАуАуАуи^|/?ЛоУрУрУоурУ2уо\ а/оуоуоуоуоуоуоуоуй\р; © V" - V ------------- Address Byte © MSB Data © ответ от МСР9801 © Э*СТАРТ АСК-битподтверждения^налинииБРА) ЫАК-битнетподтверждения(1 налинииБРА) Р-ЭТОР А2.А1,А0- адресведомогоустройства Р-битнаправленияпередачиданных(вданномслучаечтение) Т I Y" LSB Data © ответ от ATMEGA16 ответ от ATM EGA16 © © Рис. 10.38. Временная диаграм м а чтения регистра температуры Процесс чтения температуры с МСР9801 по интерфейсу Т\\Т, когда микроконтроллер — ведущий передатчик. 279 Интерфейсы передачи данных ATmega16 1. Для начала обмена данными микроконтроллер должен подать сиг­ нал “ S T A R T ” (изменение уровня с высокого на низкий на линии данных при высоком уровне на линии тактов). 2. Отправить адрес устройства, с которым мы хотим начать обмен данными. Адрес МСР9801 состоит из семи бит. Старшие четыре разряда (4 -7 ) — это идентификационный номер самого устройства (содержат 1001). Следую щ ие три разряда (1 -3 ) устанавливаются выводами А 0 -А 2 , которые находятся в состоянии лог. 0. Н улевой разряд направления передачи данных (R/W ) необходимо установить равным 1 (R ), потому что мы считываем значение температуры. Т а ­ ким образом, передаваемые восемь бит данных должны быть равны 0x91. 3. П осле отправки адреса устройства (рис. 10.39) с битом направления передачи от подчиненного устройства приходит бит подтверждения АСК. Edit Component JJ *1 Component Reference: [ÏJ2 Hidden: Component Value: |MCP9801 Hidden: All Properties: OK Data lidden Pin {SETPOINT=75. 0 } {S TE P=1} {FORMAT-3. 1 } {MAX=125} Cancel {MIN=-55} {PACKAGE=S08} {M0DFILE-MCP980X} { ITFMOD=MCP980X} {TRACE=1} Exclude from Simulation -J Attach hierarchy module Exclude from PCB Layout ✓ Edit all properties as text Рис. 10.39. Адрес устройства в Proteus Процесс чтения температуры с МСР9801 по интерфейсу T W I, когда микроконтроллер — ведущий приемник. 1. Поскольку мы отправили бит направления передачи R (чтение дан­ ных), микроконтроллер ожидает приема старших восьми бит значе­ ния температуры. 280 Глава 10 2. П осле приема данных микроконтроллер формирует сигнал под­ тверждения А С К . 3. Ожидаем приема младших восьми бит значения температуры. 4. П осле приема микроконтроллер формирует сигнал “ нет подтвер­ ждения” N A C K . 5. Микроконтроллер завершает прием отправкой состояния “ С Т О П ” (изменение уровня с низкого на высокий на линии данных при вы­ соком уровне на линии тактов) Схема Д ля отображения значения температуры (16 бит данных регистра Temperature), мы подключили к микроконтроллеру 16 светодиодов. Во­ семь светодиодов, подключенных к порту В, будут отображать старший байт, а остальные восемь (порт А ) — младший байт. К линиям S D A и SC L подключены подтягивающие резисторы по 10 кОм (рис. 10.40). Из основной программы вызывается функция инициализации ин­ терфейса T W I микроконтроллера T W I _ M a s t e r I n i t ( ) . В ней с помо­ щью регистров T W B R и T W S R задается частота синхронизации SCL: часютй 5CL ■ частота - МК 16 4 2» ПГЗЯ * Максимальная частота, на которой может передавать данные МСР9801 — 400 кГц. Необходимо вычислить значение Т\УВЯ при за­ данной частоте микроконтроллера и сигнала на выводе синхронизации 8СЬ. При Т\\Ф8=0 значение Т\\ТЖ можно вычислить так: Т\¥В К = ((/ с1к//8а . ) - 1 6 ) / 2 . У нас частота микроконтроллера составляет 10 М Гц. Допустим, мы захотели установить частоту БЬС равной 100 кГц. В таком случае, Т\\ТЖ = (100 - 16) / 2 = 42. Устанавливаем разряды ТШ РЗГТХУРЗО ре­ гистра Т\\^Я равными 0, и при данных значениях частота сигнала 8С Ь составит 100 кГц. В бесконечном цикле считываем регистр температур и выводим его значение в порты А и В. Для формирования состояния “ С Т А Р Т ” на ин­ терфейсе Т\\Ч вызываем функцию ТДО1_ЗТАБ1Т ( ) , которая устанавли­ вает низкий уровень сигнала 8 0 А при высоком уровне § С Ь и ожидает выполнения операции от интерфейса Т\¥1. П о окончании операции ин­ терфейс Т\\Т сбрасывает флаг Т\\ТМТ. Интерфейсы п 6 4 'С 3 2 "С 16 "С 8 'С 4 "С 2’С 1 "С 8 , °6 М^5 мЁ* мЁ® ^ Н7 Пте ♦70Я 4ТПЯ Н 2 Пт II *5 1г4 [ г 3 мя ♦7011 «70Я «ТОК «ГОР «7ПР. ♦' передачи данных АТтеда16 Рис. 10.40. Схема подключения датчика температуры знак по интерфейсу Т\М 80Д 8С1. <3>4й в ы в о д МСР9801 на 0 В о л ы , 8й в ы в о д на +5 в о л ы «я. ТИЮ 12С Ы 00 282 Глава 10 Для получения 16 бит данных температуры нам необходимо прежде передать адрес ведомого устройства, указать ему на необходимость на­ чать передачу и принять 16 бит. Вначале микроконтроллер выступает в роли ведущего передатчика. Записываем в регистр значение для передачи ведомому приемнику и сбрасываем разряд T W IN T , информируя о том, что программа сформи­ ровала новое состояние для интерфейса T W I. Начинается передача дан­ ных. П осле передачи адреса и приема бита подтверждения от ведомого приемника интерфейс T W I установит разряд T W IN T в 1. Это укажет на то, что м одуль ожидает действия от программы. Затем микроконтроллер выступает в роли ведущего приемника, а МСР9801 — ведомого передатчика, поскольку мы передали пакет S L A + R. Подготавливаем интерфейс T W I к приему данных, устанавливаем разряд T W E A , чтобы микроконтроллер после приема отправил бит под­ тверждения А С К , а также сбрасываем разряд T W IN T — программа сформировала новое состояние для интерфейса T W I, можно начать при­ ем. П о окончании передачи в регистре T W D R будут восемь старших бит данных от МСР9801, которые выводим на светодиоды порта В. Процесс приема младших восьми бит данных такой же, но на этот раз мы не устанавливаем разряд T W E A , поскольку нам необходимо, чтобы микроконтроллер отправил бит подтверждения “ N A C K ” . Выво­ дим полученный байт на светодиоды порта А. П осле приема вызываем функцию T W I_S T O P ( ) , в которой записы­ ваем 1 в разряд T W S T O , говоря о том, чтобы интерфейс T W I отправил в шину состояние “ С Т О П ” , и сбрасываем разряд T W IN T , чтобы проин­ формировать о том, что программа сформировала новое состояние. За­ тем следует пауза приема температуры микроконтроллером от датчика в одну секунду. Микросхема МСР9801 находится в режиме непрерывного преобра­ зования. Значение температуры постоянно записывается в регистр Tem ­ perature. Время преобразования зависит от разрешения. Чем выше раз­ решение, тем больш е требуется времени на преобразование. Значение регистра Temperature Считанное значение регистра Temperature состоит девяти значащих разрядов и семи неиспользуемых: • разряд 15 — знак температуры: 0 — положительная; 1 — отрица­ тельная; • разряды 8-14 — целая часть значения температуры; • разряд 7 — дробная часть значения температуры (0,5°С ); 283 Интерфейсы передачи данных ATmega16 • разряды 0-6 не используются при установленном разрешении 9 бит. Предположим, считано значение 0 1 1 1 1 1 01 lu u u u m iu . Темпе­ ратура положительная, поскольку разряд 15 = 0. Значение температуры: 251 ■0,5 = 125,5 С°. Отрицательная температура вычисляется переводом полученного значения в дополнительный код (инвертирование и при­ бавление единицы) и умножением на значение весового коэффициента для первого разряда (в нашем случае — 0,5). Программа Программа, реализующая работу схемы, показанной на рис. 10.41, представлена в листинге 10.9. Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом ккниге компакт-диске в папке ATmegai6\io. 09 - TWI. Щ Листинг 10.9. Программа # in c lu d e < a v r/ io .h > ttin c lu d e // _ k c p 9801 . с Заголовочны й файл // ввода-вы вод а для // используем ого < u til/ d e la y .h > Ф ункция v o id t w i // инициализации в // Для // задерж ки подклю чает проекте доступа нтерф ейса определения устройства, к функциям циклов TW I T W I M a s t e r l n i t () { // Устанавливаем // TWBR0 TW BR = TWSR &= скорость регистра TWBR и передачи разрядов 0х2А; ~ (1 << 0) & ~ (1 << X ); с помощ ью разрядов T W P S 1 ,T W P S 0 // Скорость // Коэф ф ициент TW BR7- регистра работы TW SR передатчика предделителя } // Функция v o id устанавливает состояние "С Т А Р Т" T W I_S T A R T () { // Устанавливаем // Разреш аем // С брасы ваем // програм м ы сф ормировано // О стальны е разряды TW CR (1 « // Ожидаем // T W IN T w h ile } = состояние работу ф лаг T W IN T ) T W IN T , ( ! (TW C R (1 происходит & (1 T W I, новое << << записав записав говоря регистра I формирования (эт о "С Т А Р Т", м одуля о том, ло г. ло г. что 1 со в TW STA. стороны TWCR у с т а н а в л и в а е м состояния T W IN T ))); в состояние. TW STA) после 1 TW EN. | (1 « "С та р т": выполнения в ло г. 0. T W E N ); установки очередной разряда операции) 284 Глава 10 Листинг 10.9. Продолжение // Функция v o id TW I устанавливает состояние "СТО П " S T O P () { // Устанавливаем // М одуль // Записы ваем ло г. // о со // состоян ие. том, TW CR = состояние по-преж нем у что (1 « 1 в TWEN, стороны О стальны е T W IN T ) "С Т О П ", работает, I записав но в сбрасы ваем програм м ы разряды (1 << ло г. состоянии ф лаг 1 регистра | TWCR (1 « TW STO. T W IN T , сф ормировано TW STO) в "С Т О П ". говоря новое - л о г . 0. T W E N ); } in t m a in (v o id ) { // Порт DDRA = PORTA // А Порт DDRB = PORTB TW I используем O xFF; = 0x00; В (1 ) подклю чения Выводы порта // П одаем на используем O xFF; = 0x00; M a s te r ln itО ; w h ile для // для светодиодов А - выходы порт А 0 подклю чения // Выводы порта В // П одаем на // И нициализация // Бесконечны й // Выжидаем светодиодов - порт В выходы В О В интерф ейса TW I цикл { _ d e la y _ m s (7 5 ); // T W I_ S T A R T (); // В ЕД У Щ И Й // Загруж аем // TW DR. // данных // к (п р и // время 9-би тн ом Ф ормируем преобразования tCONV=75M C разреш ении) состояние "С та р т" ПЕРЕДАТЧИК адрес подчиненного Записы ваем R/W, 1 т .е . в разряд данные устройства 0 в направления будут регистр данных передачи передаваться от устройства м икроконтроллеру. // П акет // О тправляем отправки // Разряды // 1001. // выводами А 0-А 2 // "м и н ус", поэтому // П оследний // 1 - чтение. TW D R = 0x91; TWCR = (1 4-7 - = следую щ им: 1001 000 1-3 (в разряд // T W IN T ) - адрес нашем все - три ID + A d d res s B yte+ R 1 идентиф икатор Разряды << будет 0x91 (п о умолчанию устройства, случае все разряда направление в микросхеме установленны й выводы равны "п осаж ен ы " на н у л ю ). передачи данных : id + a flp e c + R I (1 << T W E N ); // // П рограмма передать адрес готова устройства - 285 Интерфейсы передачи данных A Tm egal6 Листинг 10.9. Окончание // Ожидаем // адресны й пакет // ведом ого устройства) w h ile установки ( ! (TW C R // В ЕДУ ЩИ Й & в 1 (1 << С читы ваем тем пературу О тклик стороны // О тправляем // данных w h ile // (1 со регистр TWEA) & 8 (1 (1 << бит << М СР9801 данных // NACK // в w h ile // T W IN T ) (!(T W C R Отображ аем PORTA // TWDR = & 8 (1 бит - МК дальш е !) . приема I << (1 << T W E N ); передан температуры 8 на бит из что МК, и данные. светодиодах выводим в порт В 8 разрядов (м ож н о продолж ать заверш ения приема д а л ь ш е !), данных T W E N ); //Ожидаем // разряда // действия // указы ваю щ его, что // послан и // получены // установки указы ваю щ его, получены T W IN T ))); данных состояние << Ожидаем АСК младш ие после (1 T W IN T , Старш ие програм м ы TWDR; Ф ормируем | // // тем пературу « продолж ать заверш ении T W IN T ) отклик стороны = по // О тклик регистр МК разряда // стороны (м о ж н о // С читы ваем со 8 разрядов старш ие T W IN T ))); // (1 что от TW D R I TWDR; со - стороны // TWCR означаю щ его, подтверж дение { } ; програм м ы со « О тображ аем = АСК в ( ! (TW C R PORTB T W IN T , принято ПРИЕМНИК // = (и T W IN T ))) // TWCR разряда передан T W IN T со от стороны МК, от ож идает п р о гр а м м ы ), отклик NACK М СР9801 данные температуры Младш ие установки (м о д у л ь 8 на бит светодиодах выводим в порт А "СТО П " TW I_STOP(); _ д е 1 а у _ т з (1 0 0 0 ); } } // Задерж ка // и перед отображ ением следую щ им опросом температуры от Глава 11 И с п о л ь з о в а н и е Ж К - э к р а н а В этой главе мы рассмотрим примеры взаимодействия микрокон­ троллера А Т т е § а 1 6 с жидкокристаллическими (Ж К ) дисплеями. П о д к л ю ч е н и е т е к с т о в о г о Ж К -э к р а н а 1 6 x 2 н а б а з е к о н т р о л л е р а К8006611 Схема подключения ЖК-экрана к микроконтроллеру А Т г г ^ а 1 6 по­ казана на рис. 11.1. & ВАТ-вТАЯ Я С1602(к50066и) г--|4а>|о|т- ^ ^ и1 30_ ААЯЕГ УСС Р07/ОС2 роелср РС>б/ОС1А Р М /О С 1 В Р О ЗЛ М П Р02/1МТ0 рв7/гск РВб /М 130 Р В5/М 0 51 РВ4/Э8 рвз/осо/А1т РВ2/1МТ2/А1М0 Р В1/Т 1 РВО /ХСК/ТО Р01/ТХ0 РСЮ/НХО 25_ Р С 7 /Т О З С 2 Р С 6 /Т О З С 1 РС5/Т01 Р С 4 /Т 0 0 Р С З /Т М Э Р С 2 /Т С К РС1/30А Р СО /вС Ь Рис. 11.1. Схема подключения ЖК-экрана к микроконтроллеру Р А 7/А 0С 7 Р А 6/А 0С 6 Р А 5/А 0С 5 РА4ИМ>С4 РАЗ/А О СЗ Р А 2 /А 0 С 2 Р А 1/А 0С 1 РАО/АО СО ХТАЬЗ XTAL1 Использование Ж К-экрана 287 П ер ечи сли м выводы Ж К -м о д уля : • R/W — вход д ля установки направления передачи данны х (п о ­ ск о льк у мы не считы ваем данны е с экрана, а т о ль к о передаем их, на этом вы воде устан овлен низкий ур овен ь напряж ения); • V S S / V D D — напряжения питания, соответственно 0 и + 5 В; • V E E — управление контрастностью экрана через д ели т ель напря­ жения (перем енны й резистор); • R S — определяет передачу д анны х (вы сокий ур ов ен ь) и л и команды (низки й ур овень); • D B 0 -D B 7 — шина данны х д ля передачи команды и л и сим вола. М о ж н о использовать как восьм и-, так и четы рехразрядную п ереда­ чу. П ри использован и и четы рехразрядной ш ины строго закреплены выводы D B 4 -D B 7 ; • Е — строб. П одав си гн ал на этот вход, мы сообщ аем к о н тр оллер у, что на шине вы ставлены данные. П рограм м а передает Ж К -м о д у л ю д ве строки. Первая из н и х и зв ле­ кается из Flash-памяти программ, ч тобы н е занимать О З У м икрокон­ троллера, а вторая — из О З У . Строки передаю тся п оси м вольн о. В зави­ симости от настройки Ж К -м о д у ля , данны е мож но передавать по ч еты ­ рех- и ли восьм ипроводной шине. П риняты е Ж К -д и сп леем коды си м в олов записываю тся во вн утрен ­ ню ю память D D R A M . Каж дая ее ячейка им еет свой порядковы й ном ер (адрес). Н ул ев о й адрес соответствует отображ ению п ервого си м вола первой строки Ж К-экрана. П ри записи п роисходит автоматический п е­ реход на след ую щ ую ячейку. Отображ ение сим вола п рои сходи т след ую щ и м образом . В н утр ен ­ ний контроллер вы бирает из ячейки памяти C G R O M “ изображ ение” т о ­ го и ли и ного си м вола в зависимости от его кода в D D R A M и вы водит его на экран. О бъем памяти D D R A M превы ш ает к оли чество ячеек Ж К-экрана (2 x1 6 ). Например, записав си м вол в ячей ку 20, которая вы ходи т за о б ­ ла сть отображения, м ож но см естить эт у область на один знак. В нашем примере вы в осп ользуем ся четы рехразрядной передачей данны х через вы воды Р С 4 -Р С 7 м икроконтроллера, п одклю ч ен н ы е к л и ­ ния D B 4 -D B 7 Ж К -м о д у ля . К р о м е т ого , назначим в качестве вы ходов выводы РСО и РС 1, которы е б у д у т соединены с ли н и ей вы бора регистра R S и стробирования/синхронизации Е. Д л я инициализации д исплея передаем три команды, оп ред еляю щ и е внутренние настройки L C D . 288 • Глава 11 0 x 2 8 . Н астройка Ж К -м о д у ля на четы рехби тн ую ш и н у данных, две строки текста и ш рифт 5><7 точек. Ж К -к о н тр оллер различает ком ан­ ды п о л о г. 1 в старшем разряде. Единица в пятом разряде говорит о том, что передан код инструкции, оп ределяю щ ий параметры раз­ вертки и ш ирину шины данны х (разряды О Ь , Ы, Б соответственно). • ОхОР. Единица в третьем разряде определяет настройку режима отображ ения курсора и дисплея. Разрядами О ,С ,В (Б В 2 , О В1, БВ О ) задаем вклю чен и е д исплея и отображ ение м и гаю щ его курсора. • 0 x 0 6 . Единица во втором разряде определяет настройку направле­ ния сдвига курсора и экрана. Разрядами 1/0, 8Н (О В 1 , Е>В0) задаем см ещ ен и е счетчика на ув ели ч ен и е адреса Б О К А М при записи в не­ го (сд в и г курсора вправо), а также отклю чаем см ещ ен и е в сего экра­ на при записи в О О Я А М . П о с л е инициализации вызываем ф ункцию очистки экрана с 1 з ( ) , которая отправляет в Ж К -м о д у ль код очистки. Внутри м о д у ля очистка реализована путем записи во все ячейки О О Я А М п р о бела 0 x 2 0 и уста­ новкой курсора (счетчика А С ) в н улев у ю позицию (на начало). Д а лее вы водим на Ж К-экран две строки: о д н у — из РкэИ-памяти, а д р угую — из О З У м и кроконтроллера. Д ля перехода на вторую строку вызываем ф ункцию з е с о п с П з - п е ( ) , которая устанавливает адрес счетчика равным 0 x 4 0. С это го адреса Б О К А М начинается вторая строка экрана. К ом ан ду установки курсора задаю т единицей в разряде Б В 7. За ним след ует адрес памяти Б О К А М . П о с к о л ь к у мы передаем данны е по четы рехпроводной шине, снача­ л а передается четы ре старш их бита, а затем — четы ре м ладш их. П р о ­ цесс передачи восьми би т дан н ы х по четы рехпроводной шине, согла сн о спецификации, долж ен бы ть следую щ и м . 1. У стан о в и ть сигнал в ли н и и ЯБ (команда или данные). 2. П ередать в ш ину данны х О В 4 .. .О В 7 старш ую тетраду. 3. У ста н о в и ть на линии синхронизации Е = 1. 4. У ста н о в и ть на линии синхронизации Е = 0. 5. П ередать в ш ину данны х О В 4 .. .О В 7 м ладш ую тетраду. 6. У ста н о в и ть на линии синхронизации Е = 1. 7. У стан о в и ть на линии синхронизации Е = 0. Программа Программа, реализующая вывод двух строк на ЖК-экран, представ­ лена в листинге 11.1. 289 Использование Ж К-экрана Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке A T m e g a l 6 \ l l . 01 - Т е к с т о в ы й Ж К - О экран. Листинг 11.1. Программа R C 1 6 0 2 . с # in c lu d e < a v r /io .h > t tin c lu d e // З а г о л о в о ч н ы й ф ай л в в о д а -в ы в о д а д л я // и с п о л ь з у е м о г о < u t il/d e la y .h > # in c lu d e < a v r /p g m s p a c e .h > Ф ун к ц и я v o id // // о т п р а в к и в п о д к л ю ч а е т п р о е к т е // Д ля // за д е р ж к и // У т и л и т ы д л я // п а м я тью МК к ом ан д ы в о п р е д е л е н и я у с т р о й с т в а , д о с т у п а к ф ун к ц и ям р а б о т ы с ц и к л о в F la s h - Ж К -м о д у ль s e n d _ c m d _ t o _ L C D ( u n s ig n e d char com m and) { PORTC PORTC PORTC (com m and = &= |= - ( 1 (1 << << O xFO ) & 0 ) ; 1 ); ; / / На в ы в о д а х // р а з р я д а // РСО // к о м а н д у / / P C I (R S ) // PORTC &= - ( 1 << 0 ) ; PORTC |= (1 < < 1 ) ; _ d e la y _ u s ( 2 ) ; PORTC & = ~ ( 1 < < 1 ) d e l a y ; u s (5 0 ); = 0, (н е (Е ) _ d e la y _ u s ( 2 ) ; PORTC & = - ( 1 < < 1 ) ; // Р С 1 (Е ) PORTC = ((c o m m a n d & OxOF) < < 4 ) ; / / P C 4 -P C 7 - ста р ш и е 4 ком ан ды - - т . е . п е р е д а е м д а н н ы е) с и н х р о н и за ц и я с и н х р о н и з а ц и я Н а в ы в о д а х м лад ш и е (R S ) = РСО // к о м а н д у / / P C I (Е ) - с и н х р о н и з а ц и я (E) - с и н х р о н и з а ц и я P C I // О п ер а ц и я , // д л и т с я т . е . с о г л а с н о б о л е е 43 - P C 4 -P C 7 р а з р я д а // // 0, 4 к ом ан д ы п е р е д а е м сп ец и ф и к а ц и и , м с } // Ф ун к ц и я v o id о т п р а в к и 8 б и т д ан н ы х s e n d _ c h a r_ to _ L C D (u n s ig n e d в Ж К -м о д уль c h a r d a ta ) { PORTC (d a ta = & O x F O ); PORTC |= (1 < < 0 ) ; PORTC | = ( 1 « 1 ); _ d e la y _ u s ( 2 ) ; PORTC & = - ( 1 < < 1 ) ; PORTC = ( ( d a t a & O xOF) PORTC PORTC // На // р а з р я д а в ы в о д а х / / Р С О (R S ) // P C I (Е ) // P C I (Е ) << 4 ); P C 4 -P C 7 = 1, т . е . - с и н х р о н и з а ц и я // м лад ш и е (1 « 0 ) ; // РСО (R S ) (1 << 1 ) ; // Р С 1 (Е ) п е р е д а е м с и н х р о н и з а ц и я На = ста р ш и е - / / |= - 4 к ом ан д ы = - в ы в о д а х 1 , 4 т . е . Р С 4 -Р С 7 р а з р я д а к ом ан д ы п е р е д а е м с и н х р о н и з а ц и я д ан н ы е д а н н ы е 290 Глава 11 Листинг 11.1. Продолжение _ d e la y _ u s ( 2 ) ; PORTC & = ~ ( 1 << 1 ) ; _ d e l a y _ u s (5 0 ); _ d e la y _ m s ( 5 0 ); // P C I (Е ) // О п е р а ц и я , // д л и т с я // З а д ер ж к а - с и н х р о н и з а ц и я с о г л а с н о б о л е е 43 д л я сп ец и ф и к а ц и и , м с н а г л я д н о г о о т о б р а ж е н и я } // Ф ун к ц и я v o id о ч и с т к и э к р а н а e l s () { s e n d _ c m d _ to _ L C D (0 x 0 1 ) ; // _ d e la y _ m s ( 3 ) ; О т п р а в л я е м в Ж К -м о д у ль // к ом ан д ы о ч и с т к и // О ж идаем б о л е е // сп ец и ф и к а ц и и к о д э к р а н а 1 ,5 3 м с с о г л а с н о } // Ф ун к ц и я v o id п е р е х о д а на в т о р у ю с т р о к у s e c o n d lin e O { / / В д в у х с т р о ч н о м // П е р в а я с т р о к а // о к а н ч и в а е т с я // с // У с т а н а в л и в а е м а д р е с а // с т р о к и реж им е в DDRAM а д р е с о м 0x40 и н а ч и н а е т с я 0 x 2 7 . о к а н ч и в а е т с я к у р с о р s e n d _ c m d _ to _ L C D ( 0 х С 0 ) ; _ d e la y _ m s ( 3 ) ; н а / / с В т о р а я а д р е с а с т р о к а а д р е с о м а д р е с 0x4 0, 0x0 0 и н а ч и н а е т с я 0 x 6 7 . т . е . н а н а ч а л о в т о р о й О Ы Ю О О О О О } // Ф ун к ц и я // п а м я т и v o id о т п р а в к и в Ж К -м о д уль с т р о к и , х р а н я щ е й с я во F la s h - МК s e n d _ s tr _ fr o m _ fla s h to lc d (c o n s t char *s ) { u in t 8 _ t i; // Ц и к л в ы п о л н я е т с я // с ч и т а н fo r (i = си м в о л 0; д о т е х п о р , п о к а и з F la s h -п а м я т и н е б у д е т 1\ 0 ' p g m _ r e a d _ b y te (& s [i]) ; i+ + ) { s e n d _ c h a r _ t o _ L C D ( p g m _ r e a d _ b y t e ( & s [ i] ) ) ; // О т п р а в л я е м // с и м в о л н а _ d e la y _ m s ( 1 ) ; } } // Ф ун к ц и я v o id о т п р а в к и в Ж К -м о д у ль с т р о к и , s e n d _ s tr _ fr o m _ d a ta _ to _ lc d (c h a r *s tr х р а н я щ ей ся ) в О ЗУ МК ЖК 291 Использование Ж К-экрана { w h ile (*s tr) // П ок а е с т ь , ч т о о т п р а в л я т ь { s e n d _ c h a r_ to _ L C D (*s tr+ d e la y m s (1 ); + ) ; // О т п р а в л я е м с и м в о л } } // Ф ун к ц и я v o id н а ч а л ь н о й и н и ц и а л и за ц и и Ж К -д и с п л е я lc d in itO { d e la y m s( 6 0 ) ; // Ж s e n d _ c m d _ to _ L C D ( 0 x 2 8 ) ; дем б о л ь ш е // 2 С о г л а с н о _ d e la y _ u s ( 5 0 ) ; С о г л а с н о // c ls (); // О s e n d _ c m d _ to _ L C D ( 0 x 0 6 ) ; _ d e la y _ u s ( 5 0 ) ; // м с , О Ъ О О Ю Ю О О _ d e la y _ u s (5 0 ) ; // s e n d cmd t o L C D (O x O F ) ; 30 // с т р о к и , - // о т о б р а ж е н и е п о 4 б и т а , 5x7 сп ец и ф и к а ц и и , O b O O O O llll сп ец и ф и к а ц и и п е р е д а ч а ш рифт // ч и с т к а с о г л а с н о - б о ль ш е 39 в к лю ч е н и е м и га ю щ его сп ец и ф и к а ц и и , м с э к р а н а , к у р с о р а б о ль ш е 39 м с э к р а н а // O b O O O O O llO // с д в и г С о г л а с н о - в с е г о и н к р е м е н т и р о в а н и е , э к р а н а сп ец и ф и к а ц и и , о т к л ю ч е н б о ль ш е 39 м с } // С т р о к а , const in t р а зм е щ е н н а я в F la s h -п а м я т и c h a r p e r v a j a s t r o k a [] m a in МК PROGMEM = " FLASH MK TO L C D " ; (v o id ) { DDRC = O b l l l l O O l l ; PORTC = 0 x 0 0 ; lc d in itO ; e ls О ; // П е р е д а е м с т р о к у и з // В ы воды PCO, // На вы воды // И н и ц и а л и за ц и я / / О чищ аем в с е F la s h - п а м я т и P C I, P C 4 -P C 7 п о р т а С С т р о к а // П р ед ло ж ен и е н а п и с а н о // о т о б р а ж е н и я н а // б у д е т d e c o d e r / / к к н и г е В ы водим send s t r // п о м е с т и т ь (а в т о р W в в н а Е е н е е и з О ЗУ з а п и с ь у к а з а т е л ь д е к о д и р о в а н о м ож но H D 44780 в о а д р е с а н а й т и н а д л я c y r i l l i c п р и л а г а е м о м П р огр ам м ы \ Н 0 4 4 7 8 0 = " C ОП® MK S a J K " ; с т р о к у ь н е о б х о д и м о МК п р о гр а м м о й п а п к е МК В Ж К -м о д уль с т р о к у , р у с с к о м , i l d c a t ) . к о м п а к т -д и с к е в т о р у ю н а О ЗУ Ж К -эк р а н е c h a r v t o r a j a s t r o k a [] // в т о р у ю в 0 Ж К -эк р а н МК // х р а н и т ь с я вы ход ы Ж К -м о д уля s e n d _ s tr _ fr o m _ fla s h _ to _ lc d (& p e r v a ja _ s tr o k a [ 0 ] ) ; s e c o n d lin e ( ) ; // Д ля т о г о ч т о б ы н а ч а т // - п о д а е м в Ж К -м о д у ль fr o m _ d a ta _ to _ lc d (& v to r a ja _ s tr o k a [ 0 ] ) ; d e c o d e r , 292 Глава 11 П р и м ен ен и е ст а н д а р т н ы х п р и Ж К -д и сп л еем р а б о т е с ф у н к ц и й в ы в о д а В р а ссм о т р ен н о м вы ш е п р и м ер е бы л о п р ед ел ен н абор ф ун к ц и й для р а б о т ы с Ж К -м о д у л е м : s e n d _ c h a r _ t o _ L C D ( ) , l c d i n i t ) , c l s ( ) , s e c o n d l i n e ( ) , s e n d _ c m d _ to _ L C D ( ) . Для удобства доступа к ним в п о с л е д у ю щ и х п р о е к т а х э т о й гл а в ы м ы п о м е с т и м и х о п р е д е л е н и я в з а ­ головочн ы й ф ай л l c d . h , которы й б у д е т п одк л ю ч ать к осн о в н о й п р о ­ гр ам м е с п о м о щ ь ю дир ективы i i n c l u d e " l c d . h " (к ав ы ч к и г о в о р я т о т о м , ч т о ф а й л р а з м е щ е н в т о м ж е к а т а л о ге , ч т о и с а м а п р о г р а м м а ). С тандартны е ф ун к ц и и вы вода сл уж ат для ф орм атирования дан н ы х п е р е д и х о т п р а в к о й в Ж К -м о д у л ь . П о с к о л ь к у д л я о т о б р а ж е н и я к а ж д о г о с и м в о л а п е р е д а е т с я с о о т в е т с т в у ю щ и й е м у к о д , д л я в ы в о д а н а Ж К -э к р а н ч и с л а к а ж д у ю ц и ф р у с л е д у е т п р е д в а р и т е л ь н о п р е о б р а зо в ы в а т ь в к о д си м в ол а. Д л я эт о го у д о б н е е и сп ол ь зовать стан дар тн ы е ф ун к ц и и и з за го ­ л овочн ого ф айла s t d i o . h. В ч астн ости , для ф ор м ати р ов ан н ого сл уж и т ф ункция p r i n t f ( ) . О на п р ео б р а зу ет дан н ы е и з в н у тр ен н его п р едставл ен и я в сим вольны й в и д в с о о т в е т с т в и и с ф о р м а т н о й с т р о к о й , а за т е м в ы в о д и т и х в в ы х о д ­ н о й п о т о к ( п о у м о л ч а н и ю — s t d o u t ) . Д л я в ы в о д а н а Ж К -эк р а н э т о т п о т о к н е о б х о д и м о п е р е н а п р а в и т ь н а п о л ь зо в а т е л ь с к и й s t d o u t _ L C D , которы й и сп ол ь зует для отправки си м в олов оп р ед ел ен н у ю в ф айле l c d . h ф ункцию s e n d _ c h a r _ t o _ L C D ( ) . Ф л а г % i в ф у н к ц и и p r i n t f ( ) п о з в о л я е т п р е о б р а зо в ы в а т ь ч и с л о в н а б о р к о д о в с и м в о л о в . В ы в о д ч и с е л с п л а в а ю щ е й за п я т о й о с у щ е с т в ­ л я ет ся п о -д р у г о м у . В н а ч а л е ч и с л о п е р е в о д и т с я в н а б о р к о д о в с п о м о ­ щ ь ю ф у н к ц и и s p r i n t f (Б у ф е р _ д л я _ с т р о к и , Ф л а г _ п р е о б р а з о в а н и я , Ч и с л о ) , п о сл е ч его стр ока вы водится ф ун к ц и ей p r i n t f ( ) . Д л я т о г о ч т о б ы а к т и в и зи р о в а т ь п р е о б р а з о в а н и е ч и с е л с п л а в а ю щ е й за п я т о й , н е о б х о д и м о в A V R S tu d io в ы б р а т ь к о м а н д у м е н ю P r o j e c t ► C o n f ig u r a t io n O p t io n s (П р о е к т ► П а р а м е т р ы к о н ф и г у р а ц и и ), в д и а л о ­ г о в о м о к н е P r o j e c t O p t io n s (П а р а м е т р ы п р о е к т а ) п е р е й т и в р а зд е л L ib r a r ie s (Б и б л и о т е к и ), в ы д ел и т ь в с п и с к е A v a ila b le L in k O b j e c t s ( Д о с т у п ­ н ы е о б ъ ек т ы д л я с в я зы в а н и я ) э л е м е н т ы lib p r in tf_ flt.a и lib m .a и н а ж а т ь к н о п к у A d d L ib ra r y (Д о б а в и т ь б и б л и о т е к у ) (р и с . 1 1 .2 ). З а т е м н е о б х о д и м о п е р е й т и в р а з д е л C u s t o m o p t i o n s (П о л ь з о в а т е л ь ­ с к и е п а р а м е т р ы ), в ы б р а т ь в с п и с к е C u s t o m C o m p ila t io n O p t io n s (П о л ь ­ з о в а т е л ь с к и е п а р а м ет р ы к о м п и л я ц и и ) э л е м е н т L in k e r O p t io n s (П а р а ­ м ет р ы к о м п о н о в щ и к а ) и д о б а в и т ь с п о м о щ ь ю к н о п к и A d d п е р е к л ю ч а ­ т е л и - W l , - u , v f p r i n t f (р и с . 1 1 .3 ). 293 Использование Ж К-экрана RC1602 Project Options X| 4v General Include Directories Available Link Objects: libc.a libm.a libobjc.a libprintf_flt.a libprintf_min.a libscanfjlt.a libscanf_min.a Ш 0 + t Memory Settings ГiictnmDntinrv OK Cancel Help Рис. 11.2. Добавление библиотек для работы с плавающей запятой RC1602 Project Options Xj Custom Compilation Options [All files] -WL-u,vfprintf Remove |-WL-u,vfprintf Add RC1602.C Include Directories [Linker Options] U t $ Edit Memory Settings External Tools — № Use AVR Toolchain (or WinAVR) CustomOptions avr-gcc: iC:\WinAVR -20100110\bin\avr-gcc. exe make: |C:\WirAVR-20100110\utils\bin\make.exe Cancel Рис. 11.3. Добавление параметров компоновщика Help 294 Глава 11 Схема соединений для программы, представленной в листинге 11.2, такая же, как в предыдущем примере (см. рис. 11.1). И с х о д н ы е ф а й л ы э т о го п р и м е р а д л я W inAVR, A V R Studio и Proteus н а х о д я тс я на пр и л а га е м о м к кн и ге к о м п а кт -д и с ке в па п ке A T m e g a l 6 \ l l . 02 функции вы вода. - С тан дартн ы е Листинг 11.2. ПрограммаR C 1 6 0 2 . с # in c lu d e < a v r /io .h > # in c lu d e З а г о л о в о ч н ы й ф ай л в в о д а -в ы в о д а д л я // и с п о л ь з у е м о г о < u t il/d e la y .h > # in c lu d e < a v r /p g m s p a c e .h > # in c lu d e # in c lu d e < s td io .h > " lc d .h " // С о з д а ё м // F IL E // Ф ун к ц и я // н а з н а ч а е м // и с п о л ь з у е м s ta tic // // — п о т о к m a in п р о е к т е // Д ля д о с т у п а // за д ер ж к и // У т и л и т ы д л я // п а м я тью МК // С та н д а р тн ы е // Б и б л и о т е к а // с к ф ун кц и ям р а б о т ы с F la s h - с р е д с т в а ф ун кц и й ц и к л о в в в о д а -в ы в о д а д л я р а б о т ы Ж К -м о д улем со д ер ж а щ а я s e n d _ c h a r _ to _ L C D (N U L L ). т о л ь к о - инф орм ацию д л я У с т а н о в и в в ы в о д а . ф л а г о п о т о к е . Ф ункцию д л я в в о д а н е _F D E V _S E T U P _W R IT E , в ы в о д , s td o u t_ L C D = F D E V _ S E T U P _ S T R E A M (s e n d _ c h a r _ to _ L C D , in t о п р е д е л е н и я m y s td o u t_ L C D . с т р у к т у р а , F IL E в п о д к л ю ч а е т у с т р о й с т в а , NULL, F D E V _ S E T U P _ W R IT E ); (v o id ) { // П е р е н а п р а в л я е м // s td o u t_ L C D с т а н д а р т н ы й s t d o u t = & s td o u t_ L C D ; DDRC = 0 Ы 1 1 1 0 0 1 1 ; // PORTC = 0 x 0 0 ; / / lc d in itO ; // p r i n t f ( " S T R O K A A BCD " ) ; // s e c o n d lin e ( ) ; // p r i n t f ( " C H IS L O - % i " , 1 2 3 4 5 ) ; d e la y m s ( 1 0 0 0 ) ; // _ d e la y _ m s ( 1 0 0 0 ) ; e ls ( ) ; c h a r m y s tr[7 ]; // В ы вод d o u b le ч и с л а c h is lo с п о т о к с о зд а н н ы й PCO, В ы воды Н а н а в с е P C I, вы воды В ы вод // н а в т о р у ю В ы вод З а д ер ж к а вы ходы 2 с т р о к у ц е л о г о ч и с л а с О ч и с т к а э к р а н а к у р с о р а в // Б уф ер и у с т а н о в к а н а ч а л ь н о е з а п я т о й z a p ja to i - п о д а е м с т р о к и П е р е х о д // п лав аю щ ей С Ж К -м од уля // s p la v a u w e i P C 4 -P C 7 п о р т а И н и ц и а ли за ц и я нам и = 0 .1 2 3 4 5 ; п о л о ж е н и е 0 В 295 Использование Ж К-экрана Листинг 11.2. Окончание // П р е о б р а з о в ы в а е м // 5 з н а к о в Бргз.пЪ£ п о с л е ( & т у 8 ^ [0] , р гз.п Ь £ (Ь т у з Ъ г [ 0 ] ) ч и с л о с п лав аю щ ей з а п я т о й в с т р о к у , з а п я т о й ; " % .5 £ " , // c h is lo s _ p la v a u w e i_ z a p ja to i); О т п р а в л я е м си м в о лы и з м а с с и в а т у в ^ [] } В ы в о д н а Ж К -эк р а н ц и ф р о в о г о р езу л ь т а т о в а н а л о г о - п р е о б р а зо в а н и я Н а в х о д ы м у л ь т и п л е к с о р а А Ц П ( А Б С 0 - А Б С 4 ) п о д а н о п я ть у р о в ­ н е й н а п р я ж е н и я , з н а ч е н и я к о т о р ы х в ы в о д я т с я н а Ж К -э к р а н (р и с . 1 1 .4 ). Рис. 11.4. Схема соединений для отображения на ЖК-экране уровней напряжения 296 Глава 11 Ш и н а данны х Ж К -м о д у ля п одклю чен а к выводам Р С 4 -Р С 7 м икро­ контроллера, линия выбора регистра RS — к вы воду РС 2, ли н и я син­ хронизации Е — к вы воду РСЗ. В программе, представленной в ли сти н ге 11.3, все ф ункции д ля ра­ боты с Ж К-экраном , как и в преды дущ ем примере, определен ы в заго­ л ов о ч н ом ф айле l c d . h . К о н т р о л л ер Ж К -д и сп лея настраиваем на и с­ пользование четы рехразрядной ш ины данных, размер шрифта 5><7, ото­ бражение м и гаю щ его курсора. Размеры знакоместа одн о го си м вола Ж К экрана — 5x8 точек, но д ля вывода курсора мы ум еньш аем размер шрифта д о 5x7. При инициализации А Ц П определяем и сп ользован и е внеш него ис­ точника оп ор н о го напряжения с вывода A R E F м икроконтроллера. У с т а ­ навливаем реж им непреры вного преобразования, не зависящ его от со с­ тояния ф лага A D IF . Е го р езультат сохраняется в регистре данны х А Ц П : регистровой паре A D C H :A D C L . В бесконечном ц икле отслеж иваем м ом ент завершения преобразо­ вания (устан ови лся ф лаг A D IF ). К ак тольк о это произош ло, сохраняем результат в 16-разрядную п ерем ен н ую a d c _ r e s u l t . П еред выводом значения напряжения на ди сп лей переводим его в вольты по ф орм уле, приведенной в спецификации. П о ск о л ьк у д ля вывода на экран н еобходи м о передавать сим волы , а п о луч ен н ое значение напряж ение — ц ело е число, с п ом ощ ью функции s p r i n t f O преобразовы ваем его в си м вольн ы й массив m y s t r [ ] и пе­ редаем в Ж К -м о д у ль , и сп ользуя стандартную ф ункцию форматирован­ н ого вывода p r i n t f ( ) . Д алее обн у ля ем разряд A D IF . Е сли этого не сделать, не б уд ет рас­ познано у с л о в и е завершения преобразования. П одача ан алогового си г­ нала на А Ц П осущ ествляется через м ульти п лек сор . Д ля вы бора одн ого из его входов служ и т регистр A D M U X . Измеряем напряжение на одном из входов м ульти п лек сор а и переходим к след ую щ ем у. П о л у ч ен н ы е ре­ зультаты отображ аем на Ж К-экране. '^ ^Lr Исходные файлы этого примера для WinAVR, AVR Studio и Proteus находятся на прилагаемом к книге компакт-диске в папке татов A T m e g a l 6 \ l l . 03 - Вывод р е з у л ь ­ АЦП. Листинг 11.3. Программа ADC t o L C D . с # in c lu d e # in c lu d e < a v r /io .h > // З а г о л о в о ч н ы й ф ай л // в в о д а -в ы в о д а д л я // и с п о л ь з у е м о г о < u til/d e la y .h > в // Д ля // за д ер ж к и п о д к л ю ч а е т о п р е д е л е н и я у с т р о й с т в а , п р о е к т е д о с т у п а к ф ун кц и ям ц и к л о в 297 Использование Ж К-экрана Листинг 11.3. Продолжение # in c lu d e < a v r /p g m s p a c e .h > # in c lu d e # in c lu d e // < s td io .h > " lc d .h " Ф ун к ц и я v o id и н и ц и а л и за ц и и // У т и л и т ы д л я // п а м я тью МК // С т а н д а р т н ы е // Б и б л и о т е к а // с р а б о т ы с F la s h - с р е д с т в а ф ун кц и й в в о д а -в ы в о д а д л я р а б о т ы Ж К -м о д у лем АЦП ADC I N I T O { ADCSRA // |= (1 A D P S 2 = 1 , ADCSRA ADCSRA << |= (1 « 2 ) я (1 « 5 ); I / / 7 ) ; A D P S 1 = 1 , I (1 S F IO R // И с т о ч н и к - р е г и с т р // т . е S F IO R &= ~ ( 1 //ADM UX ADMUX - &= 1 ) << 7) р е г и с т р - ( 1 << I & -(1 & - ( 1 << реж им - 128 р а б о т ы р е г и с т р а S F IO R в в о д а -в ы в о д а A D T S 1 = 0 , З а д е й с т в о в а т ь & ~ (1 << A D T S 0 = 0 , 5 ); м у л ь т и п л е к с о р о м << // // - содерж им ы м ф ун кц и й 6) 6 ) ; //В неш ний н а п р я ж ен и я / / к = 0 ; АЦП д е л е н и я п р е о б р а з о в а н и я // ADMUX р а б о т у 0 ) ; A D T S 2 = 0 , у п р а в л е н и я 7 ) « A D A TE =1 "С Т А Р Т ": р а зр е ш и т ь к оэф ф и ц и ен т (1 о п р е д е л я е т с я н е п р е р ы в н о го - т . е . с п е ц и а л ь н ы х с и г н а л а реж им « / / // // AD EN=1 A D P S 0 = 1 , в ы в о д у (5 В ), ÄR E F п е р е м ы ч к у АЦП и с т о ч н и к (в о п о р н о г о п о д к лю ч ен н ы й STK5 00 с н я т ь AR E F) н еси м м етр и ч н ы й в х о д AD C0 (Р А О ) } // С о з д а ё м // инф орм ацию п о т о к // Ф ункцию // _F D E V _S E T U P _W R IT E , о д л я m y s td o u t_ L C D . п о т о к е . в в о д а н е F IL E Ф ун к ц и я н а з н а ч а е м и с п о л ь з у е м — (N U L L ). т о л ь к о s t a t i c F IL E s t d o u t _ L C D = F D E V _S E T U P _S T R E A M ( s e n d _ c h a r _ t o _ L C D , in t m a in с т р у к т у р а , сод ер ж а щ а я s e n d _ c h a r _ to _ L C D - д л я У с т а н о в и в в ы в о д а . ф л а г в ы в о д , NULL, _ F D E V _ S E T U P _ W R IT E ); (v o id ) { // П е р е н а п р а в л я е м с т а н д а р т н ы й п о т о к н а s td o u t_ L C D s t d o u t = & s td o u t_ L C D ; DDRC = О Ы 1 1 1 1 Ю О ; PORTC = 0 x 0 0 ; // В ы воды PC2 // На вы воды l c d i n i t O // И н и ц и а л и за ц и я Ж К -м о д уля // И н и ц и а л и за ц и я АЦП / / AD SC =1 A D C _ IN IT ( ADCSRA |= ; ) ; (1 << 6 ); // п р е о б р а з о в а н и е // п р е о б р а з о в а н и я (в в с е р еж и м е - -P C 7 - С п о д а е м 0 В а к т и в и з и р у е м н е п р е р ы в н о го а к т и в и з и р у е т с я вы ходы п о р т а и л и п р о г р а м м н о . о д и н о ч н о г о Е с л и же 298 Глава 11 Листинг 11.3. Окончание // и с т о ч н и к // у с т а н о в к а // в о з н и к н о в е н и я w h i le (1 ) // с т а р т о в о г о AD SC с и г н а л а - п р о и з в о д и т с я у с т а н о в л е н н о г о Б е с к о н е ч н ы й л ю б о е и з а п п а р а т н о п р ер ы в а н и й , т о п о с л е п р ер ы в а н и я ц и к л { d e la y _ m s ( 1 ) ; / / П о // // о к о н ч а н и и З а д ер ж к а у с т а н а в л и в а е т с я i f (A D C S R A & 1 м с п р е о б р а з о в а н и я (1 в « " 1 " . 4 ) ) р а з р я д A D IF С б р а с ы в а е т с я // Е с л и р е г и с т р а за п и с ь ю п р е о б р а з о в а н и е AD CSRA " 1 " . за в е р ш е н о , т о { u n s ig n e d i n t // // В х о д н о е // V in = d o u b le c h a r a d c _ r e s u l t = п р е о б р а з о в а н и я н а п р я ж ен и е (A D C * RE F) / В ы в од ч и с л а // П р е о б р а з о в ы в а е м // 2 з н а к а с // О б н у л я е м // п р е о б р а з о в а н и я . ч и с л о с д л я // з а п и с ь ю // п р ер ы в а н и я // A D IF // т о г о , // п р е о б р а з о в а н и я // с ч и т ы в а т ь ADCSRA ADMUX |= = // i f // i f { Е с л и Е с л и (1 п р и Э то a d c // п о == _ d e la y _ m s r e s u l t v o l t s ) П е р е д а е м в в с т р о к у с т р о к у , н а бы мы за в ер ш ен и и з н а т ь , ч т о Ж К -эк р ан з а в е р ш е н и е п р и н у д и т е л ь н о о б р а б о т ч и к п р е о б р а з о в а н и я , Мы е г о с л е д у ю щ е го ц и к л н а н а п р я ж ен и я ) и с п о л ь з о в а л и а п п а р а т н о . о к о н ч а н и и ; с т р о к у (з н а ч е н и е у к а з ы в а я т о р а з р я д о б н у л я е м д л я ц и к л а за в е р ш е н и мож но 4 ) ; + 1 ; // П е р е х о д и м м у л ь т и п л е к с о р а == з а п я т о й о с у щ е с т в л я е т с я Е с л и о б н у л е н << 3 (Р А 2 ), 0 x 0 3 ) в ы в од (A D M U X ч и с л а р е з у л ь т а т . в ы в од (A D M U X A D IF , ед и н и ц ы . ADMUX // п е р е в о д а п лав аю щ ей " % . 2 f 11, р а з р я д ч т о б ы (A D C ) ф о р м у ле з а п я т о й & m y s t r [0 ]); бы п о р е з у л ь т а т АЦП ( d o u b l e ) ( a d c _ r e s u l t * 5 ) / 1 0 2 4 ; // бы л дан н ы х з а п я т о й s p r i n t f (fc m y s tr [0 ] , p r i n t f ( “ % s : " , = Б уф ер п лав аю щ ей п о с л е С ч и ты в аем 1024 // // // р е г и с т р а в ы ч и с л я е т с я a d c r e s u l t v o l t s m y s t r [ 7 ] ; AD C ; и з 6 { т о АЦП к д л я п е р е х о д и м s e c o n d l i n e ( ) ; (Р А 5 ), т о след у ю щ ем у и з м е р е н и я к в ы в о д у н а п р я ж ен и я с т р о к е 2 э к р а н а } в о зв р а щ а е м с я к в ы в о д у 1 (Р А О ) 0 x 0 5 ) (2 0 0 ) ; e l s О ; ADMUX = 0 ; } } } } И зм е р е н и е ток а, н а п р я ж ен и я , т ем п ер а т у р ы С х е м а соед ине ний для д ан н ого пр им е р а п о казан а на рис. 11.5. Использование Ж К-экрана Рис. 11.5. Схема для измерения силы тока, напряжения, температуры 299 300 Глава 11 С и ла тока вы числяется по падению напряжения на ш унте Я ш (0,025 О м ). Напряж ение при прохож дении ш унта подается на диф ф еренциаль­ ны е входы А Ц П (A D C 0 и A D C 1 ). Зная н ом инал ш унта и напряжение на нем, мы мож ем найти и с и л у тока через ш унт. Например, если падение напряжения на Riu = +0,0745 В, то си ла тока составляет I = U / Rui = 0,0745 В / 0,025 О м = 2,98 А . П ри подаче на неинвертирую щ ий вход А Ц П отри цательн ого, а на инвертирую щ ий — п о ло ж и т ельн о го напряжения, напряжение при и н ­ дикации буд ет со знаком “ м и н ус” . Н апряж ение 0..50 В подается через д ели т ел ь (рези сторы R1 и R 2 ) на вход A D C 6 . В данном случ а е А Ц П работает в недиф ф еренциальном ре­ жиме. И зм еряем ое напряжение отсчитывается от “ зем ли ” . Д е л и т е л ь да­ ет не б о ль ш е 5 В на вход, со гла сн о спецификации м икроконтроллера. Тем пература измеряется датчиком М С Р9801 и передается по и н ­ терф ейсу T W I на выводы м и кроконтроллера S C L и S D A . Р езульта ты измерений (ток, напряжение, тем пература) отображ аю т­ ся на Ж К -экране (2 x 1 6 ), п одк лю ч ен н ого к выводам Р С 2 -Р С 7 м икрокон­ троллера. В программе, представленной в ли сти н ге 11.4, функции д ля работы с Ж К -м о д у л е м на базе KS0066U , тем пературны м датчиком М С Р9801 и А Ц П определены в заголовочных файлах l c d . h , t w i ___MCP98 0 1 . h и a d c . h и подклю чен ы с п ом ощ ью директивы # i n c l u d e Ка­ вычки говорят о том , что эти ф айлы находятся в одном каталоге с о с­ новны м кодом программы. В бесконечном ц икле с п ом ощ ью функции p r i n t f ( ) вы водим в первой строке Ж К-экрана “ I _ [A ]:U [B ]: U 2 [B ]” , а затем, и сп ользуя функ­ ц ию s e c o n d l i n e ( ) , описанную в заголовочн ом ф айле l c d . h, отправ­ ляем инструкцию перехода ко второй строке Ж К -м одуля . Вы зываем функцию A D C _ o p r o s ( ) , описанную в заголовочн ом файле a d c . h. Она п ереклю чает входы м ульти п лек сор а А Ц П , считывает значения напряжений, вы числяет требуем ы е величины и вы водит ре­ зультат. С и ла тока вы числяется по падению напряжения на Rin, д елен н ом у на сопротивление резистора 0,025 Ом. Напряж ение U подается на вывод A D C 6 . П о с к о л ь к у м акси м альн ое напряжение, подаваемой на вход А Ц П , не д о л ж н о превыш ать 5 В, д ля подачи уровня б о ль ш е 5 В мы и сп о льзу­ ем д ели т ел ь (в нашем случ а е — 1 к 10). П еред вы водом на Ж К -экран мы ум нож аем п о лу ч ен н ое напряж ение на 10. Н апряж ение U2 подается на вы вод A D C 7 без д ели теля и не д олж н о превыш ать 5 В. 301 Использование Ж К-экрана П ри вы в оде тем п ер атур ы п о сл е зад ер ж к и и н ди к ац и и н а ч еты ре с е ­ к у н д ы о ч и щ а е м эк р а н в ы з о в о м ф у н к ц и и c l s ( ) , в ы в о д и м в п е р в о й с т р о к е Ж К -э к р а н а с л о в о “ T E M P E R A T U R A ” и п е р е х о д и м ко в т о р о й с т р о к е с п о м о щ ь ю ф у н к ц и и s e c o n d l i n e ( ) . В ы зы в а е м ф у н к ц и ю t e m ­ p e r a t u r a ( ) , о п и с а н н у ю в за г о л о в о ч н о м ф а й л е t w i ___M C P 9 8 0 1 . h . Э та ф ункция п о и н т ер ф ей су T W I м и к рок он троллера опраш ивает датчи к т е м п е р а т у р ы М С Р 9 8 0 1 и о т о б р а ж а е т е е з н а ч е н и е н а Ж К -д и с п л е е . В з а в е р ш е н и е о т м е т и м , ч т о р а зр я д ы п р е д о х р а н е н и я о б я з а т е л ь н о д о л ж н ы бы т ь н а с т р о е н ы в с о о т в е т с т в и и с р и с . 1 1 .6 . STK500 in ISP mode with ATmegal6 -=lQlül Main ! Program Fuses j LockBits | Advanced | HW Settings | HW Info | Auto | Value Fuse 0CDEN JTAGEN С SPIEN ч. EESAVE С Boot Flash size=1024 words start address=$1 COO B00TSZ ▼ B00TRST □ ______________________ ___________ _ _______ СКОРТ B0DLEVEL □ Brown-out detection at VCC=2.7V B0DEN □ SUT_CKSEL Ext. Crystal/Resonator High Freq.; Start-up time: 1K CK +64 ms HIGH 0xD9 LOW OxCF ▼ ▼ P Auto read P* Smart warnings F" Verify after programming Program Verify Read Entering programming mode.. OK! Reading fuses address 0 to 1.. OxCF, 0xD9 ..OK! Leaving programming mode.. OK! Р и с . 1 1 .6 . Н а с т р о й к а р а з р я д о в п р е д о х р а н е н и я Программа П р о г р а м м а , р е а л и з у ю щ а я р а б о т у с х е м ы , п о к а з а н н о й н а р и с . 1 1 .5 , п р е д с т а в л е н а в л и с т и н г е 1 1 .4 . 302 Глава 11 Исходны е ф айлы прилагаемом ние , этого прим ера д л я in c lu d e < a v r /io .h > // - находятся Ток, на напряж е­ // LCD. С to З а г о л о в о ч н ы й в в о д а -в ы в о д а д л я ф ай л у с т р о й с т в а , # in c lu d e < u t il/d e la y .h > # in c lu d e # in c lu d e # in c lu d e t tin c lu d e < s td io .h > // С т а н д а р т н ы е с р " lc d .h " // Ф ун к ц и и д л я р а " t w i __ M C P 9 8 0 1 .h " // Ф ун к ц и й " a d c .h " // Ф ун к ц и и // С о з д а ё м // инф орм ацию // Ф ункцию // п о т о к _F D E V _S E T U P _W R IT E , д л я о // Д ля // за д е р ж к и m y s td o u t_ L C D . п о т о к е . в в о д а н е д о с т у п а F IL E Ф ун к ц и я п о д к л ю ч а е т к и с п о л ь з у е м в ф ун кц и ям п р о е к т е ц и к л о в е д с т в а в в о д а -в ы в о д а б о т ы Ж К -м о д улем — с д л я р а б о т ы с М С Р9801 д л я р а б о т ы с АЦП с т р у к т у р а , сод ер ж ащ ая s e n d _ c h a r _ to _ L C D н а з н а ч а е м о п р е д е л е н и я и с п о л ь з у е м о г о (N U L L ). т о л ь к о s t a t i c F IL E s t d o u t _ L C D = FDEV_SETUP_STREAM ( s e n d _ c h a r _ to _ L C D , in t Proteus и тем пература. Листинг 11.4. Программа ADC # WinAVR, AVR Studio к книге к ом п ак т-д и ск е в п ап ке A T m e g a l 6 \ l l . 04 - д л я У с т а н о в и в в ы в о д а . ф л а г в ы в од , NULL, FD EV SETUP W R I T E ) ; m a in (v o id ) { // П е р е н а п р а в л я е м с т а н д а р т н ы й s t d o u t = & s td o u t_ L C D ; DDRC = 0 Ы 1 1 1 1 1 0 0 ; PORTC = 0 x 0 0 ; lc d in itO ; T W I_ M a s te r In it( ) ; A D C _ IN IT ( ) ; w h ile (1 ) // п о т о к В ы воды / / Н а в с е на s td o u t_ L C D P C 2 -P C 7 вы воды // И н и ц и а ли за ц и я - вы ходы С п о р т а п о д а е м 0 Ж К -м од уля // И н и ц и а ли за ц и и и н т е р ф е й с а // И н и ц и а ли за ц и и АЦП // Б е с к о н е ч н ы й TW I ц и к л { p r i n t f ( " % s " , " 1 _ [ А ] :U [В ] : и 2 [ В ] " ) ; s e c o n d lin e О ; // П ереход ADC o p r o s ( ) ; / / Вы зы ваем _ d e la y m s (4 0 0 0 ); e ls ( ) ; p r i n t f ( "TEMPERATURA " ) s e c o n d lin e ( ) ; te m p e ra tu ra ( ) ; d e la y m s (2 0 0 0 ); e ls ( ) ; } } н а в т о р у ю ф ункцию / / / / / / / / АЦП О ч и с т к а Ж К -эк р а н а / / / / / / / / / / П е р е х о д н а (н а п р я ж е н и й ) р е з у л ь т а т о в З а д ер ж к а н а с т р о к у о п р о с а и Ж К -эк р а н е и н д и к а ц и и на 4 ; В ы зы ваем и О ч и с т к а в т о р у ю ф ункцию и н д и к а ц и и З а д ер ж к а в ы в о д о в о т о б р а ж е н и я с т р о к у о п р о с а т е м п е р а т у р ы и н д и к а ц и и Ж К -эк р а н а 2 с с В 303 Использование Ж К-экрана П о д к л ю ч ен и е к л а в и а т у р ы 3 * 4 К л а в и а т у р а п о д к л ю ч е н а к в ы в о д а м Р А 0 - Р А 6 (р и с . 1 1 .7 ). ш и Н Щ §1Е1|||§ оо I* оооооооо 1 § §. 2 3* I Ш ¡1111111 ¡¡¡¡¡¡¡1 ««яя -М"Н»М-И 4| Г Г Г зГ н*Г Г зГ ,п л • *1 * г т V -4 Т ______ Л ______Л ______- I Рис. 11.7. Схема подключения клавиатуры к микроконтроллеру 304 Глава 11 Вы воды Р А З - Р А 6 настроены как входы с внутренним и подтяги­ ваю щ ими резисторам и, т.е. на них присутствует +5 В (л о г. 1). Подавая на эти входы О В (G N D ), м ы мож ем отслеж ивать состояние лог. 0. Вы воды Р А 0 - Р А 2 настроены как выходы. Н а них м ож но п рограм м ­ но устанавливать как +5 В, так и 0 В. П рограм м а (ли ст и н г 11.5) работает след ую щ и м образом . Н а одном из вы ходов Р А 0 - Р А 2 ц и кли чн о устанавливается 0 В. П р едп олож и м это вы вод РАО. Т о гд а при нажатии на л ю б у ю из кнопок [1 ], [4 ], [7 ], [ * ] на входах с подтягиваю щ им резистором Р А З - Р А 7 установится лог. 0. С ч и ­ танное состояние вы водов Р А 0 - Р А 6 говорит о нажатой кнопке. П р и на­ жатии кнопки [1] на выводе РАО — 0 В; РА1 — 5 В; Р А 2 — 5В, РА З — 0 В; Р А 4 — 5 В; Р А 5 — 5 В; Р А 6 — 5 В. Таким образом , опросив л о г и ­ ческое состояние выводов, п о луч и м код 0 Ы 1 1 0 1 1 0 . В основной програм м е инициализируем Ж К -м о д у ль , п одклю ч ен ­ ный к порту С . Д ля хранения состояния порта А , к к отор ом у п о д к лю ч е­ ны кнопки, б уд ем использовать перем енную k e y типа c h a r . В бесконечном ц икле вызываем функцию G e t K e y P r e s s e d ( ) , ко­ торая вы полняется д о тех пор, пока н е б уд ет нажата кнопка. Р езульта ­ том функции будет код нажатой кнопки, которы й мы присваиваем пе­ рем енной k e y . Ф ункция G e t K e y P r e s s e d ( ) работает след ую щ и м образом. В бес­ конечном ц и к ле оператор вы бора s w i t c h изменяет состоян и е вы ходов Р А 0 - Р А 2 . П р и первом прохож дении цикла на Р А 2 установится 0 В, при втором — на Р А 1 , при третьем — на РАО. П о сл ед ую щ и е циклы б уд ут повторять состояния выводов Р А 0 - Р А 2 . Бы ла ли нажата кнопка, мож но узнать по установке л о г. 0 на одном из входов Р А З - Р А 6 . Е сли состояние одн ого из вход ов Р А З - Р А 6 изм ен и лось, т о ожидаем отпускания кнопки (возврат этих входов в состояние лог. 1). В ы ходи м из функции, вернув логи ч еск о е значение на выводах Р А 0 - Р А 6 . Д ля отображ ения кода нажатой кнопки (состоян и я порта А ) вы зы ­ ваем ф ункцию p r i n t _ b i n ( ) , передав ей в качестве параметра пере­ м ен н ую k e y . Эта функция вы водит на Ж К-экран состояния выводов Р А 0 - Р А 6 , где л о г . 1 — это 5 В, а л о г. 0 — 0 В. Д ля индикации кнопки служ и т функция p r i n t _ k e y ( ) . Ей в каче­ стве параметра передается состоян и е вы водов Р А 0 - Р А 6 . В самой функ­ ции исп ользуется оператор s w i t c h ( k e y ) , которы й в зависимости от состояния порта А выводит на Ж К-экран обозначение нажатой кнопки. Исходны е ф айлы прилагаем ом 3x4. к этого примера д ля книге ком пакт-диске WinAVR, AVR Studio в папке и Proteus A T m e g a l6 \ ll. 05 - находятся на Клавиатура 305 Использование Ж К-экрана Листинг 11.5. Программа k e y _ m # in c lu d e # in c lu d e # in c lu d e # in c lu d e // < a v r /io .h > Ф ун к ц и я char З а го л о в о ч н ы й ф ай л // в в о д а -в ы в о д а д л я // и с п о л ь з у е м о г о c u til/d e la y .h > < s td io .h > " lc d .h " a tr ix _ 3 x 4 . с // в // Д ля // за д е р ж к и п о д к л ю ч а е т о п р е д е л е н и я у с т р о й с т в а , п р о е к т е д о с т у п а к ф ун кц и ям ц и к л о в // С т а н д а р т н ы е с р е д с т в а в в о д а -в ы в о д а // Ф ун кц и и р а б о т ы Ж К -м о д улем о б р а б о т к и н а ж а то й д л я с к н о п к и G e t K e y P r e s s e d () { w h ile (1 ) // Б е с к о н е ч н ы й ц и к л { s w itc h (PORTA 0Ы 11) & { / / В // // У с т а н а в л и в а е м case case case O b O ll: O b lO l: O b llO : н о в о е з а в и с и м о с т и с о с т о я н и я с о с т о я н и е PORTA = 0 Ы 1 1 1 1 0 1 ; PORTA = 0 Ы 1 1 1 1 1 0 ; PORTA = 0 Ы 1 1 1 0 1 1 ; о т п р е д ы д у щ е го РА 0 -Р А 2 в ы в о д о в в ы в о д о в Р А 0 -Р А 2 b re a k ; b re a k ; b re a k ; } _ d e la y _ u s ( 1 ) ; c h a r keycode = // Ж дем ( P IN A у с т а н о в к и н а п р я ж ен и я & O b lllllll) ; // // // Е с л и if бы ла ((k e y c o d e н а ж а та != // ((P IN A & ОЫШ ООО) { d e la y m s ( 1 ) ; } re tu rn к лави ш 0Ы 11Ю 00) { w h ile в ы в о д а х в к о д в с е х д ан н ы й м о м ен т к н о п к а O b llllO O O ) & н а З а п о м и н а ем (k e y c o d e ); != // Е с л и с о с т о я н и е и з м е н и л о с ь в ы в о д о в Р А З -Р А 6 O b llllO O O ) // Ж дем, // у с т а н о в и т с я к о г д а // к н о п к и ) // В ы ходи м / / н а ж а т о й и з н а Р А З -Р А 6 +5В (о т п у с к а н и е ц и к л а , в о зв р а щ а я к о д к н оп к и } // Ф ун к ц и я в ы в о д а // В ы води т в v o id д в о и ч н о г о о б р а т н о м к о д а п о р я д к е , ч и с л а н а ч и н а я н а с Ж К -эк р а н . РАО . p r i n t _ b i n ( c h a r b in ) { do } { p r i n t f ( "% d ", b in = b in /2 ; w h ile (b in ! = b in 0 % 2 ); ) ; / / В ы водим // Ц и к л // д е л и м о е о с т а т о к в ы п о л н я е т с я н е б у д е т о т д о д е л е н и я т е х р а в н о н а п о р , н улю 2 п о к а 306 Глава 11 Листинг 11.5. Продолжение // Ф ун к ц и я v o id в ы в о д а н а з в а н и я p r in t_ k e y (c h a r н а ж а то й к н о п к и н а Ж К -эк р а н key) { / / В з а в и с и м о с т и s w itc h о т с о с т о я н и я п о р т а А . . . (k e y ) { case case case case case case case case case case case case 0Ы 110110 : 0Ы 110101: 0Ы 110011 : O b llO lllO : 0Ы 101101 : 0Ы 101011 : O b lO llllO : 0Ы 011101 : O b lO llO ll: O b O lllllO : O b O llllO l: O b O lllO ll: p p p p r r r r in in in in t t t t f f f f p p p p r r r r in in in in t f (" = = 5 " ) t f (" = = 6 " ) t f (*= = 7 " ) t f (" = = 8 " ) p p p p r r r r in in in in t t t t f f f f (" = = 1 " ) (" = = 2 " ) (" = = 3 " ) (" = = 4 " ) b re a k ; b re a k ; b re a k ; b re a k ; b re a k ; b re a k ; b re a k ; b re a k ; b re a k ; b re a k ; b re a k ; b re a k ; (" = = 9 " ) ("= = *") (" = = 0 " ) (" = = # " ) // // // 118 117 115 } // С о з д а ё м // и н ф орм ац и ю // Ф ункцию // _F D E V _S E T U P _W R IT E , s ta tic F IL E п о т о к о д л я m y s td o u t_ L C D . п о т о к е . в в о д а F IL E Ф ун к ц и я н е н а з н а ч а е м и с п о л ь з у е м s td o u t_ L C D — (N U L L ). т о л ь к о m a in сод ер ж а щ а я - д л я У с т а н о в и в в ы в о д а . ф л а г в ы в од , = F D E V _ S E T U P _ S T R E A M (s e n d _ c h a r _ to _ L C D , in t с т р у к т у р а , s e n d _ c h a r _ to _ L C D NULL, F D E V S E T U P W R IT E ) ; (v o id ) { // Ж К -эк р а н s td o u t = & s td o u t_ L C D ; DDRC = 0 Ы 1 1 1 1 1 0 0 ; PORTC = ObOOOOOOOO; lc d in it (); // // П е р е н а п р а в л я е м // н а // В ы воды / / Н а // с т а н д а р т н ы й п о т о к s td o u t_ L C D в с е Р С 2 -Р С 7 вы воды И н и ц и а ли за ц и я - вы ходы п о р т а С п о д а е м 0 В Ж К -м од уля К н оп к и DDRA = O b O O O O lll; PORTA = 0 Ы 1 1 1 1 1 0 ; // Р А З -Р А 6 - в х о д ы . Р А 0 -Р А 2 // Р А З -Р А 6 - в х о д ы , н а гр уж ен н ы е // п од тя ги в а ю щ и м и // в х о д а х // РА1 char key; // w h ile (1) // Бесконечный цикл П е р ем ен н а я д л я х р а н е н и я +5 вы ходы р е з и с т о р а м и п р и с у т с т в у е т п о д а н о - В , к о д а а + 5 В ). на РАО н а ж а той (н а На - Р А 2 , О к н оп к и В . 307 Использование Ж К-экрана Листинг 11.5. Окончание { e ls О ; k e y = G e tK e y P r e s s e d () ; p r in t_ b in (k e y ); p r in t k e y (k e y ) ; d e la y m s (5 0 0 0 ); } } // // О ч и с т к а э к р а н а П о л у ч а е м к о д н а ж а т о й // В ы водим д в о и ч н ы й к о д // к н о п к и // В ы води м // к н о п к и // З а д ер ж к а и н д и к а ц и и // к н о п к и с о б о з н а ч е н и е н а 5 к н о п к и н а ж а то й н а ж а то й Ж К -эк р а н н а ж а то й С о д е р ж и м о е п р и л а га е м о го к к н и ге к о м п а к т -д и с к а П р и л а г а е м ы й к к н и г е к о м п а к т -д и с к с о д е р ж и т ч е т ы р е п ап к и : А Т 9 0 3 2 3 1 3 — и с х о д н ы е к о д ы п р о е к т о в , р а с с м о т р е н н ы х в ч а с т и П; А Т ш е д а 1 6 — и с х о д н ы е к о д ы п р о е к т о в , р а с с м о т р е н н ы х в ч а с т и III; Д о к у м е н т а ц и я — Р О Б -ф а й л ы с т е х н и ч е с к и м и о п и с а н и я м и у с т ­ р о й с т в , и с п о л ь з о в а н н ы х в р а с с м о т р е н н ы х п р о ек т а х ; П р о г р а м м ы — у с т а н о в о ч н ы е п а к ет ы , н е о б х о д и м ы е д л я р а з р а б о т к и , к ом пи ляции и и м итации р ассм отр ен н ы х п роек тов и програм м . И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т Ии к• чт»я—ы PIC Применениеассемблера иСдля Р1С18 М уха м м ед А л и М азиди, Р о ли н МакЬСинли, Д эн н и К усэй Микроконтроллеры PIC и встроенные системы. Применение ассемблера и С для PIC18 -м IS B N 966-5-7931-0538-5 784 стр., мягкая облож ка Книга предлагает системный подход к программированию микроконтроллеров PIC и организации интерфейсов с помощью ассемблера и С. Материал излагается по принципу "от простого к сложному". В ходе этого рассматривается множество приме­ ров программ как на ассемблере, так и на С. Отдельные главы посвящены вопросам взаимодействия с периферийными устройствами, наподобие таймеров, ЖК-дисплеев, последовательных портов и двигателей. Ш пак Ю .А . Программирование на языке С для AVR и PIC микроконтроллеров. 2-е издание (+CD) IS B N 978-5-7931-0842-3 544 стр., мягкая облож ка В книге рассмотрено программирование на языке С микроконтроллеров AVR с использованием компиляторов WinAVR и CodeVisionAVR, а также микроконтролле­ ров PIC с использованием компиляторов CCS-PICC, mikroC и С30/32. Кратко рассмот­ рена архитектура и аппаратное обеспечение как традиционных восьмиразрядных микроконтроллеров AVR и PIC, так и новых семейств ATxmega, PIC24 и PIC32. Дано описание средств программной разработки, включая эмуляцию программ с помощью AVR Studio и MPLAB. Кратко рассмотрен стандартный синтаксис языка С и директивы препроцессора, а также особенности программирования на этом языке для микрокон­ троллеров. Книга содержит программные примеры на С, а также — справочник с опи­ санием системы ассемблерных команд микроконтроллеров AVR (включая ATxmega) и PIC (включая PIC24). Книги издательства “МК-Пресс” можно заказать: по адресу: 04209, г.Киев, а/я 42: по телефону/факсу: (044) 362-04-38 или по e-mail: info@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т Кравченко A .B . 10 практических устройств на AVR-микроконтроллерах. Книга 1 (+CD) IS B N 978-966-8806-41-4 224 стр., мягкая облож ка Данная книга открывает серию сборников с практическими примерами применения микроконтроллеров. В ней рассмотрены десять завершенных устройств на базе мик­ роконтроллеров А\/1Ч, которые можно легко собрать в домашних условиях и приме­ нять в быту или профессиональной деятельности: генератор световых эффектов; счетчик событий; музыкальный звонок; индикатор уровня звука; повышающий преоб­ разователь, схема управления шаговым двигателем; цифровой термометр и др. Благодаря подробному анализу аппаратной и программной части устройств, книга будет интересна и полезна как начинающим, так и опытным радиолюбителям, же­ лающим изучить методы эффективного применения микроконтроллеров. Заец Н.И. Радиолюбительские конструкции на PIC-микроконтроллерах (+CD). Книга 4 IS B N 966-8806-42-1 336 стр., мягкая облож ка Данная книга — практическое пособие по освоению микроконтроллеров PIC ком­ пании Microchip и другой современной элементной базы, наподобие индикаторов, вы­ полненных по COG-технологии. Рассмотрены алгоритмы работы, схемы и программы для различных полезных устройств: многофункциональных часов, отображающих те­ кущее время и температуру воздуха; автомобильных часов, фиксирующих время в пу­ ти и сообщающих о поломке реле-регулятора; автомата включения освещения; циф­ рового устройства для блока питания с установкой защиты по току и напряжению; специализированных термометров и др. Для начинающих дана глава о наладке уст­ ройств на микроконтроллерах. Книга предназначена для широкого круга радиолюбителей. а также будет полезна студентам, изучающим микроконтроллеры. Книги издательства “МК-Пресс” можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: info@ m k-press.com Посетите наш Internet-магазин: http://www.m k-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т Т и м У и лм сх ер с т Разработка встроенных систем с помощью микроконтроллеров PIC. Принципы и практические примеры (+CD) IS B N 978-5-903383-61-0 544 стр., мягкая облож ка Благодаря полезным примерам и иллюстрациям, эта книга дает глубокие познания в сфере проектирования систем с помощью микроконтроллеров PIC, а также — про­ граммирования этих устройств на ассемблере и С. Подробно рассмотрены микрокон­ троллеры 16F84A, 16F873A и 18F242. Даны примеры реальных проектов, включая мо­ дель робота, выполненного в виде транспортного средства с автономным управлени­ ем. Дополнительно рассматриваются такие вопросы повышенной сложности, как при­ менение устройств в сетевой среде и построение операционных систем реального времени. Барри Брэй Применение микроконтроллеров PIC18. Архитектура, программирование и построение интерфейсов с применением С и ассемблера (+CD) IS B N 978-5-7931-0516-3 576 стр., мягкая облож ка Сегодня микроконтроллеры используются повсеместно в автомобилях, бытовой технике, промышленном и медицинском оборудовании и т.п. Этот учебник дает все­ стороннее представление об архитектуре, программировании и построении интер­ фейсов этого современного чуда. На примере семейства микроконтроллеров PIC18 производства Microchip в книге объясняется архитектура, программирование и по­ строение интерфейсов. Семейство PIC18 выбрано не случайно, поскольку оно отно­ сится к самым современным восьмиразрядным микроконтроллерам. Изложенный в книге материал также применим как к бо лее ранним версиям микроконтроллеров Microchip, так и к аналогичным устройствам других производителей. Он рассчитан на опытных практиков и радиолюбителей, интересующихся микроконтроллерами. Книги издательства “МК-Пресс” можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: info@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т Л у с и о ди Д ж асио Программирование на С микроконтроллеров PIC24 (+CD) IS B N 978-5-7931-0529-3 336 стр., мягкая облож ка Лусио ди Джасио, эксперт из компании Microchip, предлагает свой уникальный взгляд на революционную технологию PIC24, проводя читателя от основ 16-разрядной архитектуры до сложных программных разработок средствами языка С, включая реа­ лизацию многозадачности с помощью прерываний PIC24, управление ЖК-дисплеями, формирование звуковых и видеосигналов, доступ к запоминающим устройствам большой емкости и др. Вне всякого сомнения, эта книга будет полезна как опытным PIC-разработчикам, так и новичкам в мире встроенных систем. Заец Н .И . Радиолюбительские конструкции на PIC-микроконтроллерах (+CD). Книга 1 IS B N 978-5-7931-0518-7 304 стр., мягкая облож ка Это издание переработано с целью исправления замеченных ошибок и уменьше­ ния объема за счет переноса статей, не пользующихся спросом, на прилагаемый ком­ пакт-диск. В книге представлено 20 описаний радиолюбительских устройств различно­ го назначения, выполненные на микроконтроллере PIC16F84. Начинающие радиолю­ бители, не знакомые с программированием микроконтроллеров, смогут без труда вос­ произвести лю бое устройство. Радиолюбители, имеющие опыт программирования, могут изменить программы и печатные платы под свои цели. Для этого в книге даны алгоритмы и исходные тексты программ с подробными комментариями. Автор также делится опытом работы с ассемблером MPLAB и различными средствами программи­ рования. Рассматриваются типичные ошибки при наладке устройств на микрокон­ троллерах. Книга предназначена для широкого круга радиолюбителей, а также может быть полезна студентам, изучающим программирование микроконтроллеров. Книги издательства “МК-Пресс” можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: ¡nfo@ m k-press.com Посетите наш Internet-магазин: http://www.m k-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т Кравченко A .B . 10 практических устройств на AVR-микроконтроллерах. Книга 2 (+CD) IS B N 978-5-7931-0532-3 320 стр., мягкая облож ка Это вторая книга из серии сборников с практическими примерами применения микроконтроллеров AVR. В ней подробно рассмотрены десять завершенных уст­ ройств на базе микроконтроллеров AVR, которые можно легко собрать в домашних условиях и применять в быту или профессиональной деятельности: генератор свето­ вых эффектов с помощью АЦП; схема управления шаговым двигателем; автомат ос­ вещения шкафа-купе; схема управления вентилятором; простой термометр; световой эффект “Призма”; микроконтроллерный генератор; робот, который двигается на свет и умеет обходить преграды; система радиоуправления моделью автомобиля; схема цифрового управления паяльником. Каждому устройству посвящена отдельная глава, где подробно описаны все этапы создания микроконтроллерной модели и программ, начиная со структуры и блок-схемы, и заканчивая самой программой и готовым рабочим кодом. И ванов В.Б. Программирование микроконтроллеров для начинающих. Визуальное проектирование, язык С, ассемблер (+CD) IS B N 978-5-7931-0559-0 176 стр., мягкая облож ка В этой книге автор проводит читателя по пути освоения программирования микро­ контроллеров от простого к сложному. Начав с краткого описания архитектуры и сис­ темы команд микроконтроллеров PIC, он переходит к визуальному проектированию в среде Flowcode, которое позволяет получить выполняемый код без каких-либо навы­ ков программирования на ассемблере или языке высокого уровня. В завершающих двух главах представлены примеры программирования микроконтроллеров PIC с помощью языка С в среде MikroC и ассемблера в среде MPLAB.___________________________ Книги издательства “МК-Пресс" можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: info@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т Кравченко A .B . 10 практических устройств на AVR-микроконтроллерах. Книга 3 (+DVD) IS B N 978-5-7931-0845-4 416 стр., мягкая облож ка Это третья книга из серии сборников с практическими примерами применения микроконтроллеров AVR. В ней основной упор сделан на модели роботов. В частно­ сти, подробно рассмотрены следующие десять завершенных устройств на базе мик­ роконтроллеров AVR, которые можно собрать в домашних условиях: измеритель с о л­ нечной активности; простой робот на солнечных батареях; усложненный робот на солнечных батареях; солнечный миниэлектромобиль; робот “Ползун”; робот “Sumo bot"; робот-проходчик лабиринта; светоэффект вращения; радиоуправляемый джип; робот-катер. Каждому устройству посвящена отдельная глава, где подробно описаны все этапы создания микроконтроллерной модели и программ, начиная со структуры и блок-схемы, и заканчивая самой программой и готовым рабочим кодом.________________ М арти Браун Источники питания. Расчет и конструирование IS B N 966-8806-01-8 288 стр., мягкая облож ка В книге поэтапно показано проектирование широкого набора источников питания. С ее помощью каждый, кто обладает базовыми познаниями в области электроники, сможет проектировать и создавать сложные источники питания. Кроме общих подхо­ дов к конструированию, представлено проектирование линейных, импульсных и квазирезонансных источников питания. Сложные вопросы, наподобие магнетизма и кон­ троля электромагнитных помех, разъясняются простым и доступным языком. Издание является практическим пособием, организованное таким образом, чтобы как опытные, так и начинающие разработчики могли быстро найти и применить требуемую им информацию.__________________________________________________________ Книги издательства “МК-Пресс” можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: info@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т Безверхний И.Б. TV-приемники на шасси VESTEL 11АКхх (+CD) IS B N 978-966-8806-11-7 304 стр., мягкая облож ка В данной книге рассмотрены телевизионные приемники на основе шасси 11АК20, 11АК30 11АК36 и РТ92 турецкой компании VESTEL. Сегодня на базе этих шасси д е­ сятки различных производителей поставляют на рынок под различными торговыми марками сотни моделей телевизоров. Подробно описаны: элементная база, схемы, сервисные режимы, регулировка и ряд вопросов практического характера. Отдельная глава посвящена современным видеопроцессорам производства PHILIPS. В приложе­ нии представлены справочные данные на современные видеопроцессоры различных производителей. О уэн Бишоп Настольная книга разработчика роботов (+CD) IS B N 978-5-7931-0559-0 176 стр., мягкая облож ка Эта книга представляет собой справочное руководство для тех, кто хочет научить­ ся проектировать и конструировать роботов. Благодаря представленным в ней поша­ говым инструкциям, вы быстро освоите методики создания забавных и захватываю­ щих роботов. На основании своего обширного практического опыта автор открывает важные аспекты программирования, электроники и механики, характерные для робо­ тотехники. Поскольку все проекты основаны на использовании всемирно популярных микроконтроллеров PIC, методики программирования осваиваются быстро и безбо­ лезненно. Данное руководство — идеальный вариант для новичков в сфере робото­ техники. Оно будет также полезно тем опытным разработчикам, которые хотят расширить свои познания в области программирования роботов. Книги издательства “МК-Пресс" можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: info@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т А врам енко Ю .Ф . Мобильные телефоны LG. Ремонт и обслуживание. Том I (+CD) мобильные!, ТЕЛЕФОНЫ) L '3 IS B N 978-966-8806-29-2 PtwoHiиобслуживание 576 стр., мягкая облож ка Книга составлена на основании сервисной документации LG Electronics. В ней подробно рассмотрены схемотехнические решения современных мобильных телеф о­ нов на базе БИС обработки аналоговых и цифровых сигналов производства ANALOG DEVICES. Представлены сведения о работе всех функциональных устройств телеф о­ нов стандарта GSM. На прилагаемом к книге компакт-диске, приводятся электриче­ ские принципиальные схемы на рассмотренные модели и справочные данные на э л е ­ ментную базу ведущих производителей интегральных схем для систем беспроводной связи. Книга рассчитана на широкий круг специалистов, занимающихся сервисным об­ служиванием мобильных телефонов. А врам ен ко Ю .Ф . Мобильные телефоны 1_С. Ремонт и обслуживание. Том II (+Сй) IS B N 978-966-8806-32-2 576 стр., мягкая облож ка Книга составлена на основании сервисной документации LG Electronics. В ней подробно рассмотрены схемотехнические решения современных мобильных телеф о­ нов на базе БИС обработки аналоговых и цифровых сигналов производства ANALOG DEVICES. Представлены сведения о работе всех функциональных устройств телеф о­ нов стандарта GSM. На прилагаемом к книге компакт-диске, приводятся электрические принципиальные схемы на рассмотренные модели, а также сервисная документация на мобильные телефоны производства SAMSUNG и NOKIA. Книга рассчитана на ши­ рокий круг специалистов, занимающихся сервисным обслуживанием мобильных те­ лефонов. Книги издательства “МК-Пресс” можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: info@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т К ри д Х а д лсто н Проектирование интеллектуальных датчиков с помощью Microchip dsPIC (+CD) IS B N 978-966-8806-38-4 320 стр., мягкая облож ка На страницах этой книги раскрыты способы применения популярных цифровых контроллеров сигналов Microchip dsPIC, в которых вычислительный потенциал мощ­ ных цифровых процессоров сигналов удачно объединен с возможностями микрокон­ троллеров PIC. Рассматриваются вопросы не только программирования, но и проек­ тирования электронного оборудования. Таким образом, читатель получает полное представление о процессе создания интерфейса для трех конкретных типов датчиков: температуры, давления/нагрузки и расхода. Книга раскрывает реальные проблемы, возникающие в повседневной работе разработчиков, и показывает решения, позво­ ляющие реализовать все сильные стороны интеллектуальных датчиков. А врам ен ко Ю .Ф . Качественный звук — сегодня это просто IS B N 966-8806-27-1 286 стр., мягкая облож ка В книге максимально подробно приведены все рекомендации разработчиков - ин­ женеров NSC, как правильно построить усилительный тракт на основе мощных ОУ. Современный подход, основанный на рекомендациях инженеров AD и TI, к топологии печатной платы, к выбору «правильных» пассивных компонентов для звуковоспроиз­ водящего тракта поможет реализовать основной принцип: как можно меньше ухуд­ шить качество записи. Большое количество примеров построения качественных УМЗЧ будет наглядным пособием для реализации собственной конструкции в короткие сроки с небольшими материальными затратами и главное, с предсказуемым результатом. Книги издательства “МК-Пресс” можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: ¡nfo@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т Санджая М аниктала Ж ,«, г Г источники \ ПИТАНИЯ \ от до ^ Импульсные источники питания от А до Z (+CD) IS B N 978-5-903383-59-7 544 стр., мягкая облож ка w m n tM iu K o n Эта книга основывается на десятилетнем авторском опыте проектирования источ­ ников питания. Здесь читатель найдет наглядное и доступное введение в курс “Источ­ ники питания”; изложение основ без пугающего математического анализа; полную и, в то же время, уникальную по своей простоте методику проектирования импульсных преобразователей и их магнитных компонентов; подробный расчет всех видов потерь в импульсных источниках питания; описание основных схемотехнических решений импульсных источников; исчерпывающее исследование аспектов контроля и измере­ ния паразитных электромагнитных излучений, связанных с работой импульсных пре­ образователей. Г .-Й . Берндт, Б. Каинка малросошV B A в Word и Excel Измерение, управление и регулирование с помощью макросов VBA в Word и Excel (+CD) IS B N 978-5-7931-0504-0 256 стр., мягкая облож ка Эта книга представляет новый подход, согласно которому весь диапазон задач измерения, управления и регулирования реализуется средствами популярного про­ граммного пакета Microsoft Office. Хотя это звучит необычно, с помощью приложений Word и Excel можно получить прямой доступ к аппаратному обеспечению, что делает их универсальными и простыми в использовании инструментами. В книге показано, как с помощью макросов VBA реализовать управление цифро­ выми мультиметрами, релейными картами и ПК-интерфейсами, организовать взаимо­ действие с микроконтроллерными системами и многое другое на основе стандартного последовательного интерфейса RS232.___________________________________________________ Книги издательства “МК-Пресс” можно заказать; по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: info@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com И з д а т е л ь с т в о “ М К -П р е с с ” п р е д с т а в л я е т К у б о в В .И . Исследование схем импульсных источников питания в SwCAD/LTspice (+CD) IS B N 978-5-7931-0560-6 208 стр., мягкая облож ка В книге рассматривается моделирование импульсных преобразователей с индук­ тивными элементами и трансформаторами в пакете SwCADIII/LTspice от известного изготовителя микросхем Linear Technology. В ходе изложения материала параллельно изучаются приемы работы с пакетом и исследуются особенности конкретных схем. Большое внимание уделяется вопросам теоретического анализа процессов коммута­ ции в индуктивных элементах и трансформаторах. Даются практические рекоменда­ ции по построению импульсных источников питания. М оскатов Е .А . Источники питания IS B N 978-5-7931-0846-1 208 стр., мягкая облож ка В книге даны расчетные соотношения, принципиальные схемы и описания принци­ па действия различных выпрямителей, сглаживающих фильтров, стабилизаторов на­ пряжения и тока, импульсных преобразователей, а также электропитающих систем, выполненных на их основе. Подробно рассмотрены компоненты, из которых изготав­ ливают современные источники питания. Приведены основные теоретические поло­ жения и рекомендации по конструированию как традиционных, так и специальных электропитающих устройств. Материал будет интересен радиолюбителям, научнотехническим работникам и студентам технических специальностей.. Книги издательства “МК-Пресс” можно заказать: по адресу: 04209, г.Киев, а/я 42; по телефону/факсу: (044) 362-04-38 или по e-mail: info@mk-press.com Посетите наш Internet-магазин: http://www.mk-press.com U f W - г Г Г ББК 32.973-04 УДК 004.312 П80 Прокопенко В. С. П80 Програмування к/пкроконтролерт ATMEL на MOBi С. - К.: “МК-Пресс”, СПб.: “КОРОНА-ВЕК”, 2015. - 320с„ ¡л. ISBN 978-5-7931-0906-2 (“КОРОНА-ВЕК’) ISBN 978-966-8806-73-5 (“МК-Пресс”) Ця книга — зб1рка прикпадш програм на MOBi С для мкроконтролерш виробництва ATMEL. У якосп засобш розробки та ¡мп~ацм використано комптятор WinAVR, середовище AVR Studio та ¡м1татор схем Proteus ISIS. Синтаксичн! особливост1 мови С та методи роботи з вищезгаданими ¡нструментальними засобами в книз! докпадно не розглядаються, осюльки автор переслщував мету дати максимальну юльюсть практичних приклад1в використання тих чи ¡нших перифер1йних пристроТв м1кроконтролера: таймер1в/л1чильниюв, приймач-передавач U(S)ART, аналогового компаратора, АЦП, ¡нтерфейс1в SPI та TWI, пам'ят1 Flash i EEPROM. Окремий р озд т присвячено взаемодн з PK-дисплеем. Таким чином, це видання розраховано на тих читачш, яю, маючи базов1 знания мови С, бажають навчитися застосовувати Тх у работ1 з м1кроконтролерами ATMEL. ББК 32.973-04 Головний редактор: Ю. О. Шпак Вщдруковано з готових д1агтозитив1в в друкарн! ТОВ “Друкарня “Рута” (свщ. Сер1я ДК №4060 вщ 29.04.2011 р.) м. Кам’янець-Подшьський, вул. Пархоменка, 1 тел. 0 38 494 22 50, drukruta@ukr.net Замовленя №611. ISBN 978-5-7931-0906-2 (“КОРОНА-ВЕК”) ISBN 978-966-8806-73-5 (“МК-Пресс”) © Прокопенко B.C., текст, ¡люстрацн, 2011 © "МК-Пресс”, оформления, 2015