Სარჩევი:

AVR Assembler Tutorial 1: 5 ნაბიჯი
AVR Assembler Tutorial 1: 5 ნაბიჯი

ვიდეო: AVR Assembler Tutorial 1: 5 ნაბიჯი

ვიდეო: AVR Assembler Tutorial 1: 5 ნაბიჯი
ვიდეო: AVR Ассемблер. Урок 1. Вводный. AVR Assembler. Lesson 1. Promo. 2024, ივლისი
Anonim
AVR Assembler Tutorial 1
AVR Assembler Tutorial 1

მე გადავწყვიტე დავწერო გაკვეთილების სერია, თუ როგორ უნდა დავწერო ასამბლეის ენის პროგრამები Atmega328p– სთვის, რომელიც არის მიკროკონტროლერი, რომელიც გამოიყენება Arduino– ში. თუ ხალხი დაინტერესდება, მე გავაგრძელებ კვირაში დაახლოებით ერთს, სანამ თავისუფალი დრო არ დამეკარგება, წინააღმდეგ შემთხვევაში ხალხი არ წაიკითხავს მათ.

მე ვმართავ Arch linux– ს და ვმუშაობ atmega328p-pu– ზე, რომელიც დაფუძნებულია დაფაზე. თქვენ შეგიძლიათ გააკეთოთ ეს ისევე, როგორც მე, ან შეგიძლიათ უბრალოდ ჩართოთ arduino თქვენს კომპიუტერში და იმუშაოთ მიკროკონტროლერზე ისე.

ჩვენ დავწერთ პროგრამებს 328p– სთვის, როგორც ის, რაც არდუინოს უმეტესობაშია, მაგრამ უნდა გაითვალისწინოთ, რომ ეს იგივე პროგრამები და ტექნიკა ასევე იმუშავებს Atmel– ის ნებისმიერ მიკროკონტროლერზე და შემდგომში (დაინტერესების შემთხვევაში) ჩვენ ვიმუშავებთ ზოგიერთთან ასევე სხვა მიკროკონტროლერის დეტალები შეგიძლიათ იხილოთ Atmel– ის მონაცემების ფურცლებში და ინსტრუქციის ნაკრების სახელმძღვანელოში. მე ვამაგრებ მათ ამ სასწავლო ინსტრუქციას.

აქ არის ის, რაც დაგჭირდებათ:

1. პურის დაფა

2. არდუინო, ან უბრალოდ მიკროკონტროლერი

3. კომპიუტერი, რომელსაც აქვს Linux

4. Avra assembler git: git clone https://github.com/Ro5bert/avra.git ან თუ იყენებთ ubuntu– ს ან debian– ზე დაფუძნებულ სისტემას უბრალოდ ჩაწერეთ „sudo apt install avra“და თქვენ მიიღებთ ორივე avr ასამბლერს და ავრუდუდ. თუმცა, თუ თქვენ მიიღებთ უახლეს ვერსიას github– ის გამოყენებით, თქვენ ასევე მიიღებთ ყველა საჭირო ფაილს, სხვა სიტყვებით რომ ვთქვათ, მას უკვე აქვს m328Pdef.inc და tn85def.inc ფაილები.

5. avrdude

ჩემი AVR ასამბლეის გაკვეთილების სრული ნაკრები შეგიძლიათ იხილოთ აქ:

ნაბიჯი 1: შექმენით ტესტირების საბჭო

შექმენით საცდელი საბჭო
შექმენით საცდელი საბჭო

თქვენ შეგიძლიათ უბრალოდ გამოიყენოთ თქვენი არდუინო და ყველაფერი გააკეთოთ ამ გაკვეთილებში თუ გსურთ. თუმცა, ვინაიდან ჩვენ ვსაუბრობთ ასამბლეის ენაზე კოდირებაზე, ჩვენი ფილოსოფია არის არსებითად მოაშოროს ყველა პერიფერია და უშუალოდ დაუკავშირდეს თავად მიკროკონტროლერს. ასე რომ, თქვენ არ ფიქრობთ, რომ უფრო სახალისო იქნებოდა ამის გაკეთება?

ვინც ეთანხმებით, შეგიძლიათ ამოიღოთ მიკროკონტროლი თქვენი არდუინოდან და შემდეგ დაიწყოთ "Breadboard Arduino" - ს აგებით, აქ მითითებების შესაბამისად:

სურათზე მე ვაჩვენებ ჩემს კონფიგურაციას, რომელიც შედგება ორი დამოუკიდებელი Atmega328p- ისგან დიდ პურის დაფაზე (მინდა, რომ შემდგომ მუშაობაზე შევინარჩუნო წინა გაკვეთილი სადენიანი და დატვირთული ერთ მიკროკონტროლერზე). მე მაქვს კვების ბლოკი ისე, რომ ზედა რკინიგზა არის 9 ვ და ყველა დანარჩენი არის 5 ვ ძაბვის მარეგულირებელიდან. მე ასევე ვიყენებ FT232R ბრეაკოუტ დაფს ჩიპების დასაპროგრამებლად. მე ვიყიდე ისინი და ჩავტვირთე ჩამტვირთვები მე თვითონ, მაგრამ თუ თქვენ უბრალოდ ამოიღეთ ერთი არდუინოდან, მაშინ უკვე კარგადაა.

გაითვალისწინეთ, რომ თუ თქვენ ამას ცდილობთ ATtiny85– ით, მაშინ შეგიძლიათ უბრალოდ მიიღოთ Sparkfun Tiny Programmer აქ: https://www.sparkfun.com/products/11801# და შემდეგ უბრალოდ შეაერთეთ იგი თქვენს კომპიუტერში USB პორტში. თქვენ ჯერ უნდა დააინსტალიროთ ჩამტვირთავი Attiny85– ზე და უმარტივესი გზაა უბრალოდ გამოიყენოთ Arduino IDE. თუმცა, თქვენ უნდა დააჭიროთ ფაილს და პარამეტრებს და შემდეგ დაამატოთ ახალი დაფების URL: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json რომელიც საშუალებას მოგცემთ დააინსტალიროთ ჩამტვირთავი (თუ თქვენი ATtiny85 უკვე არ მოყვება ერთს.)

ნაბიჯი 2: დააინსტალირეთ Assembler და Avrdude

ახლა თქვენ შეგიძლიათ გადმოწეროთ და დააინსტალიროთ ასამბლერი და avrdude ამ გაკვეთილის პირველ საფეხურზე მოცემული ბმულებიდან. სავარაუდოა, რომ თუ თქვენ უკვე მუშაობდით Arduino– სთან, მაშინ უკვე გაქვთ avrdude დაინსტალირებული.

მას შემდეგ, რაც avra დაინსტალირდება, შეამჩნევთ, რომ არსებობს ქვედირექტორია, რომელსაც თან ახლავს "წყაროები" და ამ დირექტორიაში არის რამდენიმე ფაილი. ეს არის ყველა ის მიკროკონტროლი, რომლის დაპროგრამებაც შეგიძლიათ avra– ით. თქვენ დაუყოვნებლივ შეამჩნევთ, რომ არ არსებობს ფაილი 328p– ისთვის, რომელსაც ჩვენ აქ ვიყენებთ. მე დავამატე ერთი. ფაილს უნდა დაერქვას m328Pdef.inc და თქვენ უნდა განათავსოთ მასში შემავალი დირექტორია ან სხვაგან, სადაც გსურთ. ჩვენ მას ჩავრთავთ ასამბლეის ენის პროგრამებში. ყოველივე ეს აკეთებს არის მიაწოდოს თითოეული რეგისტრი მიკროკონტროლერის სახელებს მონაცემთა ფურცლიდან ისე, რომ ჩვენ არ დაგვჭირდეს მათი ჰექსიდეციალური სახელების გამოყენება. ზემოთ მოყვანილი ფაილი შეიცავს "პრაგმის დირექტივებს", რადგან ის განკუთვნილია C და C ++ პროგრამირებისთვის. თუ დაიღალეთ იმის დანახვაზე, რომ ასამბლერი აფურთხებს "იგნორირებას უკეთებს პრაგმის დირექტივას" ჩივილები უბრალოდ შედით ფაილში და წაშალეთ ან კომენტარი გააკეთეთ #პრაგმით დაწყებული ყველა სტრიქონით

კარგი, ახლა როდესაც თქვენ გაქვთ თქვენი მიკროკონტროლერი მზად, თქვენი ასამბლერი მზად არის და თქვენი პროგრამისტი მზად არის, ჩვენ შეგვიძლია დავწეროთ ჩვენი პირველი პროგრამა.

შენიშვნა: თუ თქვენ იყენებთ ATtiny85- ს ATmega328P- ის ნაცვლად, მაშინ გჭირდებათ სხვა ფაილი, სახელწოდებით tn85def.inc. მე ასევე დავამატებ მას (გაითვალისწინეთ, რომ მას უნდა დავარქვა tn85def.inc.txt, რათა ინსტრუქციამ მომცა საშუალება ატვირთვა.) თუმცა, თუ თქვენ მიიღეთ avra assembler github– დან, თქვენ უკვე გაქვთ ორივე ეს ფაილი. ამიტომ გირჩევთ მიიღოთ და შეადგინოთ საკუთარი თავი: git clone

ნაბიჯი 3: გამარჯობა მსოფლიო

ამ პირველი გაკვეთილის მიზანია შეადგინოს სტანდარტული პირველი პროგრამა, რომელსაც წერს ახალი ენის შესწავლისას ან ელექტრონული ელექტრონული პლატფორმის შესწავლისას. "Გამარჯობა მსოფლიო!." ჩვენს შემთხვევაში ჩვენ უბრალოდ გვინდა დავწეროთ ასამბლეის ენის პროგრამა, შევიკრიბოთ იგი და ავტვირთოთ ჩვენს მიკროკონტროლერში. პროგრამა გამოიწვევს LED- ის ჩართვას. LED- ის "მოციმციმე", როგორც ამას აკეთებენ ჩვეულებრივი Arduino გამარჯობა მსოფლიო პროგრამისთვის, სინამდვილეში ბევრად უფრო რთული პროგრამაა ასამბლეის ენაზე და ამიტომ ჩვენ ამას ჯერ არ გავაკეთებთ. ჩვენ ვაპირებთ დავწეროთ უმარტივესი "შიშველი ძვლების" კოდი მინიმალური არასაჭირო ბუმბულით.

ჯერ დაუკავშირეთ LED PB5– დან (იხილეთ pinout დიაგრამა), რომელსაც ასევე უწოდებენ Digital Out 13 არდუინოზე, 220 ohm რეზისტორს, შემდეგ GND– ს. ანუ

PB5 - LED - R (220 ohm) - GND

ახლა დავწერო პროგრამა. გახსენით თქვენი საყვარელი ტექსტური რედაქტორი და შექმენით ფაილი სახელწოდებით "hello.asm"

გამარჯობა.აზმი

; ჩართავს LED- ს, რომელიც დაკავშირებულია PB5- თან (ციფრული 13). მოიცავს "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 დაწყება: rjmp დაწყება

ზემოთ არის კოდი. ჩვენ მას გავატარებთ ხაზით-ხაზით ერთ წუთში, მაგრამ ჯერ დავრწმუნდეთ, რომ ჩვენ შევძლებთ მის მოწყობილობაზე მუშაობას.

მას შემდეგ რაც შექმნით ფაილს, შემდეგ ტერმინალში ააწყობთ მას შემდეგნაირად:

avra გამარჯობა.ასმ

ეს შეიკრიბება თქვენი კოდი და შექმნის ფაილს სახელწოდებით hello.hex, რომლის ატვირთვაც ჩვენ შეგვიძლია შემდეგნაირად:

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

თუ თქვენ იყენებთ breadboard arduino– ს, თქვენ მოგიწევთ დააჭიროთ გადასაყენებელი ღილაკს breadboard arduino– ზე, მხოლოდ ზემოთ მითითებული ბრძანების შესრულებამდე. გაითვალისწინეთ, რომ თქვენ შეიძლება ასევე დაგჭირდეთ სუდოს დამატება წინ ან მისი შესრულება როგორც root. ასევე გაითვალისწინეთ, რომ ზოგიერთ arduino– ზე (Arduino UNO– ს მსგავსად) თქვენ ალბათ მოგიწევთ ბიტრეიტის შეცვლა –b 115200 და პორტი –P /dev /ttyACM0 (თუ თქვენ მიიღებთ შეცდომას avrdude– ს მოწყობილობის არასწორი ხელმოწერის შესახებ, უბრალოდ დაამატეთ - F ბრძანებას)

თუ ყველაფერი იმუშავა ისე, როგორც უნდა გქონდეთ, ახლა განათებული გექნებათ LED ნათურა … "გამარჯობა მსოფლიო!"

თუ თქვენ იყენებთ ATtiny85– ს, მაშინ avrdude ბრძანება იქნება:

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

ნაბიჯი 4: გამარჯობა. ასიმია ხაზზე

ამ გაცნობითი გაკვეთილის დასასრულებლად ჩვენ გავდივართ hello.asm პროგრამას ხაზ-ხაზით, რომ ნახოთ როგორ მუშაობს იგი.

გამარჯობა.აზმი

; ჩართავს LED- ს, რომელიც დაკავშირებულია PB5- თან (ციფრული გამოსვლა 13)

მძიმის შემდეგ ყველაფერი იგნორირებულია ასამბლეის მიერ და, შესაბამისად, ეს პირველი ორი სტრიქონი უბრალოდ არის "კომენტარი", რომელიც ხსნის რას აკეთებს პროგრამა.

. მოიცავს "./m328Pdef.inc"

ეს ხაზი ეუბნება ასამბლერს, რომ შეიცავდეს m328Pdef.inc ფაილს, რომელიც თქვენ გადმოწერეთ. თქვენ შეიძლება მოგინდეთ ეს შეიტანოთ მსგავსი ფაილების დირექტორიაში და შემდეგ შეცვალოთ ზემოაღნიშნული ხაზი, რომ მიუთითოთ იგი იქ.

ldi r16, 0b00100000

ldi ნიშნავს "დაუყოვნებლივ ჩატვირთვას" და ეუბნება შემკრებელს აიღოს სამუშაო რეგისტრი, r16 ამ შემთხვევაში და ჩატვირთოს მასში ორობითი რიცხვი, ამ შემთხვევაში 0b00100000. 0b წინ ამბობს, რომ ჩვენი რიცხვი ორობითია. თუ გვინდოდა ჩვენ შეგვეძლო ავირჩიოთ სხვა ბაზა, მაგალითად ჰექსიდეციმალური. ამ შემთხვევაში ჩვენი რიცხვი იქნებოდა 0x20 რაც ჰექსიდეციალურია 0b00100000. ან ჩვენ შეგვეძლო გამოგვეყენებინა 32 რომელიც არის ათეული ათეული იმავე რიცხვისთვის.

სავარჯიშო 1: სცადეთ შეცვალოთ ნომერი თქვენს ხაზში ჰექსიდეციალურად და შემდეგ ათწილადში და დარწმუნდით, რომ ის კვლავ მუშაობს თითოეულ შემთხვევაში.

ორობითი სისტემის გამოყენება უმარტივესია პორტებისა და რეგისტრების მუშაობის წესის გამო. ჩვენ განვიხილავთ atmega328p– ის პორტებს და რეგისტრებს უფრო დეტალურად მომავალ გაკვეთილებში, მაგრამ ახლა მე უბრალოდ განვაცხადებ, რომ ჩვენ ვიყენებთ r16 როგორც ჩვენს „სამუშაო რეგისტრს“, რაც იმას ნიშნავს, რომ ჩვენ უბრალოდ გამოვიყენებთ მას როგორც ცვლადს, რომელსაც ვინახავთ რიცხვები. "რეგისტრი" არის 8 ბიტის ნაკრები. იგულისხმება 8 წერტილი, რომელიც შეიძლება იყოს 0 ან 1 („გამორთული“ან „ჩართული“). როდესაც ჩვენ ჩავტვირთავთ ორობითი რიცხვს 0b00100000 რეესტრში ზემოაღნიშნული ხაზის გამოყენებით, ჩვენ უბრალოდ ვინახავთ ამ ნომერს რეესტრში r16.

გარეთ DDRB, r16

ეს ხაზი ეუბნება შემდგენელს, რომ დააკოპიროს რეესტრის შინაარსი r16 DDRB რეესტრში. DDRB ნიშნავს "მონაცემთა მიმართულების რეგისტრაციას B" და ის ადგენს "ქინძისთავებს" PortB- ზე. 328p– ის pinout რუქაზე თქვენ ხედავთ, რომ არის 8 ქინძისთავები წარწერით PB0, PB1,…, PB7. ეს ქინძისთავები წარმოადგენს "PortB" - ის "ბიტებს" და როდესაც ჩვენ ჩავტვირთავთ ორობითი ნომერს 00100000 DDRB რეგისტრში, ჩვენ ვამბობთ, რომ ჩვენ გვინდა PB0, PB1, PB2, PB3, PB4, PB6 და PB7 მითითებული როგორც INPUT ქინძისთავები 0 არის მათში და PB5 არის მითითებული როგორც OUTPUT პინი, რადგან ჩვენ 1 -ს ვდებთ იმ ადგილას.

გარეთ PortB, r16

ახლა, როდესაც ჩვენ დავაფიქსირეთ ქინძისთავების მიმართულებები, ჩვენ შეგვიძლია დავაყენოთ ძაბვები მათზე. ზემოაღნიშნული ხაზი აკოპირებს იმავე ორობითი ნომერს ჩვენი შენახვის რეგისტრატორიდან r16 PortB– ში. ეს აყენებს ყველა ქინძისთავს 0 ვოლტამდე, გარდა pin PB5- დან HIGH- ს, რომელიც არის 5 ვოლტი.

სავარჯიშო 2: აიღეთ ციფრული მულტიმეტრი, შეაერთეთ შავი ტყვიის მიწა (GND) და შემდეგ შეამოწმეთ თითოეული ქინძისთავები PB0– დან PB7– ით წითელი ტყვიით. არის თუ არა ძაბვები თითოეულ პინზე ზუსტად ის, რაც შეესაბამება 0b00100000 პორტბში ჩასმას? თუ არსებობს ისეთი, ვინც არ არის, რატომ გგონიათ რომ არის? (იხილეთ pin რუკა)

დაწყება:

rjmp დაწყება

დაბოლოს, პირველი სტრიქონი ზემოთ არის "ეტიკეტი", რომელიც აღნიშნავს ადგილს კოდში. ამ შემთხვევაში ამ ადგილის მარკირება როგორც "დაწყება". მეორე სტრიქონში ნათქვამია "შეფარდებითი გადასვლა ეტიკეტზე დაწყება". წმინდა შედეგი არის ის, რომ კომპიუტერი მოთავსებულია უსასრულო მარყუჟში, რომელიც უბრალოდ ინარჩუნებს ველოსიპედის დაწყებას. ჩვენ გვჭირდება ეს იმიტომ, რომ ჩვენ არ შეგვიძლია პროგრამის დასრულება ან კლდიდან ჩამოვარდნა, პროგრამამ უნდა გააგრძელოს მუშაობა, რათა სინათლე დარჩეს განათებული.

სავარჯიშო 3: ამოიღეთ ზემოთ მოყვანილი ორი ხაზი თქვენი კოდიდან ისე, რომ პროგრამა კლდიდან გადმოვარდეს. Რა მოხდა? თქვენ უნდა ნახოთ ისეთი რამ, რაც ჰგავს ტრადიციულ "მოციმციმე" პროგრამას, რომელსაც არდუინო იყენებს როგორც "გამარჯობა სამყარო!". როგორ ფიქრობთ, რატომ იქცევა ასე? (დაფიქრდით რა უნდა მოხდეს, როდესაც პროგრამა კლდიდან ჩამოვარდება …)

ნაბიჯი 5: დასკვნა

თუ აქამდე მიხვედით, გილოცავთ! ახლა თქვენ შეგიძლიათ დაწეროთ ასამბლეის კოდი, ააწყოთ იგი და ჩატვირთოთ იგი თქვენს მიკროკონტროლერზე.

ამ გაკვეთილში თქვენ ისწავლეთ როგორ გამოიყენოთ შემდეგი ბრძანებები:

ldi hregister, ნომერი იტვირთება რიცხვი (0-255) ზედა ნახევარ რეგისტრში (16-31)

ioregister– დან, დაარეგისტრირეთ ნომერი სამუშაო რეესტრიდან I/O რეესტრში

rjmp ლეიბლი გადადის პროგრამის ხაზზე, რომელსაც ეტიკეტი აქვს "label" (რომელიც არ შეიძლება იყოს 204 ინსტრუქციის მოშორებით - ანუ ნათესავი ნახტომი)

ახლა, როდესაც ეს საფუძვლები არ გამოდგება, ჩვენ შეგვიძლია გავაგრძელოთ უფრო საინტერესო კოდის და უფრო საინტერესო სქემებისა და მოწყობილობების წერა, შედგენისა და ატვირთვის მექანიკის განხილვის გარეშე.

ვიმედოვნებ, რომ მოგეწონათ ეს გაცნობითი გაკვეთილი. მომდევნო გაკვეთილში ჩვენ დავამატებთ სქემის სხვა კომპონენტს (ღილაკს) და გავაფართოვებთ ჩვენს კოდს, რომელიც მოიცავს შეყვანის პორტებსა და გადაწყვეტილებებს.

გირჩევთ: