Სარჩევი:

AVR მიკროკონტროლერი. LED- ების გადართვა Push Button გადამრთველის გამოყენებით. ღილაკზე დებიუანსი .: 4 ნაბიჯი
AVR მიკროკონტროლერი. LED- ების გადართვა Push Button გადამრთველის გამოყენებით. ღილაკზე დებიუანსი .: 4 ნაბიჯი

ვიდეო: AVR მიკროკონტროლერი. LED- ების გადართვა Push Button გადამრთველის გამოყენებით. ღილაკზე დებიუანსი .: 4 ნაბიჯი

ვიდეო: AVR მიკროკონტროლერი. LED- ების გადართვა Push Button გადამრთველის გამოყენებით. ღილაკზე დებიუანსი .: 4 ნაბიჯი
ვიდეო: ESP8266 ESP01 WIFI-UART | LDmicro-Roboremo პროგრამირება 2024, ივლისი
Anonim
Image
Image

ამ განყოფილებაში ჩვენ ვისწავლით თუ როგორ უნდა გავაკეთოთ პროგრამის C კოდი ATMega328PU– სთვის, რათა შეცვალოს სამი LED– ის სტატუსი ღილაკის გადამრთველიდან შეყვანის შესაბამისად. ასევე, ჩვენ შევისწავლეთ პრობლემის გადაწყვეტა "გადართვა გადახტომა". როგორც ყოველთვის, ჩვენ შევიკრიბებით ელექტრული წრე AVR ATmega328– ის ბაზაზე, პროგრამული კოდის მუშაობის შესამოწმებლად.

ნაბიჯი 1: ჩაწერეთ და შექმენით AVR მიკროკონტროლერის პროგრამა C კოდში ინტეგრირებული განვითარების პლატფორმის გამოყენებით Atmel Studio 7

AVR მიკროკონტროლერის განაცხადის წერა და მშენებლობა C კოდში ინტეგრირებული განვითარების პლატფორმის გამოყენებით Atmel Studio 7
AVR მიკროკონტროლერის განაცხადის წერა და მშენებლობა C კოდში ინტეგრირებული განვითარების პლატფორმის გამოყენებით Atmel Studio 7
AVR მიკროკონტროლერის პროგრამის წერა და მშენებლობა C კოდში ინტეგრირებული განვითარების პლატფორმის გამოყენებით Atmel Studio 7
AVR მიკროკონტროლერის პროგრამის წერა და მშენებლობა C კოდში ინტეგრირებული განვითარების პლატფორმის გამოყენებით Atmel Studio 7
AVR მიკროკონტროლერის განაცხადის წერა და მშენებლობა C კოდში ინტეგრირებული განვითარების პლატფორმის გამოყენებით Atmel Studio 7
AVR მიკროკონტროლერის განაცხადის წერა და მშენებლობა C კოდში ინტეგრირებული განვითარების პლატფორმის გამოყენებით 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

#include // header მონაცემების ნაკადის კონტროლის გასააქტიურებლად ქინძისთავებზე. განსაზღვრავს ქინძისთავებს, პორტებს და ა.

პირველი ფაილი არის avr-libc- ის ნაწილი და გამოყენებული იქნება თითქმის ნებისმიერ AVR პროექტში, რომელზეც მუშაობთ. io.h განსაზღვრავს თქვენს მიერ გამოყენებულ CPU- ს (რის გამოც თქვენ მიუთითებთ ნაწილს შედგენისას) და თავის მხრივ მოიცავს ჩიპს, რომელსაც ჩვენ ვიყენებთ, შესაბამისი IO განსაზღვრის სათაურში. ის უბრალოდ განსაზღვრავს მუდმივობას თქვენი ყველა ქინძისთავისთვის, პორტისთვის, სპეციალური რეგისტრაციისთვის და ა.

#include // header პროგრამაში ფუნქციის შეფერხების გასააქტიურებლად

ბიბლიოთეკის util/delay.h შეიცავს ზოგიერთ რუტინას მოკლე დაყოვნებისთვის. ფუნქცია, რომელსაც ჩვენ ვიყენებთ, არის _delay_ms ().

ჩვენ ვიყენებთ განსაზღვრებებს, რათა გამოვაცხადოთ ჩვენი ღილაკი და LED პორტები და ქინძისთავები. ამგვარი განმსაზღვრელი განცხადებების გამოყენება საშუალებას გვაძლევს მხოლოდ 3 ადვილად საპოვნელი ხაზის შეცვლა დაგვჭირდეს, თუ ჩვენ LED- ს გადავიტანთ სხვა I/O პინზე ან ვიყენებთ სხვა AVR- ს.

#განსაზღვრეთ BUTTON1 1 // ღილაკის გადამრთველი, რომელიც დაკავშირებულია B პორტ 1 პორტთან

#განსაზღვრეთ LED1 0 // Led1 უკავშირდება პორტს B pin 0 #განსაზღვრეთ LED2 1 // Led2 უკავშირდება პორტს C pin 1 #განსაზღვრეთ LED3 2 // Led3 უკავშირდება პორტს D pin 2

ბოლო ორი განსაზღვრავს განცხადებების დაყენების დროს, მილიწამში, გადართვის დენონსაციისთვის და დრო დაელოდება ღილაკის კიდევ ერთი დაჭერის საშუალებას. დებონუნციის დრო უნდა იყოს მორგებული იმ დროზე, როდესაც საჭიროა ყველა ციფრული მაღალიდან ციფრულ დაბალზე გადასვლის შემდეგ. ამოსვლის ქცევა განსხვავდება გადამრთველზე გადართვაზე, მაგრამ 20-30 მილიწამი ჩვეულებრივ საკმარისია.

#განსაზღვრეთ DEBOUNCE_TIME 25 // ლოდინის დრო ღილაკზე "დე-ბოსინგის" დროს

#განსაზღვრეთ LOCK_INPUT_TIME 300 // დრო, რომ დაელოდოთ ღილაკის დაჭერის შემდეგ

void init_ports_mcu ()

{

ჩვენი პროგრამის დასაწყისში ამ ფუნქციას ეწოდება მხოლოდ ერთხელ, რათა გამოვიყენოთ შემავალი გამომავალი ქინძისთავები, რომლებსაც ჩვენ ვიყენებთ.

ღილაკისთვის ჩვენ ვიყენებთ PORT და PIN რეგისტრებს წერისა და კითხვისთვის. AVR– ით, ჩვენ ვკითხულობთ პინს მისი PINx რეგისტრის გამოყენებით და ჩვენ ვწერთ პინს მისი PORTx რეგისტრის გამოყენებით. ჩვენ უნდა მივწეროთ ღილაკების რეგისტრატორზე, რომ გავააქტიუროთ აზიდვები.

LED- ისთვის ჩვენ მხოლოდ PORT რეგისტრი უნდა გამოვიყენოთ დასაწერად, თუმცა, ჩვენ ასევე გვჭირდება მონაცემთა მიმართულების რეგისტრი (DDR), რადგან I/O ქინძისთავები ნაგულისხმევად არის დაყენებული, როგორც შეყვანა.

პირველ რიგში, ჩვენ ვაყენებთ LED- ის I/O ქინძისთავებს, როგორც გამომავალ მონაცემების მიმართულების რეგისტრატორის გამოყენებით.

DDRB = 0xFFu; // დააყენეთ PORTB– ის ყველა ქინძისთავები, როგორც გამომავალი.

შემდეგი, პირდაპირ მიუთითეთ ღილაკის პინი შეყვანის სახით.

DDRB & = ~ (1 <

შემდეგი, PORTB ქინძისთავები დაყენებულია მაღლა (+5 ვოლტი) მის ჩასართავად. გამომავალი ქინძისთავები თავდაპირველად მაღალია და რადგანაც ჩვენი LED აქტიურია-მაღალია, ის ჩართული იქნება, თუ ჩვენ ამას მკაფიოდ არ გამოვრთავთ.

დაბოლოს, ჩვენ ვააქტიურებთ შიდა გამწევ რეზისტორს შეყვანის პინზე, რომელსაც ჩვენ ვიყენებთ ჩვენი ღილაკისთვის. ეს კეთდება უბრალოდ პორტში ერთის გამოშვებით. როდესაც კონფიგურირებულია შეყვანის სახით, ამით ხდება გაყვანილობის გააქტიურების საშუალება და როდესაც კონფიგურირებული იქნება როგორც გამომავალი, ამით უბრალოდ გამოვა მაღალი ძაბვა.

PORTB = 0xFF; // დააყენეთ PORTB– ის ყველა ქინძისთავი როგორც მაღალი. Led ჩართულია, // ასევე ჩართულია პირველი PORTB- ის შიდა Pull Up რეზისტორი. DDRC = 0xFFu; // დააყენეთ PORTC– ის ყველა ქინძისთავები, როგორც გამომავალი. PORTC = 0x00u; // დააყენეთ PORTC– ის ყველა ქინძისთავი დაბალი, რაც მას გამორთავს. DDRD = 0xFFu; // დააყენეთ PORTD– ის ყველა ქინძისთავები, როგორც გამომავალი. PORTD = 0x00u; // დააყენეთ PORTD– ის ყველა ქინძისთავი დაბალი, რაც მას გამორთავს. }

ხელმოუწერელი char button_state ()

{

ეს ფუნქცია აბრუნებს ლოგიკურ მნიშვნელობას, რომელიც მიუთითებს ღილაკზე დაჭერით თუ არა. ეს არის კოდის ბლოკი, რომელიც განუწყვეტლივ სრულდება უსასრულო მარყუჟში და ამით იკითხება ღილაკის მდგომარეობა. ეს არის ის ადგილი, სადაც ჩვენ უარვყოფთ გადართვას.

ახლა, გახსოვდეთ, რომ როდესაც ჩვენ ვაჭერთ გადამრთველს, შემავალი გამომავალი პინი მიწასთან არის მიყვანილი. ამრიგად, ჩვენ ველოდებით, რომ პინი დაბლა დაიწიოს.

/ * ღილაკზე დაჭერილია როდესაც ღილაკი 1 ბიტი ნათელია */

თუ (! (PINB & (1 <

ჩვენ ამას ვაკეთებთ იმის შემოწმებით, არის თუ არა ბიტი გამჭვირვალე. თუ ბიტი ნათელია, რაც მიუთითებს იმაზე, რომ ღილაკი დეპრესირებულია, ჩვენ ჯერ ვაყოვნებთ DEBOUNCE_TIME- ით განსაზღვრული დროის განმავლობაში, რაც 25 წმ -ია და შემდეგ კვლავ ვამოწმებთ ღილაკის მდგომარეობას. თუ 25 წამის შემდეგ ღილაკი დეპრესირებულია, მაშინ ჩამრთველი ითვლება დენონსაციურად და მზადაა მოვლენის გასააქტიურებლად და ამიტომ ჩვენ ვუბრუნდებით 1 -ს ჩვენს ზარებს. თუ ღილაკი არ არის დეპრესირებული, ჩვენ ვუბრუნებთ 0 -ს ჩვენს ზარებს.

_ დაგვიანებით_ms (DEBOUNCE_TIME);

თუ (! (PINB & (1 <

მთავარი (ბათილია)

{

ჩვენი მთავარი რუტინა. ძირითადი ფუნქცია უნიკალურია და გამოირჩევა ყველა სხვა ფუნქციისგან. ყველა C პროგრამას უნდა ჰქონდეს ზუსტად ერთი ძირითადი () ფუნქცია. მთავარი არის იქ, სადაც AVR იწყებს თქვენი კოდის შესრულებას, როდესაც დენი პირველად გადის, ასე რომ, ეს არის პროგრამის შესვლის წერტილი.

ხელმოუწერელი char n_led = 1; // თავდაპირველად LED ნომერი ჩართულია

ფუნქციის გამოძახება I/O ქინძისთავების გამოყენებისათვის:

init_ports_mcu ();

უსასრულო მარყუჟი, სადაც ჩვენი პროგრამა მუშაობს:

ხოლო (1)

{

როდესაც button_state აბრუნებს ერთს, რაც მიუთითებს იმაზე, რომ ღილაკი დაჭერილი და გამორთულია, შემდეგ კი LED- ების ამჟამინდელი სტატუსი, თავის მხრივ, n_led პარამეტრის მიხედვით.

თუ (button_state ()) // თუ ღილაკზე დაჭერილია, გადართეთ LED- ის მდგომარეობა და დააყოვნეთ 300ms (#განსაზღვრეთ LOCK_INPUT_TIME)

{გადართვა (n_led) {შემთხვევა 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2]; შესვენება;

ეს გამონათქვამები იყენებს C bitwise ოპერატორებს. ამჯერად ის იყენებს ექსკლუზიურ ან ოპერატორს. როდესაც თქვენ 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 არის გადართვის. LOCK_INPUT_TIME- ით განსაზღვრული ჩვენი შეფერხების გამო, თქვენ შეგიძლიათ დააჭიროთ და დააჭიროთ ღილაკს, რომელიც გამოიწვევს LED- ების გამორთვას და ჩართვას თანმიმდევრული სიჩქარით (ყოველ 275 წამზე ცოტა მეტი).

პროგრამირება დასრულებულია.

შემდეგი ნაბიჯი არის პროექტის შექმნა და პროგრამირება hex ფაილის მიკროკონტროლერში avrdude პროგრამის გამოყენებით.

შეგიძლიათ ჩამოტვირთოთ main.c ფაილი პროგრამით c კოდით:

ნაბიჯი 2: პროგრამის HEX ფაილის გადატანა ჩიპის ფლეშ მეხსიერებაში

პროგრამის HEX ფაილის გადატანა ჩიპის ფლეშ მეხსიერებაში
პროგრამის HEX ფაილის გადატანა ჩიპის ფლეშ მეხსიერებაში
პროგრამის HEX ფაილის გადატანა ჩიპის ფლეშ მეხსიერებაში
პროგრამის HEX ფაილის გადატანა ჩიპის ფლეშ მეხსიერებაში

ჩამოტვირთეთ და დააინსტალირეთ AVRDUDE. უახლესი ვერსია არის 6.3: ჩამოტვირთეთ zip ფაილი

პირველი, დააკოპირეთ პროგრამის ექვსკუთხედი ფაილი AVRDUDE დირექტორიაში. ჩემს შემთხვევაში ეს არის ButtonAVR.hex

შემდეგ ჩაწერეთ DOS ფანჯარაში ბრძანება: avrdude –c [პროგრამისტის სახელი] –p m328p –u –U flash: w: [თქვენი ექვსკუთხა ფაილის სახელი].

ჩემს შემთხვევაში ეს არის: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

ეს ბრძანება წერს ექვსკუთხა ფაილს მიკროკონტროლის მეხსიერებაში.

ნახეთ ვიდეო მიკროკონტროლერის ფლეშ მეხსიერების დაწვის დეტალური აღწერით:

მიკროკონტროლერის ფლეშ მეხსიერების დაწვა…

Კარგი! ახლა, მიკროკონტროლი მუშაობს ჩვენი პროგრამის ინსტრუქციის შესაბამისად. მოდით შევამოწმოთ!

ნაბიჯი 3: აპარატურის გადართვა დებუნს

აპარატურის გადართვა დებუნსინგი
აპარატურის გადართვა დებუნსინგი

პროგრამული უზრუნველყოფის გადართვის დებიუნციის გარდა, ჩვენ შეგვიძლია გამოვიყენოთ აპარატურის გადართვის დებინსონირების ტექნიკა. ამ ტექნიკის ძირითადი იდეა არის კონდენსატორის გამოყენება გადართვის სიგნალში სწრაფი ცვლილებების გასაფილტრავად.

რა ღირებულების კონდენსატორი უნდა შეირჩეს? ეს საბოლოოდ იქნება დამოკიდებული იმაზე, თუ რამდენად ცუდად მუშაობს ღილაკი ამ კონკრეტულ პრობლემასთან დაკავშირებით. ზოგიერთ ღილაკს შეუძლია აჩვენოს უზარმაზარი მოძრაობა, ზოგს კი ძალიან ცოტა ექნება. კონდენსატორის დაბალი ღირებულება, როგორიც არის 1.0 ნანოფარადები, ძალიან სწრაფად რეაგირებს, მცირედ ან საერთოდ არ იმოქმედებს ამოსვლაზე. პირიქით, უფრო მაღალი კონდენსატორის მნიშვნელობა, როგორიცაა 220 ნანოფარდი (რომელიც კონდენსატორების თვალსაზრისით ჯერ კიდევ საკმაოდ მცირეა) უზრუნველყოფს ნელ გადასვლას საწყისიდან დამთავრებულ ძაბვამდე (5 ვოლტიდან 0 ვოლტამდე). 220 ნანოფარადის სიმძლავრის მქონე გადასვლა ჯერ კიდევ საკმაოდ სწრაფია რეალურ სამყაროში და, შესაბამისად, ის შეიძლება გამოყენებულ იქნას ცუდად შესრულებულ ღილაკებზე.

ნაბიჯი 4: ელექტრული წრე

ელექტრული წრე
ელექტრული წრე
ელექტრული წრე
ელექტრული წრე
ელექტრული წრე
ელექტრული წრე

შეაერთეთ კომპონენტები სქემატური დიაგრამის შესაბამისად.

გირჩევთ: