AVR134 часовник за реално време на tinyAVR и megaAVR, avr, програмиране

Листът с данниAVR134 [1] описва изпълнението на часовника за реално време (Часовник за реално време,RTC ) със следните характеристики:

• RTC с много ниска мощност (4 µA при 3.3V) • Решение с много ниска цена • Регулируем предскалер с регулируема точност • Броене на време, дата, месец, година с автоматична конфигурация на високосна година • Година 2000 съвместим формат на дата • Може да се използва на всички AVR микроконтролери, оборудвани с RTC модул • Включен с доставена бележка C код за ATMega128

Тази бележка за приложението показва как да направите RTC на AVR® микроконтролери, които имат вграден RTC модул. Изпълнението изисква свързването само на един външен компонент - 32.768 kHz тактов кристал. Приложението консумира много малко енергия, тъй като микроконтролерът прекарва по-голямата част от времето си в режим на ниска мощност. В този режим изчислителното ядро ​​на AVR "спи", работи само таймерът, часовник от свързания външен кварц. При всяко препълване на таймера се изчисляват часът, датата, месецът и годината. Тази RTC реализация е написана за ATmega128 и може успешно да бъде пренесена към други AVR микроконтролери с RTC модул. Предимствата от използването на предложената RTC опция в сравнение с използването на външен специален RTC чип са очевидни:

• Ниска цена • Малко външни компоненти, проста схема (само 1 кристал) • Ниска консумация на енергия • По-голяма гъвкавост

Забележка. преводач: всъщност няма толкова много AVR микроконтролери, които имат RTC модул, и много от тях не могат да се нарекат евтини. По-долу е техният пълен списък към днешна дата 150104.

8-битов AVR с RTC модул: AT90CAN32, AT90CAN64, AT90CAN128,AT90USB1286, AT90USB1287, AT90USB646, AT90USB647, ATmega128, ATmega128A, ATmega1280, ATmega1281, ATmega1284, ATmega16, ATmega16A, ATmega162, ATmega164, ATmega1 65, ATmega168, ATmega169, ATmega2560, ATmega2561, ATmega32, ATmega32A, ATmega324, ATmega324A, ATmega325, ATmega325A, ATmega3250, ATmega328, ATmega329, ATmega329A, AT mega3290, ATmega3290A, ATmega406, ATmega48, ATmega48A, ATmega64, ATmega64A, ATmega640, ATmega644, ATmega64 4A, ATmega645, ATmega645A, ATmega6450, ATmega6450A, ATmega64 9, ATmega649A, ATmega6490, ATmega6490A, ATmega8, ATmega8A, ATmega8535, ATmega88, ATmega88A, ATtiny1634, ATtiny167, ATtiny828, ATtiny87.

8-битни AVR XMEGA c модул RTC: ATxmega128A1, ATxmega128A1U, ATxmega128A3, ATxmega128A3U, ATxmega128A4U, ATxmega128B1, ATxmega128B3, ATxmega128C3, ATxmega128D3, ATxm ega128D4, ATx mega16A4, ATxmega16A4U, ATxmega16C4, ATxmega16D4, ATxmega16E5, ATxmega192A3, ATxmega192A3U, ATxmega192C3, ATxmega192D3, ATxmega256A3, ATxmega256A 3B, ATxmega256A3BU, ATxmega256A3U, ATxmega256C3, ATxmega256D3, ATxmega32A4, ATxmega32A4U, ATxmega32C3, ATxmega32C4, ATxmega32D3, ATxmega32D4, ATxmega32E5, AT xmega384C3, ATxmega64A1, ATxmega64A1U, ATxmega64A3, ATxmega64A3U, ATxmega64A4U, ATxmega6 4B1, ATxmega64B3, ATxmega64C3, ATxmega64D3, ATxmega64D4, ATxmega8E5.

32-битови AVR c модул RTC: AT32UC3A0128, AT32UC3A0256, AT32UC3A0512, AT32UC3A1128, AT32UC3A1256, AT32UC3A1512, AT32UC3A3128, AT32UC3A3256, AT32UC3A364 , AT32UC3A4128, AT32UC3A4256, AT32UC3A464, AT32UC3B0128, AT32UC3B0256, AT32UC3B0512, AT32UC3B064, AT32UC3B1128, AT32UC3B1256, AT32UC3B1512, AT32UC 3B164, AT32UC 3C0128C, AT32UC3C0256C, AT32UC3C0512C, AT32UC3C064C, AT32UC3C1128C, AT32UC3C1256C, AT32UC3C1512C, AT32UC3C164C, AT32UC3C2128C, AT32UC3C2256C, AT32UC3C251 2C, AT32UC3C264C, AT32UC3L0128, AT32UC3L016,AT32UC3L0256, AT32UC3L032, AT32UC3L064, ATUC128D3, ATUC128D4, ATUC128L3U, ATUC128L4U, ATUC256L3U, ATUC256L4U, ATUC64D3, ATUC64D4, ATUC64L3U, ATUC64 L4U.

[Малко теория: как работи ]

Реализацията на RTC позволява асинхронна работа на RTC модула. В този режим Timer/Counter0 работи независимо от тактовата честота на ядрото на AVR.

На фиг. Фигура 2-1 показва как AVR микроконтролерът обикновено работи от 4 MHz основен часовник. Когато е необходимо да работи с намалена консумация на енергия, AVR преминава в Power-down режим, при който работи само асинхронният таймер от външната кристална честота 32.768 kHz.

Софтуерният часовник за реално време (RTC) се реализира с помощта на 8-битов таймер/брояч, работещ в режим на прекъсване при препълване на таймер/брояч. Програмата управлява прекъсване при препълване, за да изчисли времето и календарните променливи. Прекъсването на препълването на таймера се използва за правилно актуализиране на програмните променливи секунда (секунди), минута (минути), час (часове), дата (дата), месец (месец) и година (година).

време

Ориз. 2-1. Свързване на генератора към RTC.

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

За да намали консумацията на енергия, микроконтролерът AVR влиза в режим на пестене на енергия, в който всички модули на микроконтролера са деактивирани, с изключение на RTC. Както е показано в таблица 2-1, ядрото на AVR обикновено черпи по-малко от 4µA в този режим. Микроконтролерът ще се събуди, когато възникне прекъсване.препълване на таймера (Прекъсване на препълване на таймера). Кодът за обработка на прекъсвания в активен режим на ядрото ще се изпълнява и ще актуализира променливите на таймера.

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

За да изчислите общата консумация на енергия, добавете консумацията на енергия в режим на пестене на енергия към консумацията на енергия в активен режим. Времето, необходимо за актуализиране на променливите на таймера в манипулатора на прекъсванията, е по-малко от 100 тактови цикъла на ядрото, което е 25 µs при 4 MHz. Консумацията на енергия за този кратък период от време е незначителна. Много по-важно е времето за събуждане на микроконтролера. Може да се програмира за 35ms при използване на външен кристал или 1ms при използване на външна керамика. Примерна диаграма, която се събужда всяка секунда, за да актуализира RTC променливите, показва консумацията на енергия за два типа източници на часовник:

часовник

Ориз. 2-2. Диаграма на потреблението на ток за кварцов резонатор, стартово време 35 ms (Startup Time).

Обща консумация на ток за секунда:

= (1s * 4µA) + (35ms * 6mA) = 4µAs + 210µAs = 214µAs (микроампера за секунда)

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

време

Ориз. 2-3. Диаграма на потреблението на ток за керамичен резонатор, стартово време 1 ms (Startup Time).

Обща консумация на ток за секунда:

= (1 s * 4 uA) + (1 ms * 6 mA) = 4µAs + 6 µAs = 10 µAs

Оказва се, че намаляването на продължителността на старта ще доведе до намаляване на консумацията на ток от 214 µAs до 10 µAs.

Таблица 2-1. Консумация на ток от AVR микроконтролера във всеки режим.

Забележка (1): CK = 32,768 kHz.

[Пример за конфигурация ]

Както е показано на фиг. 2-1, кристалът трябва да бъде директно свързан към щифтовете на микроконтролера TOSC1 и TOSC2. По-новите устройства изискват допълнителни външни кондензатори на тези изводи (поради разликите в изпълнението на вътрешния осцилатор), така че вижте листа с данни за вашия микроконтролер за подробности относно свързването на външен резонатор. Осцилаторът е оптимизиран да работи на 32,768 kHz от външен тактов кристал или от външен часовников сигнал между 0 Hz и 256 kHz. В този пример за изпълнение 8 светодиода (LED) са свързани към порт B на микроконтролера и се използват за показване на състоянието на RTC. Светодиодът на пин PB0 ще показва промяната на състоянието всяка секунда. Други 6 светодиода (PB6..PB1) показват минутите в двоична система и последният светодиод, свързан към PB7, свети за един час и е изключен за още един час.

Трябва да се имат предвид някои условия, когато таймерът/броячът се тактува от източник, който е асинхронен спрямо системния часовник. Кристалът от 32,768 kHz има време за стабилизиране до една секунда след включване. Следователно микроконтролерът не трябва да влиза в режим на пестене на енергия по-рано от 1 секунда след включване. Също така трябва да се погрижите за превключването на режима на таймера в асинхронен режим. За подробности относно тези проблеми вижте листа с данни за използвания микроконтролер. Данните от регистъра на таймера се прехвърлят към временен регистър и се заключват.там след 2 цикъла на външни часовници. Регистърът за асинхронно състояние (ASSR) съдържа флагове за състояние, които могат да бъдат проверени, за да се контролира кога записаният регистър е актуализиран.

[Внедряване ]

Софтуерът се състои главно от две подпрограми. Процедурата на брояча е манипулатор на прекъсване на таймера/препълването на брояча ISR, той актуализира всички променливи на таймера, когато броячът на таймера препълни (това събитие се случва всяка секунда). Втората процедура, not_leap, коригира датата за високосни години. Основната програма конфигурира всички необходими I/O регистри, за да активира RTC модула и контролира последователността за въвеждане при изключване на захранването.

Битът AS0 в регистъра за асинхронно състояние (ASSR) е настроен да конфигурира Timer/Counter0 да бъде тактован от външен източник. Само тогава таймерът може да работи асинхронно. Таймерът се нулира и за него се задава желаното съотношение на делене на предскалера (така че тактовата честота да е 256 Hz и таймерът да препълва след всеки 256-ти импулс, т.е. всяка секунда). За да се синхронизира с външен часовников сигнал, програмата изчаква ASSR регистърът да бъде актуализиран. Битът TOIE0 в TIMSK (Регистър на маската за прекъсване на таймера/брояча) след това се настройва да активира прекъсването на препълването на таймера/брояча. Битът за разрешаване на глобално прекъсване в SREG (Регистър на състоянието) също е настроен да разрешава всички прекъсвания. Битовете SM1 и SM0 в MCUCR (контролен регистър на MCU) са настроени за избор на режим за пестене на енергия. След това инструкцията SLEEP поставя микроконтролера в режим на заспиване.Основният безкраен цикъл на основната програма периодично изпълнява инструкцията SLEEP.

Брояч на подпрограми. Това е манипулаторът на прекъсване при препълване на таймера и се изпълнява всеки път, когато възникне събитието Препълване на таймера. Това прекъсване събужда ядрото на микроконтролера, за да актуализира променливите на таймера. Процедурата за обработка на прекъсвания не приема никакви входни параметри и не връща данни от себе си, както може да направи обикновена функция. Вместо това работи с глобални променливи. За да направите това, декларирайте глобална структура, използвана за съхраняване на времето, с полета секунда, минута, час, дата, месец и година. Тъй като времето, изминало между прекъсванията на таймера, е известно (1 секунда), второто поле ще се увеличава всеки път с 1. Веднага щом второто поле достигне 60, полето за минути ще се увеличава с 1, а второто поле ще бъде настроено на 0.

време

Ориз. 5-1. Алгоритъмът на подпрограмата за обработка на прекъсване на брояча.

Подпрограма not_leap. Тази подпрограма проверява дали годината е високосна или не. Връща true, ако годината не е високосна, и false, ако е високосна. Една година се счита за високосна, ако са изпълнени и двете условия:

1. Числото на годината се дели на 4. 2. Ако една година се дели на 100, тогава тя се дели и на 400.

време

Ориз. 5-2. Алгоритъмът на функцията not_leap.

Инициализация. Функцията init() изпълнява всички необходими действия за конфигуриране на RTC, I/O портове и часовника на таймера.

Основна програма (главна функция). Тази функция стартира веднага след включване (нулиране) и съдържа системния безкраен цикъл. Преди стартиране на безкраен цикъл, инициализацията се извършва чрез извикване на подпрограмата init () и восновният цикъл постоянно влиза в режим на заспиване, а при излизане от режим на заспиване изчаква регистрите на Timer/Counter0 да се актуализират.

[Точност ]

RTCs, внедрени в AVR, са толкова точни, колкото честотата, генерирана от кристалния осцилатор. Асинхронната работа позволява на таймера да работи без никакви забавяния, свързани с работата на ядрото - той може да изпълнява (или да не извършва) всякакви дори най-сложни изчисления, това няма да повлияе по никакъв начин на работата на асинхронния таймер. В действителност обаче има леко несъответствие във времето, прочетено от основната програма, поради факта, че променливите на таймера не могат да се актуализират паралелно. Времето, необходимо за завършване на актуализацията, варира много малко в зависимост от състоянието на таймера/брояча. Най-голямата разлика възниква, когато всички променливи на таймера препълват. В този момент полето секунда = 59, минута = 59, час = 23 и т.н. Ще са необходими 94 времеви цикъла на ядрото, за да завърши актуализацията. При тактова честота на ядрото от 4 MHz разликата в грешката между RTC и часовниковия кристал няма да надвишава 23,5 µs (изчислено като 94/(4 * 10^6)). Обикновено грешката ще бъде 6 µs, защото са необходими 24 цикъла за актуализиране на второто поле. Тази грешка не се натрупва, тъй като таймерът винаги е в синхрон с тактовата честота на часовника и не спира да брои.

[Разходи за ресурси ]

Таблица 7-1. Разходи за цикъл на процесора и разходи за AVR памет.