Orodha ya maudhui:

Mdhibiti mdogo wa AVR. Geuza LED Kutumia Kitufe cha Kushinikiza. Kitufe cha kushinikiza Kudondoa: Hatua 4
Mdhibiti mdogo wa AVR. Geuza LED Kutumia Kitufe cha Kushinikiza. Kitufe cha kushinikiza Kudondoa: Hatua 4

Video: Mdhibiti mdogo wa AVR. Geuza LED Kutumia Kitufe cha Kushinikiza. Kitufe cha kushinikiza Kudondoa: Hatua 4

Video: Mdhibiti mdogo wa AVR. Geuza LED Kutumia Kitufe cha Kushinikiza. Kitufe cha kushinikiza Kudondoa: Hatua 4
Video: Part 3 - Around the World in 80 Days Audiobook by Jules Verne (Chs 26-37) 2024, Novemba
Anonim
Image
Image

Katika sehemu hii, tutajifunza Jinsi ya kutengeneza nambari ya mpango C kwa ATMega328PU kubadilisha hali ya LED tatu kulingana na pembejeo kutoka kwa kitufe cha kifungo. Pia, tumechunguza suluhisho la shida ya ni 'Badilisha Bounce'. Kama kawaida, tutakusanya mzunguko wa umeme kwa msingi wa AVR ATmega328 kuangalia kazi ya nambari ya mpango.

Hatua ya 1: Kuandika na Kuunda Maombi ya Microcontroller ya AVR katika C Code Kutumia Jukwaa la Maendeleo Jumuishi Atmel Studio 7

Kuandika na Kuunda Maombi ya Microcontroller ya AVR katika C Code Kutumia Jukwaa la Maendeleo Jumuishi Atmel Studio 7
Kuandika na Kuunda Maombi ya Microcontroller ya AVR katika C Code Kutumia Jukwaa la Maendeleo Jumuishi Atmel Studio 7
Kuandika na Kuunda Maombi ya Microcontroller ya AVR katika C Code Kutumia Jukwaa la Maendeleo Jumuishi Atmel Studio 7
Kuandika na Kuunda Maombi ya Microcontroller ya AVR katika C Code Kutumia Jukwaa la Maendeleo Jumuishi Atmel Studio 7
Kuandika na Kuunda Maombi ya Microcontroller ya AVR katika C Code Kutumia Jukwaa la Maendeleo Jumuishi Atmel Studio 7
Kuandika na Kuunda Maombi ya Microcontroller ya AVR katika C Code Kutumia Jukwaa la Maendeleo Jumuishi Atmel Studio 7

Ikiwa huna Studio ya Atmel, unapaswa kuipakua na kuisakinisha.

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

Mistari michache ya kwanza tuna mkusanyaji fulani hufafanua.

F_CPU inafafanua mzunguko wa saa huko Hertz na ni kawaida katika programu zinazotumia maktaba ya avr-libc. Katika kesi hii hutumiwa na mazoea ya kuchelewesha kuamua jinsi ya kuhesabu ucheleweshaji wa wakati.

#fndef F_CPU

#fafanua F_CPU 16000000UL // kuwaambia mtiririko wa kioo cha mtawala (16 MHz AVR ATMega328P) #endif

# pamoja na kichwa // kuwezesha udhibiti wa mtiririko wa data juu ya pini. Inafafanua pini, bandari, nk.

Faili ya kwanza ni pamoja na avr-libc na itatumika katika mradi wowote wa AVR unayofanya kazi. io.h itaamua CPU unayotumia (ndio sababu unabainisha sehemu wakati unakusanya) na kwa upande wake ni pamoja na kichwa cha ufafanuzi cha IO kinachofaa kwa chip tunayotumia. Inafafanua tu msimamo wa pini zako zote, bandari, rejista maalum, nk.

# pamoja na kichwa cha kichwa ili kuwezesha kazi ya kuchelewesha katika programu

Maktaba ya matumizi / kuchelewesha.h ina njia kadhaa za ucheleweshaji mfupi. Kazi ambayo tutatumia, ni _delay_ms ().

Tunatumia kufafanua kutangaza kitufe chetu na bandari za LED na pini. Kutumia taarifa zilizofafanuliwa kama hii inaruhusu sisi tuhitaji kurekebisha mistari 3 rahisi kupata ikiwa tunasonga LED kwenye pini tofauti ya I / O au tumia AVR tofauti.

#fafanua BUTTON1 1 // kifungo kubadili kushikamana na bandari B siri 1

#fafanua LED1 0 // Led1 iliyounganishwa na bandari B pini 0 #fafanua LED2 1 // Led2 iliyounganishwa na bandari C siri 1 #fafanua LED3 2 // Led3 iliyounganishwa na bandari D pini 2

Hizi mbili za mwisho zinafafanua nyakati za usanidi wa taarifa, kwa millisecond, kutengua swichi na wakati wa kusubiri kabla ya kuruhusu kitufe kingine cha kitufe. Wakati wa kujiondoa unahitaji kurekebishwa hadi wakati inachukua swichi kwenda kutoka kwa dijiti ya juu kwenda chini chini ya dijiti baada ya kila kukicha. Tabia ya kurudia itatofautiana kutoka kwa kubadili kubadili, lakini milliseconds 20-30 kawaida ni ya kutosha.

#fafanua DEBOUNCE_TIME 25 // wakati wa kusubiri wakati kifungo cha "kufuta-mara"

#fafanua LOCK_INPUT_TIME 300 // wakati wa kusubiri baada ya bonyeza kitufe

batili init_ports_mcu ()

{

Kazi hii inaitwa mara moja tu mwanzoni mwa programu yetu ili kuanzisha pini za pembejeo za pembejeo ambazo tutatumia.

Kwa kitufe, tutatumia rejista za PORT na PIN kwa kuandika na kusoma. Na AVRs, tunasoma pini kwa kutumia rejista ya PINx na tunaandika kwa pini tukitumia rejista ya PORTx. Tunahitaji kuandika kwenye rejista ya vitufe kuwezesha vivutio.

Kwa LED tunahitaji tu kutumia rejista ya PORT kuiandikia, hata hivyo, tunahitaji rejista ya mwelekeo wa data (DDR) kwani pini za I / O zinawekwa kama pembejeo kwa chaguo-msingi.

Kwanza, tunaweka pini za I / O za LED kama pato kwa kutumia rejista ya mwelekeo wa data.

DDRB = 0xFFu; // Weka pini zote za PORTB kama pato.

Ifuatayo, weka wazi kifungo cha kitufe kama pembejeo.

DDRB & = ~ (1 <

Ifuatayo, pini za PORTB zimewekwa juu (+ volt 5) kuiwasha. Pini za pato hapo awali zilikuwa juu, na kwa kuwa LED yetu ina waya-juu, itawashwa isipokuwa tu tuizime.

Na mwishowe, tunawezesha kipingaji cha ndani cha kuvuta kwenye pini ya kuingiza tunayotumia kwa kitufe chetu. Hii imefanywa tu kwa kutoa moja kwa bandari. Unaposanidiwa kama pembejeo, kufanya hivyo husababisha kuwezesha kuvuta na wakati umewekwa kama pato, kufanya hivyo kutatoa tu voltage ya juu.

PORTB = 0xFF; // Weka pini zote za PORTB kama JUU. Iliyowashwa imewashwa, // pia kipinga cha ndani cha Kuvuta cha Pini ya kwanza PBB imewezeshwa. DDRC = 0xFFu; // Weka pini zote za PORTC kama pato. PORTC = 0x00u; // Weka pini zote za chini za PORTC ambazo huzima. DDRD = 0xFFu; // Weka pini zote za PORTD kama pato. PORTD = 0x00u; // Weka pini zote za PORTD chini ambazo huzima. }

kifungo cha kifungo cha saini ()

{

Kazi hii inarudisha thamani ya boolean inayoonyesha ikiwa kitufe kilibonyezwa au la. Hiki ni kizuizi cha nambari ambacho kinatekelezwa kila wakati kwenye kitanzi chenye infinate na kwa hivyo inachagua hali ya kitufe. Hapa ndipo pia tunapokataa kubadili.

Sasa, kumbuka kwamba tunapobonyeza kitufe, pini ya pembejeo ya pembejeo hutolewa chini. Kwa hivyo, tunasubiri pini iende chini.

/ * kitufe kinabanwa wakati BUTTON1 kidogo iko wazi * /

ikiwa (! (PINB & (1 <

Tunafanya hivyo kwa kuangalia ikiwa kidogo iko wazi. Ikiwa kidogo iko wazi, ikionyesha kuwa kitufe kimefadhaika, kwanza tunachelewesha kwa muda unaofafanuliwa na DEBOUNCE_TIME ambayo ni 25ms halafu angalia hali ya kitufe tena. Ikiwa kitufe kimefadhaika baada ya 25ms basi swichi inachukuliwa kuwa imeondolewa na iko tayari kuchochea hafla na kwa hivyo tunarudi 1 kwa utaratibu wetu wa kupiga simu. Ikiwa kitufe hakina huzuni, tunarudi 0 kwa utaratibu wetu wa kupiga simu.

kuchelewa_ms (DEBOUNCE_TIME);

ikiwa (! (PINB & (1 <

kuu (batili)

{

Utaratibu wetu mkuu. Kazi kuu ni ya kipekee na imetengwa mbali na kazi zingine zote. Kila mpango wa C lazima uwe na kazi moja kuu (). kuu ni pale AVR inapoanza kutekeleza nambari yako wakati nguvu inapoendelea, kwa hivyo ni hatua ya kuingia ya programu.

char iliyosainiwa n_led = 1; // mwanzoni nambari ya LED imewashwa sasa

Wito wa kazi ili kuanzisha pini za I / O zinazotumiwa:

init_ports_mcu ();

kitanzi kisicho na mwisho ambapo programu yetu inaendesha:

wakati (1)

{

Wakati button_state inarudi moja inayoonyesha kuwa kitufe kilibanwa na kutolewa hati, kisha kugeuza hali ya sasa ya LED kwa zamu kulingana na parameta ya n_led.

ikiwa (button_state ()) // Ikiwa kitufe kinabanwa, toa hali ya LED na ucheleweshe kwa 300ms (#fafanua LOCK_INPUT_TIME)

{switch (n_led) {kesi 1: PORTB ^ = (1 << LED1); PORTC ^ = (1 << LED2); kuvunja;

Taarifa hizi hutumia waendeshaji C wa busara. Wakati huu unatumia operesheni ya kipekee AU. Unapoweka XOR PORT na thamani kidogo ya kidogo unayotaka kugeuza, kidogo hiyo hubadilishwa bila kuathiri bits zingine.

kesi 2:

PORTC ^ = (1 << LED2); PORTD ^ = (1 << LED3); kuvunja; kesi 3: PORTD ^ = (1 << LED3); PORTB ^ = (1 << LED1); n_led = 0; // kuweka upya nambari ya LED; } n_led ++; // LED inayofuata inawasha _delay_ms (LOCK_INPUT_TIME); }} kurudi (0); }

Kwa hivyo sasa, unapoendesha programu hii, unapaswa kubonyeza kitufe cha kushinikiza kwa LED zinageuza. Kwa sababu ya ucheleweshaji wetu unaofafanuliwa na LOCK_INPUT_TIME, unaweza kubonyeza na kushikilia kitufe ambacho kitasababisha taa za LED kuzima na kuwaka kwa kiwango thabiti (zaidi ya kila dakika 275).

Programu imekamilika.

Hatua inayofuata ni kujenga mradi na kupanga faili ya hex ndani ya mdhibiti mdogo kutumia programu ya avrdude.

Unaweza kupakua faili kuu.c na mpango katika kificho c:

Hatua ya 2: Kuhamisha Faili ya Programu ya HEX kwenye Kumbukumbu ya Flash ya Chip

Kuhamisha faili ya Programu ya HEX kwenye Kumbukumbu ya Flash ya Chip
Kuhamisha faili ya Programu ya HEX kwenye Kumbukumbu ya Flash ya Chip
Kuhamisha faili ya Programu ya HEX kwenye Kumbukumbu ya Flash ya Chip
Kuhamisha faili ya Programu ya HEX kwenye Kumbukumbu ya Flash ya Chip

Pakua na usakinishe AVRDUDE. Toleo la hivi karibuni linapatikana ni 6.3: Pakua faili ya zip

Kwanza, nakili faili ya hex ya programu kwenye saraka ya AVRDUDE. Kwa upande wangu ni ButtonAVR.hex

Kisha, andika kwenye kidirisha cha haraka cha DOS amri: avrdude –c [jina la programu] -p m328p -u -U flash: w: [jina la faili yako ya hex].

Kwa upande wangu ni: avrdude -c ISPProgv1 -p m328p -u -U flash: w: ButtonAVR.hex

Amri hii inaandika faili ya hex kwenye kumbukumbu ya microcontroller.

Tazama video hiyo na maelezo ya kina ya kuwaka kumbukumbu ndogo ya microcontroller:

Kumbukumbu ndogo ya microcontroller inawaka…

Sawa! Sasa, mdhibiti mdogo hufanya kazi kulingana na maagizo ya programu yetu. Wacha tuiangalie!

Hatua ya 3: Kubadilisha Vifaa Kusuluhisha

Kubadilisha Vifaa Kusuluhisha
Kubadilisha Vifaa Kusuluhisha

Kwa kuongezea kuondoa ubadilishaji wa Programu tunaweza kutumia mbinu ya kuondoa vifaa. Wazo la kimsingi nyuma ya mbinu hiyo ni kutumia capacitor kuchuja mabadiliko ya haraka kwenye ishara ya kubadili.

Je! Ni capacitor gani ya thamani inapaswa kuchagua? Hii hatimaye itategemea jinsi kitufe hufanya vibaya kuhusu shida hii. Vifungo vingine vinaweza kuonyesha tabia kubwa ya kugonga, lakini zingine zitakuwa na kidogo sana. Thamani ya chini ya capacitor kama nanofarads 1.0 itachukua hatua haraka sana, bila athari ndogo au hakuna athari kwenye bouncing. Kinyume chake, kiwango cha juu cha capacitor kama vile nanofarads 220 (ambayo bado ni ndogo kwa suala la capacitors) itatoa mabadiliko ya polepole kutoka kwa voltage ya kuanzia hadi ya kumaliza (5 volt hadi 0 volt). Mpito unaoonekana na uwezo wa nanofaradi 220 bado uko haraka sana katika hali halisi ya ulimwengu, na kwa hivyo inaweza kutumika kwenye vifungo vibaya.

Hatua ya 4: Mzunguko wa Umeme

Mzunguko wa Umeme
Mzunguko wa Umeme
Mzunguko wa Umeme
Mzunguko wa Umeme
Mzunguko wa Umeme
Mzunguko wa Umeme

Unganisha vifaa kulingana na mchoro wa skimu.

Ilipendekeza: