Talaan ng mga Nilalaman:

AVR Microcontroller. I-toggle ang LED's Gamit ang isang Push Button Switch. Push Button Debouncing .: 4 Mga Hakbang
AVR Microcontroller. I-toggle ang LED's Gamit ang isang Push Button Switch. Push Button Debouncing .: 4 Mga Hakbang

Video: AVR Microcontroller. I-toggle ang LED's Gamit ang isang Push Button Switch. Push Button Debouncing .: 4 Mga Hakbang

Video: AVR Microcontroller. I-toggle ang LED's Gamit ang isang Push Button Switch. Push Button Debouncing .: 4 Mga Hakbang
Video: Part 4. Using a button - Embedded C Programming with PIC18F14K50 2024, Nobyembre
Anonim
Image
Image

Sa seksyong ito, matututunan natin Paano gumawa ng program C code para sa ATMega328PU upang i-toggle ang katayuan ng tatlong LED ayon sa pag-input mula sa isang switch ng pindutan. Gayundin, nag-explore kami ng mga solusyon sa problema ng 'Switch Bounce'. Tulad ng dati, tipunin namin ang de-koryenteng circuit sa base ng AVR ATmega328 upang suriin ang gawain ng code ng programa.

Hakbang 1: Pagsulat at Pagbuo ng Application ng AVR Microcontroller sa C Code Gamit ang Integrated Development Platform Atmel Studio 7

Pagsulat at Pagbuo ng Application ng AVR Microcontroller sa C Code Gamit ang Integrated Development Platform Atmel Studio 7
Pagsulat at Pagbuo ng Application ng AVR Microcontroller sa C Code Gamit ang Integrated Development Platform Atmel Studio 7
Pagsulat at Pagbuo ng Application ng AVR Microcontroller sa C Code Gamit ang Integrated Development Platform Atmel Studio 7
Pagsulat at Pagbuo ng Application ng AVR Microcontroller sa C Code Gamit ang Integrated Development Platform Atmel Studio 7
Pagsulat at Pagbuo ng Application ng AVR Microcontroller sa C Code Gamit ang Integrated Development Platform Atmel Studio 7
Pagsulat at Pagbuo ng Application ng AVR Microcontroller sa C Code Gamit ang Integrated Development Platform Atmel Studio 7

Kung wala kang Atmel Studio, dapat mong i-download at i-install ito.

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

Ang mga unang ilang linya na mayroon kaming ilang mga tumutukoy sa tagatala.

Tinutukoy ng F_CPU ang dalas ng orasan sa Hertz at karaniwan ito sa mga program na gumagamit ng avr-libc library. Sa kasong ito ginagamit ito ng mga gawain sa pagkaantala upang matukoy kung paano makalkula ang mga pagkaantala sa oras.

#ifndef F_CPU

#define F_CPU 16000000UL // sinasabi sa dalas ng kristal ng controller (16 MHz AVR ATMega328P) #endif

#include // header upang paganahin ang kontrol ng daloy ng data sa mga pin. Tinutukoy ang mga pin, port, atbp.

Ang unang isama ang file ay bahagi ng avr-libc at gagamitin sa halos anumang proyekto sa AVR na iyong pinagtatrabahuhan. Tutukuyin ng io.h ang CPU na iyong ginagamit (kung kaya't tinukoy mo ang bahagi kapag nag-iipon) at kasama namang isama ang naaangkop na header ng kahulugan ng IO para sa chip na ginagamit namin. Tinutukoy lamang nito ang mga pare-pareho para sa lahat ng iyong mga pin, port, espesyal na rehistro, atbp.

#include // header upang paganahin ang pagka-antala sa pagpapaandar sa programa

Naglalaman ang library ng paggamit / pagkaantala.h ng ilang mga gawain para sa maikling pagkaantala. Ang pagpapaandar na gagamitin namin, ay _delay_ms ().

Gumagamit kami ng mga tumutukoy upang ideklara ang aming mga pindutan at mga port at pin ng LED. Ang paggamit ng mga tumutukoy sa mga pahayag na tulad nito ay nagbibigay-daan sa amin na kailangan lamang na baguhin ang 3 mga madaling hanapin na mga linya kung ilipat namin ang LED sa isang iba't ibang I / O pin o gumamit ng ibang AVR.

#define BUTTON1 1 // button switch na konektado sa port B pin 1

#define LED1 0 // Led1 na konektado sa port B pin 0 #define LED2 1 // Led2 na konektado sa port C pin 1 #define LED3 2 // Led3 na konektado sa port D pin 2

Ang pangwakas na dalawang tukuyin ang mga oras ng pag-set up ng mga pahayag, sa millisecond, upang i-debounce ang switch at ang oras upang maghintay bago payagan ang isa pang pindutin ang pindutan. Ang oras ng pag-debounce ay kailangang ayusin sa oras na kinakailangan ng switch upang pumunta mula sa isang digital na mataas sa isang digital na mababa pagkatapos ng lahat ng pag-bouncing. Ang pag-uugali ng bounce ay magkakaiba mula sa paglipat sa switch, ngunit ang 20-30 milliseconds ay karaniwang sapat na.

#define DEBOUNCE_TIME 25 // oras upang maghintay habang ang pindutang "de-bouncing"

# tukuyin ang LOCK_INPUT_TIME 300 // oras upang maghintay pagkatapos ng isang pindotang pindutin

walang bisa init_ports_mcu ()

{

Ang pagpapaandar na ito ay tinatawag na isang beses lamang sa simula ng aming programa upang simulan ang mga input output pin na gagamitin namin.

Para sa pindutan, gagamitin namin ang mga rehistro ng PORT at PIN para sa pagsulat at pagbasa. Sa mga AVR, nabasa namin ang isang pin gamit ang pagrehistro ng PINx at nagsusulat kami sa isang pin gamit ang rehistro na PORTx. Kailangan naming magsulat sa pagrehistro ng pindutan upang paganahin ang mga pull-up.

Para sa LED kailangan lamang naming gamitin ang PORT register upang sumulat sa, gayunpaman, kailangan din namin ang rehistro ng direksyon ng data (DDR) habang ang mga I / O na pin ay naka-setup bilang mga input bilang default.

Una, itinatakda namin ang mga pin ng I / O ng LED bilang isang output gamit ang rehistro ng direksyon ng data.

DDRB = 0xFFu; // Itakda ang lahat ng mga pin ng PORTB bilang output.

Susunod, tahasang itakda ang pindutan ng pindutan bilang isang input.

DDRB & = ~ (1 <

Susunod, ang mga PORTB na pin ay itinakda nang mataas (+5 volt) upang i-on ito. Ang mga output pin ay una nang mataas, at dahil ang aming LED ay wired na aktibo-mataas, bubuksan ito maliban kung malinaw naming patayin ito.

At sa wakas, pinapagana namin ang panloob na pull-up risistor sa input pin na ginagamit namin para sa aming pindutan. Ginagawa ito sa pamamagitan lamang ng paglabas ng isa sa port. Kapag na-configure bilang isang input, ang paggawa nito ay nagreresulta sa pagpapagana ng mga pull-up at kapag na-configure bilang isang output, ang paggawa nito ay magpapalabas lamang ng isang mataas na boltahe.

PORTB = 0xFF; // Itakda ang lahat ng mga pin ng PORTB bilang TAAS. Ang LED ay naka-on, // din ang panloob na resistor na Pull Up ng unang pin PORTB ay pinagana. DDRC = 0xFFu; // Itakda ang lahat ng mga pin ng PORTC bilang output. PORTC = 0x00u; // Itakda ang lahat ng mga pin ng PORTC mababa na papatayin. DDRD = 0xFFu; // Itakda ang lahat ng mga pin ng PORTD bilang output. PORTD = 0x00u; // Itakda ang lahat ng mga pin ng PORTD mababa na papatayin. }

unsigned char button_state ()

{

Ang pagpapaandar na ito ay nagbabalik ng isang halaga ng boolean na nagpapahiwatig kung pinindot ang pindutan o hindi. Ito ang bloke ng code na may patuloy na isinasagawa sa infinity loop at sa gayon ay polling ang estado ng pindutan. Dito rin namin pinuputol ang switch.

Ngayon, tandaan na kapag pinindot namin ang switch, ang input output pin ay nakuha sa lupa. Sa gayon, hinihintay namin ang pagbaba ng pin.

/ * ang pindutan ay pinindot kapag ang BUTTON1 bit ay malinaw * /

kung (! (PINB & (1 <

Ginagawa namin ito sa pamamagitan ng pag-check kung ang bit ay malinaw. Kung ang bit ay malinaw, na nagpapahiwatig na ang pindutan ay nalulumbay, unang naantala namin ang dami ng oras na tinukoy ng DEBOUNCE_TIME na 25ms at pagkatapos ay suriin muli ang estado ng pindutan. Kung ang pindutan ay nalulumbay pagkatapos ng 25ms pagkatapos ay ang switch ay isinasaalang-alang na ma-debounce at handa na upang mag-trigger ng isang kaganapan at sa gayon ibabalik namin ang 1 sa aming gawain sa pagtawag. Kung ang pindutan ay hindi nalulumbay, ibabalik namin ang 0 sa aming gawain sa pagtawag.

_delay_ms (DEBOUNCE_TIME);

kung (! (PINB & (1 <

int main (walang bisa)

{

Ang aming pangunahing gawain. Ang pangunahing pagpapaandar ay natatangi at naihiwalay mula sa lahat ng iba pang mga pagpapaandar. Ang bawat programa ng C ay dapat na mayroong eksaktong isang pangunahing () pagpapaandar. pangunahing ay kung saan ang AVR ay nagsisimulang ipatupad ang iyong code kapag ang kapangyarihan ay unang nagpatuloy, kaya't ito ang entry point ng programa.

unsigned char n_led = 1; // sa simula LED number ay nasa ngayon

Tawag ng pagpapaandar upang simulan ang ginagamit na mga pin ng I / O:

init_ports_mcu ();

walang katapusang loop kung saan tumatakbo ang aming programa:

habang (1)

{

Kapag ibinalik ng button_state ang isa na nagpapahiwatig na ang pindutan ay pinindot at na-debounce, pagkatapos ay i-toggle ang kasalukuyang katayuan ng LED na turn ayon sa n_led parameter.

kung (button_state ()) // Kung ang pindutan ay pinindot, i-toggle ang estado ng LED at antalahin ang 300ms (#define LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^ = (1 << LED1); PORTC ^ = (1 << LED2); pahinga;

Ang mga pahayag na ito ay gumagamit ng mga operator ng bit C. Sa oras na ito gumagamit na ito ng eksklusibong OR operator. Kapag XOR mo ang PORT na may kaunting halaga ng bit na nais mong i-toggle, ang isang bit na iyon ay binago nang hindi naaapektuhan ang iba pang mga piraso.

kaso 2:

PORTC ^ = (1 << LED2); PORTD ^ = (1 << LED3); pahinga; kaso 3: PORTD ^ = (1 << LED3); PORTB ^ = (1 << LED1); n_led = 0; // reset LED number break; } n_led ++; // susunod na LED ay i-on ang _delay_ms (LOCK_INPUT_TIME); }} bumalik (0); }

Kaya ngayon, kapag pinatakbo mo ang program na ito, dapat mong mapindot ang push-button sa mga LED na toggling. Dahil sa aming pagkaantala na tinukoy ng LOCK_INPUT_TIME, maaari mong pindutin nang matagal ang pindutan na magiging sanhi ng pag-off at pag-on ng LED sa isang pare-pareho na rate (mas kaunti sa bawat 275ms).

Kumpleto na ang Programming.

Susunod na hakbang ay pagbuo ng proyekto at pag-program ng hex file sa microcontroller gamit ang avrdude program.

Maaari mong i-download ang main.c file na may programa sa c code:

Hakbang 2: Paglilipat ng HEX File ng Program sa Flash Memory of Chip

Paglipat ng HEX File ng Program sa Flash Memory of Chip
Paglipat ng HEX File ng Program sa Flash Memory of Chip
Paglipat ng HEX File ng Program sa Flash Memory of Chip
Paglipat ng HEX File ng Program sa Flash Memory of Chip

Mag-download at mag-install ng AVRDUDE. Ang pinakabagong magagamit na bersyon ay 6.3: I-download ang zip file

Una, kopyahin ang hex file ng programa sa direktoryo ng AVRDUDE. Sa aking kaso ito ay ang ButtonAVR.hex

Pagkatapos, i-type sa DOS prompt window ang utos: avrdude –c [pangalan ng programmer] –p m328p –u –U flash: w: [pangalan ng iyong hex file].

Sa aking kaso ito ay: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Nagsusulat ang utos na ito ng hex file sa memorya ng microcontroller.

Panoorin ang video na may detalyadong paglalarawan ng microcontroller flash memory burn:

Nasusunog ang memory ng microcontroller flash…

Ok! Ngayon, gumagana ang microcontroller alinsunod sa mga tagubilin ng aming programa. Tignan natin!

Hakbang 3: Paglipat ng Hardware sa Pag-debit

Pag-debit ng Hardware Switch
Pag-debit ng Hardware Switch

Bilang karagdagan sa pag-debug ng switch ng Software maaari kaming gumamit ng diskarteng paglipat ng hardware switch. Ang pangunahing ideya sa likod ng naturang pamamaraan ay ang paggamit ng isang kapasitor upang ma-filter ang mabilis na mga pagbabago sa signal ng switch.

Anong halaga ng capacitor ang dapat mapili? Ito ay sa huli ay nakasalalay sa kung gaano kahirap gampanan ang pindutan patungkol sa partikular na problemang ito. Ang ilang mga pindutan ay maaaring magpakita ng isang napakalaking pag-uugali ng bouncing, ngunit ang iba ay magkakaroon ng napakakaunting. Ang isang mababang halaga ng capacitor tulad ng 1.0 nanofarads ay mabilis na magreact, na may kaunti o walang epekto sa pag-bouncing. Sa kabaligtaran, ang isang mas mataas na halaga ng capacitor tulad ng 220 nanofarads (na kung saan ay maliit pa rin sa mga tuntunin ng mga capacitor) ay magbibigay ng isang mabagal na paglipat mula sa simula hanggang sa nagtatapos na boltahe (5 volt hanggang 0 volt). Ang paglipat na nakikita gamit ang isang 220 nanofarads na kapasidad ay pa rin medyo mabilis sa isang real-world sense gayunpaman, at sa gayon ay maaaring magamit sa hindi maganda ang pagganap ng mga pindutan.

Hakbang 4: Electrical Circuit

Electrical Circuit
Electrical Circuit
Electrical Circuit
Electrical Circuit
Electrical Circuit
Electrical Circuit

Ikonekta ang mga sangkap alinsunod sa diagram ng eskematiko.

Inirerekumendang: