Агуулгын хүснэгт:

AVR микроконтроллер. LED товчлуурыг ашиглан унтраана уу. Датах товчлуурыг дарах: 4 алхам
AVR микроконтроллер. LED товчлуурыг ашиглан унтраана уу. Датах товчлуурыг дарах: 4 алхам

Видео: AVR микроконтроллер. LED товчлуурыг ашиглан унтраана уу. Датах товчлуурыг дарах: 4 алхам

Видео: AVR микроконтроллер. LED товчлуурыг ашиглан унтраана уу. Датах товчлуурыг дарах: 4 алхам
Видео: LDmicro 21: настройка режима C и Arduino Mega (программирование микроконтроллера с помощью LDmicro) 2024, Долдугаар сарын
Anonim
Image
Image

Энэ хэсэгт бид ATMega328PU програмын C програмыг гурван товчлуурын унтраалгын дагуу гурван LED -ийн статусыг хэрхэн өөрчлөх талаар сурах болно. Түүнчлэн, бид "Switch Bounce" гэсэн асуудлын шийдлийг судалж үзсэн. Хөтөлбөрийн кодын ажлыг шалгахын тулд бид ихэвчлэн AVR ATmega328 дээр цахилгаан хэлхээг угсардаг.

Алхам 1: Хөгжлийн нэгдсэн платформыг ашиглан C код дээр AVR микроконтроллер програмыг бичиж, бүтээх Atmel Studio 7

Хөгжлийн нэгдсэн платформыг ашиглан C код дээр AVR микроконтроллер програмыг бичиж, бүтээх Atmel Studio 7
Хөгжлийн нэгдсэн платформыг ашиглан C код дээр AVR микроконтроллер програмыг бичиж, бүтээх Atmel Studio 7
Хөгжлийн нэгдсэн платформыг ашиглан C код дээр AVR микроконтроллер програм бичих, бүтээх Atmel Studio 7
Хөгжлийн нэгдсэн платформыг ашиглан C код дээр AVR микроконтроллер програм бичих, бүтээх Atmel Studio 7
Хөгжлийн нэгдсэн платформыг ашиглан C код дээр AVR микроконтроллер програмыг бичиж, бүтээх Atmel Studio 7
Хөгжлийн нэгдсэн платформыг ашиглан C код дээр AVR микроконтроллер програмыг бичиж, бүтээх Atmel Studio 7

Хэрэв танд Atmel Studio байхгүй бол та үүнийг татаж аваад суулгах хэрэгтэй.

www.microchip.com/mplab/avr-support/atmel-studio-7

Эхний хэдэн мөрөнд бид хөрвүүлэгчийг тодорхойлдог.

F_CPU нь Герц дэх цагийн давтамжийг тодорхойлдог бөгөөд avr-libc номын санг ашигладаг програмуудад түгээмэл байдаг. Энэ тохиолдолд цаг хугацааны хоцролтыг тооцоолохдоо хоцролтын горимд ашигладаг.

#ifndef F_CPU

#тодорхойлох F_CPU 16000000UL // хянагчийн болор давтамжийг хэлэх (16 MHz AVR ATMega328P) #endif

Зүү дээр өгөгдлийн урсгалын хяналтыг идэвхжүүлэхийн тулд #толгойг оруулна уу. Зүү, порт гэх мэтийг тодорхойлдог.

Эхний оруулах файл нь avr-libc-ийн нэг хэсэг бөгөөд таны ажиллаж буй AVR төсөлд ашиглагдах болно. io.h нь таны ашиглаж буй CPU -ийг тодорхойлох болно (тиймээс та үүнийг эмхэтгэхдээ хэсгийг зааж өгдөг) бөгөөд эргээд бидний ашиглаж буй чипт тохирох IO тодорхойлолтын толгойг оруулна. Энэ нь таны бүх зүү, порт, тусгай бүртгэл гэх мэт тогтмол байдлыг тодорхойлдог.

#include // header програмд саатуулах функцийг идэвхжүүлэх

Номын сангийн util/delay.h нь богино хугацаанд хойшлуулах зарим горимыг агуулдаг. Бидний ашиглах функц бол _delay_ms () юм.

Бид товчлуур болон LED -ийн портууд болон тээглүүдийг зарлахын тулд тодорхойлолтыг ашигладаг. Иймэрхүү тодорхойлсон мэдэгдлийг ашиглах нь LED-ийг өөр оролт/гаралтын зүү рүү зөөх эсвэл өөр AVR ашигладаг бол олоход хялбар 3 мөрийг өөрчлөх боломжийг бидэнд олгодог.

#define BUTTON1 1 // товчлуурын унтраалга В порт 1 зүү холбогдсон

#тодорхойлох LED1 0 // Led1 нь В порттой холбогдсон 0 #Тодорхойлох LED2 1 // Led2 нь С порт 1 -тэй холбогдсон #Тодорхойлох LED3 2 // Led3 нь 2 -р портод холбогдсон

Төгсгөлийн хоёр нь товчлуурыг дахин дарахыг зөвшөөрөхөөс өмнө шилжүүлэгчийг суллах, хүлээх хугацааг миллисекундээр тодорхойлдог. Дахин гарах хугацааг дижитал өндөрөөс дижитал доод руу шилжихийн тулд тохирсон байх ёстой. Үсрэх зан үйл нь сэлгэн залгахаас өөр байх боловч 20-30 миллисекунд хангалттай байдаг.

DEBOUNCE_TIME 25-ийг #тодорхойлох "товчлуурыг тайлах" товчлуурыг хүлээх цаг

#товчлуур дарсны дараа хүлээх LOCK_INPUT_TIME 300 // хугацааг тодорхойлох

хүчингүй init_ports_mcu ()

{

Энэ функцийг манай програмын эхэнд нэг удаа дуудаж, бидний ашиглах оролтын гаралтын цэгүүдийг эхлүүлэх болно.

Товчлуурын хувьд бид PORT болон PIN бүртгэлийг ашиглан бичих, унших болно. AVR -ийн тусламжтайгаар бид PINx бүртгэл ашиглан зүү уншиж, PORTx регистр ашиглан пин рүү бичдэг. Татах ажиллагааг идэвхжүүлэхийн тулд бид товчлуурын бүртгэлд бичих ёстой.

LED -ийн хувьд бид бичихийн тулд зөвхөн PORT регистрийг ашиглах шаардлагатай байдаг, гэхдээ оролтын оролт нь анхдагчаар оролт хэлбэрээр тохируулагдсан байдаг тул бидэнд өгөгдлийн чиглэлийн бүртгэл (DDR) хэрэгтэй болно.

Нэгдүгээрт, бид LED -ийн I/O тээглүүрийг өгөгдлийн чиглэлийн бүртгэлийг ашиглан гаралт болгон тохируулж байна.

DDRB = 0xFFu; // PORTB -ийн бүх голыг гаралт болгон тохируулна уу.

Дараа нь товчлуурын зүүг оролт болгоно.

DDRB & = ~ (1 <

Дараа нь PORTB зүүг асаахын тулд өндөр (+5 вольт) тохируулна. Гаралтын тээглүүр нь эхэндээ өндөр байдаг бөгөөд манай LED идэвхтэй өндөр утсан холболттой тул бид үүнийг шууд унтраахгүй бол асаах болно.

Эцэст нь бид товчлууртаа ашиглаж буй оролтын зүү дээрх дотоод татах эсэргүүцлийг идэвхжүүлдэг. Үүнийг порт руу нэг гаргаснаар л хийдэг. Үүнийг оролт болгон тохируулснаар таталтыг идэвхжүүлж, гаралт болгон тохируулбал өндөр хүчдэл гарна.

PORTB = 0xFF; // PORTB -ийн бүх голыг өндөр гэж тохируулна уу. Лед асаалттай байна, // мөн анхны зүү PORTB -ийн дотоод татах эсэргүүцэл идэвхжсэн байна. DDRC = 0xFFu; // PORTC -ийн бүх зүүг гаралт болгон тохируулна уу. PORTC = 0x00u; // PORTC -ийн бүх зүүг унтраа. DDRD = 0xFFu; // PORTD -ийн бүх голыг гаралт болгон тохируулна уу. PORTD = 0x00u; // PORTD -ийн бүх тээглүүрийг хамгийн бага болгож унтраа. }

тэмдэггүй char button_state ()

{

Энэ функц нь товчлуур дарагдсан эсэхээс үл хамааран логик утгыг буцаана. Энэ бол кодын блокыг төгсгөлгүй гогцоонд байнга гүйцэтгэдэг бөгөөд ингэснээр товчлуурын төлөв байдлыг санал болгодог. Энд бид шилжүүлэгчийг суллах болно.

Одоо бид унтраалгыг дарахад оролтын гаралтын зүү газарт татагддаг болохыг санаарай. Тиймээс бид тээглүүр доошлохыг хүлээж байна.

/ * BUTTON1 бит тодорхой байх үед товчлуур дарагдана */

хэрэв (! (PINB & (1 <

Бид жаахан ойлгомжтой эсэхийг шалгаад үүнийг хийдэг. Хэрэв товчлуур дарагдсан байгааг илтгэх бит нь тодорхой байвал бид эхлээд DEBOUNCE_TIME -ийн тодорхойлсон хугацааг 25 ms болгож хойшлуулж, дараа нь товчлуурын төлөв байдлыг дахин шалгана. Хэрэв товчлуур 25 секундын дараа дарагдсан бол унтраалгыг задалсан бөгөөд үйл явдлыг эхлүүлэхэд бэлэн гэж үзээд 1 -ийг дуудлагын горим руу буцаана. Хэрэв товчлуур дарагдаагүй бол бид 0 -ийг дуудлагын горим руу буцаана.

_хойшлох_ms (DEBOUNCE_TIME);

хэрэв (! (PINB & (1 <

int main (хүчингүй)

{

Бидний үндсэн хэвшил. Үндсэн функц нь өвөрмөц бөгөөд бусад бүх функцээс ялгаатай. C програм бүр яг нэг үндсэн () функцтэй байх ёстой. Гол нь AVR таны кодыг ажиллуулж эхлэх үед програмыг нэвтрэх цэг юм.

гарын үсэггүй char n_led = 1; // эхлээд LED дугаар одоо асаалттай байна

Ашиглаж буй I/O зүүг эхлүүлэх функцын дуудлага:

init_ports_mcu ();

Манай програм ажилладаг хязгааргүй давталт:

байхад (1)

{

Button_state товчлуурыг дарж, задалсан болохыг харуулсан нэгийг буцааж өгвөл n_led параметрийн дагуу LED -ийн одоогийн байдлыг ээлжлэн солино.

if (button_state ()) // Хэрэв товчлуур дарагдсан бол LED -ийн төлөвийг сольж, 300ms -аар хойшлуулна (#LOCK_INPUT_TIME -ийг тодорхойлох)

{шилжүүлэгч (n_led) {тохиолдол 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); завсарлага;

Эдгээр мэдэгдэл нь C битийн операторуудыг ашигладаг. Энэ удаад онцгой OR операторыг ашиглаж байна. PORT -ийг өөрчлөхийг хүссэн битийн утгыг XOR хийх үед нэг бит нь бусад битүүдэд нөлөөлөхгүйгээр өөрчлөгддөг.

тохиолдол 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); завсарлага; тохиолдол 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // LED дугаарын эвдрэлийг дахин тохируулах; } n_led ++; // дараагийн LED нь _delay_ms (LOCK_INPUT_TIME) асаалттай байна; }} буцах (0); }

Тиймээс, одоо та энэ програмыг ажиллуулахдаа LED товчлуурыг дарж LED-ийг асаах боломжтой байх ёстой. LOCK_INPUT_TIME -ийн тодорхойлсон саатлаас шалтгаалан та LED -ийг зохих хурдаар (275 м тутамд бага зэрэг) унтрааж, унтраах товчлуурыг дарж болно.

Програмчлал дууссан.

Дараагийн алхам бол төсөл болон hex файлыг avrdude програмыг ашиглан микроконтроллерт бүтээх явдал юм.

Та main.c файлыг c кодтой програмаар татаж авах боломжтой.

Алхам 2: HEX програмын файлыг чипний флаш санах ой руу шилжүүлэх

Програмын HEX файлыг чипний флаш санах ой руу шилжүүлэх
Програмын HEX файлыг чипний флаш санах ой руу шилжүүлэх
Програмын HEX файлыг чипний флаш санах ой руу шилжүүлэх
Програмын HEX файлыг чипний флаш санах ой руу шилжүүлэх

AVRDUDE татаж аваад суулгана уу. Хамгийн сүүлийн хувилбар нь 6.3: zip файлыг татаж аваарай

Нэгдүгээрт, програмын hex файлыг AVRDUDE лавлах руу хуулж ав. Миний хувьд энэ нь ButtonAVR.hex юм

Дараа нь DOS хүлээх цонхонд дараах тушаалыг бичнэ үү: avrdude –c [програмистын нэр] –p m328p –u –U flash: w: [таны зургаан талт файлын нэр].

Миний хувьд энэ нь: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Энэ тушаал нь hex файлыг микроконтроллерийн санах ойд бичдэг.

Микроконтроллерийн флаш санах ойг шатаах тухай дэлгэрэнгүй тайлбар бүхий видеог үзээрэй.

Микроконтроллерийн флаш санах ой шатаж байна …

Болж байна уу! Одоо микроконтроллер нь манай програмын зааврын дагуу ажиллаж байна. Үүнийг шалгаж үзье!

Алхам 3: Тоног төхөөрөмжийн унтраалга

Тоног төхөөрөмжийн унтраалга
Тоног төхөөрөмжийн унтраалга

Програм хангамжийн унтраалгыг задлахаас гадна бид техник хангамжийн унтраах техникийг ашиглаж болно. Ийм аргын гол санаа бол унтраалгын дохионы хурдан өөрчлөлтийг шүүж авахын тулд конденсатор ашиглах явдал юм.

Ямар утгатай конденсаторыг сонгох ёстой вэ? Энэ нь товчлуур нь тухайн асуудлын талаар хэр муу ажиллаж байгаагаас шалтгаална. Зарим товчлуурууд нь маш их үсрэх зан үйлийг харуулдаг бол зарим нь маш бага байх болно. 1.0 нанофарад гэх мэт бага конденсатор нь маш хурдан хариу үйлдэл үзүүлэх бөгөөд энэ нь үсрэлтэнд бараг л нөлөөлдөггүй. Үүний эсрэгээр, 220 нанофарад гэх мэт конденсаторын өндөр утга (энэ нь конденсаторын хувьд маш бага хэвээр байгаа) нь эхлэлээс төгсгөлийн хүчдэл хүртэл (5 вольтоос 0 вольт хүртэл) аажмаар шилжих болно. 220 нанофарад багтаамжтай шилжилт нь бодит утгаараа маш хурдан хэвээр байгаа тул муу гүйцэтгэлтэй товчлууруудад үүнийг ашиглаж болно.

Алхам 4: Цахилгаан хэлхээ

Цахилгаан хэлхээ
Цахилгаан хэлхээ
Цахилгаан хэлхээ
Цахилгаан хэлхээ
Цахилгаан хэлхээ
Цахилгаан хэлхээ

Схемийн дагуу бүрэлдэхүүн хэсгүүдийг холбоно уу.

Зөвлөмж болгож буй: