Мазмұны:

AVR Assembler оқулығы 2: 4 қадам
AVR Assembler оқулығы 2: 4 қадам

Бейне: AVR Assembler оқулығы 2: 4 қадам

Бейне: AVR Assembler оқулығы 2: 4 қадам
Бейне: How to use LED seven segment display and calculate its resistors value 2024, Шілде
Anonim
AVR құрастырушы оқулығы 2
AVR құрастырушы оқулығы 2

Бұл оқу құралы «AVR Assembler Tutorial 1» сабағының жалғасы болып табылады

Егер сіз 1 -оқулықтан өтпеген болсаңыз, қазір оны тоқтатып, бірінші орындаңыз.

Бұл оқулықта біз Arduino -да қолданылатын atmega328p ассемблерлік бағдарламалауды зерттеуді жалғастырамыз.

Саған қажет болады:

  1. нан тақтасы Arduino немесе 1 -оқулықтағыдай қарапайым Arduino
  2. жарық диоды
  3. 220 Ом резистор
  4. басу түймесі
  5. нан тақтасында контур жасауға арналған сымдарды жалғау
  6. Қолдану нұсқаулығы: www.atmel.com/images/atmel-0856-avr-instruction-s…
  7. Деректер парағы: www.atmel.com/images/Atmel-8271-8-bit-AVR-Microco…

Оқулықтардың толық жинағын мына жерден табуға болады:

1 -қадам: Схеманы құру

Циклды құру
Циклды құру

Алдымен сіз осы оқулықта оқитын схеманы құруыңыз керек.

Міне, оның қосылу әдісі:

PB0 (цифрлық пин 8) - жарық диоды - R (220 ом) - 5В

PD0 (цифрлық түйреуіш 0) - батырмасы - GND

Сіз жарық диодты PB0 орнына GND -ге қосу арқылы дұрыс бағытталғанын тексере аласыз. Егер ештеңе болмаса, бағытты өзгертіңіз және жарық қосылуы керек. Содан кейін оны PB0 -ге қайта қосыңыз және жалғастырыңыз. Суретте менің нан тақтасы arduino қалай қосылғанын көрсетеді.

2 -қадам: Ассамблея кодын жазу

Ассамблея кодексін жазу
Ассамблея кодексін жазу

Келесі кодты pushbutton.asm деп аталатын мәтіндік файлға жазыңыз және оны 1 -оқулықтағыдай avra көмегімен құрастырыңыз.

Назар аударыңыз, бұл кодта бізде көптеген түсініктемелер бар. Ассемблер нүктелі үтірді көрген сайын жолдың қалған бөлігін өткізіп жіберіп, келесі жолға өтеді. Болашақта оған оралғанда сіз не істеп жатқаныңызды білу үшін кодты түсініктеме беру жақсы бағдарламалау практикасы (әсіресе ассамблея тілінде!). Мен алғашқы бірнеше оқулықтарда көп нәрсені түсіндіремін, сондықтан біз не болып жатқанын және не үшін екенін білеміз. Кейінірек, біз құрастыруды кодтауда біршама жақсара бастағанда, мен сәл егжей -тегжейлі түсініктеме беремін.

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

; жазған: 1o_o7; күні: 23 қазан 2014 ж.; **********************************

.нолист

.include «m328Pdef.inc».list.def temp = r16; r16 жұмыс регистрін temp rjmp Init ретінде белгілеңіз; бірінші жол орындалды

Ішінде:

температура; барлық биттерді 1 -ге орнатыңыз. DDRB, температура; Деректер бағыты бойынша енгізу -шығару жолында битті 1 етіп орнату; DDRB болып табылатын PortB үшін тіркеу мыналарды орнатады; PIN ретінде шығыс, 0 бұл түйреуішті кіріс ретінде орнатады; мұнда барлық PortB түйреуіштері шығыс (1 -ге орнатылған) ldi temp, 0b11111110; уақытша регистрге «дереу» нөмірін жүктеңіз; егер бұл тек ld болса, онда екінші аргумент; жад орны болуы керек, оның орнына DDRD, temp; mv temp DDRD, нәтижесі PD0 енгізу болып табылады; ал қалғандары клр температурасы болып табылады; temp -дегі барлық биттер PortB, temp 0 -ге орнатылады; PortB ішіндегі барлық биттерді (яғни түйреуіштерді) 0V ldi temp, 0b00000001 мәніне орнатыңыз; PortD, temp жылдамдығын төмендету үшін бірден нөмірді жүктеңіз; PortD температурасын жылжытыңыз. PD0 тартылатын резисторы бар; (яғни 5В -қа орнатылған), себебі оның битінде 1 бар; қалғандары 0 -ден бері 0В.

Негізгі:

температурада, PinD; PinD PortD күйін сақтайды, оны уақытшаға көшіріңіз; егер түйме PD0 -ге қосылған болса, бұл болады; Түйме басылғанда 0, әйтпесе 1; PD0 жоғары тартылатын резисторы бар, ол әдетте 5В PortB температурасында; жоғарыдағы 0 мен 1 көрсеткіштерін PortB жібереді; бұл біз PB0,; PD0 LOW болғанда, ол PB0 параметрін LOW күйіне орнатады және бұрады; светодиодта (светодиодтың екінші жағы 5В -қа қосылғандықтан, бұл PB0 -ды 0В -ге орнатады; ток өтеді) rjmp Main; Майн басталуына қайта оралады

Назар аударыңыз, бұл жолы біздің кодта көптеген түсініктемелер ғана емес, сонымен қатар оны кім жазғаны және ол қашан жазылғандығы туралы ақпарат беретін тақырып бөлімі бар. Кодтың қалған бөлігі де бөлімдерге бөлінеді.

Жоғарыда көрсетілген кодты құрастырғаннан кейін оны микроконтроллерге жүктеп, оның жұмыс істейтінін көру керек. Жарық диодты түймені басу кезінде қосылуы керек, содан кейін босатқан кезде қайтадан өшуі керек. Мен суретте оның қалай көрінетінін көрсеттім.

3-қадам: Кодты сызықтық талдау

Мен тек түсініктеме беретін жолдарды өткізіп жіберемін, себебі олардың мақсаты өздігінен түсінікті.

.нолист

. «m328Pdef.inc».list қосыңыз

Бұл үш жолда біз бағдарламалайтын ATmega328P регистрі мен бит анықтамалары бар файл бар.. Nolist пәрмені ассемблерге бұл файлды оны құрастырған кезде шығаратын pushbutton.lst файлына қоспауды айтады. Бұл тізім опциясын өшіреді. Файлды қосқаннан кейін листинг опциясын.list пәрменімен қайта қосамыз. Мұны істеуіміздің себебі - m328Pdef.inc файлы өте ұзақ және оны тізім файлынан көрудің қажеті жоқ. Біздің ассемблер, avra, тізім файлын автоматты түрде жасамайды және егер біз қаласақ, келесі пәрменді пайдаланып жинайтын боламыз:

avra -l түймесі.лст түймесі.asm

Егер сіз мұны жасасаңыз, ол pushbutton.lst деп аталатын файлды жасайды және егер сіз бұл файлды тексерсеңіз, ол сіздің бағдарламалық кодты қосымша ақпаратпен бірге көрсететінін көресіз. Егер сіз қосымша ақпаратқа қарасаңыз, онда сызықтар C: -дан басталатынын көресіз, содан кейін код жадта орналасқан он алтылықта қатысты мекен -жай. Негізінде ол 000000 -де бірінші пәрменмен басталады және әрбір келесі пәрменмен сол жерден жоғарылайды. Жадтағы салыстырмалы орыннан кейінгі екінші баған - бұл команданың он алтылық коды, содан кейін команданың аргументіне арналған он алтылық код. Біз болашақ оқулықтарда тізім файлдарын талқылайтын боламыз.

.def температурасы = r16; r16 жұмыс регистрін температура ретінде белгілеңіз

Бұл жолда «temp» айнымалы мәнін r16 «жұмыс регистріне» тең деп анықтау үшін «.def» ассемблер директивасын қолданамыз. Біз r16 регистрін әр түрлі порттар мен регистрлерге көшіргіміз келетін нөмірлерді сақтайтын тізім ретінде қолданамыз (оны тікелей жазуға болмайды).

1 -жаттығу: Екілік санды тікелей портқа немесе DDRB сияқты арнайы регистрге көшіруге тырысыңыз және кодты жинау кезінде не болатынын көріңіз.

Регистрде байт (8 бит) ақпарат бар. Негізінде бұл әдетте SR-Latches жиынтығы, олардың әрқайсысы «бит» және 1 немесе 0 болады. Біз бұл серияны кейінірек талқылай аламыз (және тіпті құрастырамыз!). Сіз «жұмыс регистрі» деген не және неге r16 таңдадық деп ойлайтын шығарсыз. Біз мұны болашақ оқулықта чиптің ішкі батпағына батқан кезде талқылайтын боламыз. Әзірге мен сізге кодты жазу және физикалық жабдықты бағдарламалау сияқты нәрселерді қалай жасау керектігін түсінгім келеді. Содан кейін сізде микроконтроллердің жады мен тіркеу қасиеттерін түсінуді жеңілдететін тәжірибеден алынған анықтама жүйесі болады. Мен кіріспе оқулықтар мен талқылаулардың көпшілігі мұны керісінше істейтінін түсінемін, бірақ мен нұсқаулықты оқудан бұрын жаһандық перспективаға қол жеткізу үшін алдымен бейне ойын ойнау бірінші нұсқаулықты оқудан әлдеқайда оңай екенін білдім.

rjmp Init; бірінші жол орындалды

Бұл жол «Init» белгісіне «салыстырмалы секіру» болып табылады және мұнда қажет емес, өйткені келесі команда Init -те бар, бірақ біз оны болашақта пайдалану үшін қосамыз.

Ішінде:

температура; барлық биттерді 1 -ге орнатыңыз.

Init белгісінен кейін біз «регистрді орнату» командасын орындаймыз. Бұл «temp» регистріндегі барлық 8 битті (сіз еске түсіретін r16) 1 -ге орнатады. Сонымен temp енді 0b11111111 қамтиды.

DDRB, температура; Деректер бағытының енгізу -шығару регистрінде бит деп 1 -ге орнатыңыз

; DDRB болып табылатын PortB үшін бұл түйреуішті шығыс ретінде орнатады; 0 бұл түйреуішті кіріс ретінде орнатады; сондықтан мұнда барлық PortB түйреуіштері шығыс болып табылады (1 -ге орнатылған)

DDRB регистрі (PortB үшін деректерді бағыттау регистрі) PortB -тың қандай түйреуіштері (яғни PB0 -ден PB7 -ге дейін) кіріс ретінде белгіленетінін және шығыс ретінде белгіленетінін көрсетеді. Бізде светодиодқа PB0 түйреуіші қосылған, ал қалғандары ештеңеге қосылмағандықтан, біз барлық биттерді 1 -ге қоямыз, бұл олардың барлығы шығыс.

ldi temp, 0b11111110; уақытша регистрге «дереу» нөмірін жүктеңіз

; егер бұл тек ld болса, онда екінші аргумент болар еді; есте сақтау орны болуы керек

Бұл жол 0b11111110 екілік нөмірін уақыт регистріне жүктейді.

DDRD, температура; mv temp DDRD, нәтижесі PD0 - кіріс және

; қалғаны шығыс болып табылады

Енді біз PortD үшін деректер бағытын тіркеуді temp -ден орнатамыз, өйткені temp әлі де 0b11111110 бар, біз PD0 кіріс түйреуіші ретінде тағайындалатынын көреміз (өйткені оң жақта 0 бар), ал қалғандары шығыс ретінде белгіленеді Ол жерлерде 1.

clr температурасы; температурадағы барлық биттер 0 -ге орнатылады

PortB, температура; PortB ішіндегі барлық биттерді (яғни түйреуіштерді) 0В -ге орнатыңыз

Алдымен біз регистрдің температурасын «тазалаймыз», бұл барлық биттерді нөлге теңестіруді білдіреді. Содан кейін біз мұны барлық түйреуіштерге 0В орнататын PortB регистріне көшіреміз. PortB разрядындағы нөл процессордың түйреуішті 0В күйінде сақтайтынын білдіреді, ал біреуден кейін бұл істікшені 5В -қа орнатады.

2 -жаттығу: мультиметрді қолданып, PortB барлық түйреуіштердің шын мәнінде нөлге тең екендігін тексеріңіз. PB1 -де біртүрлі нәрсе болып жатыр ма? Неліктен бұл болуы мүмкін екендігі туралы қандай да бір түсінік бар ма? (төмендегі 4 -жаттығуға ұқсас, содан кейін кодты орындаңыз …) 3 -жаттығу: кодыңыздан жоғарыдағы екі жолды алып тастаңыз. Бағдарлама әлі де дұрыс жұмыс істей ме? Неге?

ldi temp, 0b00000001; температураны дереу жүктеу

PortD, температура; температураны PortD -ге жылжытыңыз. PD0 - 5В (тартқыш резисторы бар); өйткені онда 1 бит бар, қалғандары 0В. 4 -жаттығу: Жоғарыдағы екі жолды кодтан алып тастаңыз. Бағдарлама әлі де дұрыс жұмыс істей ме? Неге? (Бұл жоғарыдағы 3 -жаттығудан өзгеше. Бекіту диаграммасын қараңыз. PD0 үшін әдепкі DDRD параметрі қандай? (Деректер парағының 90 -бетін қараңыз)

Алдымен температураға 0b00000001 нөмірін «бірден жүктейміз». «Шұғыл» бөлік бар, өйткені біз жүктелетін нөмірі бар жад орнына көрсеткішті емес, тікелей температураны жүктейміз. Бұл жағдайда біз «ldi» орнына «ld» қолданамыз. Содан кейін біз бұл нөмірді Port0 -ге жібереміз, ол PD0 -ны 5В -қа, ал қалғандарын 0В -қа орнатады.

Енді біз түйреуіштерді кіріс немесе шығыс ретінде орнаттық және олардың бастапқы күйлерін 0В немесе 5В (LOW немесе HIGH) күйіне қойдық, енді біз өз бағдарламамызға «цикл» енгіземіз.

Негізгі: температурада, PinD; PinD PortD күйін сақтайды, оны температураға көшіріңіз

; егер түйме PD0 -ге қосылған болса, онда бұл болады; a түйме басылғанда 0, әйтпесе 1; PD0 тартылатын резисторы бар, ол әдетте 5В болады

PinD регистрі PortD түйреуіштерінің ағымдағы күйін қамтиды. Мысалы, егер сіз PD3 -ке 5В сым қосқан болсаңыз, онда келесі сағат циклінде (бұл микроконтроллер 16 МГц сағаттық сигналға қосылғандықтан секундына 16 миллион рет болады) PinD3 биті (қазіргі PD3 күйінен) 0 орнына 1 болады. Сондықтан бұл жолда түйреуіштердің ағымдағы күйін temp -ге көшіреміз.

PortB, температура; жоғарыдағы 0 мен 1 сандарын PortB жібереді

; бұл біз жарық диоды PB0 -ге қосылғанын қалаймыз, демек; PD0 LOW болғанда, ол PB0 параметрін LOW күйіне орнатады және бұрылады; светодиодта (жарық диодтың екінші жағы қосылады; 5В -қа, бұл PB0 -ны 0В -ге орнатады, сондықтан ток өтеді)

Енді біз PinD ішіндегі түйреуіштердің күйін PortB шығысына жібереміз. Бұл, егер түйме басылмаса, PD0 PortD0 -ге 1 жіберетінін білдіреді. Бұл жағдайда түйме жерге қосылғандықтан, түйреуіш 0В болады және ол PortB0 -ге 0 жібереді. Енді, егер сіз схемаға қарасаңыз, PB0 -дегі 0В жарық диоды жарқырайды, себебі оның екінші жағы 5 В -та. Егер біз 1 түймесін PB0 -ге жіберу үшін түймені баспасақ, бұл бізде PB0 -де 5В, сонымен қатар жарық диодтың екінші жағында 5В болады, сондықтан ешқандай потенциалдық айырмашылық жоқ және ток болмайды, сондықтан Жарық диоды жанбайды (бұл жағдайда бұл диод болып табылатын жарық диоды, сондықтан ток тек бір бағытта, бірақ бәрібір).

rjmp негізгі; Бастауға оралу

Бұл салыстырмалы секіру бізді Main: белгісіне қайтарады және біз PinD -ді тағы да тексереміз және т.б. Әр 16 миллионыншы секунд сайын түйменің басылып жатқанын тексеріңіз және сәйкесінше PB0 орнатыңыз.

5 -жаттығу: Сіздің кодты PB0 орнына PB3 қосылатындай етіп кодты өзгертіңіз және оның жұмыс істейтінін көріңіз. 6 -жаттығу: 5В емес, GND -ке светодиодты қосыңыз және сәйкесінше кодты өзгертіңіз.

4 -қадам: Қорытынды

Бұл оқулықта біз ATmega328p үшін құрастыру тілін әрі қарай зерттедік және жарықдиодты түймемен басқаруды үйрендік. Атап айтқанда, біз келесі командаларды үйрендік:

ser register регистрдің барлық биттерін 1 -ге орнатады

clr register регистрдің барлық биттерін 0 -ге орнатады

реестрде енгізу/шығару регистрі нөмірді енгізу регистрінен жұмыс регистріне көшіреді

Келесі оқулықта біз ATmega328p құрылымын және ондағы әр түрлі регистрлерді, операцияларды және ресурстарды қарастырамыз.

Бұл оқулықтарды жалғастырмас бұрын мен қызығушылық деңгейін күтемін. Егер осы микропроцессорға арналған бағдарламаларды құрастыру тілінде кодтауды үйренуді ұнататын адамдар көп болса, мен жалғастырамын және күрделі схемаларды құрамын және сенімді кодты қолданамын.

Ұсынылған: