Talaan ng mga Nilalaman:
- Hakbang 1: Pagsulat at Pagbuo ng Application ng AVR Microcontroller sa C Code Gamit ang Integrated Development Platform Atmel Studio 7
- Hakbang 2: Paglilipat ng HEX File ng Program sa Flash Memory of Chip
- Hakbang 3: Paglipat ng Hardware sa Pag-debit
- Hakbang 4: Electrical Circuit
Video: AVR Microcontroller. I-toggle ang LED's Gamit ang isang Push Button Switch. Push Button Debouncing .: 4 Mga Hakbang
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:13
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
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
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
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
Ikonekta ang mga sangkap alinsunod sa diagram ng eskematiko.
Inirerekumendang:
Isang Halloween Scare Machine Gamit ang isang PIR, isang 3D Printed Pumpkin at ang Troll Arduino Compatible Audio Pranker / practical Joke Board .: 5 Mga Hakbang
Isang Halloween Scare Machine Gamit ang isang PIR, isang 3D Printed Pumpkin at ang Troll Arduino Compatible Audio Pranker / practical Joke Board .: Ang Troll board na nilikha ni Patrick Thomas Mitchell ng EngineeringShock Electronics, at buong pinondohan sa Kickstarter hindi pa masyadong nakakaraan. Nakuha ko ang aking gantimpala ng ilang linggo maaga upang makatulong na sumulat ng ilang mga halimbawa ng paggamit at bumuo ng isang library ng Arduino sa isang pagtatangka
Paano Gumawa ng isang Drone Gamit ang Arduino UNO - Gumawa ng isang Quadcopter Gamit ang Microcontroller: 8 Hakbang (na may Mga Larawan)
Paano Gumawa ng isang Drone Gamit ang Arduino UNO | Gumawa ng isang Quadcopter Gamit ang Microcontroller: PanimulaBisitahin ang Aking Youtube Channel Ang isang Drone ay isang napakamahal na gadget (produkto) na bibilhin. Sa post na ito tatalakayin ko, kung paano ko ito magagawa sa murang ?? At Paano mo magagawa ang iyong sarili tulad nito sa murang presyo … Sa India ang lahat ng mga materyales (motor, ESC
AVR Microcontroller. Mga LED Flasher Gamit ang Timer. Nakagambala ang Mga timer. Timer CTC Mode: 6 na Hakbang
AVR Microcontroller. Mga LED Flasher Gamit ang Timer. Nakagambala ang Mga timer. Timer CTC Mode: Kamusta sa lahat! Ang timer ay isang mahalagang konsepto sa larangan ng electronics. Ang bawat elektronikong sangkap ay gumagana sa isang batayan sa oras. Nakakatulong ang base ng oras na ito upang mapanatili ang lahat ng trabaho na naka-synchronize. Ang lahat ng mga microcontroller ay gumagana sa ilang paunang natukoy na dalas ng orasan, ang
TOUCH SWITCH - Paano Gumawa ng isang Touch Switch Gamit ang isang Transistor at Breadboard .: 4 Mga Hakbang
TOUCH SWITCH | Paano Gumawa ng isang Touch Switch Gamit ang isang Transistor at Breadboard .: Ang touch switch ay isang napaka-simpleng proyekto batay sa aplikasyon ng transistors. Ang transistor ng BC547 ay ginagamit sa proyektong ito na gumaganap bilang touch switch. SIGURADO NA Panoorin ang VIDEO NA Bibigyan KA NG BUONG DETALYE TUNGKOL SA PROYEKTO
Pag-configure ng AVR Microcontroller Fuse Bits. Paglikha at Pag-upload sa Flash Memory ng Microcontroller ang LED Blinking Program .: 5 Mga Hakbang
Pag-configure ng AVR Microcontroller Fuse Bits. Paglikha at Pag-upload sa Flash Memory ng Microcontroller ang LED Blinking Program .: Sa kasong ito lilikha kami ng simpleng programa sa C code at susunugin ito sa memorya ng microcontroller. Susulat kami ng aming sariling programa at isulat ang hex file, gamit ang Atmel Studio bilang pinagsamang platform ng pag-unlad. Ise-configure namin ang fuse bi