Програмиране в AVR Studio 5 от самото начало

studio

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

Съдържание

T0, T2– (TCNT0, TCNT2) осемцифрени броячи (четни)TCNTn- броещ регистър на 8-разряден брояч където; n-брояч номер

T1, T3– (TCNT1Н и TCNT1L, TCNT3H и TCNT3L) 16-битови броячи (нечетни)TCNTny- 16-битов брояч регистър където; n-число на брояча y-най-висока (H) или най-малка значима (L) цифра

T1 се състои от два осембитови регистъраTCNT1H и TCNT1L, а T3 се състои от два регистъраTCNT3H и TCNT3L. БукватаHобозначава висок ред, аLнисък ред.

Тъй катотаймеритеса регистри, те могат да бъдат достъпни по всяко време, четене, записване, нулиране и промяна на стойността. Приети са специфични правила за писане и четене на таймери TCNT1H и TCNT1L.

1. Програмите за писане и четене на таймерни данни трябва да са атомарни, т.е. преди четене или писане деактивираме прекъсванията и в края на процеса ги активираме отново. 2. При запис първо се записва старшият байт H и след това младият байт L. 3. При четене първо се чете младият байт L, след това старшият байт H. Например: Запишете данни в броячния регистър.

Четене на данни от регистъра за преброяване

Защо такива правила?И всичко това, за да не се изкривяват данните през времето, необходимо за четене от всеки регистър. Ако използвате директно четене на 8-битовите регистри TCNT1H и TCNT1L, тогава не можете да сте сигурни, че тезирегистрите бяха прочетени едновременно. Може да възникне следната ситуация: Броячът съдържаше стойността $01FF, вие четете TCNT1H (съдържаща стойността 01 в някаква променлива). През това време дойде импулс за броене и съдържанието на TCNT1L стана равно на $00, а стойността на $02 беше записана в TCNT1H.

Сега четете стойността на TCNT1L в друга променлива, получавате стойност $00 в тази променлива (тъй като таймерът/броячът вече е преброил). 16-битовата стойност на тези променливи се оказа $0100, но по време на четенето на високия байт съдържанието на брояча беше $01FF и трябваше да прочетете ниския байт като FF. За да се предотврати тази ситуация, в блока на таймера/брояча се съдържа временен регистър. Този регистър е прозрачен, т.е. работи автоматично. При четене на стойността на регистъра TCNT1L в променлива, съдържанието на TCNT1H попада в този регистър. След това, при четене на високия байт в променливата, се чете стойността на временния регистър. Временният регистър е абсолютно прозрачен за потребителя, но за коректната му работа е необходимо да се следва горната последователност от действия. Достъпът до регистрите чрез допълнителен (буферен) регистър се нарича двойно буфериране

Таймерите са свързани с импулси за броене, които могат да бъдат външни и подавани към специален вход на микросхемата или генерирани от собствен генератор. От своя страна честотата на собствения му осцилатор може да се синхронизира от външен кварцов резонатор или може да се определя от вътрешна RC верига. След това външната честота или честотата на нейния собствен осцилатор преминава през предскалера, управляван от регистъраCLKPR. Входна честота на таймераозначено като CLKTnТази честота съответства на тактовия сигнал на процесора. Един импулс на брояча увеличава стойността на таймера с единица, така че TCNT регистрите са регистри на брояча исе нарича Таймер/Брояч (TC). За правилна работа на таймер/брояч на външен часовник, минималното време между две превключвания на външен часовник трябва да бъде поне един тактов период на процесора. Външният часовников сигнал се синхронизира с нарастващия фронт на вътрешния часовников сигнал на процесора. (Това трябва да се помни при изграждането на честотни броячи). Контролният регистър за таймер/броячTCNTе регистърTCCR.Маската за прекъсванеза таймер/броячTCNTеTIMSK(Регистър за управление на прекъсване на таймера).Регистърът на флага на маската за прекъсване на TIMSK е регистърът TIFR. Не забравяйте, че тези 3 регистъра (TCCR, TIMSK, TIFR) се използват почти винаги, когато TCNT таймерът/броячът работи.

Прекъсванията могат да бъдат извиканичрез препълване на регистъра TCNT, сравняване на стойността на регистъра TCNT със стойността на специалните регистри за сравнение OCR, улавяне - от стойностите на специалните регистри за улавяне ICR и се определят от режима на работа на таймера / брояча. В допълнение, заявка за прекъсване може да бъде задействана отWatchdog Timer WDT.

Таймерите/броячите могат да работят в различни режими и съответно да изпълняват различни функции. Режимът на работа, тоест поведението на таймера/брояча и изхода на съвпадащия сигнал, се определя като режим на работа на генератора на сигнали, управляван от регистриWGM02; WGM01; WGM00(съкратена нотацияWGM02:0) и режим на изходен сигнал за съвпадение, контролиран от регистриCOM0x1; COM0x0(съкратено отCOM0x1:0).Състоянието на битовете, които определят изходния режим на съвпадащия сигнал, не влияе на последователността на броене, която се определя само от състоянието на конфигурационните битове на генератора на сигнали.

БитоветеCOM0x1:0определят дали изходът на ШИМ трябва да бъде инвертиран или не (инвертиран или неинвертиран ШИМ).(PWM) Широчинно-импулсна модулация или Широчинно-импулсна модулация (PWM).За режими без PWM, съдържанието на битовете COM0x1:0 определя дали изходният сигнал трябва да бъде зададен на единица, нулиран на нула или превключен в противоположно състояние по време на съвпадение

↑ Разграничават се следните режими на работа на таймерите:

Нормално- броене и прекъсване при препълване. В този режим, когато битътTOIEна регистърTIMSKе зададен, възниква заявка за прекъсване. Условието за прекъсване ще бъде нулиране на регистъра на таймераTCNT, което се случва, след като всички клетки са пълни (след числото 0xFF) и се фиксира чрез хардуерно повдигане на флага за препълванеTOVв регистъраTIFR. ФлагътTOV0се държи като деветия бит в този случай, с изключение на това, че е само зададен, а не изчистен. Използвайки прекъсване при препълване на таймера, което автоматично изчиства флагаTOV0, можете програмно да увеличите коефициента на преобразуване. Нормалният режим няма други функции и се счита за най-простият.

Capture– (capture) съхраняване на стойността на брояча в специален регистър за улавянеICRxчрез управляващ сигнал (от специален вход на микроконтролера(ICP)или от изхода на вградения компаратор), където x- съответства на номера на брояча. Едновременно с прихващането, заявка за прекъсване и преход към векторите за прекъсване -CAPT. Прекъсването се задава в този режим чрез битICIEилиTICIEв регистърTIMSKи се коригира чрез повдигане на флагICFв регистърTIFR.

CTC– (Изчистване на таймера при сравнение) Изчистване на таймера при сравнение – Сравнете със стойността на специалните OCR съвпадащи регистри, които се използват за контролиране на скоростта на преобразуване на брояча. Има заявка за прекъсване и преход към вектори за прекъсване -COMP. Регистрите за съвпадение са обозначени катоOCRnxyкъдето; n - номер на брояч,x-регистър A или B (ако има 2 регистъра за съвпадение, тогава означете първия като регистър A, а втория като регистър B, всеки от тях може да бъде 16 бита)y- висок (H) или нисък (L) бит на регистрите за съвпадение.

В повечето модели микроконтролери един осембитов таймер съответства на два осембитови OCR регистъра за сравнение, регистър A и регистър B. Например таймерът TCNT0 съответства на два регистъра за сравнение OCR0A и OCR0B. Ако таймерът е шестнадесет-битов, тогава четири осем-битови регистъра за сравнение съответстват на него, например таймерът TCNT1 съответства на OCR1AH ​​​​и OCR1AL, OCR1BH и OCR1BL.

В режим CTC възниква заявка за прекъсване, таймерите се нулират (когато съвпадат с OCR1 и OCR1A) или състоянието на щифтовете на микроконтролера се променя, което зависи от зададените настройки на таймера.

Стойностите на клетките на регистрите TIMSK и TIFR в различни модели микроконтролери имат подобни функции и имена, но могат да се различават по местоположение и не създават затруднения при превключване от един контролер към друг.

Флаговете съответстват на прекъсванията в регистъра TIMSK. Задайте на "1", когато са изпълнени условията за съответното прекъсване.