Mündəricat:

AVR mikro nəzarətçisi. Bir düyməni istifadə edərək LED -i dəyişdirin. Push Button Debouncing .: 4 Addım
AVR mikro nəzarətçisi. Bir düyməni istifadə edərək LED -i dəyişdirin. Push Button Debouncing .: 4 Addım

Video: AVR mikro nəzarətçisi. Bir düyməni istifadə edərək LED -i dəyişdirin. Push Button Debouncing .: 4 Addım

Video: AVR mikro nəzarətçisi. Bir düyməni istifadə edərək LED -i dəyişdirin. Push Button Debouncing .: 4 Addım
Video: Zigbee LED nəzarətçi C01Z - sönük lampalar, baxış və sınaq üçün 2024, Noyabr
Anonim
Image
Image

Bu bölmədə, ATMega328PU üçün üç LED -in vəziyyətini bir düymə açarının girişinə görə dəyişmək üçün C proqramının necə hazırlanacağını öyrənəcəyik. Ayrıca, 'Switch Bounce' probleminin həllini araşdırdıq. Həmişə olduğu kimi, proqram kodunun işini yoxlamaq üçün AVR ATmega328 əsasında elektrik dövrəsini yığacağıq.

Addım 1: İnteqrasiya edilmiş İnkişaf Platforması Atmel Studio 7 -dən istifadə edərək CR -də AVR Mikrokontrolör Tətbiqinin Yazılması və Qurulması

Atmel Studio 7 İnteqrasiya İnkişaf Platformasından istifadə edərək C Kodunda AVR Mikrodenetleyici Tətbiqinin Yazılması və Qurulması
Atmel Studio 7 İnteqrasiya İnkişaf Platformasından istifadə edərək C Kodunda AVR Mikrodenetleyici Tətbiqinin Yazılması və Qurulması
Atmel Studio 7 İnteqrasiya İnkişaf Platformasından istifadə edərək C Kodunda AVR Mikrodenetleyici Tətbiqinin Yazılması və Qurulması
Atmel Studio 7 İnteqrasiya İnkişaf Platformasından istifadə edərək C Kodunda AVR Mikrodenetleyici Tətbiqinin Yazılması və Qurulması
Atmel Studio 7 İnteqrasiya İnkişaf Platformasından istifadə edərək C Kodunda AVR Mikrodenetleyici Tətbiqinin Yazılması və Qurulması
Atmel Studio 7 İnteqrasiya İnkişaf Platformasından istifadə edərək C Kodunda AVR Mikrodenetleyici Tətbiqinin Yazılması və Qurulması

Atmel Studio yoxdursa, yükləməli və quraşdırmalısınız.

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

Bəzi tərtibçilərin müəyyən etdiyi ilk bir neçə sətir.

F_CPU, Hertz-də saat tezliyini təyin edir və avr-libc kitabxanasından istifadə edən proqramlarda çox yayılmışdır. Bu vəziyyətdə, gecikmələrin necə hesablanacağını təyin etmək üçün gecikmə qaydaları istifadə olunur.

#ifndef F_CPU

#define F_CPU 16000000UL // nəzarətçi kristal tezliyini izah edir (16 MHz AVR ATMega328P) #endif

Sancaqlar üzərində məlumat axını nəzarətini təmin etmək üçün #include // header. Sancaqlar, portlar və s.

Birincisi, avr-libc-in bir hissəsidir və üzərində işlədiyiniz hər hansı bir AVR layihəsində istifadə ediləcəkdir. io.h istifadə etdiyiniz CPU -nu təyin edəcək (bu səbəbdən tərtib edərkən hissəni qeyd edirsiniz) və öz növbəsində istifadə etdiyimiz çip üçün uyğun IO tərif başlığını da daxil edəcək. Bütün pinləriniz, portlarınız, xüsusi qeydləriniz və s. Üçün sabitləri təyin edir.

Proqramda gecikmə funksiyasını aktivləşdirmək üçün #include // header

Kitabxana util/delay.h qısa gecikmələr üçün bəzi qaydalar ehtiva edir. İstifadə edəcəyimiz funksiya _delay_ms () dir.

Düymələrimizi və LED -in portlarını və pinlərini elan etmək üçün təriflərdən istifadə edirik. Bu kimi təriflərin istifadə edilməsi, LED-i fərqli bir I/O pininə köçürsək və ya fərqli bir AVR istifadə etsək, tapılması asan olan 3 xətti dəyişdirməyimizə imkan verir.

#define BUTTON1 1 // B pin 1 portuna bağlı düymə açarı

#define LED1 0 // Led1 port B pin 0 -a bağlıdır #define LED2 1 // Led2 port C pin 1 -ə bağlıdır #define LED3 2 // Led3 port D pin 2 -ə bağlıdır

Son ikisi, düyməni basmağa icazə verməzdən əvvəl açarı ləğv etmək üçün gözləmə müddətini milisaniyədə təyin edir. Geri çəkilmə vaxtı, bütün sıçrayışdan sonra rəqəmsal yüksəkdən rəqəmsal aşağıya keçmək üçün keçid tələb olunan vaxta uyğunlaşdırılmalıdır. Sıçrama davranışı keçiddən keçməyə qədər dəyişəcək, ancaq 20-30 milisaniyələr ümumiyyətlə kifayət qədərdir.

#debine DEBOUNCE_TIME 25 // "de-sıçrayan" düyməsini gözləyərkən gözləmə vaxtı

#düyməsini basdıqdan sonra gözləmək üçün LOCK_INPUT_TIME 300 // vaxtını təyin edin

etibarsız init_ports_mcu ()

{

Bu funksiya, proqramımızın əvvəlində istifadə edəcəyimiz giriş çıxış pinlərini işə salmaq üçün bir dəfə çağırılır.

Düymə üçün yazmaq və oxumaq üçün PORT və PIN qeydlərindən istifadə edəcəyik. AVR ilə PINx qeydindən istifadə edərək bir pin oxuyuruq və PORTx qeydindən istifadə edərək bir pin yazırıq. Çəkmələri aktiv etmək üçün düymə qeydinə yazmalıyıq.

LED üçün yazmaq üçün yalnız PORT qeydindən istifadə etməliyik, eyni zamanda I/O pinlərinin giriş olaraq təyin edildiyi üçün məlumat istiqaməti qeydinə (DDR) də ehtiyacımız var.

Birincisi, LED -in I/O sancaqlarını məlumat istiqaməti qeydindən istifadə edərək çıxış olaraq təyin edirik.

DDRB = 0xFFu; // PORTB -in bütün sancaqlarını çıxış olaraq təyin edin.

Sonra, düymə pinini açıq olaraq giriş olaraq təyin edin.

DDRB & = ~ (1 <

Sonra, PORTB pinləri açmaq üçün yüksək (+5 volt) olaraq təyin olunur. Çıxış pinləri əvvəlcə yüksəkdir və LED-lərimiz aktiv yüksəklikdə olduğu üçün açıq şəkildə söndürməyincə açılacaq.

Və nəhayət, düyməmiz üçün istifadə etdiyimiz giriş pinindəki daxili çəkmə müqavimətini işə salırıq. Bu, sadəcə porta bir ədəd çıxarmaqla edilir. Bir giriş olaraq konfiqurasiya edildikdə, bu, çəkmələri aktivləşdirməklə nəticələnir və bir çıxış olaraq konfiqurasiya edildikdə, bunu etmək sadəcə yüksək bir gərginlik verir.

PORTB = 0xFF; // PORTB -in bütün sancaqlarını YÜKSƏK olaraq təyin edin. Led açılır, // həmçinin ilk pin PORTB -in daxili Pull Up müqaviməti aktivdir. DDRC = 0xFFu; // PORTC -nin bütün sancaqlarını çıxış olaraq təyin edin. PORTC = 0x00u; // Bütün PORTC pinlərini söndürən aşağıya endirin. DDRD = 0xFFu; // PORTD -nin bütün sancaqlarını çıxış olaraq təyin edin. PORTD = 0x00u; // Bütün PORTD pinlərini söndürən aşağı salın. }

imzasız char button_state ()

{

Bu funksiya düymənin basılıb basılmadığını göstərən boolean dəyər qaytarır. Bu kod bloku daim infinasiya döngəsində icra olunur və buna görə də düymənin vəziyyətini sorğulayır. Keçiddən imtina etdiyimiz yer də budur.

İndi unutmayın ki, düyməni basdığımız zaman giriş çıxış pimi yerə çəkilir. Beləliklə, sancağın aşağı düşməsini gözləyirik.

/ * BUTTON1 biti aydın olduqda düyməyə basılır */

əgər (! (PINB & (1 <

Bitin aydın olub olmadığını yoxlayaraq bunu edirik. Düymənin basıldığını göstərən bit aydındırsa, əvvəlcə 25 ms olan DEBOUNCE_TIME tərəfindən təyin olunan vaxtı təxirə salırıq və sonra düymənin vəziyyətini yenidən yoxlayırıq. Düymə 25 saniyədən sonra basıldığı təqdirdə, keçid ləğv edilmiş sayılır və bir hadisəni tetiklemeye hazırdır və buna görə də 1 -i zəng rejimimizə qaytarırıq. Düymə sıxılmasa, 0 -a zəng etmə rejiminə qayıdırıq.

_delay_ms (DEBOUNCE_TIME);

əgər (! (PINB & (1 <

int main (boş)

{

Əsas iş rejimimiz. Əsas funksiya unikaldır və digər funksiyalardan fərqlənir. Hər bir C proqramının tam olaraq bir main () funksiyası olmalıdır. Əsas, AVR -in ilk dəfə güc açıldıqda kodunuzu icra etməyə başladığı yerdir, buna görə də proqramın giriş nöqtəsidir.

imzasız char n_led = 1; // əvvəlcə LED nömrəsi indi yanır

İstifadə olunan I/O pinlərini işə salmaq üçün funksiyaya zəng edin:

init_ports_mcu ();

Proqramımızın işlədiyi sonsuz döngə:

vaxt (1)

{

Button_state, düymənin basıldığını və ləğv edildiyini göstərən birini geri qaytardıqda, n_led parametrinə uyğun olaraq LED -lərin cari vəziyyətini dəyişir.

if (button_state ()) // Düymə basıldıqda, LED -in vəziyyətini dəyişin və 300 ms gecikdirin (#define LOCK_INPUT_TIME)

{keçid (n_led) {hal 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); fasilə;

Bu ifadələr C bitwise operatorlarından istifadə edir. Bu dəfə eksklüziv OR operatorundan istifadə edir. Portu keçmək istədiyiniz bitin dəyəri ilə XOR etdiyiniz zaman, bir bit digər bitlərə təsir etmədən dəyişdirilir.

hal 2:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); fasilə; hal 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // LED nömrə fasiləsini sıfırlayın; } n_led ++; // növbəti LED _delay_ms (LOCK_INPUT_TIME) açılır; }} qayıt (0); }

Beləliklə, indi bu proqramı işə saldığınız zaman, LED-lərin dəyişmə düyməsini basa bilməlisiniz. LOCK_INPUT_TIME tərəfindən təyin olunan gecikməyimizə görə, LED -lərin sabit bir sürətlə sönməsinə səbəb olacaq düyməni basıb saxlayın (hər 275 ms -dən bir az çox).

Proqramlaşdırma tamamlandı.

Növbəti addım, avrdude proqramından istifadə edərək layihəni və hex faylını mikro nəzarətçiyə proqramlaşdırmaqdır.

Main.c faylını c kodu ilə proqramla yükləyə bilərsiniz:

Addım 2: Proqramın HEX faylını çipin flash yaddaşına köçürmək

Proqramın HEX faylını çipin flash yaddaşına köçürmək
Proqramın HEX faylını çipin flash yaddaşına köçürmək
Proqramın HEX faylını çipin flash yaddaşına köçürmək
Proqramın HEX faylını çipin flash yaddaşına köçürmək

AVRDUDE yükləyin və quraşdırın. Mövcud olan ən son versiya 6.3: zip faylını yükləyin

Əvvəlcə proqramın hex faylını AVRDUDE qovluğuna kopyalayın. Mənim vəziyyətimdə ButtonAVR.hex

Sonra, DOS istək pəncərəsinə əmr daxil edin: avrdude –c [proqramçının adı] –p m328p –u –U flash: w: [hex faylınızın adı].

Mənim vəziyyətimdə: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Bu əmr mikro nəzarətçinin yaddaşına hex fayl yazır.

Mikrodenetleyici flash yaddaşının yanmasının ətraflı təsviri ilə videoya baxın:

Mikro nəzarətçi flash yaddaşı yanır …

Tamam! İndi mikrokontrolör proqramımızın təlimatlarına uyğun işləyir. Gəlin yoxlayaq!

Addım 3: Hardware Switch Debouncing

Hardware Switch Debouncing
Hardware Switch Debouncing

Proqram təminatı açma ilə yanaşı, hardware açma texnikasından istifadə edə bilərik. Bu texnikanın əsas fikri, keçid siqnalındakı sürətli dəyişiklikləri süzmək üçün bir kondansatördən istifadə etməkdir.

Hansı dəyər kondansatörü seçilməlidir? Bu, nəticədə düymənin bu problemlə bağlı nə qədər zəif işləyəcəyindən asılı olacaq. Bəzi düymələr çox sıçrayan bir davranış göstərə bilər, digərlərində isə çox az olacaq. 1.0 nanofarad kimi aşağı bir kondansatör dəyəri çox tez reaksiya verəcək və sıçrayışa heç bir təsiri yoxdur. Əksinə, 220 nanofarad kimi daha yüksək bir kondansatör dəyəri (hələ də kondansatör baxımından olduqca kiçikdir) başlanğıcdan sona qədər (5 voltdan 0 volta qədər) yavaş bir keçid təmin edəcəkdir. 220 nanofarad tutumu ilə görülə bilən keçid hələ də real mənada olduqca sürətlidir və buna görə də zəif işləyən düymələrdə istifadə edilə bilər.

Addım 4: Elektrik dövrəsi

Elektrik dövrəsi
Elektrik dövrəsi
Elektrik dövrəsi
Elektrik dövrəsi
Elektrik dövrəsi
Elektrik dövrəsi

Şematik sxemə uyğun olaraq komponentləri birləşdirin.

Tövsiyə: