Mündəricat:

AVR Assembler Dərsliyi 1: 5 Addımlar
AVR Assembler Dərsliyi 1: 5 Addımlar

Video: AVR Assembler Dərsliyi 1: 5 Addımlar

Video: AVR Assembler Dərsliyi 1: 5 Addımlar
Video: Mövzu 3. Alqoritm 2024, Noyabr
Anonim
AVR Assembler Dərsliyi 1
AVR Assembler Dərsliyi 1

Arduinoda istifadə olunan mikro nəzarətçi olan Atmega328p üçün montaj dili proqramlarının necə yazılacağına dair bir sıra dərsliklər yazmağa qərar verdim. İnsanlar maraqlanırsa, boş vaxtım bitənə qədər və ya başqa insanlar oxumağı dayandırana qədər həftədə bir dəfə çıxarmağa davam edəcəyəm.

Arch Linux-u işlədirəm və çörək taxtasında qurulmuş bir atmega328p-pu üzərində işləyirəm. Bunu mənimlə eyni şəkildə edə bilərsiniz və ya kompüterinizə bir arduino qoşa və mikrokontrolördə bu şəkildə işləyə bilərsiniz.

Əksər arduino proqramlarında olduğu kimi 328p üçün proqramlar yazacağıq, amma qeyd etməlisiniz ki, eyni proqramlar və texnikalar Atmel mikrokontrolörlərindən hər hansı biri üçün işləyəcək və daha sonra (əgər maraq varsa) bəziləri ilə işləyəcəyik. digərləri də. Mikrokontrolörün təfərrüatlarını Atmel məlumat vərəqlərində və Təlimat Təlimatında tapa bilərsiniz. Onları bu təlimata bağlayıram.

Burada sizə lazım olacaq:

1. Çörək taxtası

2. Arduino və ya sadəcə mikrokontroller

3. Linux ilə işləyən kompüter

4. git: git clone istifadə edən avra montajçısı https://github.com/Ro5bert/avra.git və ya ubuntu və ya debian əsaslı bir sistemdən istifadə edirsinizsə, sadəcə "sudo apt install avra" yazın və hər iki avr montajçısını əldə edəcəksiniz. və avrdude. Bununla birlikdə, github istifadə edərək ən son versiyanı əldə etsəniz, lazım olan bütün sənədləri də alacaqsınız, başqa sözlə artıq m328Pdef.inc və tn85def.inc sənədlərinə malikdir.

5. avrdude

AVR montajçı dərslərimin tam dəstini burada tapa bilərsiniz:

Addım 1: Test Şurası qurun

Bir Test Şurası qurun
Bir Test Şurası qurun

İstəyirsinizsə, arduino -nu istifadə edə və bu dərsliklərdə hər şeyi edə bilərsiniz. Bununla birlikdə, montaj dilində kodlaşdırmadan bəhs etdiyimiz üçün fəlsəfəmiz mahiyyətcə bütün periferikləri çıxarmaq və birbaşa mikrokontrolörün özü ilə qarşılıqlı əlaqə qurmaqdır. Bəs bunu belə etmək daha əyləncəli olarmı?

Sizinlə razılaşanlar üçün mikrodenetleyiciyi arduinodan çıxarıb buradakı təlimatları izləyərək "Breadboard Arduino" qurmağa başlaya bilərsiniz:

Şəkildə böyük bir çörək taxtasında iki ayrı Atmega328p -dən ibarət qurğumu göstərirəm (əvvəlki dərsliyi bir mikrokontrolörə bağlayaraq digərində işləyərkən saxlamaq istəyirəm). Güc mənbəyini elə qurmuşam ki, ən üst ray 9V, qalanlarının hamısı gərginlik tənzimləyicisindən 5V olsun. Fişləri proqramlaşdırmaq üçün FT232R qırılma lövhəsindən də istifadə edirəm. Onları aldım və yükləyiciləri öz üzərimə qoydum, ancaq bir Arduinodan bir çəkmisinizsə, artıq yaxşıdır.

Diqqət yetirin ki, bunu bir ATtiny85 ilə sınayırsınızsa, Sparkfun Kiçik Proqramlaşdırıcısını buradan əldə edə bilərsiniz: https://www.sparkfun.com/products/11801# və sonra onu kompüterinizin USB portuna qoşun. Əvvəlcə Attiny85 -də bir yükləyici qurmalısınız və ən asan yol Arduino IDE -dən istifadə etməkdir. Bununla birlikdə, faylı və üstünlükləri tıklamalı və sonra bu Yeni Kartlar URL-ni əlavə etməlisiniz: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json önyükleyiciyi yükləməyinizə imkan verir (əgər ATtiny85 -də onsuz da bir cihaz yoxdursa).

Addım 2: Assembler və Avrdude qurun

İndi bu təlimatın ilk addımında verilən bağlantılardan montajçı və avrdude yükləyə və quraşdıra bilərsiniz. Çox güman ki, əgər siz artıq Arduino ilə işləyirsinizsə, onda artıq avrdude quraşdırmısınız.

Avra qurduqdan sonra onunla birlikdə "qaynaqlar" adlanan bir alt qovluğun olduğunu və bu qovluğun içərisində bir dəstə faylın olduğunu görəcəksiniz. Bunlar avra ilə proqramlaşdıra biləcəyiniz bütün mikro nəzarətçilərdir. Burada istifadə etdiyimiz 328p üçün heç bir fayl olmadığını dərhal görəcəksiniz. Birini qoşmuşam. Fayl m328Pdef.inc olaraq adlandırılmalı və daxil olan qovluğa və ya istədiyiniz başqa bir yerə qoymalısınız. Bunu montaj dili proqramlarımıza daxil edəcəyik. Bunların hamısı, məlumatların vərəqindən mikrokontrolör adlarındakı hər bir qeydin verilməsi üçün onaltılıq adlarından istifadə etməyimiz lazım deyil. Yuxarıdakı fayl C və C ++ proqramlaşdırması üçün nəzərdə tutulduğu üçün "pragma direktivləri" ehtiva edir. Montajçının "pragma direktivinə məhəl qoymamaq" şikayətlərini tüpürdüyünü görməkdən yoruldunuzsa, sadəcə fayla daxil olun və #pragma ilə başlayan bütün sətirləri silin və ya şərh edin.

Tamam, indi mikrokontrolörünüz hazırdır, montajçınız hazırdır və proqramçınız hazırdır, ilk proqramımızı yaza bilərik.

Qeyd: ATmega328P yerinə ATtiny85 istifadə edirsinizsə, tn85def.inc adlı fərqli bir fayl lazımdır. Mən də əlavə edəcəyəm (bunu tn85def.inc.txt adlandırmalıydım ki, Instructables yükləməyimə icazə versin.) Ancaq, əgər avra assemblerini github -dan almış olsanız, bu faylların hər ikisi də ondadır. Buna görə də əldə etməyi və özünüz tərtib etməyi məsləhət görürəm: git clone

Addım 3: Salam Dünya

Bu ilk dərsliyin məqsədi hər hansı bir yeni dil öyrənərkən və ya hər hansı bir yeni elektronika platformasını araşdırarkən yazdığı standart ilk proqramı qurmaqdır. "Salam Dünya!" Bizim vəziyyətimizdə sadəcə bir montaj dili proqramı yazmaq, onu yığmaq və mikrokontrollerimizə yükləmək istəyirik. Proqram bir LED -in açılmasına səbəb olacaq. Normal bir Arduino salam dünya proqramı üçün olduğu kimi bir LED -in "yanıb -sönməsinə" səbəb olmaq, montaj dilində daha mürəkkəb bir proqramdır və buna görə də hələ bunu etməyəcəyik. Minimum lazımsız tüklə ən sadə "çılpaq sümüklər" kodunu yazacağıq.

Əvvəlcə arduinoda Digital Out 13 olaraq da adlandırılan PB5 -dən bir LED bağlayın (pinout diaqramına baxın), 220 ohm rezistora, sonra GND -ə qoşun. Yəni

PB5 - LED - R (220 ohm) - GND

İndi proqramı yazaq. Sevdiyiniz mətn redaktorunu açın və "hello.asm" adlı bir fayl yaradın.

; salam.asm

; PB5 (rəqəmsal çıxış 13) ilə əlaqəli bir LED yandırır. "./m328Pdef.inc" ldi r16, 0b00100000 DDRB, r16 PortB, r16 Başlat: rjmp Başla

Yuxarıdakı koddur. Bir dəqiqə ərzində xətti-xətdən keçəcəyik, amma əvvəlcə cihazınızda işləməsini təmin edə biləcəyimizə əmin olaq.

Fayl yaratdıqdan sonra onu bir terminalda aşağıdakı kimi yığırsınız:

salam.asm

bu, kodunuzu toplayacaq və hello.hex adlı bir fayl yaradacaq və onu aşağıdakı kimi yükləyə bilərik:

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

bir çörək taxtası arduino istifadə edirsinizsə, yuxarıdakı əmri yerinə yetirməzdən əvvəl çörək taxtası arduino üzərindəki sıfırlama düyməsini basmalı olacaqsınız. Unutmayın ki, qarşınıza bir sudo əlavə etməli və ya kök olaraq icra etməlisiniz. Həm də unutmayın ki, bəzi arduino -larda (Arduino UNO kimi) yəqin ki, bit sürətini -b 115200 və portu -P /dev /ttyACM0 -a dəyişmək məcburiyyətində qalacaqsınız (əgər avrdude -dən etibarsız bir cihaz imzası ilə bağlı bir səhv alsanız - F əmrinə)

Hər şey lazım olduğu kimi işləyirsə, indi bir LED yandıracaqsınız ….. "Salam Dünya!"

ATtiny85 istifadə edirsinizsə, avrdude əmri belə olacaq:

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

Addım 4: Hello.asm Line-by-line

Bu giriş dərsini bitirmək üçün necə işlədiyini öyrənmək üçün hello.asm proqramından keçəcəyik.

; salam.asm

; PB5 -ə qoşulmuş bir LED yandırır (rəqəmsal çıxış 13)

Nöqtəli vergüldən sonra hər şey montajçı tərəfindən nəzərə alınmır və buna görə də bu ilk iki sətir sadəcə proqramın nə etdiyini izah edən "şərhlər" dir.

.includ "./m328Pdef.inc"

Bu xətt montajçıya yüklədiyiniz m328Pdef.inc faylını daxil etməyi bildirir. Bunu oxşar daxil olan faylların bir kataloquna qoymaq və sonra yuxarıdakı sətri oraya işarə etmək üçün dəyişdirmək istəyə bilərsiniz.

ldi r16, 0b00100000

ldi "dərhal yüklə" mənasını verir və montajçıya bu vəziyyətdə r16 işçi qeydini götürməsini və bu halda ona 0b00100000 ikili nömrə yükləməsini bildirir. Qarşıdakı 0b nömrəmizin ikili olduğunu söyləyir. İstəsəydik, onaltılıq kimi başqa bir baza seçə bilərdik. Bu halda nömrəmiz 0b00100000 üçün hexidecimal olan 0x20 olardı. Və ya eyni ədəd üçün baza 10 onluq olan 32 -dən istifadə edə bilərdik.

Məşq 1: Yuxarıdakı sətirdəki nömrəni onaltılı, sonra kodunuzda ondalık olaraq dəyişdirməyə çalışın və hər vəziyyətdə hələ də işlədiyini yoxlayın.

Limanlar və Qeydlər necə işlədiyinə görə ikili istifadə etmək ən sadədir. Gələcək dərslərdə atmega328p -in limanlarını və qeydlərini daha ətraflı müzakirə edəcəyik, amma hələlik r16 -nı "işçi reyestrimiz" olaraq istifadə etdiyimizi bildirəcəyik, yəni onu yalnız saxladığımız bir dəyişən kimi istifadə edəcəyik. "Qeyd" 8 bitdən ibarət bir dəstdir. 0 və ya 1 ola biləcək 8 nöqtənin mənası ("sönmüş" və ya "açıq"). Yuxarıdakı sətirdən istifadə edərək 0b00100000 ikili nömrəsini reyestrə yüklədikdə sadəcə bu nömrəni r16 reyestrində saxlayırıq.

DDRB çıxdı, r16

Bu sətir, tərtibçiyə r16 reyestrinin məzmununu DDRB reyestrinə köçürməsini bildirir. DDRB, "Data Direction Register B" deməkdir və PortB -də "pinlər" qurur. 328p üçün pinout xəritəsində PB0, PB1,…, PB7 etiketli 8 sancağın olduğunu görə bilərsiniz. Bu sancaqlar "PortB" nin "bitlərini" təmsil edir və 00100000 ikili nömrəsini DDRB reyestrinə yüklədikdə PB0, PB1, PB2, PB3, PB4, PB6 və PB7 -nin INPUT pinləri olaraq qurulmasını istədiyimizi söyləyirik. Onlarda 0 var və PB5 bir Çıxış pin olaraq təyin olunur, çünki o yerə 1 qoyuruq.

PortB, r16

Pimlərin istiqamətlərini təyin etdikdən sonra artıq üzərindəki gərginliyi təyin edə bilərik. Yuxarıdakı sətir eyni ikili nömrəni r16 saxlama qeydimizdən PortB -ə köçürür. Bu, PB5 pinindən başqa bütün pinləri 0 volta təyin edir, bu da 5 voltdur.

Məşq 2: Rəqəmsal bir multimetr götürün, qara qurğunu yerə (GND) qoşun və sonra PB0 -dan PB7 -ə qədər olan hər bir sancağı qırmızı qurğuşla sınayın. Pimlərin hər birindəki gərginlik, PortB -də 0b00100000 qoymağa tam uyğundurmu? Əgər olmayanlar varsa, niyə düşünürsünüz? (pin xəritəsinə baxın)

Başlamaq:

rjmp Başlat

Nəhayət, yuxarıdakı birinci sətir kodda bir nöqtəni etiketləyən "etiket" dir. Bu vəziyyətdə, bu nöqtəni "Başlat" olaraq etiketləyin. İkinci sətirdə "Başlat etiketinə nisbi atlama" deyilir. Xalis nəticə, kompüterin velosiped sürməyə davam edən sonsuz bir döngəyə yerləşdirilməsidir. Buna ehtiyacımız var, çünki proqramı bitirə bilmərik və ya uçurumdan düşə bilmərik, işığın işıqlı qalması üçün proqram işləməyə davam etməlidir.

Məşq 3: Proqramın uçurumdan düşməsi üçün yuxarıdakı iki sətri kodunuzdan çıxarın. Nə baş verir? Arduinonun "salam dünya!" Olaraq istifadə etdiyi ənənəvi "göz qırpma" proqramına bənzəyən bir şey görməlisiniz. Sizcə niyə belə hərəkət edir? (Proqram uçurumdan düşəndə nə olacağını düşünün …)

Addım 5: Nəticə

Bu günə qədər qazandınızsa, təbrik edirəm! İndi montaj kodunu yaza, yığa və mikrokontrolörünüzə yükləyə bilərsiniz.

Bu təlimatda aşağıdakı əmrləri necə istifadə edəcəyinizi öyrəndiniz:

ldi hregister, nömrə yuxarı yarıya (16-31) bir ədəd (0-255) yükləyir

ioregister -dən çıxaraq, işçi qeydindən bir nömrəni I/O reyestrinə qeyd edin

rjmp etiketi "etiket" ilə etiketlənmiş proqramın sətrinə atlayır (204 təlimatdan artıq ola bilməz - yəni nisbi atlama)

İndi bu əsaslar yolda olmadığından, tərtib və yükləmə mexanikasını müzakirə etmədən daha maraqlı kod və daha maraqlı sxemlər və qurğular yazmağa davam edə bilərik.

Ümid edirəm bu giriş dərsindən zövq aldınız. Növbəti dərsdə başqa bir dövrə komponenti (bir düymə) əlavə edəcəyik və giriş limanlarını və qərarları daxil etmək üçün kodumuzu genişləndirəcəyik.

Tövsiyə: