Talaan ng mga Nilalaman:

Tutorial sa AVR Assembler 6: 3 Mga Hakbang
Tutorial sa AVR Assembler 6: 3 Mga Hakbang

Video: Tutorial sa AVR Assembler 6: 3 Mga Hakbang

Video: Tutorial sa AVR Assembler 6: 3 Mga Hakbang
Video: PAANO MAGKABIT NG CCTV | CCTV TAGALOG BASIC TUTORIAL 2024, Nobyembre
Anonim
Tutorial sa AVR Assembler 6
Tutorial sa AVR Assembler 6

Maligayang pagdating sa Tutorial 6!

Ang tutorial ngayon ay magiging isang maikling kung saan makakabuo kami ng isang simpleng pamamaraan upang maipaabot ang data sa pagitan ng isang atmega328p at isa pa gamit ang dalawang port na kumokonekta sa kanila. Dadalhin namin ang roller ng dice mula sa Tutorial 4 at ang Register Analyzer mula sa Tutorial 5, ikonekta ang mga ito nang sama-sama, at gamitin ang aming pamamaraan upang maiparating ang resulta ng mga dice roll mula sa roller hanggang sa analyzer. Pagkatapos ay mai-print namin ang roll sa binary gamit ang mga LED na itinayo namin para sa analyzer sa Tutorial 5. Kapag mayroon kaming pagtatrabaho na ito ay makakagawa namin ang susunod na piraso ng aming pangkalahatang proyekto sa susunod na tutorial.

Sa tutorial na ito kakailanganin mo:

  1. Iyong prototyping board
  2. Ang iyong roller ng dice mula sa Tutorial 4
  3. Ang iyong Register Analyzer mula sa Tutorial 5
  4. Dalawang nag-uugnay na mga wire
  5. Isang kopya ng Kumpletong Data Sheet (rebisyon sa 2014):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. Isang kopya ng Manwal na Itakda ng Tagubilin (rebisyon sa 2014):

    www.atmel.com/images/atmel-0856-avr-instruc…

Narito ang isang link sa kumpletong koleksyon ng aking mga tutorial na AVR assembler:

Hakbang 1: Paano Kami Makakakuha ng Dalawang Microcontrollers upang Makipag-usap sa bawat Isa?

Paano Kami Makakakuha ng Dalawang Microcontrollers upang Makipag-usap sa bawat Isa?
Paano Kami Makakakuha ng Dalawang Microcontrollers upang Makipag-usap sa bawat Isa?

Dahil nagsisimula kaming palawakin ang aming proyekto upang ang aming solong produkto ng pagtatapos ay binubuo ng isang koleksyon ng mas maliit na mga bahagi na kakailanganin namin ng higit pang mga pin kaysa sa maibigay na isang solong Atmega328P. Samakatuwid gagawin namin ang bawat piraso ng pangkalahatang proyekto sa isang hiwalay na microcontroller at pagkatapos ay ipabahagi nila ang data sa pagitan nila. Kaya't ang problemang kailangan nating malutas ay kung paano tayo makakaisip ng isang simpleng pamamaraan para sa mga tagakontrol upang makipag-usap sa bawat isa at maglipat ng data sa pagitan nila? Sa gayon, isang bagay tungkol sa mga kumokontrol na ito ay ang bawat isa ay nagpatupad ng 16 milyong mga tagubilin bawat segundo. Ito ay napaka tiyak na nag-time at sa gayon maaari naming gamitin ang tiyempo na ito upang maglipat ng data. Kung gagamitin namin ang mga pagkaantala ng millisecond upang mabuo ang data kung gayon hindi talaga namin magiging tumpak ang lahat dahil ang CPU ay nagpapatupad ng 16, 000 na mga tagubilin sa isang solong millisecond. Sa madaling salita, ang isang millisecond ay isang kawalang-hanggan para sa CPU. Kaya't subukan natin ito sa mga dice roll. Nais kong ipadala ang resulta ng isang dice roll mula sa dice roller chip patungo sa chip ng analyzer. Ipagpalagay na nakatayo ka sa kalye at nais kong senyasan sa iyo ang resulta ng aking rolyo ng isang pares ng dice. Ang isang bagay na magagawa ko, kung pareho kaming may relo, ay maaari kong i-on ang isang flashlight, pagkatapos kapag handa ka nang matanggap ang aking data buksan mo ang iyong flashlight at pareho naming sinisimulan ang aming mga orasan. Pagkatapos ay pinapanatili ko ang aking flashlight para sa eksaktong bilang ng mga milliseconds habang ang dice roll at pagkatapos ay patayin ito. Kaya't kung pinagsama ko ang 12 ay itatago ko ang aking ilaw sa loob ng 12 millisecond. Ngayon ang problema sa itaas ay na, para sa iyo at sa akin, walang paraan na magagawa nating maayos ang oras ng mga bagay upang makilala ang pagitan ng 5 milliseconds at 12 milliseconds Ngunit paano ito: Ipagpalagay na nagpasya kaming itatago ko ang aking ilaw sa loob ng isang taon para sa bawat numero sa dice? Kung gayon kung gumulong ako ng 12 ipapakita ko sa iyo ang ilaw sa loob ng 12 taon at sa palagay ko ay sasang-ayon ka na walang posibilidad na magkamali ka sa pag-alam sa numero ng tama? Maaari kang magpahinga at maglaro ng baseball, maaari ka ring maglaro ng craps sa Vegas sa loob ng 6 na buwan, hangga't sa isang punto sa isang taon upang tumingin sa kalye upang makita kung ang ilaw ay nasa iyo ay hindi mo makaligtaan ang isang bilang. Sa gayon iyon mismo ang ginagawa namin para sa mga microcontroller! Ang isang solong millisecond para sa CPU ay tulad ng isang taon. Kaya't kung i-on ko ang signal para sa 12 milliseconds halos walang pagkakataon na malito ito ng iba pang microcontroller para sa 10 o 11 hindi mahalaga kung ano ang nakakagambala at kung ano ang mangyayari pansamantala. Para sa mga microcontroller, ang isang millisecond ay isang kawalang-hanggan. Kaya narito ang gagawin namin. Pipili muna kami ng dalawang port sa controller na magiging aming mga port sa komunikasyon. Gagamitin ko ang PD6 para sa Pagtanggap ng Data (maaari naming tawagan itong Rx kung nais namin) at pipiliin ko ang PD7 para sa paglilipat ng data (maaari naming tawagan itong Tx kung nais namin). Pansamantalang suriin ng chip ng analyzer ang Rx pin at kung makakita ito ng isang senyas ay mahuhulog ito sa isang "subroutine ng komunikasyon" at pagkatapos ay magpadala ng isang bumalik na senyas sa roller ng dice na nagsasabing handa na itong matanggap. Parehas silang magsisimulang tiyempo at ang dice roller ay magpapadala ng isang senyas (ibig sabihin 5V) para sa isang millisecond bawat numero sa dice. Kaya't kung ang rolyo ay doble ng anim, o isang 12, pagkatapos ay itatakda ng dice roller ang PD7 hanggang 5V para sa 12 milliseconds at pagkatapos ay itakda ito pabalik sa 0V. Susuriin ng analyzer ang PD6 pin nito sa bawat millisecond, na binibilang sa bawat oras, at kapag bumalik ito sa 0V pagkatapos ay naglalabas ito ng nagresultang numero sa display ng analyzer, na nagpapakita ng labingdalawang binary sa mga LED. Kaya't iyon ang plano. Tingnan natin kung maipapatupad natin ito.

Hakbang 2: Mga Subroutine ng Komunikasyon

Ang unang bagay na kailangan nating gawin ay ikonekta ang dalawang mga Controller. Kaya kumuha ng isang kawad mula sa PD6 sa isa at ikonekta ito sa PD7 sa kabilang banda, at vice versa. Pagkatapos ay ipasimula ang mga ito sa pamamagitan ng pagtatakda ng PD7 sa OUTPUT sa pareho at PD6 sa INPUT sa pareho. Sa wakas itakda ang lahat sa kanila sa 0V. Partikular, idagdag ang sumusunod sa seksyon ng Init, o I-reset ang code sa bawat microcontroller:

sbi DDRD, 7; Ang PD7 ay nakatakda sa output

cbi PortD, 7; Una nang PD7 0V cbi DDRD, 6; Ang PD6 ay nakatakda sa input cbi PortD, 6; PD6 sa una 0V clr total; kabuuan sa dice sa una 0

Ngayon ay i-set up natin ang komunikasyon subroutine sa dice-roller chip. Tukuyin muna ang isang bagong variable sa tuktok na tinatawag na "kabuuang" na mag-iimbak ng kabuuang bilang na pinagsama sa pares ng dice at ipasimula ito sa zero.

Pagkatapos ay sumulat ng isang subroutine upang makipag-usap sa analyzer:

makipag-usap:

cbi PortD, 7 sbi PortD, 7; Magpadala ng handa maghintay signal: sbic PinD, 6; basahin ang PinD at laktawan kung 0V rjmp maghintay antala 8; antalahin upang mai-synchronize (nahanap na eksperimentong ito) ipadala: dec kabuuang pagkaantala 2; antala para sa bawat bilang ng die cpi total, 0; Ang 0 dito ay nangangahulugang ang "kabuuang" mga pagkaantala ng numero ay naipadala na breq PC + 2 rjmp ipadala cbi PortD, 7; PD7 hanggang 0V clr total; i-reset ang kabuuang dice sa 0 ret

Sa analyzer nagdagdag kami ng isang rcall mula sa pangunahing gawain sa komunikasyon na subroutine:

clr analyzer; maghanda para sa bagong numero

sbic PinD, 6; suriin ang PD6 para sa isang 5V signal rcall na makipag-usap; kung ang 5V ay pumunta upang makipag-usap sa Mov analyzer, kabuuang; output sa analyzer display rcall analyzer

at pagkatapos ay isulat ang subroutine ng komunikasyon tulad ng sumusunod:

makipag-usap:

kabuuang clr; i-reset ang kabuuan sa 0 pagkaantala 10; antalahin upang mapupuksa ang mga bounce sbi PortD, 7; itakda ang PB7 sa 5V upang handa nang makatanggap ng signal: pagkaantala 2; maghintay para sa susunod na bilang inc kabuuan; pagtaas ng kabuuang sbic PinD, 6; kung ang PD6 ay babalik sa 0V tapos na tayong makatanggap; kung hindi man loop back up para sa higit pang data cbi PortD, 7; i-reset ang PD7 kapag tapos na ret

Ayan na! Ngayon ang bawat microcontroller ay naka-set up upang maiparating ang resulta ng dice roll at pagkatapos ay ipakita ito sa analyzer.

Ipapatupad namin ang isang mas mahusay na paraan ng pakikipag-usap sa paglaon kapag kailangan naming ilipat ang mga nilalaman ng isang rehistro sa pagitan ng mga taga-kontrol sa halip na isang dice roll lamang. Sa kasong iyon, gagamitin lamang namin ang dalawang wires na kumokonekta sa kanila ngunit gagamitin namin ang 1, 1 na nangangahulugang "simulan ang paghahatid"; Ang 0, 1 ay nangangahulugang "1"; Ang 1, 0 ay nangangahulugang "0"; at sa wakas 0, 0 na nangangahulugang "end transmission".

Pagsasanay 1: Tingnan kung maaari mong ipatupad ang mas mahusay na pamamaraan at gamitin ito upang ilipat ang dice roll bilang isang 8-bit na binary number.

Maglalakip ako ng isang video na ipinapakita ang pagpapatakbo ng minahan.

Hakbang 3: Konklusyon

Konklusyon
Konklusyon

Inilakip ko ang kumpletong code para sa iyong sanggunian. Hindi ito kasing malinis at malinis tulad ng gusto ko, ngunit lilinisin ko ito habang pinalalawak namin ito sa mga susunod na tutorial.

Mula ngayon ay ikakabit ko lamang ang mga file na naglalaman ng code sa halip na i-type ang lahat dito. I-type lang namin ang mga seksyon na interesado kaming talakayin.

Ito ay isang maikling tutorial kung saan nakagawa kami ng isang simpleng pamamaraan ng pagsasabi sa aming analyzer microcontroller kung ano ang resulta ng aming dice roll mula sa aming dice-roller microcontroller habang gumagamit lamang ng dalawang port.

Exercise 2: Sa halip na gumamit ng isang handa na signal upang ipakita kung handa nang magpadala ng dice roller at isa pa kapag handa nang tumanggap ang analyzer, gumamit ng isang "external interrupt" na tinatawag na "Pin Change Interrupt". Ang mga pin sa atmega328p ay maaaring magamit sa ganitong paraan kung kaya't mayroon silang PCINT0 throught PCINT23 sa tabi nila sa diagram ng pinout. Maaari mong ipatupad ito bilang isang nakakagambala sa isang katulad na paraan tulad ng ginawa namin sa pag-overflow ng overflow ng timer. Sa kasong ito ang makagambala na "handler" ay ang subroutine na nakikipag-usap sa dice roller. Sa ganitong paraan hindi mo kailangang tawagan ang subroutine ng komunikasyon mula sa pangunahing: pupunta ito roon anumang oras na mayroong isang nakakagambala na nagmumula sa isang pagbabago ng estado sa pin na iyon.

Exercise 3: Ang isang mas mahusay na paraan ng pakikipag-usap at paglilipat ng data sa pagitan ng isang microcontroller sa isang koleksyon ng iba pa ay ginagamit ang built in na 2-wire serial interface sa mismong microcontroller. Subukang basahin ang seksyon 22 ng datasheet at tingnan kung maaari mong malaman kung paano ipatupad ito.

Gagamitin namin ang mas malambot na mga diskarteng ito sa hinaharap kapag nagdagdag kami ng karagdagang mga Controller.

Ang katotohanan na ang ginawa lamang namin sa aming analyzer ay kunin ang kabuuan ng dice roll at pagkatapos ay i-print ito sa binary gamit ang mga LED ay hindi kung ano ang mahalaga. Ang katotohanan ay na ngayon ang aming analyzer ay "alam" kung ano ang dice roll at maaaring gamitin ito nang naaayon.

Sa susunod na tutorial binabago namin ang layunin ng aming "analyzer", na nagpapakilala ng ilang higit pang mga elemento ng circuit, at ginagamit ang dice roll sa isang mas kawili-wiling paraan.

Hanggang sa muli…

Inirerekumendang: