Orodha ya maudhui:

Mafunzo ya Mkusanyiko wa AVR 2: 4 Hatua
Mafunzo ya Mkusanyiko wa AVR 2: 4 Hatua

Video: Mafunzo ya Mkusanyiko wa AVR 2: 4 Hatua

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

Mafunzo haya ni mwendelezo wa "AVR Assembler Tutorial 1"

Ikiwa haujapitia Mafunzo ya 1 unapaswa kuacha sasa na ufanye hiyo kwanza.

Katika mafunzo haya tutaendelea na masomo yetu ya programu ya lugha ya mkutano wa atmega328p inayotumiwa katika Arduino's.

Utahitaji:

  1. mkate wa mkate Arduino au Arduino ya kawaida kama katika Mafunzo ya 1
  2. LED
  3. kinzani cha 220 ohm
  4. kitufe cha kushinikiza
  5. kuunganisha waya kwa kutengeneza mzunguko kwenye ubao wako wa mkate
  6. Mwongozo wa Kuweka Uingizaji: www.atmel.com/images/atmel-0856-avr-instruction-s…
  7. Hati ya data: www.atmel.com/images/Atmel-8271-8-bit-AVR-Microco …….

Mkusanyiko kamili wa mafunzo yangu unaweza kupatikana hapa:

Hatua ya 1: Kuunda Mzunguko

Kujenga Mzunguko
Kujenga Mzunguko

Kwanza unahitaji kujenga mzunguko ambao tutasoma katika mafunzo haya.

Hii ndio njia ambayo imeunganishwa:

PB0 (pini ya dijiti 8) - LED - R (220 ohm) - 5V

PD0 (pini ya dijiti 0) - kifungo cha kushinikiza - GND

Unaweza kuangalia kuwa LED yako imeelekezwa vizuri kwa kuiunganisha na GND badala ya PB0. Ikiwa hakuna kinachotokea basi geuza mwelekeo na taa inapaswa kuja juu. Kisha unganisha tena kwa PB0 na uendelee. Picha inaonyesha jinsi mkate wangu wa arduino umeunganishwa.

Hatua ya 2: Kuandika Kanuni za Mkutano

Kuandika Kanuni za Bunge
Kuandika Kanuni za Bunge

Andika nambari ifuatayo kwenye faili ya maandishi inayoitwa pushbutton.asm na uiandike na avra kama ulivyofanya kwenye Mafunzo ya 1.

Ona kwamba katika nambari hii tuna maoni mengi. Kila wakati mkusanyaji anapoona semicoloni itaruka mstari uliobaki na kwenda kwenye mstari unaofuata. Ni mazoezi mazuri ya programu (haswa kwa lugha ya kusanyiko!) Kutoa maoni yako sana kwa nambari yako ili utakaporudi kwake katika siku zijazo utajua unachokuwa unafanya. Nitatoa maoni ya mambo mengi sana katika mafunzo ya kwanza ya kwanza ili tuweze kujua ni nini kinaendelea na kwanini. Baadaye, mara tu tutakapokuwa bora kwenye usimbo wa mkutano nitatoa maoni kwa undani kidogo.

;************************************

; iliyoandikwa na: 1o_o7; tarehe: Oktoba 23, 2014; ***********************************

.nolist

pamoja na "m328Pdef.inc".list.def temp = r16; teua rejista ya kufanya kazi r16 kama temp rjmp Init; mstari wa kwanza kutekelezwa

Ndani yake:

muda mfupi; weka vipande vyote kwa muda wa 1. nje DDRB, temp; kuweka kidogo kama 1 kwenye Mwelekeo wa Takwimu I / O; kujiandikisha kwa PortB, ambayo ni DDRB, inaweka hiyo; pini kama pato, 0 ingeweka pini kama pembejeo; kwa hivyo hapa, pini zote za PortB ni matokeo (kuweka 1) ldi temp, 0b11111110; pakia nambari "ya haraka" kwa rejista ya muda; kama ingekuwa tu ld basi hoja ya pili; ingekuwa mahali pa kumbukumbu badala ya DDRD, temp; mv temp kwa DDRD, matokeo ni kwamba PD0 ni pembejeo; na zingine ni matokeo clr temp; bits zote katika temp zimewekwa 0 Portb, temp; weka bits zote (i.e. pini) katika PortB hadi 0V ldi temp, 0b00000001; pakia nambari ya haraka ili kumaliza PortD, temp; songa temp kwa PortD. PD0 ina kontena la kuvuta; (i.e. imewekwa kwa 5V) kwani ina 1 katika hiyo kidogo; zingine ni 0V tangu 0's.

Kuu:

kwa muda, PinD; PinD inashikilia hali ya PortD, nakili hii kwa muda; ikiwa kitufe kimeunganishwa na PD0 hii itakuwa; 0 wakati kifungo kinasukumwa, 1 vinginevyo tangu; PD0 ina kontena la kuvuta ni kawaida katika 5V nje PortB, temp; hutuma 0 na 1 zilizosomwa hapo juu kwa PortB; hii inamaanisha tunataka LED iunganishwe na PB0,; wakati PD0 iko chini, inaweka PB0 kuwa chini na kugeuka; kwenye LED (kwa kuwa upande mwingine wa LED ni; imeunganishwa na 5V na hii itaweka PB0 hadi 0V hivyo; mtiririko wa sasa) rjmp Kuu; matanzi nyuma hadi mwanzo wa Kuu

Ona kwamba wakati huu hatuna maoni mengi tu kwenye nambari yetu, lakini pia tuna sehemu ya kichwa ambayo inatoa habari juu ya nani aliiandika na ni lini iliandikwa. Nambari iliyobaki pia imegawanywa katika sehemu.

Baada ya kuandaa nambari iliyo hapo juu unapaswa kuipakia kwenye microcontroller na uone kuwa inafanya kazi. LED inapaswa kuwasha wakati unasukuma kitufe na kisha uzime tena wakati unaacha. Nimeonyesha jinsi inavyoonekana kwenye picha.

Hatua ya 3: Uchambuzi wa Kanuni kwa mstari

Nitaruka mistari ambayo ni maoni tu kwani kusudi lao linajidhihirisha.

.nolist

pamoja na "m328Pdef.inc".list

Mistari hii mitatu ni pamoja na faili iliyo na ufafanuzi wa Daftari na Bit kwa ATmega328P ambayo tunapanga. Amri ya.nolist inamwambia mkusanyaji asijumuishe faili hii kwenye faili ya pushbutton.lst ambayo inazalisha unapoikusanya. Inazima chaguo la orodha. Baada ya kujumuisha faili tunawasha tena chaguo la orodha na amri ya orodha. Sababu tunafanya hivi ni kwa sababu faili ya m328Pdef.inc ni ndefu kabisa na hatuhitaji kuiona kwenye orodha ya faili. Mkusanyaji wetu, avra, haitoi faili ya orodha moja kwa moja na ikiwa tungependa moja tungekusanyika kwa kutumia amri ifuatayo:

avra -l pushbutton.lst kushinikiza.asm

Ukifanya hivyo itazalisha faili inayoitwa pushbutton.lst na ukichunguza faili hii utapata kuwa inaonyesha nambari yako ya mpango pamoja na habari ya ziada. Ukiangalia habari ya ziada utaona kuwa mistari huanza na C: ikifuatiwa na anwani ya jamaa katika hex ya mahali ambapo nambari imewekwa kwenye kumbukumbu. Kwa kweli huanza saa 000000 na amri ya kwanza na kuongezeka kutoka hapo na kila amri inayofuata. Safu ya pili baada ya mahali pa jamaa kwenye kumbukumbu ni nambari ya hex kwa amri ikifuatiwa na nambari ya hex kwa hoja ya amri. Tutazungumzia faili za orodha zaidi katika mafunzo ya siku zijazo.

.def temp = r16; teua rejista ya kazi r16 kama temp

Katika mstari huu tunatumia agizo la kukusanyika ".def" kufafanua "temp" inayobadilika kuwa sawa na r16 "rejista ya kufanya kazi." Tutatumia rejista r16 kama ile inayohifadhi nambari ambazo tunataka kunakili kwa bandari na rejista anuwai (ambazo haziwezi kuandikiwa moja kwa moja).

Zoezi la 1: Jaribu kunakili nambari moja kwa moja kwenye bandari au sajili maalum kama DDRB na uone kile kinachotokea unapojaribu kukusanya nambari hiyo.

Rejista ina habari (8 bits) ya habari. Kimsingi ni kawaida mkusanyiko wa SR-Latches kila moja ni "kidogo" na ina 1 au 0. Tunaweza kujadili hii (na hata kujenga moja!) Baadaye katika safu hii. Labda unajiuliza ni nini "rejista ya kufanya kazi" na kwanini tumechagua r16. Tutazungumzia hilo katika mafunzo ya baadaye tutakapoingia kwenye quagmire ya wa ndani wa chip. Kwa sasa nataka uelewe jinsi ya kufanya vitu kama nambari ya kuandika na kupanga vifaa vya mwili. Halafu utakuwa na fremu ya kumbukumbu kutoka kwa uzoefu huo ambayo itafanya kumbukumbu na rejista mali za mdhibiti mdogo zieleweke. Natambua kuwa vitabu vya kiada na majadiliano hufanya hivi kwa njia nyingine lakini nimegundua kuwa kucheza mchezo wa video kwa muda kwanza kupata mtazamo wa ulimwengu kabla ya kusoma mwongozo wa maagizo ni rahisi sana kuliko kusoma mwongozo kwanza.

rjmp Init; mstari wa kwanza kutekelezwa

Mstari huu ni "kuruka kwa jamaa" kwa lebo "Init" na sio lazima hapa kwa kuwa amri inayofuata tayari iko katika Init lakini tunaijumuisha kwa matumizi ya baadaye.

Ndani yake:

muda mfupi; weka vipande vyote kwa muda wa 1.

Baada ya lebo ya Init tunafanya amri ya "kuweka sajili". Hii inaweka seti zote 8 kwenye rejista ya "temp" (ambayo unakumbuka ni r16) hadi 1. Kwa hivyo temp sasa ina 0b11111111.

nje DDRB, temp; kuweka kidogo kama 1 kwenye rejista ya Mwelekeo wa Takwimu I / O

; kwa PortB, ambayo ni DDRB, inaweka pini hiyo kama pato; 0 ingeweka pini kama pembejeo; kwa hivyo hapa, pini zote za PortB ni matokeo (weka kwa 1)

Rejista ya DDRB (Sajili ya Uelekezaji wa Takwimu ya PortB) inaelezea ni pini gani kwenye PortB (i.e. PB0 kupitia PB7) zimeteuliwa kama pembejeo na ambazo zimetajwa kama pato. Kwa kuwa tuna pini PB0 iliyounganishwa na LED yetu na zingine hazijaunganishwa na chochote tutaweka bits zote kwa 1 ikimaanisha kuwa zote ni matokeo.

ldi temp, 0b11111110; pakia nambari ya "haraka" kwa rejista ya muda

; kama ingekuwa tu ld basi hoja ya pili ingekuwa; lazima iwe eneo la kumbukumbu

Mstari huu hupakia nambari ya binary 0b11111110 kwenye sajili ya temp.

nje DDRD, temp; mv temp kwa DDRD, matokeo ni kwamba PD0 ni pembejeo na

; mengine ni matokeo

Sasa tunaweka Rejista ya Uelekezaji wa Takwimu ya PortD kutoka temp, kwani temp bado ina 0b11111110 tunaona kuwa PD0 itateuliwa kama pini ya kuingiza (kwani kuna 0 mahali pa kulia kabisa) na zingine zimeteuliwa kama matokeo kwani kuna 1 katika maeneo hayo.

clr muda; bits zote katika temp zimewekwa kwa 0's

nje PortB, temp; weka bits zote (i.e. pini) kwenye PortB hadi 0V

Kwanza sisi "husafisha" temp ya kujiandikisha ambayo inamaanisha kuweka bits zote kuwa sifuri. Kisha tunakili hiyo kwa daftari la PortB ambalo linaweka 0V kwenye pini zote hizo. Zero kwenye bandari ya PortB inamaanisha kuwa processor itashika pini hiyo kwa 0V, moja kidogo itasababisha pini hiyo iwekwe 5V.

Zoezi la 2: Tumia multimeter kuangalia ikiwa pini zote kwenye PortB ni sifuri. Je! Kuna kitu cha kushangaza kinachoendelea na PB1? Wazo lolote kwa nini hiyo inaweza kuwa? (sawa na Zoezi la 4 hapo chini kisha fuata nambari…) Zoezi la 3: Ondoa mistari miwili hapo juu kutoka kwa nambari yako. Je! Programu bado inaendesha kwa usahihi? Kwa nini?

ldi temp, 0b00000001; pakia nambari ya haraka kwa temp

nje PortD, temp; songa temp kwa PortD. PD0 iko kwenye 5V (ina kontena la pullup); kwa kuwa ina 1 katika hiyo kidogo wengine ni 0V. Zoezi la 4: Ondoa mistari miwili hapo juu kutoka kwa nambari yako. Je! Programu bado inaendesha kwa usahihi? Kwa nini? (Hii ni tofauti na Zoezi la 3 hapo juu. Tazama mchoro wa pini. Je! Mipangilio ya DDRD chaguo-msingi ya PD0 ni nini? (Tazama ukurasa wa 90 wa karatasi ya data.

Kwanza "tunapakia mara moja" nambari 0b00000001 hadi temp. Sehemu ya "haraka" iko kwa kuwa tunapakia nambari ya moja kwa moja hadi kwa muda badala ya kuelekeza mahali pa kumbukumbu iliyo na nambari ya kupakia. Kwa hali hiyo tungetumia tu "ld" badala ya "ldi". Kisha tunatuma nambari hii kwa PortD ambayo huweka PD0 hadi 5V na iliyobaki kwa 0V.

Sasa tumeweka pini kama pembejeo au pato na tumeanzisha majimbo yao ya kwanza kama 0V au 5V (LOW or HIGH) na kwa hivyo sasa tunaingia "kitanzi" chetu.

Kuu: katika temp, PinD; PinD inashikilia hali ya PortD, nakili hii kwa temp

; ikiwa kifungo kimeunganishwa na PD0 basi hii itakuwa; 0 wakati kifungo kinasukumwa, 1 vinginevyo tangu; PD0 ina kontena la kuvuta ni kawaida kwa 5V

Rejista ya PinD ina hali ya sasa ya pini za PortD. Kwa mfano, ikiwa umeunganisha waya wa 5V kwa PD3, basi kwenye mzunguko unaofuata wa saa (ambayo hufanyika mara milioni 16 kwa sekunde kwa kuwa tuna mdhibiti mdogo aliyefungwa hadi ishara ya saa 16MHz) PinD3 kidogo (kutoka hali ya sasa ya PD3) itakuwa 1 badala ya 0. Kwa hivyo katika mstari huu tunakili hali ya sasa ya pini kwa temp.

nje PortB, temp; hutuma 0 na 1 zilizosomwa hapo juu kwa PortB

; hii inamaanisha tunataka LED imeunganishwa na PB0, kwa hivyo; wakati PD0 iko chini, itaweka PB0 kuwa chini na kugeuka; kwenye LED (upande mwingine wa LED imeunganishwa; kwa 5V na hii itaweka PB0 hadi 0V kwa sasa inapita)

Sasa tunatuma hali ya pini kwenye PinD kwa pato la PortB. Kwa ufanisi, hii inamaanisha kuwa PD0 itatuma 1 kwa PortD0 isipokuwa kitufe kitapobanwa. Katika kesi hiyo kwa kuwa kitufe kimeunganishwa ardhini pini hiyo itakuwa kwenye 0V na itatuma 0 kwa PortB0. Sasa, ukiangalia mchoro wa mzunguko, 0V kwenye PB0 inamaanisha kuwa LED itawaka kwani upande wake mwingine uko 5V. Ikiwa hatubonyeza kitufe, ili 1 ipelekwe kwa PB0, hiyo itamaanisha tuna 5V kwenye PB0 na pia 5V upande wa pili wa LED na kwa hivyo hakuna tofauti inayowezekana na hakuna sasa itatiririka na kwa hivyo LED haitawaka (katika kesi hii ni LED ambayo ni diode na kwa sasa inapita tu mwelekeo mmoja bila kujali lakini chochote).

rjmp Kuu; vitanzi nyuma kwa Anza

Rukia huyu wa jamaa anaturudisha kwenye Kuu yetu: lebo na tunaangalia PinD tena na kadhalika. Kuangalia kila milioni 16 ya sekunde ikiwa kitufe kinasukumwa na kuweka PB0 ipasavyo.

Zoezi la 5: Badilisha nambari yako ili LED yako iunganishwe na PB3 badala ya PB0 na uone kuwa inafanya kazi Zoezi la 6: Chomeka LED yako kwenye GND badala ya 5V na urekebishe nambari yako ipasavyo.

Hatua ya 4: Hitimisho

Katika mafunzo haya tumechunguza zaidi lugha ya mkutano kwa ATmega328p na kujifunza jinsi ya kudhibiti LED na kitufe cha kushinikiza. Hasa tulijifunza amri zifuatazo:

sajili ya ser huweka seti zote za rejista hadi 1's

Usajili wa clr huweka bits zote za rejista hadi 0

katika rejista, i / o sajili nakala nambari kutoka kwa i / o kujiandikisha hadi rejista ya kufanya kazi

Katika mafunzo yanayofuata tutachunguza muundo wa ATmega328p na rejista anuwai, shughuli, na rasilimali zilizomo.

Kabla sijaendelea na mafunzo haya nitasubiri na kuona kiwango cha kupendeza. Ikiwa kuna idadi ya watu ambao kwa kweli wanafurahia kujifunza jinsi ya kuweka alama kwa programu za microprocessor hii katika lugha ya mkutano basi nitaendelea na kujenga mizunguko ngumu zaidi na nitatumia nambari thabiti zaidi.

Ilipendekeza: