Avr studio montajcıdaki program örnekleri. Atmel AVR mikrodenetleyicilerinin montaj dilinde pratik programlanması

GİRİİŞ Mikrodenetleyiciler, kökenleri ve uygulamaları
Mikrodenetleyicilerin arka planı
Yunan tarzı elektronik
Neden AVR?
Sıradaki ne?

BÖLÜM I. ATMEL AVR'NİN TASARIM VE ÇALIŞMASINA İLİŞKİN GENEL İLKELER

Bölüm 1. Atmel AVR mikrokontrolörlerine genel bakış

AVR aileleri
Özellikler pratik kullanım MK AVR'si

Bölüm 2. Genel yapı, hafıza organizasyonu, saatleme, sıfırlama

Program belleği
Veri belleği (RAM, SRAM)
Kalıcı veri belleği (EEPROM)
Saat yöntemleri
Sıfırla
Ek harici veri belleği bağlama özellikleri

Bölüm 3: Çevre Birimlerine Giriş

G/Ç bağlantı noktaları
Zamanlayıcılar-sayaçlar
Analogtan dijitale dönüştürücü
Seri bağlantı girişleri
UART
SPI arayüzü
TWI arayüzü (12С)
Evrensel seri arayüz USI

Bölüm 4. Kesintiler ve Güç Tasarruf Modları

Kesintiler
Kesinti türleri
Güç Tasarrufu Modları
MK AVR tüketimi
AYR MK tüketimi ve enerji tasarrufu modları

BÖLÜM II. ATMEL AVR MİKRO DENETLEYİCİLERİN PROGRAMLANMASI

Bölüm 5. AVR ailesinin MCU'larını programlamanın genel ilkeleri

Montaj mı yoksa C mi?
AVR programlama yöntemleri ve araçları
Kod düzenleyici
AVR Stüdyosu Hakkında
Montajcının düzenlenmesi
Programcılar
Hex dosyaları hakkında
AVR derleyici komutları, talimatları ve gösterimi
Sayılar ve İfadeler
Direktifler ve işlevler
Bir AVR programının genel yapısı
Kesinti yönetimi
SIFIRLA
En basit program
Gecikme
Sayaç programı
Kesintileri Kullanma
Zamanlayıcı gecikmesi
Kesintileri kullanan sayaç programı
Yapılandırma bitleri hakkında

Bölüm 6. AVR Komuta Sistemi

Kontrol Transfer Talimatları ve SREG Kaydı
Kontrol Et-Atla Komutları
Mantıksal İşlem Komutları
Shift talimatları ve bit işlemleri
Aritmetik talimatlar
Veri Aktarım Komutları
Sistem Kontrol Komutları
Montajcıda standart prosedürlerin uygulanması
Yığın, yerel ve genel değişkenler hakkında

Bölüm 7. Aritmetik İşlemler

Standart Aritmetik İşlemler
Çok Basamaklı Sayıların Çarpılması
Çok basamaklı sayıların bölünmesi
Kesirli sayılarla işlemler
Rastgele numara üreticisi
BCD formatındaki sayılarla işlemler
MK'deki negatif sayılar

Bölüm 8. Zamanlayıcıların Programlanması

8- ve 16-bit zamanlayıcılar
Formasyon değeri belirle frekanslar
geri sayım
Hassas zaman düzeltmesi
Frekans ölçer ve periyot ölçer
Frekans ölçer
Dönemölçer
Dinamik ekran kontrolü
LED göstergeler ve bağlantıları
Programlama dinamik ekran
PWM modunda zamanlayıcılar

Bölüm 9. EEPROM'un Kullanılması

EEPROM'daki verilerin güvenliği hakkında bir kez daha
EEPROM yazma ve okuma
Sabitleri EEPROM'da saklamak

Bölüm 10. Analog Karşılaştırıcı ve ADC

Analog-dijital işlemler ve hataları
Analog karşılaştırıcıyla çalışma
ADC'yi karşılaştırıcıya entegre etme
Çalışma prensibi ve hesaplama formülleri
ADC programını entegre etme
Dahili ADC
ADC kullanım örneği
programı

Bölüm 11: SPI Programlama

SPI aracılığıyla temel işlemler
Donanım seçeneği
Yazılım seçeneği
Kalıcı bellek türleri hakkında
SPI aracılığıyla flash belleği yazın ve okuyun
SPI aracılığıyla 45DB011B hafızalı değişim programı
Flash kart yazma ve okuma
MMS kartlarını bağlama
Komutların gönderilmesi ve MMC'nin başlatılması
MMS yazma ve okuma

Bölüm 12. TWI (12C) arayüzü ve pratik kullanımı

Temel 12C protokolü
12C protokolünün yazılım emülasyonu
Harici kalıcı belleğe veri yazma
AT24 hafızalı değişim modları
programı
12C arayüzlü saat
Veri kaydı
Veri okuma

Bölüm 13. UART/USART Programlama

UART başlatma
Veri gönderme ve alma
UART kullanarak DS1307 saatini ayarlama örneği
İletişim arızalarına karşı koruma teknikleri
Parite kontrolü
Doğru bir değişim nasıl organize edilir
Ek özellikler USART
RS-232 ve RS-485 arayüzlerinin uygulanması
RS-232 için seviye dönüştürücüler
RS-485

Bölüm 14. Güç Tasarrufu Modları ve Watchdog Zamanlayıcısı

Enerji Tasarruf Modunun Programlanması
Pille çalışan bir cihaz örneği
Programın sonuçlandırılması
Watchdog zamanlayıcısını kullanma

UYGULAMALAR

Ek 1. Atmel AVR mikrodenetleyicilerinin temel parametreleri

Ek 2. Atmel AVR Komutları
Aritmetik ve mantıksal talimatlar
Bit Çalıştırma Talimatları
Karşılaştırma Komutları
Kontrol Aktarım Komutları
Koşulsuz atlama ve alt program çağrı komutları
Kontrol-Atla Talimatları ve Koşullu Dallandırma Talimatları
Veri aktarım komutları
Sistem Kontrol Komutları

Ek 3. Program metinleri
SPI arayüzü üzerinden 45DB011B flash bellek ile veri alışverişi için demo programı
12C arayüzü üzerinden değişim prosedürleri

Ek 4. İle veri alışverişi yapın kişisel bilgisayar ve UART aracılığıyla programlarda hata ayıklama
Delphi'de COM portuyla çalışma
COM bağlantı noktası ve Windows API
COM ile hazır bileşenler aracılığıyla çalışma
DOS ve Windows'ta bir RTS hattı kurma
COM2000 programı
Bir terminal programı kullanarak programlarda hata ayıklama

Ek 5. Yaygın kısaltmalar ve terimler sözlüğü
Rusça terimlerin İngilizce çevirileriyle yazışmaları
İngilizce terimlerin Rusça çevirileriyle yazışmaları

Edebiyat
Konu dizini


Bu nedenle, vicdanlı okuyucunun zaten bir programcıyı, bir deney panosunu topladığını ve ayrıca gerekli yazılımı kurup yapılandırdığını umuyorum.

Şimdi serinin ilk yazısını yazdıktan sonra biraz heyecanlandığımı ve “yeni başlayanlar için” tabirini koyarak seleflerim gibi aynı hatayı yaptığımı anlıyorum. "Montaj dili programlamaya yeni başlayanlar için" konusunu formüle etmek daha doğru olacaktır, yani okuyucunun bir mikrodenetleyicinin ne olduğuna dair en azından yüzeysel bir anlayışa sahip olduğunu varsayıyorum, aksi takdirde bunu anlamak çok zamanımızı alacaktır. bu konuyu tanıyın. Bunlara hiç aşina olmayanlar için, S. Ryumik'in Radioamator dergisinde yayınlanan (2005 Sayıları 1-11) benim görüşüme göre kesinlikle harika olan “AVR Mikrodenetleyiciler” adlı bir dizi makalesini önerebilirim. . Bu döngüde temel denetleyici olarak ATmega8 seçilir ancak genel olarak fonksiyonel birimler Yukarıdaki denetleyici ve ATtiny13 pratik olarak aynıdır.

ATtiny13 mikrokontrolcüsüyle doğrudan tanışmak için A.V.'nin kitabını tavsiye ederim. Evstifeev "Küçük ailenin AVR mikrodenetleyicileri. Kullanım kılavuzu" (M .: Yayınevi "Dodeka-XXI", 2007. - 432 s.). Küçük ailedeki tüm kontrolörler için çevrilmiş ve sistematik hale getirilmiş veri sayfaları içerir ve bana göre mikrokontrolörlerin programlanmasıyla ilgilenenler için bir masaüstü referansı olmalıdır.

Ancak hikaye ilerledikçe denetleyicinin yazılı programlarda kullanılacak düğümleri ve modülleri hakkında bazı bilgiler vereceğim.

Ama bütün bunlar lirik bir ara söz. Doğrudan hikayeye dönelim.

ATtiny13 denetleyici, küçük boyutuna rağmen çok iyi bir performansa sahiptir. fonksiyonel özellikler. Ve az sayıda pin, her birinin gerçekleştirdiği işlevlerin sayısıyla fazlasıyla telafi edilir. Pinlerin pin çıkışı ve açıklamaları aşağıda sunulmuştur:

Tablo A.V.'nin yukarıda bahsedilen kitabından alınmıştır. Evstifeeva.

Gördüğünüz gibi her pin en az üç, hatta daha fazlasını gerçekleştirebilir. İlk başta alternatif işlevleri dikkate almayacağız, yalnızca temel olanı (dijital giriş/çıkış) ele alacağız.

Şekil ve tablodan görülebileceği gibi, güç pinleri dışındaki tüm pinler PB adını ve ardından gelenleri taşır. seri numarası. Bu ne anlama gelir? Tüm denetleyici pinleri, çalışma kolaylığı için 8 parça halinde birleştirilmiştir ve 8 pinlik her gruba üç özel I/O kaydı atanmıştır. Genel olarak, özellikle montajcıda denetleyicilerle çalışırken kayıt kavramı çok önemlidir. Yukarıda belirtilen üç kaydın her birine daha yakından bakalım. Hepsi denetleyici belleğindeki tek baytlık hücrelerdir. Her bit, denetleyici çıkışlarından birine karşılık gelir ve kayıt defterindeki bit numarası, çıkış numarasıyla çakışır (örneğin, 0'ıncı bit, PB0 çıkışından sorumludur, 1'inci bit, PB1 çıkışından sorumludur, vb.). Tüm kayıtların, program yazarken erişilebilecekleri kendi adları vardır. Bunlar ne tür isimler?

1. DDRB kaydı, her denetleyici pininin bilgi aktarımı yönünden sorumludur. Bu kaydın herhangi bir biti “0” ise, ilgili çıkış bir giriş olacaktır ve “1” ise çıkış olacaktır. Üstelik her çıkış ayrı ayrı ve programın herhangi bir yerinde yapılandırılır. Bu, farklı koşullar altında veya farklı zamanlarda aynı pinin diğer pinlerden bağımsız olarak giriş veya çıkış olarak yapılandırılabileceği anlamına gelir.

2. PINB kaydı şunları içerir: Mevcut durum tüm pinler: eğer pine voltaj uygulanıyorsa ilgili bit'e mantıksal “1” yazılır; voltaj yoksa mantıksal “0” yazılır. Bu kayıt esas olarak giriş modundaki bir pinin durumunu okumak için kullanılır.

3. PORTB kaydı bilgi aktarımının yönüne bağlı olarak ikili bir işlev gerçekleştirir. Eğer pin dijital çıkış olarak çalışıyorsa PORTB yazmacının herhangi bir bitine “1” yazmak ilgili pin üzerinde voltajın görünmesine, “0” yazmak ise voltajın kaybolmasına neden olur. Böylece çıkış modunda her pinin durumunu belirleyen bu kayıttır. Modunda dijital giriş Herhangi bir bit'e mantıksal bir "1" yazılması, yerleşik çekme direncinin ilgili pime bağlanmasına ve devre dışı bırakılması için "0" yazılmasına yol açar. Bu “çekme direnci” nasıl bir şeydir ve ne için tasarlanmıştır? Pim dijital giriş görevi görüyorsa giriş tampon direnci oldukça yüksek ve giriş akımı oldukça küçüktür. Bu nedenle, herhangi bir elektriksel girişim, çıkışın kendiliğinden isteğe bağlı bir duruma geçmesine yol açabilir. Bunun olmasını önlemek için, giriş ile güç kaynağı arasına onlarca kiloohm dirençli bir direnç bağlanır ve giriş potansiyelini besleme voltajına "yukarı çeker" (dolayısıyla adı). Bu dirençten geçen akım, devrenin geri kalanına müdahale etmeyecek kadar küçük, ancak yanlışlıkla pin değişimini önleyecek kadar büyüktür. Düğmelerle çalışırken sıklıkla çekme dirençleri kullanacağız, çünkü bunlara basılmadığında bağlı oldukları pinler esasen havada "asılı" kalır ve girişime maruz kalır.

Açılışta tüm kayıtların 0'a sıfırlandığı ve her pinin, çekme direnci olmadan dijital giriş görevi gördüğü belirtilmelidir.

Artık denetleyici girişleriyle çalışmak için NEYE ihtiyaç duyulduğuna dair en azından bir fikrimiz olduğuna göre, onlarla NASIL çalışılacağını öğrenmenin zamanı geldi.

İlk yazımızı yazalım çalışma programı montajcıda. Öncelikle yeni bir proje oluşturmak için eksiksiz bir algoritma vereceğim, ancak gelecekte yalnızca programın metnine odaklanarak bunu atlayacağım.

1. asm klasörüne gidin ve içinde yeni bir klasör oluşturun. Bizim için uygun bir adla yeniden adlandırın. Daha spesifik olmak gerekirse, onlara adım numaramızla atıfta bulunacağım. Bu durumda "adım2".

2. Sağ tık build.bat dosyasına tıklayın ve yeni oluşturulan klasörü belirterek kaynak dosyanın yolunu değiştirin (adım2). Bundan sonra içeriğim şöyle görünecek:

"F:\Prog\AVR\asm\avrasm32 -fI %F:\Prog\AVR\asm\step2\main.asm
Duraklat"

Arşivi açtığınız yere bağlı olarak bu durum sizin için farklılık gösterebilir.

3. Asmedit klasörüne gidin ve ASM_Ed.exe programını çalıştırın

4. Açılan pencereye programın metnini yazın. Bu nokta üzerinde daha ayrıntılı olarak duracağım, çünkü bugünkü dersimizin yanı sıra sonraki derslerimizin de ana konusu bu.

Bir montajcı programının metni nedir? Belirli kurallara göre yazılmış çeşitli unsurları içerebilir:

Talimat sözdizimine bağlı olarak işlenenli veya işlenensiz montaj talimatları. Komut adı ile ilk işlenen arasında boşluk, sekme veya her ikisinden herhangi bir sayı bulunmalıdır. İşlenenler bir virgülle ayrılır; bu virgülün önüne veya arkasına isteğe bağlı sayıda boşluk veya sekme de gelebilir;

Her biri "." ile başlayan yönergeler;

Programda kullanıcı tarafından keyfi olarak adlandırılan ve gidilmesi gerekebilecek yerler olan etiketler. Her etiket bir ":" karakteriyle biter;

";" ile başlayan yorumlar. Onaltılı dosya oluşturulurken yorumun başından satırın sonuna kadar olan tüm metinler dikkate alınmaz ve tamamen keyfi olabilir;

Programın daha iyi yapısı ve okunabilirliği için boş satırlar.

Her satırda birden fazla komut bulunamaz. Ancak, bir satırda bir etiketin ve ardından bir komutun ve bir yorumun aynı anda bulunmasına izin verilir.

Bu kuralları kullanarak SB1 butonu basılı tutulduğunda LED2'yi açacak, buton bırakıldığında LED'i kapatacak bir program yazacağız. Programın metni aşağıda sunulmaktadır:

.include "F:\Prog\AVR\asm\Appnotes\tn13def.inc"
sbi DDRB, 4 ;РВ4 - çıkış (LED2)
sbi PORTB, 2 ; PB2 üzerindeki çekme direncini açın (SB1 düğmesi)
sbic PINB, 2 ;PB2=0 ise (düğmeye basıldığında), sonrakini atlayın. astar
sbi PORTB, 4 ;PB4'ü 1'e takma (LED'i kapatma)
sbis PINB, 2 ;PB2=1 ise (düğme serbest bırakılır), sonraki adımı atlayın. astar
cbi PORTB, 4 ;PB4'ün 0'a ayarlanması (LED açık)

Gelin buna daha detaylı bakalım. İlk satır, başında nokta olacak şekilde yukarıdaki kurallara göre yazılan "include" direktifini içerir. Amacı arkasında belirtilen dosyayı program metnine dahil etmektir. İlk adımda söylediğim gibi "tn13def.inc" dosyasına ihtiyacımız olacak. Bu satırda, bilgisayarınızdaki Appnotes klasörünün konumunun yolunu değiştirmeniz gerekecektir. Bu dosyayı neden eklememiz gerekiyor? Meraklı bir okuyucu ona bakabilir ve içeriğini okuyabilir, ancak büyük olasılıkla ilk başta pek azını anlayacaktır. Şimdilik, assembler'ın varsayılan olarak bilmediği kayıtların adları ile denetleyicideki fiziksel adresleri arasında bir yazışma içerdiğini söyleyeceğim.

Aşağıdaki satırlar montajcı komutlarıdır. Dikkatli okuyucu toplam dördünün kullanıldığını fark edecektir. çeşitli komutlar. Her birinin amacına bakalım.

Sbi komutunun iki işleneni vardır: birincisi kayıt adı, ikincisi ise bit numarasıdır. Yürütülmesinin bir sonucu olarak, belirtilen kayıttaki belirtilen bit "1" olarak ayarlanır.

Cbi komutu söz dizimi açısından yukarıdakine benzer ve tam tersi işlevi gerçekleştirir - belirtilen kayıttaki belirtilen biti "0" olarak sıfırlar.

Sbis komutu söz dizimi açısından da yukarıdakine benzer. Ancak onlardan farklı olarak yazmaçlarla herhangi bir işlem yapmaz, yalnızca belirtilen yazmaçtaki belirtilen bitin durumunu kontrol eder ve "1" e eşitse komutu takip eden satırı atlar. Aksi takdirde, onu takip eden satır ve ondan sonraki tüm satırlar yürütülür.

Sbiс komutu sbis komutunun tersidir. Belirtilen kayıt biti "0" ise bir sonraki satırı atlar.

Şimdi yukarıdakilerin hepsini özetleyerek programın algoritmasını anlamaya çalışalım. Başlangıç ​​olarak bunu kelimenin tam anlamıyla satır satır yapacağım.

1 satır. include yönergesi, kayıt tanımlarını içeren tn13def.inc dosyasını içerir.

2. satır. Sbi komutu, DDRB kaydının 4. bitinde "1"i ayarlar, böylece PB4 pinini çıkışa çevirir. Kart şemasına bakarsanız (önceki adımın Şekil 1'i), LED2'nin bu pime bağlı olduğunu görebilirsiniz. Komuttan ve ";" işaretinden sonra satırında gerçekleştirilen eylemlerin anlamını kısaca açıklayan bir yorum yazılmıştır.

3 satır. Aynı sbi komutu, dahili çekme direncini SB1 düğmesinin bağlı olduğu PB2 pinine bağlayarak PORTB kaydının 2. bitinde "1"i ayarlar. DDRB kaydının 2. bitinin durumunu değiştirmediğimiz için bu pin bir giriş olarak kalacak, aslında ihtiyacımız olan şey de bu.

4 satır. Sbic komutu, PINB kaydını kullanarak PB2 girişinde mantıksal bir "0" olup olmadığını kontrol eder. Diyagrama yakından bakarsanız, düğmelere basıldığında ortak tel ile ilgili terminali kapattığını görebilirsiniz. Bu standart bir tekniktir, çünkü buton bırakıldığında pull-up direnci nedeniyle çıkışta lojik “1” bulunur, butona basıldığında ise lojik “0” çıkışın bağlanmasından dolayı ortaya çıkar. ortak kabloya çıkış. Yani PB2 pininde mantıksal “0” varsa yani butona basılırsa bir sonraki satırı atlarız, buton bırakılırsa çalıştırırız.

5 satır. İçinde, sbi komutu PORTB kaydının 4. bitinde mantıksal bir "1" ayarlar ve böylece LED2'yi kapatır. Zeki bir okuyucu, çıkışa voltaj uyguladığımızda LED'in neden kapandığını merak edebilir. Cevap tasarımda yatıyor. LED, anotla güç kablosuna ve katotla kontrol cihazı çıkışına bağlanır. Bu nedenle çıkışa voltaj uygulandığında anot ve katodun potansiyelleri eşit olacak ve LED sönecektir. Çıkışa mantıksal “0” verilirse LED'e voltaj uygulanacak ve yanacaktır. Böylece, 4 ve 5 numaralı hatlardan oluşan bir çift, düğme bırakıldığında LED2'yi kapatır.

6 satır. Anlamı 4'ün tersidir. Sbis komutu, PB2 girişinde mantıksal bir “1” olup olmadığını kontrol eder, yani düğmenin bırakılıp bırakılmadığını kontrol eder. Düğme bırakılırsa bir sonraki satır atlanır ve bir sonraki satır bir sonraki satıra geçer. Fakat 7. satır sonuncu olduğu için 2. satıra geçiş söz konusudur. Düğmeye basıldığında 7. satır yürütülür.

7 satır. 5'in karşısında. Cbi komutu PORTB kaydının 4. bitini "0"a sıfırlar, böylece LED2'yi açar. Böylece SB1 butonuna basıldığında 6 ve 7 numaralı hat çifti LED2'yi yakar.

Gördüğünüz gibi özellikle zor bir şey yapmadık. Sadece 3 yazmaç ve 4 talimat bilgisini kullanarak ilk programımızı yazdık. Bundan sonra onunla ne yapmalı? Henüz unutmadıysanız program oluşturma algoritmasını yazmaya devam ediyoruz.

5. Program metnini editör penceresine yazdıktan sonra, “Dosya” menü öğesini seçin ve açılan listede “Farklı Kaydet…” seçeneğini tıklayın. Dosya kaydetme penceresinde oluşturduğumuz step2 klasörünü seçin ve “build.bat” dosyasında belirttiğimiz isim olduğundan “main” dosya adını belirtin.

Kaydettikten sonra program penceresi şöyle görünmelidir:

6. Bir hex dosyası oluşturun. Bunu yapmak için araç çubuğundaki "II" düğmesini tıklayın. Aşağıdaki pencere görünmelidir:

Montajın hatasız tamamlandığını ve “main.hex” firmware dosyasının 6 kelimelik yani 12 baytlık bir hacimde oluşturulduğunu bize bildirir. C'deki benzer bir programın hacminin en az 5 katı olacağını not ediyorum.

7. Adım2 klasörüne gittikten sonra, artık herhangi bir programcı ile denetleyiciye dikilebilen, sonuçlarını görmek için yapılması gereken, yeni oluşturulmuş bir main.hex dosyası biçiminde bir ekleme buluyoruz. Yazdığımız program. Kontrolörün flaşını yaptıktan sonra devre doğru monte edilmişse her şey geliştirdiğimiz algoritmaya göre çalışmalıdır: butonlar bırakıldığında LED2 kapalı olmalı, SB1 butonu basılı tutulduğunda ise yanmalıdır.

Bir sonraki adımdan önce aşağıdaki görevleri yapmanızı öneririm:

1. SB2 düğmesine basmayı program işlemine ters algoritmayla ekleyin: SB2 düğmesi bırakıldığında LED1 yanmalı ve basıldığında kapalı olmalıdır.

2. Her iki düğmeyi kullanarak LED2'yi kontrol edecek bir program yazın. SB1 düğmesine basıldığında, LED yanmalı ve SB2 düğmesine basılana kadar yanık kalmalıdır; bu, SB1'e bir sonraki basışa kadar söner.

Herkes İyi akşamlar! “Assembler” denen rahat bir dünyadan yayın yapıyorum. Konunun neyle ilgili olduğunu hemen açıklayacağım AVR mikrodenetleyicileri- ve bu yazının assembler'ı başka bir görev için kullanmak isteyenler için yararlı olup olmayacağını henüz bilmiyorum. Gerçek şu ki, tam anlamıyla birkaç gün önce montajcıyı sıfırdan öğrenmeye başladım - bir cihaz yapmam gerekiyor - ve içindeki her şeyi kendim yapmaya karar verdim. Güzel bir gün şunu farkettim Montajcıyı öğrenmek kesinlikle işe yaramaz! Assembly dili ancak anlaşılabilir! Yani, montaj dilinde programlama yapmak isteyenlere, mikro denetleyicinin FİZİKSEL OLARAK nasıl çalıştığını ayrıntılı olarak araştırmanızı ve ardından komutların inceliklerini incelemenizi şiddetle tavsiye ederim.
Bu yüzden muhtemelen size en baştan anlatacağım küçük bir makale dizisine başlayacağım. tam olarak nasıl Assembly dili programlamasında bazı şeyleri anladım - ASM'nin ne olduğunu hiç anlamayanlar için, bu konuda çok iyi olanların dilinden tam bir "çevirmen" olacağımı düşünüyorum.

Bu konuya aşağı yukarı DIHALT'ın teşvikiyle girdiğimi hemen söyleyeceğim - bu nedenle bu makaleler, süper kandırılan montaj-mikrodenetleyici dilinden çoğu insanın anlayabileceği bir dile bir tür çeviri olacak. Umarım oyun ilerledikçe gurular beni düzeltir ve aniden bir şeyi yanlış açıklarsam beni düzeltirler.
Böylece, birkaç gün önce montajcı hakkında vardığım ilk sonuçlar beni baştan sona şok etti - ve gece 23:00'den sabah 5'e kadar oturup DI HALT makalelerini okudum - ardından memnun ve mutlu bir şekilde yatağıma gittim. Mikrodenetleyiciler için montaj dili programlaması.
Bu daha basit bir şekilde nasıl açıklanabilir? Bence işin özünden başlamamız gerekiyor.
***
Başlangıçta teknik ayrıntılara girmeyeceğiz (bir sonraki makalede bunlar hakkında konuşacağız) - sadece 3 karakter olduğunu hayal edin:
1. Mikrodenetleyici - Bu, Ruslara gelen İngiliz Steve. Mükemmel biliyor ingilizce dili ama Rusça'yı hiç anlamıyor - tek bir kelime bile. Sadece ingilizce. Tartışmayı kaybetti ve Rus'un kendisinden yapmasını istediği her şeyi sorgusuz sualsiz yapmaya söz verdi.
2. Montajcı - Bu, annesi İngiliz, babası Rus olan tercüman Vasya'dır. Hem İngilizce'yi hem de Rusça'yı çok iyi biliyor.
3.Biz - Bu, bir İngiliz'in geldiği bir Rus. Yani, biz biziz =) Aynı zamanda, Rusça'yı çok iyi biliyoruz ve (!!!) biraz İngilizce - sadece biraz, bir sözlükle.
***
Bu durumu hayal edin - odanızdaki bir sandalyede bir İngiliz oturuyor. Ve bilgisayarınızın başında oturuyorsunuz ve bu yazıyı okuyorsunuz, aniden pencereniz aniden açıldı! Bu kötü şans! Rüzgâr esiyor, perde yelken olmuş... Kapatsak iyi olur! Ancak sandalyeden kalkmak, ayaklarınızı sistem ünitesinden çıkarmak, onları terliklere tıkmak, bir fincan kahvenizi (bira) bırakmak ve elementlerle savaşmak çok tembel. Ve sonra aniden odada bahsi kaybeden bir İngiliz'in olduğunu ve onu kovalama zamanının geldiğini fark ediyorsunuz! Ve sen ona çok tatlı bir şekilde şöyle diyorsun: “Dostum! Lütfen pencereyi kapatın, sonra tekrar sandalyeye oturabilirsiniz! ve oturuyor, şaşkınlıkla sana bakıyor ve hiçbir şey yapmıyor! Elbette lahana çorbasını yiyebilirsin - ama o zaman seni yine de anlamayacak! Sonra tercüman arkadaşınız Vasily'i ararsınız - o gelir ve İngiliz'in yanına bir sandalyeye oturur. Ve diyorsunuz ki - Çevir: "Steve, git, pencereyi kapat ve sonra sandalyeye otur!" Çevirmen İngilizceye tercüme ediyor - İngiliz anlıyor ve gidip pencereyi kapatıyor, sonra gelip bir sandalyeye oturuyor.
Bu noktada montajcının bu “Biz-Birleştirici-Kontrolör” zincirindeki rolünü anlamanız yeterli.
Yani herkes montajcının ne olduğunu nasıl anlayacak? Sonra okumaya devam edin.
***

Peki bu durumu hayal edelim. Vasya'ya diyorsunuz ki - "Dinle, kısaca durum bu - Hesap makinesini evde unuttum, 56983'ü 2'ye böl ve Steve'e yumruklarınla ​​şu kadar şınav çekmesini söyle" ve Vasya hesap makinesine güveniyor ve Steve'e İngilizce "Yumruklarınızla 28491 kez şınav çekin" diyor. "DİREKTİF"- başka bir deyişle, talimat Vasya için bir görevdir ve bunun sonucu Steve'in eylemidir.

Başka bir durum daha var - Vasya'ya "Steve'e 28491 şınav çekmesini söyle" diyorsunuz ve Vasya kelimelerinizi İngilizceye çeviriyor. denir ŞEBEKE

Çok basit; bir direktif var ve bir operatör var. Operatör, Steve'e ne yapması gerektiği konusunda doğrudan talimatınızdır - Vasya burada isteğinizi yalnızca İngilizceye çeviriyor. Ve Direktif Vasya'nın kendisi için bir görevdir - ve Vasya önce ona söylediğinizi yapar ve ardından sonuca bağlı olarak Steve'e bir şeyler söyler.

Artık İngiliz'e düzenli olarak işkence edeceğiz! Ama önce tercümanımız Vasya'yı daha yakından tanımamız gerekiyor. Aşağıdakileri bilmeniz gerekir - Vasya size her zaman sorgusuz sualsiz itaat eder - kendisine söyleneni yapar. Vasya'nın hesap makinesinde ondalık basamaklar yok - örneğe şınavla bakarsanız, o zaman 56983 \ 2 = 28491,5 - ancak Vasya'nın ondalık noktadan sonraki her şeyi kesiliyor - ve yalnızca bir tam sayı görüyor - ve önemli değil 28491.000001 mi olacak, yoksa 28491.9999999 mu olacak - Vasya için bu çok önemli, her iki durumda da 28491 olacak. Hiçbir şey yuvarlak değil. Daha önemli bilgi Vasya hakkında. Vasya zalimdir; Steve'in yirmi sekiz bin kez şınav çektiği gerçeğini umursamıyor. Ona Vasya'nın tercüme ettiğini söylediler. Ve sadece tercüme etmekle kalmadı, aynı zamanda beni istediğini yapmaya zorladı. Yani Steve yirmi üç bin beş yüz on üçüncü şınavda ölürse bu tamamen senin hatan olacak.

Aslında şimdilik bu kadar. Bir sonraki yazıda daha derine ineceğiz - şimdilik bunu anlamanız yeterli. Sadece bu durumu hayal edin ve neyin ne olduğunu, kimin hangi rolü oynadığını ve direktifin operatörden nasıl farklı olduğunu anlayın.
Ve sonra her şeyi kendi adıyla çağırmaya çalışacağız ve montajcının bir yetişkin gibi bir mikrodenetleyici ile nasıl çalıştığını kabaca tahmin edeceğiz.

Ünlü Tetris'in montaj dilinde yazılmış bir kopyası. Tamamen 512 baytlık önyükleme sektörüne sığar (yalnızca 446 baytlık alan gerektirir; bu, tam olarak MBR'deki maksimum önyükleyici boyutudur).

MBR, işletim sisteminin daha sonra yüklenmesi için gerekli olan ve ilk fiziksel sektörlerde bulunan kod ve verileri içeren bir bölümdür. Diskin ilk 446 baytı önyükleyici koduna verilir. TetrOS'un yazıldığı yer burasıdır.

Doğal olarak bu özellikleri nedeniyle herhangi bir işlemden önce yüklenir. işletim sistemi- Herhangi bir işletim sistemine ihtiyaç duymaz, kendi kendine çalışır. Evet, evet doğru duydunuz, TetrOS kendi önyükleyicisidir.

Ekranda böyle görünüyor:

Ve önyükleme sektöründeki kaynak kodu şuna benzer:

Ve evet öyle Tümü kaynak. Sadece 446 bayt ağırlığında olduğunu hatırlıyor musunuz?

Bu "mucize işletim sistemini" qemu altında çalıştırabilir veya hatta bir diskin veya flash sürücünün önyükleme bölümüne bile kurabilirsiniz.

Öğle yemeği

Sadece qemu'yu yükleyin:

sudo apt-get qemu'yu yükle

ve koş:

USB flash sürücüye yükleme

Görüntüyü bir flash sürücüye kopyalayın. Diyelim ki flash sürücü /dev/sde olarak monte edilmişse, ona yazmak için aşağıdaki komutu çalıştırmanız gerekecektir. önyükleme sektörü TetrOS:

sudo dd if=tetros.img of=/dev/sde

Oyun açıklaması

Geliştirici, pek de sıkıcı olmayan bir tasarımı yalnızca 512 baytlık belleğe sığdırmayı başardı. Oyundaki her tuğlanın kendine has rengi var, butonlarla kontrol ediliyor, yenilgi durumunda oyun bitiyor, tuğlalar rastgele üretiliyor... BolgenOS'un yakınından bile geçmiyordu!

Ne yazık ki boyut nedeniyle bazı özelliklerin terk edilmesi gerekti. Oyunun puanlaması yoktur, oyunu yeniden başlatmadan yeniden başlatın veya bir sonraki tuğlanın ne olacağını gösterin.

İsim: Atmel AVR mikrodenetleyicilerinin montaj dili 2. baskısında pratik programlanması

Yayımcı:"BHV-Petersburg"

Yayınlandığı yıl: 2011

Sayfalar: 354

Dil: Rusça

Biçim: DjVu

Boyut: 12,2 MB

Atmel AVR mikrodenetleyicilerinin çalışma prensipleri, mimari özellikleri ve programlama teknikleri üst üste bindirilmiştir.

Modern mikroelektronik ekipmanın temel işlevlerini programlamak için hazır tarifler sağlanmıştır: bir düğmeye basmaya yanıt vermekten veya dinamik bir ekran oluşturmaktan karmaşık veri kayıt protokollerine kadar. harici bellek veya gerçek zamanlı saat bağlantısının özellikleri. Özel dikkat mikroelektronik cihazlardan kişisel bilgisayarla veri alışverişine odaklanıyor ve program örnekleri sunuyor. Kitap özellikleri dikkate alıyor modern modeller AVR ve son üretim yıllarının ilgili mikro devreleri.
Uygulama, AVR mikrokontrolörlerinin ana parametrelerini, komutların ve metinlerin bir listesini içerir.Uygulamalar, AVR mikrokontrolörlerin ana parametrelerini, bunlara yönelik komutların ve program metinlerinin bir listesini ve ayrıca kullanılan terimler ve kısaltmaların bir listesini içerir.
Öğrenciler, mühendisler ve radyo amatörleri için

7. Mikrodenetleyiciler, kökenleri ve uygulamaları
8. Mikrodenetleyicilerin geçmişi
10. Yunan tarzı elektronik
12. Neden AVR?
14. Sırada ne var?
17. BÖLÜM L ATMEL AVR'NİN TASARIM VE ÇALIŞTIRILMASINA İLİŞKİN GENEL İLKELER
19. Bölüm 1. Atmel AVR mikrokontrolörlerine genel bakış
21. AVR aileleri
23. AVR MK'nin pratik kullanım özellikleri
23. Tüketim hakkında
25. AVR'yi devrelerde kullanmanın bazı özellikleri
27. Bölüm 2. Genel yapı, hafıza organizasyonu, zamanlama, sıfırlama
27. Program hafızası
29. Veri belleği (RAM, SRAM)
31. Kalıcı veri belleği (EEPROM)
32. Saat yöntemleri
34. Sıfırla
37. Bölüm 3: Çevre Birimlerine Giriş
38. G/Ç bağlantı noktaları
39. Zamanlayıcılar-sayaçlar
41. Analogdan dijitale dönüştürücü
42. Seri bağlantı noktaları
43.UART
46. ​​​​SPI arayüzü
50. TWI arayüzü (I2C)
50. Evrensel Seri Arayüz USI
53. Bölüm 4. Kesintiler ve güç tasarrufu modları
53. Kesintiler
57. Kesinti türleri
58. Enerji Tasarruf Modları
61. BÖLÜM II. ATMELAVR MİKRODENETLEYİCİLERİN PROGRAMLANMASI
63. Bölüm 5. AVR ailesinin MK'lerini programlamanın genel ilkeleri
63. Montajcı mı yoksa C mi?
67. AVR programlama yöntemleri ve araçları
67. Kod editörü
68. AVR Stüdyosu Hakkında
70. Montajcının düzenlenmesi
71. Programcılar
75. Hex dosyaları hakkında
78. AVR derleyicisinin komutları, talimatları ve notasyonu
79. Sayılar ve ifadeler
80. Direktifler ve işlevler
84. AVR programının genel yapısı
85. Kesinti yönetimi
89.SIFIRLAMA
90. En basit program
92. Gecikme
94. Sayaç programı
96. Kesintileri kullanmak
97. Zamanlayıcı gecikmesi
98. Kesintileri kullanan sayaç programı
101. Yapılandırma bitleri hakkında
105. Bölüm 6, AVR Komuta Sistemi
105. Kontrol aktarım talimatları ve SREG kaydı
111. Kontrol-geçiş komutları
113. Mantıksal işlem komutları
114. Shift talimatları ve bit işlemleri
116. Aritmetik işlem talimatları
118. Veri aktarım komutları
122. Sistem yönetimi komutları
123. Montajcıda standart prosedürlerin uygulanması
125. Yığın, yerel ve global değişkenler hakkında
127. Bölüm 7. Aritmetik İşlemler
128. Standart aritmetik işlemler
129. Çok Basamaklı Sayıların Çarpılması
131. Çok Basamaklı Sayıların Bölünmesi
134. Kesirli Sayılarla İşlemler
136. Rastgele sayı üreteci
138. BCD formatındaki sayılarla işlemler
143. MK'deki negatif sayılar
147. Bölüm 8. Zamanlayıcıların programlanması
147. 8- ve 16-bit zamanlayıcılar
149. Belirli bir frekans değerinin oluşumu
153. Geri sayım
158. Doğru zaman düzeltmesi
160. Frekans ölçer ve periyot ölçer
160. Frekans ölçer
164. Periyodometre
167. Dinamik ekran kontrolü
168. LED göstergeler ve bağlantıları
171. Dinamik ekranı programlama
174. PWM modunda zamanlayıcılar
179. Bölüm 9. EEPROM'un Kullanılması
179. EEPROM'daki verilerin güvenliği hakkında bir kez daha
181. EEPROM yazma ve okuma
183. Sabitleri EEPROM'da Saklamak
187. Bölüm 10. Analog karşılaştırıcı ve ADC
187. Analog-dijital işlemler ve hataları
190. Analog karşılaştırıcıyla çalışma
193. ADC'yi bir karşılaştırıcıya entegre etmek
194. Çalışma prensibi ve hesaplama formülleri
198. ADC programını entegre etmek
201. Dahili ADC
204. ADC kullanma örneği
206.Program
215. Bölüm 11. SPI Programlama
215. SPI aracılığıyla temel işlemler
216. Donanım seçeneği
218. Yazılım seçeneği
219. Kalıcı bellek türleri hakkında
221. SP aracılığıyla flash belleğe yazın ve okuyun!
224. SPI aracılığıyla 45DB011B hafızalı değişim programı
225. Flash kart yazma ve okuma
225. MMS kartlarını bağlama
228. Komutların gönderilmesi ve MMC'nin başlatılması
232. MMS yazma ve okuma
237. Bölüm 12. TW1 (I2C) arayüzü ve pratik kullanımı
237. Temel protokol 1 2 C
240. I 2 C protokolünün yazılım emülasyonu
241. Harici kalıcı belleğe veri yazma
241. AT24 hafızalı mod değiştirme
243. Program
247. I 2 C arayüzlü saat
255. Veri kaydı
259. Verileri okumak
261. Bölüm 13. UART/USART Programlama
262. UART başlatma
263.Veri gönderme ve alma
266. UART kullanarak DS1307 saatini ayarlama örneği
271. İletişim arızalarına karşı koruma teknikleri
271. Parite kontrolü
273. Doğru bir değişim nasıl organize edilir
274. USART'ın ek özellikleri
276. RS-232 ve RS-485 arayüzlerinin uygulanması
280. RS-232 için seviye dönüştürücüler
283.RS-485
285. Bölüm 14. Güç tasarrufu modları ve gözlemci zamanlayıcısı
286. Enerji tasarrufu modunun programlanması
287. Pille çalışan cihaz örneği
289. Programın sonuçlandırılması
293. Watchdog zamanlayıcısını kullanmak
299. UYGULAMALAR
301. Ek 1. Atmel AVR mikrodenetleyicilerinin temel parametreleri
309. Ek 2. Atmel AVR Komutları
310. Aritmetik ve mantıksal talimatlar
311. Bit Çalıştırma Talimatları
312. Karşılaştırma komutları
313. Kontrol aktarım komutları
313. Koşulsuz atlama komutları ve alt programların çağrılması
314. Kontrol-atlama komutları ve koşullu atlama komutları
315. Veri aktarım komutları
316. Sistem yönetimi komutları
317. Ek 3. Program metinleri
317. SPI arayüzü aracılığıyla 45DB011B flash bellek ile veri alışverişi için gösteri programı
321. I2C arayüzü aracılığıyla değişim prosedürleri
329. Ek 4. Kişisel bilgisayarla veri alışverişi ve UART aracılığıyla programlarda hata ayıklama
329. Delphi'de COM portuyla çalışma
335. DOS ve Windows'ta RTS hattı kurulumu
337. COM2000 programı
339. Terminal öykünücüsü kullanarak programlarda hata ayıklama
341. Ek 5. Sık kullanılan kısaltmalar ve terimler sözlüğü
347. Edebiyat
349. Konu dizini