Orodha ya maudhui:

Mafunzo ya Mkusanyiko wa AVR 1: Hatua 5
Mafunzo ya Mkusanyiko wa AVR 1: Hatua 5

Video: Mafunzo ya Mkusanyiko wa AVR 1: Hatua 5

Video: Mafunzo ya Mkusanyiko wa AVR 1: Hatua 5
Video: Я ОДЕРЖИМЫЙ ДЕМОНАМИ 2024, Julai
Anonim
Mafunzo ya Mkusanyiko wa AVR 1
Mafunzo ya Mkusanyiko wa AVR 1

Nimeamua kuandika safu kadhaa za mafunzo juu ya jinsi ya kuandika programu za lugha ya mkutano wa Atmega328p ambayo ni mdhibiti mdogo anayetumiwa katika Arduino. Ikiwa watu wataendelea kupendezwa nitaendelea kuweka moja kwa wiki au hivyo hadi nitakapoishiwa na wakati wa bure au sivyo watu wataacha kuzisoma.

Ninaendesha Arch linux na nafanya kazi kwa atmega328p-pu iliyowekwa kwenye ubao wa mkate. Unaweza kuifanya kwa njia sawa na mimi au unaweza kuziba arduino kwenye kompyuta yako na ufanye kazi kwa mdhibiti mdogo kwa njia hiyo.

Tutakuwa tukiandika programu za 328p kama ile ambayo iko katika arduino nyingi lakini unapaswa kutambua kuwa programu na mbinu hizo hizo pia zitafanya kazi kwa watawala wowote wa Atmel na baadaye (ikiwa kuna nia) tutafanya kazi na baadhi ya hizo zingine pia. Maelezo ya mdhibiti mdogo anaweza kupatikana kwenye karatasi za data za Atmel na Mwongozo wa Kuweka Maagizo. Ninawaunganisha na hii inayoweza kufundishwa.

Hivi ndivyo utahitaji:

1. Ubao wa mkate

2. Arduino, au mdhibiti mdogo tu

3. Kompyuta inayoendesha Linux

4. Mkusanyaji wa avra kutumia git: git clone https://github.com/Ro5bert/avra.git au ikiwa unatumia ubuntu au mfumo wa msingi wa debian andika tu "sudo apt install avra" na utapata mkusanyaji wote wa avr na avrdude. LAKINI, ikiwa utapata toleo la hivi karibuni ukitumia github basi utapata pia faili zote muhimu, kwa maneno mengine tayari ina faili za m328Pdef.inc na tn85def.inc.

5. avrdude

Seti kamili ya mafunzo yangu ya kukusanyika ya AVR yanaweza kupatikana hapa:

Hatua ya 1: Jenga Bodi ya Upimaji

Jenga Bodi ya Upimaji
Jenga Bodi ya Upimaji

Unaweza tu kutumia arduino yako na ufanye kila kitu kwenye mafunzo haya kwenye hiyo ikiwa ungependa. Walakini, kwa kuwa tunazungumza juu ya kuweka alama kwa lugha ya mkusanyiko falsafa yetu ni asili kuvua viini vyote na kuingiliana moja kwa moja na mdhibiti mdogo. Kwa hivyo haufikiri itakuwa raha zaidi kuifanya kwa njia hiyo?

Kwa wale ambao wanakubali, unaweza kuvuta mdhibiti mdogo kutoka kwa arduino yako na kisha uanze kwa kujenga "Breadboard Arduino" kwa kufuata maagizo hapa:

Kwenye picha ninaonyesha seti yangu ambayo inajumuisha Atmega328p mbili zilizosimama kwenye ubao mkubwa wa mkate (Nataka kuwa na uwezo wa kuweka mafunzo ya awali ya waya na kupakia kwenye microcontroller moja wakati nikifanya kazi kwa inayofuata). Nina usambazaji wa umeme uliowekwa ili reli ya juu kabisa ni 9V na zingine zote ni 5V kutoka kwa mdhibiti wa voltage. Ninatumia pia bodi ya kuzuka ya FT232R kupanga chip. Niliinunua na kuweka bootloaders juu yangu mwenyewe, lakini ikiwa ukitoa moja tu kutoka kwa Arduino basi ni sawa tayari.

Kumbuka kuwa ikiwa unajaribu hii na ATtiny85 basi unaweza tu kupata Sparkfun Tiny Programmer hapa: https://www.sparkfun.com/products/11801# na kisha ingiza kwenye bandari ya USB kwenye kompyuta yako. Utahitaji kusakinisha bootloader kwenye Attiny85 kwanza na njia rahisi ni kutumia Arduino IDE. Walakini, utahitaji kubonyeza faili, na mapendeleo, na kisha ongeza URL hii ya Bodi Mpya: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json ambayo kukuwezesha kufunga bootloader (ikiwa ATtiny85 yako haikuja na moja.)

Hatua ya 2: Sakinisha Assembler na Avrdude

Sasa unaweza kupakua na kusanikisha mkusanyaji na avrdude kutoka kwa viungo vilivyopewa kwenye hatua ya kwanza ya mafunzo haya. Inawezekana kwamba ikiwa tayari umefanya kazi na Arduino basi tayari umeweka avrdude.

Baada ya kuwekewa avra utaona kuwa kuna saraka ndogo inayokuja na inayoitwa "vyanzo" na ndani ya saraka hiyo kuna rundo la faili zinazojumuisha. Hizi ni watawala wote ambao unaweza kupanga na avra. Utaona mara moja kwamba hakuna faili ya 328p ambayo tunatumia hapa. Nimeambatanisha moja. Faili inapaswa kuitwa m328Pdef.inc na unapaswa kuweka ndani ya saraka ikiwa ni pamoja na au mahali pengine pengine unapenda. Tutakuwa tukijumuisha katika programu zetu za lugha ya mkutano. Yote hii inafanya ni kutoa kila rejista katika majina madogo ya microcontroller kutoka kwa karatasi ya data ili tusitumie majina yao ya hexidecimal. Faili hapo juu ni pamoja na "maagizo ya pragma" kwani ilibuniwa kwa programu ya C na C ++. Ukichoka kuona mkusanyaji akitema "kupuuza maagizo ya pragma" ingia kwenye faili na ufute au toa maoni kwenye mistari yote inayoanza na #pragma

Sawa, kwa kuwa sasa una microcontroller yako tayari, mkusanyaji wako tayari, na programu yako tayari, tunaweza kuandika programu yetu ya kwanza.

Kumbuka: Ikiwa unatumia ATtiny85 badala ya ATmega328P basi unahitaji jalada tofauti linaloitwa tn85def.inc. Nitaiambatanisha pia (kumbuka ilibidi niiita tn85def.inc.txt ili Maagizo yangeniruhusu kuipakia.) ILA, ikiwa ulipata mkusanyaji wa avra kutoka github basi tayari unayo faili hizi zote. Kwa hivyo ninapendekeza kuipata na kujiandaa mwenyewe: git clone

Hatua ya 3: Habari Ulimwengu

Lengo la mafunzo haya ya kwanza ni kujenga mpango wa kawaida wa kwanza ambao mtu huandika wakati wa kujifunza lugha yoyote mpya au kukagua jukwaa jipya la elektroniki. "Salamu, Dunia!." Kwa upande wetu tunataka tu kuandika programu ya lugha ya mkutano, kukusanyika, na kuipakia kwa mdhibiti wetu mdogo. Programu hiyo itasababisha taa kuwasha. Kusababisha mwangaza wa LED "kupepesa" kama wanavyofanya kwa mpango wa kawaida wa ulimwengu wa Arduino ni mpango ngumu zaidi katika lugha ya mkutano na kwa hivyo hatutafanya hivyo bado. Tutaandika nambari rahisi zaidi ya "mifupa wazi" na fluff ndogo isiyo ya lazima.

Kwanza unganisha LED kutoka PB5 (angalia mchoro wa pinout) ambao pia huitwa Digital Out 13 kwenye arduino, kwa kinzani cha 220 ohm, halafu kwa GND. Yaani.

PB5 - LED - R (220 ohm) - GND

Sasa kuandika programu. Fungua kihariri chako cha maandishi unachopenda na unda faili inayoitwa "hello.asm"

; hello.asm

; inawasha LED ambayo imeunganishwa na PB5 (dijiti nje ya 13). pamoja na "./m328Pdef.inc" ldi r16, 0b00100000 kutoka DDRB, r16 nje PortB, r16 Anza: rjmp Start

Hapo juu ni nambari. Tutapitia mstari kwa mstari kwa dakika, lakini kwanza tuhakikishe tunaweza kuifanya iweze kufanya kazi kwenye kifaa chako.

Baada ya kuunda faili, basi kwenye kituo unakusanya kama ifuatavyo:

avra hello.asm

hii itakusanya nambari yako na kuunda faili inayoitwa hello.hex ambayo tunaweza kuipakia kama ifuatavyo:

avrdude -p m328p -c stk500v1 -b 57600 -P / dev / ttyUSB0 -U flash: w: hello.hex

ikiwa unatumia bodi ya mkate arduino itabidi ubonyeze kitufe cha kuweka upya kwenye bodi ya mkate kabla ya kutekeleza amri hapo juu. Kumbuka kuwa unaweza pia kuongeza sudo mbele au kuifanya kama mizizi. Pia kumbuka kuwa kwenye arduino's (kama Arduino UNO) itabidi ubadilishe bitrate kuwa -b 115200 na bandari -P / dev / ttyACM0 (ikiwa utapata hitilafu kutoka kwa avrdude kuhusu saini ya kifaa batili ongeza tu - F kwa amri)

Ikiwa kila kitu kimefanya kazi kama inavyostahili sasa utakuwa na mwangaza wa LED…. "Hello World!"

Ikiwa unatumia ATtiny85 basi amri ya avrdude itakuwa:

avrdude -p attiny85 -c usbtiny -U flash: w: hello.hex

Hatua ya 4: Hello.asm Line-by-line

Ili kumaliza mafunzo haya ya utangulizi tutapitia hello.asm mpango-na-mstari kuona jinsi inavyofanya kazi.

; hello.asm

; inawasha LED ambayo imeunganishwa na PB5 (dijiti nje ya 13)

Kila kitu baada ya semicoloni kinapuuzwa na mkusanyaji na kwa hivyo hii mistari miwili ya kwanza ni "maoni" tu inayoelezea kile mpango hufanya.

pamoja na "./m328Pdef.inc"

Mstari huu unamwambia mkusanyaji ajumuishe faili ya m328Pdef.inc ambayo umepakua. Unaweza kutaka kuweka hii katika saraka ya faili zinazofanana na kisha ubadilishe laini hapo juu kuionesha hapo.

ldi r16, 0b00100000

ldi inasimama kwa "mzigo mara moja" na inamwambia mkusanyaji achukue rejista ya kufanya kazi, r16 katika kesi hii, na upakie nambari ya binary ndani yake, 0b00100000 katika kesi hii. 0b mbele inasema kuwa nambari yetu iko katika binary. Ikiwa tunataka tungeweza kuchagua wigo mwingine, kama hexidecimal. Katika kesi hiyo nambari yetu ingekuwa 0x20 ambayo ni hexidecimal kwa 0b00100000. Au tungeweza kutumia 32 ambayo ni msingi 10 decimal kwa nambari ile ile.

Zoezi la 1: Jaribu kubadilisha nambari kwenye mstari hapo juu kuwa hexidecimal na kisha kwa decimal katika nambari yako na uthibitishe kuwa bado inafanya kazi katika kila kesi.

Kutumia binary ni rahisi ingawa kwa sababu ya njia Bandari na Sajili hufanya kazi. Tutazungumzia bandari na rejista za atmega328p kwa undani zaidi katika mafunzo ya siku za usoni lakini kwa sasa nitasema tu kwamba tunatumia r16 kama "rejista yetu ya kufanya kazi" ikimaanisha kwamba tutatumia kama anuwai ambayo tunahifadhi nambari. "Rejista" ni seti ya bits 8. Maana yake matangazo 8 ambayo inaweza kuwa 0 au 1 (`off 'au` on'). Tunapopakia nambari ya binary 0b00100000 kwenye rejista kwa kutumia laini hapo juu tumehifadhi tu nambari hiyo kwenye rejista r16.

nje DDRB, r16

Mstari huu unamwambia mkusanyaji nakala nakala ya daftari r16 kwenye rejista ya DDRB. DDRB inasimama kwa "Usajili wa Uelekezaji wa Takwimu B" na inaweka "pini" kwenye PortB. Kwenye ramani ya pinout ya 328p unaweza kuona kuwa kuna pini 8 zilizoandikwa PB0, PB1,…, PB7. Pini hizi zinawakilisha "bits" za "PortB" na tunapopakia nambari ya binary 00100000 kwenye rejista ya DDRB tunasema kwamba tunataka PB0, PB1, PB2, PB3, PB4, PB6, na PB7 zilizowekwa kama pini za INPUT kwani zina 0 ndani yao, na PB5 imewekwa kama pini ya OUTPUT kwani tunaweka 1 mahali hapo.

nje PortB, r16

Sasa kwa kuwa tumeweka mwelekeo wa pini tunaweza sasa kuweka voltages juu yao. Mstari hapo juu unakili nambari ile ile ya binary kutoka kwa rejista yetu ya uhifadhi r16 hadi PortB. Hii inaweka pini zote kwa volts 0 isipokuwa pini PB5 hadi HIGH ambayo ni volts 5.

Zoezi la 2: Chukua multimeter ya dijiti, ingiza risasi nyeusi kwenye ardhi (GND) kisha ujaribu kila pini PB0 kupitia PB7 na risasi nyekundu. Je! Voltages kwenye kila pini ni zile zinazolingana na kuweka 0b00100000 katika PortB? Ikiwa kuna ambazo hazipo, kwa nini unafikiri hiyo ni? (tazama ramani ya pini)

Anza:

rjmp Anza

Mwishowe, mstari wa kwanza hapo juu ni "lebo" ambayo inaweka alama katika nambari. Katika kesi hii kutaja mahali hapo kama "Anza". Mstari wa pili unasema "jamaa kuruka kwa lebo ya Anza." Matokeo halisi ni kwamba kompyuta imewekwa kwenye kitanzi kisicho na mwisho ambacho kinaendelea kuendesha baiskeli tena kwa Anza. Tunahitaji hii kwa sababu hatuwezi kumaliza programu tu, au kuanguka kwenye mwamba, mpango lazima uendelee kukimbia ili taa iweze kuwaka.

Zoezi la 3: Ondoa mistari miwili hapo juu kutoka kwa nambari yako ili programu ianguke kwenye mwamba. Nini kinatokea? Unapaswa kuona kitu ambacho kinaonekana kama mpango wa jadi wa "blink" unaotumiwa na Arduino kama "ulimwengu wa hello!". Je! Unafikiri ni kwanini inafanya hivi? (Fikiria juu ya nini lazima kitatokea wakati mpango unadondoka kwenye mwamba…)

Hatua ya 5: Hitimisho

Ikiwa umefika hapa sasa basi hongera! Sasa unaweza kuandika nambari ya kusanyiko, kukusanyika, na kuipakia kwenye microcontroller yako.

Katika mafunzo haya umejifunza jinsi ya kutumia amri zifuatazo:

ldi usajili, nambari hupakia nambari (0-255) kwenye rejista ya nusu ya juu (16-31)

nje ya usajili, sajili nakala kutoka kwa rejista ya kufanya kazi hadi sajili ya I / O

lebo ya rjmp inaruka kwenye mstari wa programu iliyoandikwa na "lebo" (ambayo haiwezi kuwa zaidi ya maagizo 204 mbali - i.e. kuruka kwa jamaa)

Sasa kwa kuwa misingi hii imekwisha njia, tunaweza kuendelea kuandika nambari ya kupendeza zaidi na mizunguko na vifaa vya kupendeza zaidi bila kujadili mitambo ya kuandaa na kupakia.

Natumahi umefurahiya mafunzo haya ya utangulizi. Katika mafunzo yanayofuata tutaongeza sehemu nyingine ya mzunguko (kitufe) na kupanua nambari yetu kuwa ni pamoja na bandari na maamuzi.

Ilipendekeza: