Mundarija:

AVR mikrokontroller. Taymer yordamida LEDlar yonadi. Taymerlar uzilishlar. Taymer CTC rejimi: 6 qadam
AVR mikrokontroller. Taymer yordamida LEDlar yonadi. Taymerlar uzilishlar. Taymer CTC rejimi: 6 qadam

Video: AVR mikrokontroller. Taymer yordamida LEDlar yonadi. Taymerlar uzilishlar. Taymer CTC rejimi: 6 qadam

Video: AVR mikrokontroller. Taymer yordamida LEDlar yonadi. Taymerlar uzilishlar. Taymer CTC rejimi: 6 qadam
Video: LDmicro 22: платы Arduino с AVRDUDESS (программирование микроконтроллеров с помощью LDmicro) 2024, Noyabr
Anonim
Image
Image

Hammaga salom!

Taymerlar - elektronika sohasidagi muhim tushuncha. Har bir elektron komponent vaqt asosida ishlaydi. Bu vaqt bazasi barcha ishlarni sinxronlashtirishga yordam beradi. Barcha mikrokontrolderlar oldindan belgilangan soat chastotasida ishlaydi, ularning hammasi taymerlarni sozlash uchun sharoitga ega. AVR juda aniq, aniq va ishonchli taymerga ega. U juda ko'p funktsiyalarni taklif qiladi, shuning uchun uni keng mavzuga aylantiradi. Eng yaxshi tomoni shundaki, taymer CPUdan mutlaqo mustaqil. Shunday qilib, u CPUga parallel ishlaydi va protsessorning aralashuvi yo'q, bu taymerni aniq qiladi. Bu bo'limda men AVR taymerlarining asosiy tushunchalarini tushuntiraman. Men taymer yordamida LED chirog'ini boshqarish uchun C kodida oddiy dastur yozyapman.

1 -qadam: tavsif

Muammo bayonoti 1: Har 50 Msda birinchi LED (yashil) yonib tursin
Muammo bayonoti 1: Har 50 Msda birinchi LED (yashil) yonib tursin

ATMega328 -da taymerlarning uch turi mavjud:

Taymer/Hisoblagich0 (TC0) - umumiy maqsadli 8 bitli taymer/hisoblagich moduli, ikkita mustaqil OutputCompare birligi va PWM qo'llab -quvvatlashi;

Taymer/Hisoblagich1 (TC1) - 16 -bitli Taymer/Hisoblagich birligi dasturning aniq bajarilish vaqtini (hodisalarni boshqarish), to'lqinlarni yaratish va signal vaqtini o'lchash imkonini beradi;

Taymer/Hisoblagich2 (TC2) -umumiy maqsadli, kanalli, PWM va asinxron ishlashga ega 8 -bitli taymer/hisoblagich moduli;

2 -qadam: Muammo bayonoti 1: Keling, har 50 Msda birinchi LED (yashil) yonib tursin

Muammo bayonoti 1: Keling, har 50 Msda birinchi LED (yashil) yonib tursin
Muammo bayonoti 1: Keling, har 50 Msda birinchi LED (yashil) yonib tursin
Muammo bayonoti 1: Har 50 Msda birinchi LED (yashil) yonib tursin
Muammo bayonoti 1: Har 50 Msda birinchi LED (yashil) yonib tursin

Metodologiya:

- yuqori chastotali elektr signalini butun sonli bo'linish orqali past chastotaga kamaytirish uchun Timer0 oldindan hisoblagichidan foydalanish;

- Timer0 to'lishi har safar uzilishdan foydalanish;

Taymer0 (8 bit) u 0 dan 255 gacha sanaladi, shundan keyin ular to'lib toshadi, bu qiymat har soat pulsida o'zgaradi.

F_CPU = 16MHz: Soat vaqti = 1000ms / 16000000Hz = 0.0000625ms

Taymerlar soni = (Kechiktirish / Soat vaqti) -1 = (50ms / 0.0000625ms) = 799999

Soat allaqachon 799999 marta bosilgan, bu faqat 50 msga kechikish imkonini beradi!

Taymerlar sonini kamaytirish uchun biz chastotalarni taqsimlash texnikasidan foydalanishimiz mumkin. AVR bizga oldindan tanlash uchun quyidagi qiymatlarni taklif qiladi: 8, 64, 256 va 1024. Jadvalga qarangki, turli xil oldindan hisoblagichlardan foydalanish natijalari.

Hisoblagich qiymati har doim butun son bo'lishi kerak. Keling, oldindan hisoblagich 256 ni tanlaymiz!

Ko'pgina mikrokontrolrlarda Interrupt deb nomlangan narsa bor. Bu uzilish ma'lum shartlar bajarilganda o'chirilishi mumkin. Endi har safar uzilish sodir bo'lganda, AVR to'xtaydi va asosiy tartibni bajarishni saqlaydi, uzilish qo'ng'irog'iga qatnashadi ("Interrupt Service Routine, ISR" deb nomlangan maxsus tartibni bajaradi) va u bajarilgandan so'ng, tizimga qaytadi. asosiy tartib va uni bajarishda davom etmoqda.

Kerakli kechikish (50ms) mumkin bo'lgan maksimal kechikishdan katta bo'lgani uchun: 4, 096ms = 1000ms / 62500Hz * 256, aniqki, taymer to'lib toshadi. Qachonki taymer oshib ketsa, uzilish o'chiriladi.

To'xtatuvchi necha marta ishdan bo'shatilishi kerak?

50ms / 4.096ms = 3125/256 = 12.207 Agar taymer 12 marta to'lib ketgan bo'lsa, 12 * 4.096ms = 49.152ms o'tib ketgan bo'lardi. 13 -takrorlashda bizga 50ms - 49.152ms = 0.848ms kechikish kerak.

62500 Gts chastotada (oldindan hisoblagich = 256) har bir malumot 0,016 ms oladi. Shunday qilib, 0,848ms kechikish uchun 0,848ms / 0,016ms = 53 Shomil kerak bo'ladi. Shunday qilib, 13 -takrorlashda biz faqat taymerni 53 tagacha sanashga ruxsat beramiz va keyin uni qayta o'rnatamiz.

Timer0/Counter -ni ishga tushiring (rasmga qarang):

TCCR0B | = (1 << CS02) // taymerni oldindan hisoblagich bilan sozlash = 256 TCNT0 = 0 // taymerni ishga tushirish TIMSK0 | = (1 << TOIE0) // to'lg'azish sei () // global uzilishlarni yoqish tot_overflow = 0 // to'ldiruvchi hisoblagich o'zgaruvchisini ishga tushirish

3 -qadam: Muammo bayonoti 2: Har 1 soniyada ikkinchi LED (ko'k) yonib tursin

Muammo bayonoti 2: Har 1 soniyada ikkinchi LED (ko'k) yonib tursin
Muammo bayonoti 2: Har 1 soniyada ikkinchi LED (ko'k) yonib tursin
Muammo bayonoti 2: Har 1 soniyada ikkinchi LED (ko'k) yonib tursin
Muammo bayonoti 2: Har 1 soniyada ikkinchi LED (ko'k) yonib tursin
Muammo bayonoti 2: Har 1 soniyada ikkinchi LED (ko'k) yonib tursin
Muammo bayonoti 2: Har 1 soniyada ikkinchi LED (ko'k) yonib tursin

Metodologiya:

- yuqori chastotali elektr signalini butun sonli bo'linish orqali past chastotaga kamaytirish uchun Timer1 oldindan hisoblagichidan foydalanish;

Taqqoslash (CTC) rejimida Clear Timer -dan foydalanish;

- CTC rejimi bilan uzilishlardan foydalanish;

Taymer1 (16 bit) 0 dan 65534 gacha, keyin ular to'lib toshadi. Bu qiymat har bir pulsda o'zgaradi.

F_CPU = 16MHz: Soat vaqti = 1000ms / 16000000Hz = 0.0000625ms Taymerlar soni = (Kechiktirish / Soat vaqtining zaruriy davri) -1 = (1000ms / 0.0000625ms) = 15999999

1s kechikish uchun soat 15999999 marta urilgan!

Taymerlar sonini kamaytirish uchun biz chastotalarni taqsimlash texnikasidan foydalanishimiz mumkin. AVR bizga oldindan tanlash uchun quyidagi qiymatlarni taklif qiladi: 8, 64, 256 va 1024. Jadvalda qarangki, har xil oldindan hisoblagichlardan foydalanish natijalari. Hisoblagich qiymati har doim butun son bo'lishi kerak. Keling, oldindan hisoblagich 256 ni tanlaymiz!

Taqqoslash vaqtini tozalash (CTC) rejimida, OCR1A yoki ICR1 registri hisoblagich o'lchamlarini o'zgartirish uchun ishlatiladi. CTC rejimida hisoblagich qiymati (TCNT1) OCR1A yoki ICR1 ga mos kelganda hisoblagich nolga tushiriladi. OCR1A yoki ICR1 hisoblagich uchun eng yuqori qiymatni belgilaydi, shuning uchun ham uning o'lchamlari. Bu rejim mos keladigan chiqish chastotasini ko'proq nazorat qilish imkonini beradi, shuningdek, tashqi hodisalarni sanashni osonlashtiradi. Biz AVRga Timer1/Hisoblagichni qiymati 62500 qiymatiga yetishi bilan uni 1 soniya kechiktirishga qaytarish kerakligini aytishimiz kerak.

Taymer1/hisoblagichni ishga tushiring (rasmga qarang):

TCCR1B | = (1 << WGM12) | (1 << CS12) // taymerni prescaler = 256 va CTC rejimi bilan sozlash TCNT1 = 0 // taymerni ishga tushirish TIMSK1 | = (1 << OCIE1A) // OCR1A taqqoslashni taqqoslash = 62500 // solishtirish qiymatini ishga tushirish

4 -qadam: Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik

Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik
Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik
Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik
Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik
Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik
Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik
Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik
Muammo bayonoti 3: Har 16msda uchinchi LEDni (qizil) yondiraylik

Metodologiya:

- yuqori chastotali elektr signalini butun sonli bo'linish orqali past chastotaga tushirish uchun Timer2 oldindan hisoblagichidan foydalanish;

Taqqoslash (CTC) rejimida Clear Timer -dan foydalanish;

- Hardware CTC rejimidan uzilishlarsiz foydalanish;

Taymer2 (8 bit), keyin 0 dan 255 gacha, ular to'lib toshadi. Bu qiymat har bir pulsda o'zgaradi.

F_CPU = 16MGts: Vaqt vaqti = 1000ms / 16000000Hz = 0.0000625ms

Taymerlar soni = (Kerakli kechikish / soat vaqti) -1 = (16ms / 0.0000625ms) = 255999

16ms kechikish uchun soat 255999 marta urilgan!

Qarang: jadvalda turli xil oldindan hisoblagichlardan foydalanish natijalari keltirilgan. Hisoblagich qiymati har doim butun son bo'lishi kerak. Keling, oldindan hisoblagich 1024 ni tanlaymiz!

CTC rejimida hisoblagich qiymati (TCNT2) OCR2A yoki ICR2 ga mos kelganda hisoblagich nolga tushiriladi. Pin PB3, shuningdek, TIMER2 - OC2A ning chiqish taqqoslash pinidir (diagramaga qarang).

Taymer/Counter2 boshqaruv registri A - TCCR2A Bit 7: 6 - COM2A1: 0 - A birligini solishtirish uchun chiqish rejimini solishtiring, chunki biz LEDni almashtirishimiz kerak, biz quyidagini tanlaymiz: solishtirish mos kelganda OC2A -ni almashtirish. OC2A pin avtomatik ravishda almashtiriladi. Bayroq bitini tekshirishning hojati yo'q, hech qanday uzilishlarga qatnashishning hojati yo'q.

Taymer2/Hisoblagichni ishga tushiring

TCCR2A | = (1 << COM2A0) | (1 << WGM21) // o'tish rejimida OC2A taymerini sozlash va CTC rejimida TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20) // taymerni oldindan hisoblagich bilan sozlash = 1024 TCNT2 = 0 // hisoblagichni ishga tushirish OCR2A = 250 // solishtirish qiymatini ishga tushirish

5 -qadam: C dasturida kod yozish. HEX faylini mikrokontroller flesh xotirasiga yuklash

C dasturida kod yozish. HEX faylini mikrokontroller flesh xotirasiga yuklash
C dasturida kod yozish. HEX faylini mikrokontroller flesh xotirasiga yuklash
C dasturida kod yozish. HEX faylini mikrokontroller flesh xotirasiga yuklash
C dasturida kod yozish. HEX faylini mikrokontroller flesh xotirasiga yuklash

Integratsiyalashgan rivojlanish platformasi - Atmel Studio yordamida AVR mikrokontroller dasturini C kodida yozish va qurish.

F_CPU Hertzda soat chastotasini belgilaydi va avr-libc kutubxonasidan foydalanadigan dasturlarda keng tarqalgan. Bunday holda, u kechiktirish tartibida vaqtni kechiktirishni qanday hisoblash kerakligini aniqlash uchun ishlatiladi.

#ifndef F_CPU

#define F_CPU 16000000UL // nazorat qiluvchi kristal chastotasini aytib berish (16 MGts AVR ATMega328P) #endif

#include // sarlavhasi pinlar ustidan ma'lumotlar oqimini boshqarishni yoqish uchun. Pim, port va boshqalarni belgilaydi.

Birinchi qo'shilgan fayl avr-libc tarkibiga kiradi va siz ishlayotgan AVR loyihalarida ishlatiladi. io.h siz foydalanadigan protsessorni aniqlaydi (shuning uchun siz kompilyatsiya paytida qismni ko'rsatasiz) va o'z navbatida biz foydalanadigan chip uchun mos keladigan IO ta'rifi sarlavhasini o'z ichiga oladi. Bu sizning barcha pinlaringiz, portlaringiz, maxsus registrlaringiz va boshqalar uchun doimiylarni belgilaydi.

#include // header uzilishni yoqish uchun

uchuvchi uint8_t tot_overflow; // to'lg'azish sonini hisoblash uchun global o'zgaruvchi

Muammolarni bayon qilish metodologiyasi: har 50 msda birinchi bo'lib (yashil) LED yonadi

- yuqori chastotali elektr signalini butun sonli bo'linish bilan past chastotaga kamaytirish uchun Timer0 oldindan hisoblagichidan foydalanish;

- Timer0 to'lishi har safar uzilishdan foydalanish;

void timer0_init () // taymerni ishga tushirish0, uzilish va o'zgaruvchi

{TCCR0B | = (1 << CS02); // taymerni oldindan hisoblagich bilan o'rnatish = 256 TCNT0 = 0; // hisoblagichni ishga tushirish TIMSK0 | = (1 << TOIE0); // nterrupt sei () ni to'ldirishni yoqish; // global uzilishlarni yoqish tot_overflow = 0; // to'ldiruvchi hisoblagich o'zgaruvchisini ishga tushirish}

Muammolarni bayon qilish metodologiyasi: Har 1 soniyada ikkinchi LED (ko'k) yonadi

- yuqori chastotali elektr signalini butun sonli bo'linish orqali past chastotaga kamaytirish uchun Timer1 oldindan hisoblagichidan foydalanish;

Taqqoslash (CTC) rejimida Clear Timer -dan foydalanish;

- CTC rejimi bilan uzilishlardan foydalanish;

void timer1_init () // taymer1ni ishga tushirish, uzilish va o'zgaruvchi {TCCR1B | = (1 << WGM12) | (1 << CS12); // taymerni oldindan hisoblagich = 256 va CTC rejimi bilan sozlash TCNT1 = 0; // hisoblagichni ishga tushirish OCR1A = 62500; // solishtirish qiymatini ishga tushirish TIMSK1 | = (1 << OCIE1A); // uzilishni taqqoslashni yoqish}

Muammolarni hal qilish metodologiyasi: har 16 msda uchinchi LED (qizil) yonadi

- yuqori chastotali elektr signalini butun sonli bo'linish orqali past chastotaga tushirish uchun Timer2 oldindan hisoblagichidan foydalanish;

Taqqoslash (CTC) rejimida Clear Timer -dan foydalanish;

- Hardware CTC rejimidan uzilishlarsiz foydalanish;

void timer2_init () // taymer2 ni ishga tushirish {TCCR2A | = (1 << COM2A0) | (1 << WGM21); // OC2A taymerini o'tish rejimida va CTC rejimida sozlash TCCR2B | = (1 << CS22) | (1 << CS21) | (1 << CS20); // taymerni oldindan hisoblagich bilan sozlash = 1024 TCNT2 = 0; // hisoblagichni ishga tushirish OCR2A = 250; // solishtirish qiymatini ishga tushirish}

TCNT0 oshib ketganda chaqiriladigan TIMER0 xizmatining uzilishi:

ISR (TIMER0_OVF_vect)

{tot_overflow ++; // toshmalar sonini kuzatib boring}

Bu ISR har qanday o'yin sodir bo'lganda o'chiriladi, shuning uchun bu erga o'ting:

ISR (TIMER1_COMPA_vect) {PORTC ^= (1 << 1); // bu erga olib boring/

int main (bekor)

{DDRB | = (1 << 0); // ulanish 1 (yashil) pinli PB0 DDRC | = (1 << 1); // ulang 2 (ko'k) PC1 DDRB piniga olib keldi | = (1 << 3); // ulanish 3 (qizil) pin PB3 (OC2A) taymer0_init () ga olib keldi; // taymerni ishga tushirish0 timer1_init (); // taymerni ishga tushirish1 timer2_init (); // timer2 ni ishga tushiring, (1) // abadiy aylaning {

Agar Timer0 12 marta oshib ketgan bo'lsa, 12 * 4.096ms = 49.152ms o'tib ketgan bo'lardi. 13 -takrorlashda bizga 50ms - 49.152ms = 0.848ms kechikish kerak. Shunday qilib, 13 -takrorlashda biz faqat taymerni 53 tagacha sanashga ruxsat beramiz va keyin uni qayta o'rnatamiz.

if (tot_overflow> = 12) // yo'qligini tekshiring. overflows = 12 QAYD: '> =' ishlatiladi

{if (TCNT0> = 53) // taymerlar soni 53 ga yetishini tekshiring {PORTB ^= (1 << 0); // LEDni o'zgartiradi TCNT0 = 0; // hisoblagichni qayta o'rnatish tot_overflow = 0; // to'ldirish hisoblagichini tiklash}}}}

HEX faylini mikrokontroller flesh xotirasiga yuklash:

DOS buyruqlar oynasiga buyruqni kiriting:

avrdude –c [dasturchining ismi] –p m328p –u –U chirog'i: w: [olti burchakli faylingizning nomi] Mening vaziyatimda: avrdude –c ISPProgv1 –p m328p –u –U flesh: w: Timers.hex

Bu buyruq olti burchakli faylni mikrokontroller xotirasiga yozadi. Videoni mikrokontroller flesh xotirasining yonishi haqida batafsil tavsif bilan tomosha qiling:

Mikrokontroller flesh xotirasi yonmoqda…

Ok! Endi mikrokontroller dasturimiz ko'rsatmalariga muvofiq ishlaydi. Keling, buni tekshirib ko'ramiz!

6 -qadam: Elektr zanjirini yaratish

Elektr zanjirini yaratish
Elektr zanjirini yaratish
Elektr zanjirini yaratish
Elektr zanjirini yaratish
Elektr zanjirini yaratish
Elektr zanjirini yaratish

Komponentlarni sxematik sxema bo'yicha ulang.

Tavsiya: