Мазмуну:

AVR Assembler үйрөткүчү 6: 3 кадамдар
AVR Assembler үйрөткүчү 6: 3 кадамдар

Video: AVR Assembler үйрөткүчү 6: 3 кадамдар

Video: AVR Assembler үйрөткүчү 6: 3 кадамдар
Video: Лекция 4. Архитектура AVR. Ассемблер 2024, Ноябрь
Anonim
AVR Assembler үйрөткүчү 6
AVR Assembler үйрөткүчү 6

Tutorial 6га кош келиңиз!

Бүгүнкү үйрөткүч кыска болот, анда биз бир атмега328п менен экинчисинин ортосунда маалыматтарды бириктирүүчү эки портту колдонуу менен маалымат алмашуунун жөнөкөй ыкмасын иштеп чыгабыз. Андан кийин биз үйрөткүч 4төн сүйөк ролигин жана 5 -сабактан регистр анализаторун алып, аларды бири -бирине туташтырабыз жана роликтен анализаторго чүчү түрмөктөрдүн натыйжасын жеткирүү үчүн биздин ыкманы колдонобуз. Биз андан кийин 5 -үйрөткүчтүн анализатору үчүн курган Светодиоддордун жардамы менен түрмөктү экилик кылып басып чыгарабыз. Бизде бул иш болгондон кийин биз кийинки окуу куралыбызда жалпы долбоорубуздун кийинки бөлүгүн кура алабыз.

Бул окуу куралында сизге керек болот:

  1. Сиздин прототибиңиздин тактасы
  2. Үйрөткүч 4төн сиздин сөөк ролигиңиз
  3. Сиздин каттоо анализаторуңуз үйрөткүч 5
  4. Эки туташтыруучу зым
  5. Толук маалымат баракчасынын көчүрмөсү (2014 -жылдагы оңдоо):

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

  6. Колдонмонун көчүрмөсү (2014 -жылкы редакция):

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

Бул жерде менин AVR ассемблер окуу куралдарымдын толук коллекциясына шилтеме бар:

1 -кадам: Кантип эки микроконтроллерди бири -бири менен сүйлөшө алабыз?

Кантип эки микроконтроллерди бири -бири менен сүйлөшө алабыз?
Кантип эки микроконтроллерди бири -бири менен сүйлөшө алабыз?

Биз бир гана акыркы продуктубуз кичинекей бөлүктөрдүн жыйындысынан тургандай кылып, долбоорубузду кеңейте баштаганыбыз үчүн, бизге бир Atmega328P камсыз кыла албагандан көбүрөөк казык керек болот. Ошондуктан, биз жалпы долбоордун ар бир бөлүгүн өзүнчө микроконтроллерде жасайбыз жана андан кийин алардын ортосунда маалыматтарды бөлүшүүсүн талап кылабыз. Ошентип, биз чечишибиз керек болгон маселе, контроллерлердин бири -бири менен сүйлөшүүсүнүн жана алардын ортосунда маалыматтарды өткөрүп берүүсүнүн жөнөкөй ыкмасын кантип ойлоп табууга болот? Ооба, бул контроллерлер жөнүндө бир нерсе, алардын ар бири секундасына 16 миллион көрсөтмөнү аткарат. Бул абдан так белгиленген жана андыктан биз бул убакытты маалыматтарды өткөрүп берүү үчүн колдоно алабыз. Эгерде биз маалыматты түзүү үчүн миллисекунддук кечигүүнү колдонсок, анда биз так болуунун кажети жок, анткени CPU бир миллисекундта 16 000 көрсөтмөнү аткарып жатат. Башкача айтканда, миллисекунд - CPU үчүн түбөлүктүүлүк. Келгиле, муну чукул түрмөктөр менен сынап көрөлү. Мен сүйөк ролунун чипинен анализатордун чипине чукулдун жыйынтыгын өткөргүм келет. Сиз көчөнүн аркы өйүзүндө турдуңуз дейли, мен сизге бир жуп чүкө тоголотуумдун жыйынтыгын билдиргим келди. Мен жасай алчу бир нерсе, эгерде экөөбүздүн колубузда саат болсо, мен фонарикти күйгүзө алмакмын, анда сиз менин маалыматымды алууга даяр болгондо фонаригиңизди күйгүзөсүз жана экөөбүз тең саатыбызды баштайбыз. Анан чыракты тоголотуп жатканда миллисекундтардын так санын күйгүзүп, анан өчүрөм. Ошентип, мен 12ди тоголотуп койсом, мен жарыгымды 12 миллисекундка күйгүзүп коймокмун. Эми жогоруда айтылган маселе, сен жана мен үчүн, биз 5 миллисекунддан 12ге чейин айырмалай ала турган нерселерди так убакытка бөлө албайбыз. миллисекундия. Бирок бул жөнүндө эмне айтууга болот: биз чырактын ар бир саны үчүн жарыгымды бир жыл бою күйгүзүүнү чечтик дейли? Эгер мен 12ни тоголотсом, мен сизге 12 жыл бою жарык чачып турмакмын жана сиз туура санды табууда ката кетирүү мүмкүнчүлүгү жок экенине кошуласыз деп ойлойм? Сиз бир аз эс алып, бейсбол ойносоңуз болот, ал тургай, 6 ай бою Вегаска спорттук оюндарды ойносоңуз болот, эгерде жыл бою кайсы бир убакта көчөнүн аркы өйүзүн карасаңыз, анда жарык өчпөйт. Ооба, так биз микроконтроллерлер үчүн кылып жатабыз! CPU үчүн бир миллисекунд бир жылга окшош. Ошентип, эгер мен сигналды 12 миллисекундка күйгүзүп койсом, башка микроконтроллер аны эмне үчүн үзгүлтүккө учуратса да жана эмне болбосун 10 же 11 үчүн чаташтырып жиберет. Микроконтроллерлер үчүн миллисекунд - бул түбөлүктүүлүк, андыктан биз эмне кылабыз. Биринчиден, биз контроллердеги эки портту тандайбыз, биздин байланыш порттарыбыз. Мен PD6ны маалыматтарды алуу үчүн колдоном (эгер биз кааласак, аны Rx деп атасак болот) жана мен маалыматтарды берүү үчүн PD7ди тандайм (эгер кааласак Tx деп атасак болот). Анализатордун чипи мезгил -мезгили менен анын Rx пинин текшерип турат жана эгер ал сигналды көрсө, ал "байланыш подпрограммасына" түшөт, андан кийин аны кабыл алууга даярмын деп кубик ролигине кайтаруу сигналын берет. Алар экөө тең убакытты башташат жана сөөктүн ролиги кубиктин бир санына миллисекунд үчүн сигнал (б.а. 5В) өткөрүп берет. Ошентип, эгерде ролл кош алты же 12 болсо, анда чүкө ролиги PD7ди 5 миллисекундга 5 миллисекундка коюп, кайра 0Вге коёт. Анализатор PD6 пинин ар бир миллисекундта текшерет, ар бир убакытты санап турат, жана 0Vге кайтканда, анализатордун дисплейине чыккан санды чыгарат, он экиден LEDди көрсөтөт. Демек, бул план. Келгиле, аны ишке ашыра аларыбызды карап көрөлү.

2 -кадам: Байланыш программалары

Биз кылышыбыз керек болгон биринчи нерсе - эки контроллерди туташтыруу. Ошентип, биринен PD6дан зым алып, экинчисинен PD7ге туташтырыңыз, жана тескерисинче. Андан кийин PD7ди экөөнө тең ЧЫГУУГА жана PD6ны КИРГИЗҮҮГӨ коюу менен аларды инициалдаңыз. Акыры алардын бардыгын 0Вге койгула. Тактап айтканда, ар бир микроконтроллердеги коддун Init же Reset бөлүмүнө төмөнкүлөрдү кошуңуз:

sbi DDRD, 7; PD7 чыгарууга коюлду

cbi PortD, 7; PD7 башында 0V cbi DDRD, 6; PD6 cB PortD, 6 киргизүү үчүн коюлган; PD6 башында 0V clr жалпы; суммалардын башында бардыгы 0

Эми коммуникациянын подрограммасын диц-ролик чипине орнотолу. Биринчиден, үстүнкү бөлүктө "жалпы" деп аталган жаңы өзгөрмөнү аныктаңыз, ал жалпынын санын сүйдүн үстүнө илип, нөлгө баштапкы абалга келтирет.

Андан кийин анализатор менен байланышуу үчүн подпрограмманы жазыңыз:

байланыш:

cbi PortD, 7 sbi PortD, 7; Даяр сигналды күтүүнү жөнөтүү: sbic PinD, 6; 0D rjmp күтүү кечигүүсү 8 болсо PinDди окуп, өткөрүп жиберүү 8; синхрондоштуруу үчүн кечиктирүү (муну эксперименталдык жол менен табышкан) жөнөтүү: дек жалпы кечигүү 2; ар бир өлүү үчүн кечигүү cpi жалпы, 0; 0 бул жерде "жалпы" саны кечигүүлөр жөнөтүлгөн дегенди билдирет PC+2 rjmp cbi portD, 7 жөнөтүү; PD7 - 0V clr жалпы; сөлдүн жалпы суммасын 0 ретке кайтаруу

Анализатордо биз байланыш регламентине негизги тартиптен rcall кошобуз:

clr анализатору; жаңы номерге даярдан

sbic PinD, 6; байланыш үчүн 5В сигнал үчүн PD6 текшерүү; эгер 5V mov анализатору менен байланышууга барса, бардыгы; анализаторго чыгаруу rcall анализаторун көрсөтүү

анан байланыш подпрограммасын төмөнкүчө жазыңыз:

байланыш:

clr total; баштапкы абалга келтирүү 0 кечигүү 10; секирүүдөн арылуу үчүн кечигүү sbi PortD, 7; PB7ди 5Vга даяр сигналды кабыл алуу үчүн коюңуз: кечигүү 2; кийинки санды күтө туруңуз; көбөйтүү жалпы sbic PinD, 6; эгер PD6 кайра 0Вге кайтса, биз rjmp алууну бүтүрдүк; антпесеңиз, көбүрөөк маалымат алуу үчүн cbi PortD, 7; ret7 бүткөндө PD7ди баштапкы абалга келтирүү

Мына сага! Эми ар бир микроконтроллер чүчү кулактын жыйынтыгын билдирип, анан анализатордо көрсөтүү үчүн орнотулган.

Кийинчерээк биз реестрдин мазмунун текченин ордуна, контроллерлерге өткөрүп берүү керек болгондо, байланыштын кыйла эффективдүү ыкмасын колдонобуз. Мындай учурда, биз дагы эле аларды туташтырган эки зымды гана колдонобуз, бирок 1, 1ди колдонобуз "берүүнү баштоо"; 0, 1 "1" дегенди билдирет; 1, 0 "0" дегенди билдирет; жана акыры 0, 0 "акыркы берүүнү" билдирет.

Exercise 1: Сиз жакшыраак ыкманы ишке ашыра алаарыңызды жана аны 8-бит бинардык номер катары сюжеттин түрмөгүн өткөрүп берүү үчүн колдоно ала тургандыгыңызды караңыз.

Мен өзүмдүн ишимди көрсөткөн видеону тиркейм.

3 -кадам: Жыйынтык

Жыйынтык
Жыйынтык

Мен сиздин кодуңуз үчүн толук кодду тиркеп койдум. Бул мен каалагандай таза жана тыкан эмес, бирок биз аны кийинки окуу куралдарында кеңейткен сайын тазалайм.

Мындан ары мен жөн эле кодду камтыган файлдарды тиркеп коёюн, баарын бул жерге жазгыла. Биз жөн гана талкууга кызыккан бөлүмдөрдү теребиз.

Бул кыска үйрөткүч болгон, анда биз анализаторубуздун микроконтроллерине эки портту колдонуп жатып, биздин сүйөк роликтин микроконтроллеринен кандай жыйынтык чыгарганын айтуунун жөнөкөй ыкмасын ойлоп тапканбыз.

Exercise 2: Dice roller качан өткөрүүгө даяр экенин көрсөтүү үчүн даяр сигналды колдонуунун ордуна, анализатор кабыл алууга даяр болгондо экинчисин "Pin Change Interrupt" деп аталган "тышкы үзгүлтүктү" колдонуңуз. Атмега328птеги казыктарды ушинтип колдонсо болот, ошондуктан аларда PININ диаграммасында жанында PCINT23 бар PCINT0 бар. Сиз муну таймердин толуп кетүүсүндө болгон сыяктуу эле үзгүлтүк катары ишке ашырсаңыз болот. Бул учурда үзгүлтүккө учуроочу "иштетүүчү" чүкөлөрдүн ролиги менен байланышкан кичи программа болот. Муну менен байланыштын чакан программасын чындап эле чалуунун кажети жок: ал ошол пиндин абалынын өзгөрүшүнөн келип чыккан үзгүлтүк болгондо ошол жакка барат.

Exercise 3: Микроконтроллердин ортосундагы маалыматты алмашуунун жана берүүнүн эң жакшы жолу, микро контроллердин өзүндө курулган 2 зымдуу сериялык интерфейсти колдонуу. Маалымат баракчасынын 22 -бөлүмүн окуп чыгууга аракет кылыңыз жана аны кантип ишке ашыруу керек экенин биле аласызбы.

Келечекте биз дагы контроллерлерди кошкондо бул татаал техникаларды колдонобуз.

Биздин анализатор менен кылган нерселерибиздин бардыгы - текчелердин жалпы суммасын алып, анан аны LEDлердин жардамы менен экилик кылып басып чыгаруу. Чындыгында, азыр биздин анализаторубуз чүкөнүн эмне экенин "билет" жана ошого жараша колдоно алат.

Кийинки үйрөткүчтө биз "анализаторубуздун" максатын өзгөртүп, дагы бир нече схема элементтерин киргизип, кубиктин ролун кызыктуу жол менен колдонобуз.

Кийинки убакытка чейин…

Сунушталууда: