Avr урок 10

Днес ние знаем, че такива насрещно таймери в микроконтролери и това, което правят, и това, което прекъсва и това, което те се нуждаят също.

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

И тези таймери, броячи постоянно мислят, ако ги инициализира.

Таймери в MC ATmega8 три.

Двама от тях - това осем-битови таймери, тоест тези, които могат да разчитат само да увеличите тази стойност до 255. Ние ще бъдат достатъчни. Дори и да се прилага максималната честота разделител, ние не сме толкова малко брои, ние дори не можем да намерим половин секунда. И ние имаме точно такава задача да се брои за 1 секунда, за да контролира сметка застроена LED. Вие със сигурност може да се използва по-променливи капацитет до определена стойност, но това ще бъде изцяло хардуер сметка.

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

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

Сега, накратко за прекъсвания.

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

В нашия контролер ATmega8 има 19 вида прекъсвания. Ето ги и тях в таблицата в техническата документация за контролера

Avr урок 10

Какви видове условия може да бъде? В нашия случай, например, таймерът брои до определена стойност или например към някои автобус дойде байта и други условия.

Сега нека да разгледаме нашия таймер 16-битов или TIMER1.

Тук е неговата структурна схема

Avr урок 10

Ние виждаме там TCNTn регистрирате. който постоянно се променя броя, което означава, че непрекъснато се разраства. На практика това е на тезгяха. Такъв е случаят и броя на магазините, на които броят на таймера и.

И в регистрите и OCRnA OCRnB (буквата N - броя на таймера, в нашия случай това ще бъде 1) - регистър, в който ние се регистрира броя, който ще бъде в сравнение с Хилон TCNTn регистрирате.

Например, ние сме донесе някакъв номер, в случай OCRnA и веднага след като този брой е съчетана със стойността в регистъра на сметка, е прекратяване и ние сме в състояние да обработва. Таймер прекъсвания са много подобни на обичайното закъснение в кода, само когато сме в забава, ние в този момент не може да направи всеки код (добре, отново метафорично "ние" всъщност ALU). А когато каза таймера, целия код на програмата ни в този момент се извърши безопасно. Така че ние получаваме значително, без да дава празен ход огромен контролер ресурс за секунди или дори половин секунда. По това време, ние можем да се справят с натискане на бутони, ние можем да се справят с таймер и други.

Налице е също така регистър TCCR. Този регистър - регистър контрол. Там са посочени някои бита, отговорни за конфигурация таймер.

Също така, има няколко режима на таймера се, научихме малко pozdenee.

Тя се състои от две половини, тъй като ние konotroller 8-битов, и то не може да бъде 16-битови регистри. Ето защо, в половината от регистъра (физически и в един случай) се съхранява най-старата част на регистъра, а другият - най-младият. Също така може да се нарече регистър двойка, състояща се от две отделни регистри и TCCR1A TCCR1B. Броят 1 показва, че регистърът на таймера 1 принадлежи.

Дани регистри на TCCR носи отговорност за определяне на разделител на таймера не е толкова бърз мисъл както казва той (или по-скоро си някои бита) за определяне на специфичен режим.

За Mode Setting отговарят WGM бита

Avr урок 10

Тук виждаме много разновидности на режима.

Нормално - това е нормален режим, таймерът отброява до края.

PWM - PWM е само на различни видове, което означава, че Таймерът може да играе ролята на модулатор на импулса. С тази технология, ще се срещнем в следващите уроци.

CTC - се връща случайно, е точно това, което ние ще трябва. Ето най-после sravnivyutsya TCNT регистри и OCR. Има два режима, ние трябва първо, второ, да работи с други регистри.

Всички видове режими ние не се учат в този урок. Когато ние изискваме тези режими, а след това го кажем.

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

Кодът, както винаги, е създаден от последния проект. За да Протей като кодът е бил копиран и преименуван с последните уроците, а в качествата на контролера е на пътя към новия фърмуер. Проектите ще бъдат наречени Test07.

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

Добавяне на друга функция, в полза на добавяне функции на последния урок, който научих. Функция Код пост след segchar функция преди основната функция. След дължи на факта, че ние ще бъдем в рамките на новите ни функции да причини segchar функция.

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

Следователно, първата функция ние nazvovom timer_ini

Тази функция, както видяхме не разполага с никакви аргументи - без вход, няма връщане назад. Нека просто се обадете на тази функция в основната (функцията)

неподписан овъгляване butcount = 0, butstate = 0;

Сега започваме тази функция спокойно попълване на код.

Да започнем с регистър за контрол на таймера, като TCCR1B. Използването на любимия ни операция "ИЛИ", ние сме в определен бит регистър zanesom yedinichku

нищожен timer_ini (свободен)

TCCR1B | = (1<

Също така, има таймер, който е по-случай - TIMSK. Този регистър е отговорен за прекъсване маска - Прекъсване маска. Този регистър достъпен за всички таймери, не само за първата, тя е обща. Ето, ние се бит регистър OCIE1A на. което ще ни даде възможност да се коригира типа прекъсване на TIMER1 ком

TCCR1B | = (1<

TIMSK | = (1<

Сега нека да играе скорост с сравнението регистрира OCR1A (H и L). Той ще има малко, за да се брои. OCR1AH ​​регистрирате магазини високи номера за сравнение, и регистъра OCR1AL - по-млади.

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

TIMSK | = (1<

OCR1AH ​​= 0b10000000; // пишете на регистрационен номер от регистъра за сравнение

TCCR1B | = (); // задаване на делител.

Докато не се дели не е настроена, тъй като още не сме взети под внимание. Нека ние ще направим това.

Докато ние в регистъра е броят OCR1A 0b1000000000000000, което съответства на десетичната номер 32768.

Мик работи за нас, тъй като ние се съгласихме, при честота от 8000000 Hz.

8000000 да се разделят 32768 получи приблизително 244.14. Но с такава честота в херца, и ще работи нашата таймер, ако не се прилага по отношение на разделителя. Това означава, че броят ни ще бъдат променени 244 пъти в секунда, така че ние дори не виждам. Ето защо е необходимо да се прилага таймер честота разделител. Ние избираме разделителя 256. нас просто подходящ, а дори и до 1 Hz, ние ще се промени броят и след това сравнение.

Ето какви са разделители за таймер 1

Avr урок 10

Аз се подчертава в таблицата ни изисква разделител. Ние виждаме това, което искаме да се създаде само малко CS12.

Тъй като честотата разделител имаме 256, то това делител разделяме 8000000, получи 31 250, което е тук, ние трябва да се приведе в редица TCNT. До този номер и ще вземе нашия таймера, за да брои до 1 секунда. Броят 31250 - е в двоичен представителство 0b0111101000010010. Zanesom определен брой в регистър двойка, и е приложима и разделител

OCR1AH ​​= 0b01111010; // пишете на регистрационен номер от регистъра за сравнение

С тази функция всички.

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

И тялото на тази функция ще се извършва от самата основа на факта на съвпадението на числата.

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

Съответно, от кода в основната () сме същата променлива uberom

неподписан овъгляване I;

Сега, в действителност, тялото на водача. Тук ние ще се обади segchar функция. След това ще се увеличи до 1 променлива аз. И така, тя не излиза извън рамките на едноцифрени числа, това ще се нулира при това състояние

Сега малко на правилен код първата функция основната (). Г. Port е отговорен за състоянието на сегментите zabem мои, че когато е включен, ние не свети, тъй като с общ анод. След това ние сме тук zanesom номер 0 в globavlnuyu променлива аз, само проформа. Като цяло, като правило, в началото на neitsializirovannyh променливи и така винаги е нула. Но ние все още го инициализира. И най-важното, за да таймера прекъсване на работа, това не е достатъчно, за да се включат в таймерът за инициализация. Също така, по принцип за всички прекъсва глобалната прекъсване трябва да бъде решен. За тази цел има специална функция SEI () - Задаване на прекъсванията.

Сега кодът ще бъде като този

Също така, ние трябва да го свържете прекъсване библиотека файл файл първи

// неподписан овъгляване butcount = 0, butstate = 0;

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

Avr урок 10

Всичко работи за нас. Отличен!

Ето такава, имаме хронометър. Но тъй като ние дори не разполагат с кварцов резонатор, това хронометър не може да се счита за точна.

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

Купете програмист тук (надежден продавач) USBASP USBISP 2.0