İçindekiler:

AVR Assembler Eğitimi 1: 5 Adım
AVR Assembler Eğitimi 1: 5 Adım

Video: AVR Assembler Eğitimi 1: 5 Adım

Video: AVR Assembler Eğitimi 1: 5 Adım
Video: Onshape Eğitimi #1 | Onshape Nedir, Hesap Açılır, Arayüzü ve Modellemeye Giriş 2024, Kasım
Anonim
AVR Assembler Eğitimi 1
AVR Assembler Eğitimi 1

Arduino'da kullanılan mikrodenetleyici olan Atmega328p için Assembly dili programlarının nasıl yazılacağına dair bir dizi öğretici yazmaya karar verdim. İnsanlar ilgilenmeye devam ederse, boş zamanım bitene ya da insanlar onları okumayı bırakana kadar haftada bir tane çıkarmaya devam edeceğim.

Arch linux kullanıyorum ve bir breadboard üzerinde kurulmuş bir atmega328p-pu üzerinde çalışıyorum. Bunu benim gibi yapabilir veya bilgisayarınıza bir arduino takıp mikrodenetleyici üzerinde bu şekilde çalışabilirsiniz.

Çoğu arduino'da olduğu gibi 328p için programlar yazacağız ama bu aynı programların ve tekniklerin herhangi bir Atmel mikrodenetleyicisi için de işe yarayacağını ve daha sonra (eğer ilgi varsa) bazılarıyla çalışacağız. diğerleri de öyle. Mikrodenetleyicinin ayrıntıları Atmel veri sayfalarında ve Komut Seti Kılavuzunda bulunabilir. Onları bu talimata ekliyorum.

İşte ihtiyacınız olacak:

1. Bir devre tahtası

2. Bir Arduino veya sadece mikrodenetleyici

3. Linux çalıştıran bir bilgisayar

4. avra assembler git: git clone https://github.com/Ro5bert/avra.git kullanıyorsa veya ubuntu veya debian tabanlı bir sistem kullanıyorsanız "sudo apt install avra" yazmanız yeterlidir ve hem avr assembler'ı alırsınız ve avrdude. ANCAK, github kullanarak en son sürümü alırsanız, gerekli tüm içerme dosyalarını da alırsınız, başka bir deyişle, zaten m328Pdef.inc ve tn85def.inc dosyalarına sahiptir.

5. avrdude

AVR montajcı eğitimlerimin tamamı burada bulunabilir:

Adım 1: Bir Test Panosu Oluşturun

Bir Test Panosu Oluşturun
Bir Test Panosu Oluşturun

İsterseniz arduino'nuzu kullanabilir ve bu eğitimlerdeki her şeyi yapabilirsiniz. Bununla birlikte, montaj dilinde kodlamadan bahsettiğimiz için felsefemiz, doğası gereği tüm çevre birimlerini ortadan kaldırmak ve doğrudan mikrodenetleyicinin kendisiyle etkileşime girmektir. Yani sence de böyle yapmak daha eğlenceli olmaz mı?

Kabul edenler için, mikrodenetleyiciyi arduino'nuzdan çıkarabilir ve ardından buradaki talimatları izleyerek bir "Breadboard Arduino" oluşturmaya başlayabilirsiniz:

Resimde, büyük bir devre tahtası üzerinde iki bağımsız Atmega328p'den oluşan kurulumumu gösteriyorum (bir sonrakinde çalışırken önceki öğreticiyi kablolu ve bir mikro denetleyicide yüklü tutmak istiyorum). Güç kaynağını, en üstteki ray 9V ve diğerlerinin tümü voltaj regülatöründen 5V olacak şekilde ayarladım. Ayrıca çipleri programlamak için bir FT232R devre kartı kullanıyorum. Onları satın aldım ve üzerlerine önyükleyiciler koydum, ancak bir Arduino'dan bir tane çıkardıysanız, o zaman zaten sorun değil.

Bunu bir ATtiny85 ile deniyorsanız, Sparkfun Tiny Programmer'ı buradan edinebileceğinizi unutmayın: https://www.sparkfun.com/products/11801# ve ardından bilgisayarınızdaki USB bağlantı noktasına takmanız yeterlidir. İlk önce Attiny85'e bir önyükleyici yüklemeniz gerekecek ve en kolay yol sadece Arduino IDE'yi kullanmak. Ancak, dosyaya ve tercihlere tıklamanız ve ardından şu Yeni Panolar URL'sini eklemeniz gerekir: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json önyükleyiciyi yüklemenizi sağlar (ATtiny85'iniz zaten bir tane gelmediyse.)

Adım 2: Assembler ve Avrdude'u kurun

Artık bu eğitimin ilk adımında verilen bağlantılardan assembler ve avrdude'u indirip kurabilirsiniz. Arduino'larla zaten çalışıyorsanız, muhtemelen avrdude'u zaten yüklemişsinizdir.

avra'yı kurduktan sonra, onunla birlikte gelen "sources" adlı bir alt dizin olduğunu ve bu dizinin içinde bir sürü içerme dosyası olduğunu fark edeceksiniz. Bunların hepsi avra ile programlayabileceğiniz mikrodenetleyicilerdir. Burada kullandığımız 328p için bir dosya olmadığını hemen fark edeceksiniz. Bir tane ekledim. Dosyanın adı m328Pdef.inc olmalı ve include dizinine veya istediğiniz herhangi bir yere koymalısınız. Assembly dili programlarımıza dahil edeceğiz. Tüm bunlar, onaltılık adlarını kullanmak zorunda kalmamamız için mikrodenetleyici adlarındaki her bir kaydı veri sayfasından vermektir. Yukarıdaki içerme dosyası, C ve C++ programlaması için tasarlandığından "pragma yönergeleri" içerir. Derleyicinin "pragma yönergesini görmezden geliyor" şikayetlerini tükürdüğünü görmekten bıktıysanız, dosyaya gidin ve #pragma ile başlayan tüm satırları silin veya yorumlayın.

Tamam, artık mikrodenetleyiciniz hazır, assembler'ınız ve programlayıcınız hazır olduğuna göre ilk programımızı yazabiliriz.

Not: ATmega328P yerine ATtiny85 kullanıyorsanız, tn85def.inc adında farklı bir içerme dosyasına ihtiyacınız vardır. Onu da ekleyeceğim (Not: Instructables yüklememe izin versin diye onu tn85def.inc.txt olarak adlandırmak zorunda kaldım.) ANCAK, eğer avra assembler'ı github'dan aldıysanız, bu dosyaların ikisi de zaten onunla birliktedir. Bu yüzden onu almanızı ve kendiniz derlemenizi öneririm: git klon

3. Adım: Merhaba Dünya

Bu ilk öğreticinin amacı, herhangi bir yeni dil öğrenirken veya herhangi bir yeni elektronik platformu keşfederken yazılan standart ilk programı oluşturmaktır. "Selam Dünya!." Bizim durumumuzda sadece bir Assembly dili programı yazmak, onu birleştirmek ve mikrodenetleyicimize yüklemek istiyoruz. Program bir LED'in yanmasına neden olacaktır. Normal Arduino merhaba dünya programı için olduğu gibi bir LED'in "yanıp sönmesine" neden olmak, aslında Assembly dilinde çok daha karmaşık bir programdır ve bu yüzden bunu henüz yapmayacağız. En basit "çıplak" kodu minimum gereksiz tüylerle yazacağız.

Önce arduino'da Digital Out 13 olarak da adlandırılan PB5'ten bir LED'i (pinout şemasına bakın) 220 ohm'luk bir rezistöre, ardından GND'ye bağlayın. yani

PB5 -- LED -- R(220 ohm) -- GND

Şimdi programı yazalım. Favori metin düzenleyicinizi açın ve "hello.asm" adlı bir dosya oluşturun.

;merhaba.asm

; PB5'e bağlı bir LED'i yakar (dijital çıkış 13).include "./m328Pdef.inc" ldi r16, 0b00100000 DDRB çıkışı, r16 çıkış PortB, r16 Başlat: rjmp Başlat

Yukarıdaki koddur. Bir dakika içinde satır satır inceleyeceğiz, ancak önce cihazınızda çalıştırabileceğimizden emin olalım.

Dosyayı oluşturduktan sonra, bir terminalde aşağıdaki gibi birleştirirsiniz:

avra merhaba.asm

bu, kodunuzu bir araya getirecek ve aşağıdaki gibi yükleyebileceğimiz merhaba.hex adlı bir dosya oluşturacaktır:

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

Bir breadboard arduino kullanıyorsanız, yukarıdaki komutu uygulamadan hemen önce breadboard arduino'daki sıfırlama düğmesine basmanız gerekecektir. Ayrıca önüne bir sudo eklemeniz veya onu root olarak çalıştırmanız gerekebileceğini unutmayın. Ayrıca bazı arduinolarda (Arduino UNO gibi) bit hızını -b 115200 ve -P /dev/ttyACM0 portunu değiştirmeniz gerekeceğini unutmayın (avrdude'dan geçersiz bir cihaz imzası hakkında bir hata alırsanız, sadece - F komutuna)

Her şey olması gerektiği gibi çalıştıysa, şimdi bir LED yanmış olacak….. "Merhaba Dünya!"

ATtiny85 kullanıyorsanız avrdude komutu şöyle olacaktır:

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

Adım 4: Hello.asm Satır satır

Bu giriş eğitimini bitirmek için nasıl çalıştığını görmek için merhaba.asm programını satır satır inceleyeceğiz.

;merhaba.asm

; PB5'e bağlı bir LED'i açar (dijital çıkış 13)

Noktalı virgülden sonraki her şey montajcı tarafından göz ardı edilir ve bu nedenle bu ilk iki satır, programın ne yaptığını açıklayan basitçe "yorumlardır".

.include "./m328Pdef.inc"

Bu satır, montajcıya indirdiğiniz m328Pdef.inc dosyasını eklemesini söyler. Bunu benzer içerme dosyalarının bulunduğu bir dizine koymak ve ardından yukarıdaki satırı oraya işaret edecek şekilde değiştirmek isteyebilirsiniz.

ldi r16, 0b00100000

ldi "hemen yükle" anlamına gelir ve montajcıya bu durumda r16 çalışan bir kayıt defteri almasını ve bu durumda 0b00100000 ikili sayı yüklemesini söyler. Öndeki 0b, sayımızın ikili olduğunu söylüyor. İsteseydik, onaltılık gibi başka bir taban seçebilirdik. Bu durumda numaramız 0x20 olurdu, bu da 0b00100000 için onaltılık sayıdır. Veya aynı sayı için 10 tabanı olan 32'yi kullanabilirdik.

Alıştırma 1: Kodunuzda yukarıdaki satırdaki sayıyı onaltılık ve ardından ondalık sayı olarak değiştirmeyi deneyin ve her durumda hala çalıştığını doğrulayın.

Bağlantı Noktaları ve Kayıtların çalışma şekli nedeniyle ikili kullanmak en basitidir. Atmega328p'nin bağlantı noktalarını ve kayıtlarını gelecekteki derslerde daha ayrıntılı olarak tartışacağız, ancak şimdilik sadece r16'yı "çalışma kaydımız" olarak kullandığımızı belirteceğim, yani onu yalnızca depoladığımız bir değişken olarak kullanacağız. sayılar. Bir "kayıt", 8 bitlik bir kümedir. Yani 0 veya 1 olabilen 8 nokta ("kapalı" veya "açık"). 0b00100000 ikili numarasını yukarıdaki satırı kullanarak register'a yüklediğimizde, bu numarayı sadece r16 register'ına kaydetmiş oluyoruz.

DDRB çıkışı, r16

Bu satır derleyiciye r16 kaydının içeriğini DDRB kaydına kopyalamasını söyler. DDRB, "Veri Yönü Kaydı B" anlamına gelir ve PortB'deki "pinleri" kurar. 328p için pinout haritasında PB0, PB1, …, PB7 olarak etiketlenmiş 8 pin olduğunu görebilirsiniz. Bu pinler "PortB"nin "bitlerini" temsil eder ve 00100000 ikili numarasını DDRB kaydına yüklediğimizde, PB0, PB1, PB2, PB3, PB4, PB6 ve PB7'nin INPUT pinleri olarak ayarlanmasını istediğimizi söylüyoruz. İçlerinde 0 var ve PB5, o noktaya 1 koyduğumuz için bir ÇIKIŞ pini olarak ayarlandı.

PortB çıkışı, r16

Artık pinlerin yönünü sabitlediğimize göre artık voltajları üzerlerine ayarlayabiliriz. Yukarıdaki satır, aynı ikili sayıyı depolama kaydımız r16'dan PortB'ye kopyalar. Bu, 5 volt olan PB5 ila YÜKSEK pin hariç tüm pinleri 0 volta ayarlar.

Alıştırma 2: Dijital bir multimetre alın, siyah ucu toprağa (GND) takın ve ardından PB0 ila PB7 arasındaki pinlerin her birini kırmızı uçla test edin. Pinlerin her birindeki voltajlar tam olarak PortB'ye 0b00100000 koymakla aynı mı? Olmayanlar varsa sizce neden öyle? (pin haritasına bakın)

Başlangıç:

rjmp Başlat

Son olarak, yukarıdaki ilk satır, koddaki bir noktayı etiketleyen bir "etiket"tir. Bu durumda o noktayı "Başlat" olarak etiketlemek. İkinci satırda "Başlat etiketine göreli atlama" yazıyor. Net sonuç, bilgisayarın yalnızca Başlat'a geri dönmeye devam eden sonsuz bir döngüye yerleştirilmesidir. Buna ihtiyacımız var çünkü programın bitmesini veya uçurumdan düşmesini sağlayamayız, ışığın yanık kalması için programın çalışmaya devam etmesi gerekir.

Alıştırma 3: Programın uçurumdan düşmesi için yukarıdaki iki satırı kodunuzdan kaldırın. Ne oluyor? Arduino tarafından "merhaba dünyası" olarak kullanılan geleneksel "göz kırpma" programına benzeyen bir şey görmelisiniz. Sizce neden bu şekilde davranıyor? (Program bir uçurumdan düştüğünde ne olması gerektiğini bir düşünün…)

Adım 5: Sonuç

Buraya kadar geldiyseniz, tebrikler! Artık montaj kodu yazabilir, monte edebilir ve mikrodenetleyicinize yükleyebilirsiniz.

Bu öğreticide aşağıdaki komutların nasıl kullanılacağını öğrendiniz:

ldi hregister, sayı bir sayıyı (0-255) bir üst yarı kaydına (16-31) yükler

ioregister dışında, kayıt, çalışan bir kayıttan bir G/Ç kaydına bir sayı kopyalar

rjmp etiketi, "etiket" ile etiketlenmiş programın satırına atlar (204 komuttan daha uzak olamaz - yani göreceli atlama)

Artık bu temel bilgiler ortadan kalktığına göre, derleme ve yükleme mekaniğini tartışmak zorunda kalmadan daha ilginç kodlar ve daha ilginç devreler ve cihazlar yazmaya devam edebiliriz.

Umarım bu tanıtım dersini beğenmişsinizdir. Bir sonraki eğitimde başka bir devre bileşeni (bir düğme) ekleyeceğiz ve kodumuzu giriş portlarını ve kararları içerecek şekilde genişleteceğiz.

Önerilen: