Atmega8 mikrodenetleyiciler. Yeni başlayanlar için Atmega8 programlama. AVR mikro denetleyicileri. Yeni başlayanlar için programlama Mikrodenetleyici atmega8 eğitimi

Aralık 2015

1. Önerilen yöntemin avantajları

Mikrodenetleyicilere (MCU'lar) dayalı cihaz devreleri genellikle birleştirilmesi zor iki özelliğin birleşimiyle ayırt edilir: maksimum basitlik ve yüksek işlevsellik. Ek olarak, işlevsellik gelecekte devrede herhangi bir değişiklik yapmadan - yalnızca programı değiştirerek (yanıp sönerek) değiştirilebilir ve genişletilebilir. Bu özellikler, modern MK'lerin yaratıcılarının, bir geliştiricinin ihtiyaç duyabileceği her şeyi tek bir çip üzerine yerleştirmeye çalışmasıyla açıklanmaktadır. elektronik cihaz- en azından mümkün olduğu kadar. Sonuç olarak, devre ve kurulumdan yazılıma vurgu yapıldı. MK kullanımıyla artık devreyi parçalarla "yüklemeye" daha az ihtiyaç duyuluyor ve bileşenler arasında daha az bağlantı var. Bu elbette devreyi hem deneyimli hem de acemi elektronik mühendisleri için tekrarlama açısından daha çekici hale getiriyor. Ancak her zamanki gibi her şeyin bedelini ödemek zorundasınız. Bunun da zorlukları vardı. Yeni bir MK satın alırsanız, onu servis verilebilir parçalardan doğru şekilde monte edilmiş bir devreye kurun ve güç uygulayın, o zaman hiçbir şey çalışmayacaktır - cihaz çalışmayacaktır. Mikrodenetleyicinin bir programa ihtiyacı vardır.

Görünüşe göre bunda da her şey basit - İnternette ücretsiz ürün yazılımı içeren birçok şema bulabilirsiniz. Ancak burada bir sorun var: Ürün yazılımının bir şekilde mikro denetleyiciye "yüklenmesi" gerekiyor. Bunu daha önce hiç yapmamış biri için, böyle bir görev genellikle bir sorun haline gelir ve ana itici faktör haline gelir ve çoğu zaman onları MK kullanmanın zevklerinden vazgeçmeye ve "gevşek" ve katı mantığa dayalı şemalar aramaya zorlar. Ancak her şey ilk bakışta göründüğü kadar karmaşık değil.

İnternetteki yayınları analiz ettikten sonra, bu sorunun çoğunlukla iki yoldan biriyle çözüldüğünü görebilirsiniz: hazır bir programcı satın almak veya ev yapımı bir programcı yapmak. Aynı zamanda, ev yapımı programcıların yayınlanmış devreleri çoğu zaman mantıksız derecede karmaşıktır; gerçekten gerekli olandan çok daha karmaşıktır. Elbette, MK'yi her gün flaşlamayı planlıyorsanız, "havalı" bir programcıya sahip olmak daha iyidir. Ancak böyle bir prosedüre ihtiyaç nadiren ortaya çıkarsa, zaman zaman programcı olmadan da yapabilirsiniz. Hayır elbette düşünce gücüyle bunu yapmayı öğrenmekten bahsetmiyoruz. Bu, programlama modunda bilgi yazarken ve okurken programcının mikro denetleyiciyle nasıl etkileşime girdiğini anlayarak, mevcut araçları daha geniş bir amaç için kullanabileceğimiz anlamına gelir. Bu araçların programcının hem yazılım hem de donanım parçalarını değiştirmesi gerekecektir. Donanım, MK mikro devresine fiziksel bir bağlantı, girişlerine mantıksal seviyeler uygulama ve çıkışlarından veri okuma yeteneği sağlamalıdır. Yazılım kısmı gerekli tüm süreçleri kontrol eden algoritmanın çalışmasını sağlamalıdır. Ayrıca, MK'deki kayıt bilgilerinin kalitesinin programlayıcınızın ne kadar "havalı" olduğuna bağlı olmadığını da not ediyoruz. “Daha iyi kaydedilmiş” veya “daha ​​kötü” diye bir şey yoktur. Yalnızca iki seçenek vardır: “kayıtlı” ve “kayıtlı değil”. Bu, kristalin içindeki kayıt işleminin doğrudan MK'nin kendisi tarafından kontrol edilmesiyle açıklanmaktadır. Sadece ona yüksek kaliteli güç sağlamanız (parazit veya dalgalanma yok) ve arayüzü uygun şekilde düzenlemeniz gerekir. Test okumasının sonuçlarında herhangi bir hata ortaya çıkmazsa, her şey yolunda demektir - denetleyiciyi amacına uygun olarak kullanabilirsiniz.

Programlayıcı olmadan MK'ye program yazabilmek için bir USB-RS232TTL bağlantı noktası dönüştürücüsüne de ihtiyacımız var. USB-RS232TTL dönüştürücü, yalnızca giriş ve çıkışlarının TTL mantıksal seviyelerini, yani 0 ila 5 volt aralığında voltajı kullanması nedeniyle "gerçek" olandan farklı bir COM bağlantı noktası oluşturmak için bir USB bağlantı noktası kullanmanıza olanak tanır ( Daha fazlasını "") makalesinde okuyabilirsiniz. Her durumda, böyle bir dönüştürücünün "evinizde" bulunması faydalıdır, bu nedenle halihazırda bir tane yoksa kesinlikle satın almaya değer. Mantıksal seviyelere gelince, bizim durumumuzda TTL, normal bir COM bağlantı noktasına göre bir avantaj bile sağlıyor çünkü böyle bir bağlantı noktasının girişleri ve çıkışları, ATtiny ve ATmega dahil olmak üzere 5 V ile çalışan herhangi bir mikro denetleyiciye doğrudan bağlanabilir. Ancak normal bir COM bağlantı noktası kullanmaya çalışmayın; -12 ila +12 V (veya -15...+15V) aralığındaki voltajları kullanırlar. Bu durumda mikrodenetleyiciye doğrudan bağlantı kabul edilemez!!!

Programcının işlevlerini uygulayan Perpetuum M programı için bir komut dosyası oluşturma fikri, internette MK ürün yazılımı için belirli çözümler sunan bir dizi yayın okuduktan sonra ortaya çıktı. Her durumda ciddi eksiklikler veya aşırı zorluklar keşfedildi. Çoğu zaman bir mikrodenetleyici içeren programlayıcı devreleriyle karşılaştım ve aynı zamanda oldukça ciddi bir şekilde şöyle tavsiyeler verildi: "... ve bu programcı için mikrodenetleyiciyi programlamak için ihtiyacımız olacak... bu doğru - başka bir programcı!" Daha sonra bir arkadaşa gidip onu araması önerildi. ücretli hizmet ve benzeri. Bu amaçlarla ağ üzerinde dağıtılan yazılımın kalitesi de etkileyici değildi - hem işlevsellik hem de kullanıcı arayüzünün "bulanıklığı" ile ilgili birçok sorun fark edildi. Bir programın nasıl kullanılacağını anlamak genellikle çok zaman alır - en basit eylemleri gerçekleştirmek için bile üzerinde çalışılması gerekir. Başka bir program uzun süre ve özenle bir şeyler yapabilir, ancak kullanıcı MK'ye hiçbir şeyin yazılmadığını ancak tüm ürün yazılımı tamamen tamamlandıktan ve ardından test okunduktan sonra öğrenir. Ayrıca şu sorun da ortaya çıkıyor: Kullanıcı MK'sini desteklenen kristaller listesinden seçmeye çalışıyor ancak MK listede yok. Bu durumda, programı kullanamayacaksınız - kural olarak eksik MK'ler listesine dahil edilme sağlanmamıştır. Ek olarak, çoğu durumda programcının MK türünü kendisinin belirleyebileceği göz önüne alındığında, listeden bir denetleyicinin manuel olarak seçilmesi garip görünüyor. Bütün bunlar mevcut ürünlere çamur atmak için değil, bu makalede açıklanan Perpetuum M programı komut dosyasının ortaya çıkma nedenini açıklamak için söyleniyor. Sorun gerçekten var ve öncelikle mikrodenetleyici dünyasına ilk adımlarını atmak için bu "duvarı" her zaman aşmayı başaramayan yeni başlayanları ilgilendiriyor. Önerilen komut dosyası, diğer programlarda bulunan eksiklikleri dikkate alır. Algoritmanın işleyişinde maksimum "şeffaflık" uygulandı; öğrenme gerektirmeyen ve kafanın karışmasına ve "yanlış şeye tıklamaya" izin vermeyen son derece basit bir kullanıcı arayüzü. Gerekli MK desteklenenler arasında değilse, MK geliştiricisinin web sitesinden indirilen belgelerden gerekli verileri alarak açıklamasını kendiniz ekleyebilirsiniz. Ve en önemlisi senaryonun çalışmaya ve değişikliğe açık olmasıdır. Herkes açabilir Metin düzeltici, kendi takdirinize göre inceleyin ve düzenleyin, mevcut işlevleri zevkinize göre değiştirin ve eksik olanları ekleyin.

Senaryonun ilk versiyonu Haziran 2015'te oluşturuldu. Bu sürüm yalnızca flash bellek yazma/okuma, yapılandırma bitlerini ayarlama ve denetleyici tipini otomatik olarak algılama işlevleriyle Atmel'in ATtiny ve ATmega serisi mikrokontrolörleri için destek sağlar.EEPROM yazma ve okuma uygulanmadı.Betiğin işlevselliğini tamamlama planları vardı. : EEPROM yazma ve okuma ekleme, PIC denetleyicileri için destek uygulama vb. Bu nedenle komut dosyası henüz yayınlanmadı. Ancak zaman yetersizliğinden dolayı planın uygulanması gecikti ve bu nedenle en iyisi olmayacak iyiliğin düşmanı, mevcut sürümün yayınlanmasına karar verildi. Zaten uygulanan işlevler yeterli olmayacaksa lütfen üzülmeyin. Bu durumda istediğiniz işlevi kendiniz eklemeyi deneyebilirsiniz. Saklamayacağım: Başlangıçta bu betiği oluşturma fikrinin eğitimsel bir anlamı da var. Algoritmayı anladıktan ve ona kendinize ait bir şeyler ekledikten sonra, MK'nin programlama modunda çalışmasını daha iyi anlayabileceksiniz, böylece gelecekte kendinizi arızalı bir arabanın önünde düşünceli bir şekilde içine bakan ve neden "işe yaramadığını" anlamayan bir kız konumunda bulmayacaksınız.

2. Programlama modunda MK arayüzü

Denetleyiciyi programlama moduna geçirmenin ve bu modda onunla çalışmanın birkaç farklı yolu vardır. ATtiny ve ATmega serisinin kontrolörleri için uygulanması en kolay olanı belki de SPI'dir. Onu kullanacağız.

Ancak SPI üretmek için gerekli sinyalleri değerlendirmeye başlamadan önce bir takım çekinceler yapacağız. Mikrodenetleyicinin konfigürasyon bitleri vardır. Bunlar, mikro devrenin bazı özelliklerini projenin ihtiyaçlarına göre değiştirmenize olanak tanıyan geçiş anahtarları gibi bir şeydir. Fiziksel olarak bunlar, içine bir programın yazıldığı hücreler gibi kalıcı bellek hücreleridir. Aradaki fark, bunların çok az sayıda olması (ATmega için üç bayta kadar) ve herhangi bir belleğin adres alanının parçası olmamasıdır. Konfigürasyon verilerinin yazılması ve okunması, MK programlama modunda ayrı komutlarla gerçekleştirilir. Şimdi bazı konfigürasyon bitlerinin SPI kullanma yeteneğini etkilediğini not etmek önemlidir. Bazı değerleriyle SPI'nin kullanılamayacağı ortaya çıkabilir. Böyle bir mikrodenetleyiciyle karşılaşırsanız bu makalede önerilen yöntem yardımcı olmayacaktır. Bu durumda ya farklı bir programlama modunu destekleyen programlayıcıdaki konfigürasyon bitlerinin ayarlarını değiştirmeniz ya da farklı bir mikrodenetleyici kullanmanız gerekecektir. Ancak bu sorun yalnızca kullanılmış MK'ler veya birinin zaten başarısız bir şekilde "oynadığı" MK'ler için geçerlidir. Gerçek şu ki, yeni MCU'lar SPI kullanımını engellemeyen konfigürasyon bit ayarlarıyla birlikte geliyor. Bu, dört farklı MK'nin (ATmega8, ATmega128, ATtiny13, ATtiny44) başarıyla yanıp söndüğü Perpetuum M programı için programcı komut dosyasının test sonuçlarıyla doğrulandı. Hepsi yeniydi. Yapılandırma bitlerinin başlangıç ​​ayarı belgelerle tutarlıydı ve SPI kullanımına müdahale etmiyordu.

Yukarıdakiler göz önüne alındığında, aşağıdaki bitlere dikkat etmelisiniz. SPIEN biti açıkça SPI kullanımına izin verir veya devre dışı bırakır, bu nedenle bizim durumumuzda değerinin etkinleştirilmesi gerekir. RSTDISBL biti, mikro devrenin çıkışlarından birini (önceden belirlenmiş) "sıfırlama" sinyalinin girişine çevirebilir veya çevirmeyebilir (bu bit'e yazılan değere bağlı olarak). Bizim durumumuzda “reset” girişi gereklidir (eğer yoksa MK'yi SPI üzerinden programlama moduna geçirmek mümkün olmayacaktır). Ayrıca saat sinyalinin kaynağını belirten CKSEL grubunun bitleri de vardır. Bunlar SPI kullanımını engellemez ancak akılda tutulması gerekir çünkü hiç saat darbesi yoksa veya frekansları belirli bir SPI hızı için kabul edilebilirden düşükse, iyi bir şey de olmayacaktır. Tipik olarak, dahili bir RC osilatörüne sahip yeni MCU'lar, onu kullanacak şekilde yapılandırılmış CKSEL grup bitlerine sahiptir. Bu bize oldukça yakışıyor; zamanlama bizim tarafımızdan herhangi bir ek çaba sarf edilmeden sağlanıyor. Kuvars rezonatörünü lehimlemeye veya harici bir jeneratör bağlamaya gerek yoktur. Belirtilen bitler farklı bir ayar içeriyorsa, ayara uygun olarak saatlemeye dikkat etmeniz gerekecektir. Bu durumda MCU'ya bir kuvars rezonatör veya harici bir saat üreteci bağlamak gerekli olabilir. Ancak bu yazıda bunun nasıl yapıldığını ele almayacağız. Bu makalede yer alan programlama için bir MK bağlama örnekleri en basit durum için tasarlanmıştır.

Pirinç. 1. Programlama modunda SPI aracılığıyla veri alışverişi

Şimdi ATmega128A MK'nin belgelerinden alınan Şekil 1'e dönelim. Bir baytın MK'ye iletilmesi ve aynı anda MK'den bir bayt alınması sürecini gösterir. Gördüğümüz gibi, bu işlemlerin her ikisi de, SPI programlama modunda böyle bir rolün atandığı mikro devrenin pinlerinden biri olan SCK girişinde programcıdan mikro denetleyiciye sağlanan aynı saat darbelerini kullanır. İki sinyal hattı daha, saat döngüsü başına bir bit veri alımı ve iletimi sağlar. MOSI girişi aracılığıyla veriler mikro denetleyiciye girer ve okunan veriler MISO çıkışından alınır. SCK'den MISO ve MOSI'ye çizilen iki noktalı çizgiye dikkat edin. Mikrodenetleyicinin MOSI girişinde ayarlanan veri bitini hangi anda "yuttuğunu" ve hangi anda kendi veri bitini MISO çıkışına ayarladığını gösterirler. Her şey oldukça basit. Ancak MK'yi programlama moduna girmek için hala bir RESET sinyaline ihtiyacımız var. Ayrıca ortak GND kablosunu ve VCC güç kaynağını da unutmayalım. Toplamda, donanım yazılımını SPI aracılığıyla flaşlamak için mikrodenetleyiciye yalnızca 6 kablonun bağlanması gerektiği ortaya çıktı. Aşağıda bunu daha detaylı analiz edeceğiz ancak şimdilik SPI üzerinden programlama modunda MK ile veri alışverişinin 4 baytlık paketler halinde yapıldığını ekleyeceğiz. Her paketin ilk baytı temel olarak tamamen talimat kodlamaya ayrılmıştır. İkinci bayt, birinciye bağlı olarak, komut kodunun devamı veya adresin bir parçası olabilir veya isteğe bağlı bir değere sahip olabilir. Üçüncü bayt esas olarak adresleri iletmek için kullanılır, ancak birçok talimatta isteğe bağlı bir değere sahip olabilir. Dördüncü bayt genellikle veri iletir veya isteğe bağlı bir değere sahiptir. Dördüncü baytın iletilmesiyle eş zamanlı olarak bazı komutlar mikrodenetleyiciden gelen verileri alır. Her komutun ayrıntıları, "SPI Seri Programlama Komut Seti" adı verilen tabloda kontrolör belgelerinde bulunabilir. Şimdilik, yalnızca denetleyiciyle olan tüm alışverişin, her birinde bir bayttan fazla yararlı bilginin iletilmediği 32 bitlik paketlerden oluşan bir diziden oluşturulduğunu not ediyoruz. Bu çok optimal değil, ancak genel olarak iyi çalışıyor.

3. Programlama için MK'yi bağlama

SPI arayüzünü düzenlemek ve MISO çıkışından verileri okumak için mikrodenetleyici girişlerine gerekli tüm sinyallerin sağlandığından emin olmak için bir programcı oluşturmaya gerek yoktur. Bu, en yaygın USB-RS232TTL dönüştürücü kullanılarak kolayca yapılabilir.

İnternette sıklıkla bu tür dönüştürücülerin kalitesiz olduğu ve onlarla ciddi bir şey yapılamayacağı bilgisini bulabilirsiniz. Ancak çoğu dönüştürücü modeliyle ilgili olarak bu görüş yanlıştır. Evet, standart bir COM bağlantı noktasına (örneğin, yalnızca TXD ve RXD) kıyasla mevcut tüm giriş ve çıkışlara sahip olmayan, aynı zamanda ayrılmaz bir tasarıma sahip olan (mikro devre plastikle doldurulmuştur) satışta dönüştürücüler vardır. pinlerine ulaşmak imkansızdır). Ancak bunlar satın almaya değmez. Bazı durumlarda eksik port giriş ve çıkışlarını kabloları doğrudan çipe lehimleyerek elde edebilirsiniz. Böyle bir "geliştirilmiş" dönüştürücünün bir örneği Şekil 2'de gösterilmektedir (yonga PL-2303 - pinlerinin amacı hakkında daha fazla ayrıntı "" makalesinde yer almaktadır). Bu en ucuz modellerden biridir ancak ev yapımı tasarımlarda kullanıldığında kendine has avantajları vardır. COM bağlantı noktası gibi ucunda standart dokuz pimli konektör bulunan tam özellikli adaptör kabloları da yaygındır. Normal bir COM bağlantı noktasından yalnızca TTL düzeyleri ve eski sürümlerle uyumsuzluk açısından farklılık gösterirler. yazılım ve bazı eski ekipmanlar. Ayrıca CH34x çipindeki kabloların, PL-2303 üzerindeki dönüştürücülere kıyasla çeşitli ekstrem testlerde çok daha güvenilir ve kararlı olduğunu gösterdiği de belirtilebilir. Ancak normal kullanımda fark hissedilmiyor.

USB-RS232TTL dönüştürücü seçerken, sürücüsünün kullandığınız işletim sisteminin sürümüyle uyumluluğuna da dikkat etmelisiniz.

Dört örneğini kullanarak bir mikrodenetleyiciyi ve bir USB-RS232TTL dönüştürücüyü bağlama prensibine daha yakından bakalım farklı modeller MK: ATtiny13, ATtiny44, ATmega8 ve ATmega128. Şekil 3 böyle bir bağlantının genel şemasını göstermektedir. RS232 sinyallerinin (RTS, TXD, DTR ve CTS) uygunsuz şekilde kullanıldığını bilmek sizi şaşırtabilir. Ancak endişelenmeyin: Perpetuum M programı doğrudan onlarla çalışabilir - çıkış değerlerini ayarlayabilir ve giriş durumlarını okuyabilir. Her durumda, CH34x ve PL-2303 yongalarında yaygın olarak kullanılan USB-RS232TTL dönüştürücüler bu yeteneği sağlar; bu doğrulanmıştır. Bağlantı noktasına erişmek için standart Windows işlevleri kullanıldığından, diğer popüler dönüştürücülerde de herhangi bir sorun olmamalıdır.

Genel şemada gösterilen dirençler prensip olarak kurulamaz, ancak yine de onları kurmak daha iyidir. Amaçları nedir? Dönüştürücünün TTL giriş ve çıkışlarını ve mikro denetleyicinin beş voltluk güç kaynağını kullanarak, mantıksal seviyeleri koordine etme ihtiyacından kurtuluyoruz - her şey zaten oldukça doğru. Bu, bağlantıların doğrudan olabileceği anlamına gelir. Ancak deneyler sırasında Her şey olabilir. Mesela kötü niyetlilik kanununa göre bir tornavida tam da düşmeyeceği bir yere düşebilir ve hiçbir durumda kısa devre yapılmaması gereken bir şeye kısa devre yaptırabilir. Elbette her şey olabilir. bir "tornavida" olduğu ortaya çıkar. Bu durumda dirençler bazen sonuçları azaltır. Amaçlarından biri olası bir çıkış çatışmasını ortadan kaldırmaktır. Gerçek şu ki, programlama tamamlandıktan sonra mikro denetleyici normal çalışma moduna geçer ve belki de MK'de az önce kaydedilen programa göre, dönüştürücünün çıkışına (RTS, TXD veya DTR) bağlı olan pini de bir çıkış haline gelir. Bu durumda, doğrudan bağlı iki çıkışın "kavga etmesi" çok kötü olacaktır. - farklı mantıksal düzeyler ayarlamayı deneyin. Böyle bir “mücadelede” birileri “kaybedebilir” ama biz bunu istemiyoruz.

Üç direncin değerleri 4,3 KOhm seviyesinde seçilmiştir. Bu, dönüştürücü çıkışı ile mikro denetleyici girişi arasındaki bağlantılar için geçerlidir. Dirençlerin doğruluğu önemli değil: dirençlerini 1 KOhm'a düşürebilir veya 10 KOhm'a yükseltebilirsiniz (ancak ikinci durumda, MK yolunda uzun kablolar kullanıldığında parazit riski artar). Dönüştürücü girişi (CTS) ile mikrodenetleyici çıkışı (MISO) arasındaki bağlantıya gelince, burada 100 Ohm'luk bir direnç kullanılıyor. Bu, kullanılan dönüştürücünün girişinin özellikleriyle açıklanmaktadır. Testler sırasında, girişleri görünüşte nispeten düşük bir dirençle (birkaç yüz Ohm civarında) pozitif güç kaynağına bağlanan PL-2303 mikro devresinde bir dönüştürücü kullanıldı. "Çekmeyi kırmak" için bu kadar küçük dirençli bir direnç takmam gerekiyordu. Ancak kesinlikle yüklemenize gerek yok. Dönüştürücüde bu her zaman giriştir. Bir çıkış yolu olamaz, yani olayların gelişiminde herhangi bir çıkış çatışması olmayacak.

Çipin, analogdan dijitale dönüştürücüye güç sağlamak için ayrı bir AVCC pini varsa (örneğin, ATmega8 veya ATmega128), ortak VCC güç pinine bağlanması gerekir. Bazı IC'lerde birden fazla VCC güç pini veya birden fazla GND bulunur. Örneğin ATmega128'de 3 GND pini ve 2 VCC pini vardır. Kalıcı bir tasarımda aynı isimdeki pinleri birbirine bağlamak daha iyidir. Bizim durumumuzda programlama sırasında birer VCC ve GND pini kullanabilirsiniz.

Ve işte ATtiny13 bağlantısının neye benzediği. Şekil SPI aracılığıyla programlama sırasında kullanılan pin atamalarını göstermektedir. Fotoğrafın yanında geçici bir bağlantının gerçekte nasıl göründüğü görülüyor.


Bazıları bunun ciddi olmadığını söyleyebilir - kablolardaki bağlantılar. Ama sen ve ben mantıklı insanlarız. Amacımız mikrodenetleyiciyi programlamak, üzerinde minimum zaman ve diğer kaynakları harcamak ve birinin önünde gösteriş yapmamaktır. Kalite zarar görmez. Bu durumda "kablolar üzerinde" yöntemi oldukça etkili ve haklıdır. Kontrolörün donanım yazılımının güncellenmesi tek seferlik bir prosedürdür, bu nedenle onu yapay elmaslarla kaplamanın bir anlamı yoktur. Gelecekte denetleyiciyi devreden çıkarmadan (bitmiş üründe) ürün yazılımını değiştirmek amaçlanıyorsa, bu, cihazın imalatı sırasında kurulum sırasında dikkate alınır. Genellikle bu amaç için bir konektör (RESET, SCK, MOSI, MISO, GND) takılır ve MK, karta kurulumdan sonra bile yanıp sönebilir. Ancak bunlar yaratıcı zevklerdir. En basit durumu düşünüyoruz.

Şimdi ATtiny44 MK'ye geçelim. Burada her şey hemen hemen aynı. Çizime ve fotoğrafa dayanarak, yeni başlayan biri bile bağlantıyı anlamakta zorluk çekmeyecektir. ATtiny44 gibi, ATtiny24 ve ATtiny84 mikrokontrolörlerini de bağlayabilirsiniz; bu üçünün pin atamaları aynıdır.


Bir denetleyiciyi programlamak için geçici olarak bağlamanın başka bir örneği ATmega8'dir. Burada daha fazla pin var, ancak prensip aynı - birkaç kablo ve şimdi kontrolör bilgileri içine "doldurmaya" hazır. Fotoğrafta pin 13'ten gelen ekstra siyah kablo programlamada yer almıyor. MK programlama modundan çıktıktan sonra ses sinyalini kaldırmak için tasarlanmıştır. Bunun nedeni, "Perpetuum M" komut dosyasında hata ayıklama sırasında programın MK'ye indirilmiş olmasıdır. Müzik kutusu.


Çoğunlukla farklı muhafazalarda bir kontrolör bulunur. Bu durumda her durum için pinlerin atanması farklı şekilde dağıtılır. Kontrol cihazınızın muhafazası şekilde gösterilene benzemiyorsa, MK geliştiricisinin web sitesinden indirebileceğiniz teknik belgelerdeki pinlerin amacını kontrol edin.

Resmi tamamlamak için, bir MK mikro devresini çok sayıda "bacak" ile bağlamaya bakalım. Fotoğraftaki pin 15'ten gelen ekstra siyah kablonun amacı ATmega8'dekiyle tamamen aynı.


Muhtemelen zaten her şeyin oldukça basit olduğuna ikna olmuşsunuzdur. Mikro devrelerin pimlerini (saat yönünün tersine bir daire içindeki işaretten) nasıl sayacağını bilen herkes bunu anlayacaktır. Ve doğruluğu unutma. Mikro devreler temiz insanları sever ve dikkatsiz muameleyi affetmez.

Yazılım kısmına geçmeden önce USB-RS232TTL dönüştürücü sürücüsünün doğru kurulduğundan emin olun (Windows Aygıt Yöneticisini kontrol edin). Dönüştürücüyü bağladığınızda görünen sanal COM bağlantı noktasının numarasını hatırlayın veya not edin. Bu sayının aşağıda okuyabileceğiniz betiğin metnine girilmesi gerekecektir.

4. Komut Dosyası - "Perpetuum M" programcısı

“Programcının” donanım kısmını çözdük. Bu zaten savaşın yarısı. Şimdi yazılım kısmıyla ilgilenmeye devam ediyor. Rolü, mikro denetleyiciyle etkileşim için gerekli tüm işlevleri uygulayan bir komut dosyasının kontrolü altında Perpetuum M programı tarafından gerçekleştirilecek.

Komut dosyasının bulunduğu arşiv, perpetuum.exe programının bulunduğu klasöre açılmalıdır. Bu durumda, perpetuum.exe dosyasını çalıştırdığınızda, ekranda yüklü komut dosyalarının listesini içeren bir menü görüntülenecektir; bunların arasında “AVR MK Programlayıcı” satırı bulunacaktır (tek olabilir). İhtiyacımız olan çizgi bu.

Komut dosyası, "MK Programmer AVR.pms" dosyasındaki PMS klasöründe bulunur. Bu dosya, gerekirse Windows Not Defteri gibi normal bir metin düzenleyicide görüntülenebilir, incelenebilir ve düzenlenebilir. Komut dosyasını kullanmadan önce büyük olasılıkla bağlantı noktası ayarlarıyla ilgili metinde değişiklik yapmanız gerekecektir. Bunu yapmak için, Windows Aygıt Yöneticisi'nde kullanılan bağlantı noktasının adını kontrol edin ve gerekirse "PortName = COM4";" satırında uygun değişikliği yapın. - 4 rakamı yerine başka bir rakam da olabilir. Ayrıca, farklı bir USB-RS232TTL dönüştürücü modeli kullanırken, sinyal çevirme ayarlarını (“Yüksek” kelimesiyle başlayan kod satırları) değiştirmeniz gerekebilir. Perpetuum M programının talimatlarında yer alan örneklerden birini (bağlantı noktasıyla çalışmaya yönelik işlevler bölümü) kullanarak sinyallerin ters çevrilmesini USB-RS232TTL dönüştürücüyle kontrol edebilirsiniz.

MK_AVR alt klasörü, desteklenen denetleyicilerin açıklamalarını içeren dosyaları içerir. İhtiyacınız olan kontrol cihazı bunlar arasında yoksa, ihtiyacınız olanı bir benzetme yaparak kendiniz ekleyebilirsiniz. Örnek olarak dosyalardan birini alın ve bir metin düzenleyici kullanarak, mikro denetleyicinizin belgelerinden alarak gerekli verileri girin. Önemli olan dikkatli olmak, verileri hatasız girmek, aksi takdirde MK programlanmayacak veya yanlış programlanacaktır. Orijinal sürüm 6 mikrodenetleyiciyi destekler: ATtiny13, ATtiny24, ATtiny44, ATtiny84, ATmega8 ve ATmega128. Komut dosyası, bağlı denetleyicinin otomatik olarak tanınmasını uygular; bunu manuel olarak belirtmenize gerek yoktur. MK'den okunan tanımlayıcı mevcut açıklamalar arasında değilse kontrolörün tanınamadığına dair bir mesaj görüntülenir.

Komut dosyasının bulunduğu arşiv ayrıca şunları içerir: Ek Bilgiler. AVR denetleyici inc dosyaları klasörü, denetleyici tanım dosyalarının çok kullanışlı ve kapsamlı bir koleksiyonunu içerir. Bu dosyalar MK için kendi programlarınızı yazarken kullanılır. Dört klasör daha "MusicBox_...", ATtiny13, ATtiny44, ATmega8 ve ATmega128 için ayrı ayrı MK'ye indirilmeye hazır, Assembly dilinde bir program ve bellenim içeren dosyalar içerir. Bu makalede önerildiği gibi programlama için bu MK'lerden birini zaten bağladıysanız, hemen şimdi flaş edebilirsiniz - bir müzik kutusu alacaksınız. Aşağıda bu konuda daha fazla bilgi bulabilirsiniz.

Script menüsünden “MK AVR Programmer” satırını seçtiğinizde script çalıştırılmaya başlayacaktır. Aynı zamanda portu açar, MK'ye programlama moduna geçmesi için bir komut gönderir, MK'den başarılı geçiş hakkında onay alır, MK tanımlayıcısını talep eder ve mevcutlar arasında tanımlayıcısıyla bu MK'nin bir tanımını arar. Açıklamaları olan dosyalar. Gerekli açıklamayı bulamazsa ilgili bir mesaj görüntüler. Bir açıklama bulunursa programcının ana menüsü açılır. Ekran görüntüsünü Şekil 8'de görebilirsiniz. Daha fazlasını anlamak zor değil - menü çok basit.

Komut dosyasının ilk sürümünde tam teşekküllü bir programcının bazı işlevleri uygulanmamıştır. Örneğin EEPROM'a okuma ve yazmanın bir yolu yoktur. Ancak betiği bir metin düzenleyicide açarsanız, asıl şeyin zaten içinde uygulanmış olmasına rağmen boyutunun çok küçük olduğunu göreceksiniz. Bu, eksik işlevleri eklemenin o kadar da zor olmadığını gösteriyor - dil çok esnektir, küçük bir programda zengin işlevsellik uygulamanıza olanak tanır. Ancak çoğu durumda mevcut işlevler bile yeterlidir.

Bazı işlevsellik sınırlamaları doğrudan komut dosyası metninde açıklanmaktadır:
//yalnızca sıfır adresinden kayıt uygulandı (Genişletilmiş Segment Adresi Kaydı göz ardı edilir, YÜK OFSETİ - de)
//HEX dosyasındaki kayıtların sırası ve devamlılığı kontrol edilmez
//sağlama toplamı kontrol edilmiyor
Bu, MK'nin ürün yazılımı kodunun alındığı bir HEX dosyasıyla çalışmak için geçerlidir. Bu dosya bozuk değilse sağlama toplamının kontrol edilmesinin hiçbir etkisi olmayacaktır. Eğer bozuksa script kullanılarak tespit edilmesi mümkün olmayacaktır. Çoğu durumda, kalan kısıtlamaların zararı olmaz ancak yine de bunları aklınızda tutmanız gerekir.

5. Müzik kutusu – yeni başlayanlar için basit bir zanaat

Eğer elinizde şu mikrodenetleyicilerden biri varsa: ATtiny13, ATtiny44, ATmega8 veya ATmega128'i kolaylıkla bir müzik kutusuna veya müzik kartına dönüştürebilirsiniz. Bunu yapmak için, ilgili ürün yazılımını, komut dosyasıyla aynı arşivdeki "MusicBox_..." klasörlerinde bulunan dört kişiden biri olan MK'ye yazmak yeterlidir. Firmware kodları ".hex" uzantılı dosyalarda saklanır. ATmega128'i böyle bir zanaat için kullanmak elbette tıpkı ATmega8 gibi "şişmandır". Ancak bu, test etme veya deney yapma, diğer bir deyişle eğitim amaçlı olarak yararlı olabilir. Assembler'daki programların metinleri de ektedir. Programlar sıfırdan oluşturulmadı - A.V. Belov'un kitabındaki müzik kutusu programı esas alındı. AVR mikrodenetleyicileri amatör radyo uygulamalarında." Orijinal program bir dizi önemli değişikliğe uğradı:
1. dört MK'nin her biri için uyarlanmıştır: ATtiny13, ATtiny44, ATmega8 ve ATmega128
2. düğmeler kaldırıldı - güç ve ses yayıcı dışında denetleyiciye hiçbir şeyin bağlanmasına gerek yok (melodiler sonsuz bir döngüde birbiri ardına çalınır)
3. Müzik ritmindeki bozuklukları ortadan kaldırmak için her notanın süresi, notalar arasındaki duraklamanın süresi kadar kısaltılır.
4. sekizinci melodi bağlantılıdır, kitap versiyonunda kullanılmamıştır
5. öznel açıdan: algoritmayı optimize etmek ve anlaşılmasını kolaylaştırmak için bazı "iyileştirmeler"

Bazı melodilerde, özellikle ortada "Gülümseme" de yalan ve hatta büyük hatalar duyulabilir. Zil sesi kodları kitaptan alınmıştır (veya daha doğrusu kitabın yazarının web sitesinden orijinal asm dosyasıyla birlikte indirilmiştir) ve değiştirilmemiştir. Görünüşe göre melodilerin kodlanmasında hatalar var. Ancak bu bir sorun değil - müzikle "dost" olan herkes bunu kolayca anlayabilir ve her şeyi düzeltebilir.

ATtiny13'te 16 bitlik bir sayacın bulunmaması nedeniyle notaları yeniden üretmek için 8 bitlik bir sayacın kullanılması gerekti ve bu da notaların doğruluğunda hafif bir düşüşe yol açtı. Ancak bu kulak tarafından pek fark edilmez.

Yapılandırma bitleri hakkında. Ayarları yeni mikro denetleyicinin durumuna uygun olmalıdır. MK'niz daha önce bir yerde kullanılmışsa, konfigürasyon bitlerinin durumunu kontrol etmeniz ve gerekirse bunları yeni mikro denetleyicinin ayarlarına uygun hale getirmeniz gerekir. Yeni mikro denetleyicinin konfigürasyon bitlerinin durumunu bu MK'nin belgelerinden ("Sigorta Bitleri" bölümü) öğrenebilirsiniz. Bunun istisnası ATmega128'dir. Bu MCU, eski ATmega103 ile uyumluluk modunu etkinleştiren M103C bitine sahiptir. M103C bitinin etkinleştirilmesi ATmega128'in yeteneklerini büyük ölçüde azaltır ve bu bit yeni MK'de etkindir. M103C'yi etkin olmayan duruma sıfırlamanız gerekir. Yapılandırma bitlerini değiştirmek için programlayıcı komut dosyası menüsünün ilgili bölümünü kullanın.

Müzik kutusunun şemasını vermenin bir anlamı yok: İçinde yalnızca bir mikro denetleyici, güç kaynağı ve bir piezo ses yayıcı bulunur. Güç, MK'yi programlarken yaptığımızla tamamen aynı şekilde sağlanır. Ses yayıcı, ortak kablo (kontrolörün GND pini) ile numarası program montaj kodu (*.asm) içeren dosyada bulunabilen MK pinlerinden biri arasına bağlanır. Yorumlarda her MK için program metninin başında bir satır vardır: " ses sinyali XX pininde oluşturulur." Programcı betiği işini tamamladığında mikrodenetleyici programlama modundan çıkar ve normal çalışma moduna geçer. Melodilerin çalınması hemen başlar. Ses yayıcıyı bağlayarak bunu kontrol edebilirsiniz. Ses yayıcıdan çıkabilirsiniz. kristal programlanırken yalnızca ses SPI tarafından kullanılmayan bir pinden geliyorsa bağlanır, aksi takdirde pin üzerindeki ekstra kapasitans programlamayı etkileyebilir.

Görev: Bir LED'i kontrol etmek için bir program geliştirelim. Butona basıldığında LED yanar, bırakıldığında ise söner.

İlk önce cihazın şematik bir diyagramını geliştirelim. I/O portları herhangi bir harici cihazı mikrodenetleyiciye bağlamak için kullanılır. Bağlantı noktalarının her biri hem giriş hem de çıkış olarak çalışabilme özelliğine sahiptir. Portlardan birine LED'i, diğerine butonu bağlayalım. Bu deney için bir kontrolör kullanacağız Atmega8. Bu çip 3 I/O portu içerir, 2 adet sekiz bitlik ve 1 adet on altı bitlik zamanlayıcı/sayıcıya sahiptir. Ayrıca gemide 3 kanallı bir PWM, 6 kanallı 10 bit analogdan dijitale dönüştürücü ve çok daha fazlası bulunmaktadır. Bana göre bir mikrodenetleyici programlamanın temellerini öğrenmek için harikadır.

LED'i bağlamak için PB0 hattını kullanacağız ve düğmeden bilgi okumak için PD0 hattını kullanacağız. Diyagram Şekil 1'de gösterilmektedir.

Pirinç. 1

Direnç R2 aracılığıyla, mantıksal bir sinyale karşılık gelen PD0 girişine artı besleme voltajı verilir. Düğme kapatıldığında voltaj sıfıra düşer, bu da mantıksal sıfıra karşılık gelir. Gelecekte R2, programa gerekli ayarları girerek dahili bir yük direnciyle değiştirilerek devreden çıkarılabilir. LED, akım sınırlama direnci R3 aracılığıyla PB0 portunun çıkışına bağlanır. LED'i yakmak için PB0 hattına mantıksal bir sinyal uygulamanız gerekir. Cihazın frekans kararlılığı konusunda yüksek gereksinimleri olmadığından 4 MHz'de dahili bir ana saat üreteci kullanacağız.

Şimdi programı yazıyoruz. Program yazmak için programlama ortamını kullanıyorum AVR Stüdyosu Ve WinAvr. AVR Studio'yu açın, bir hoş geldiniz penceresi açılır, "Yeni proje oluştur" düğmesine tıklayın, ardından proje türünü seçin - AVR GCC, proje adını yazın, örneğin "cod1", hem "Proje klasörü oluştur" hem de "Oluştur" seçeneğini işaretleyin Başlatma dosyası" onay kutularını işaretleyin, "İleri" düğmesine tıklayın, sol pencerede "AVR Simülatörü" seçeneğini seçin ve sağ pencerede "Atmega8" mikrodenetleyici tipini seçin, "Bitir" düğmesine tıklayın, editör ve proje kategori ağacı açılır - Başlangıç ​​ayarları tamamlanmıştır.

Öncelikle harici dosyaları eklemek için operatörü kullanarak Atmega8 için standart açıklama metnini ekleyelim: #katmak

yönerge sözdizimi #katmak

#katmak<имя_файла.h>
#include “dosyaadı.h”

Açılı ayraçlar< и >derleyiciye, içerilen dosyaların öncelikle include adlı standart WinAvr klasöründe aranması gerektiğini belirtin. Çift tırnak “ ve “ derleyiciye projenin saklandığı dizinde aramaya başlamasını söyler.

Her mikrodenetleyici tipinin kendi başlık dosyası vardır. ATMega8 için bu dosyaya iom8.h, ATtiny2313 - iotn2313.h için denir. Her programın başında kullandığımız mikrodenetleyicinin başlık dosyasını eklemeliyiz. Ancak aynı zamanda ortak bir başlık dosyası io.h vardır. Önişlemci bu dosyayı işler ve proje ayarlarına bağlı olarak gerekli başlık dosyasını programımıza dahil eder.

Bizim için programın ilk satırı şöyle görünecek:

#katmak

Herhangi bir C programının bir ana fonksiyon içermesi gerekir. Ana adı verilir. Programın yürütülmesi her zaman ana fonksiyonun yürütülmesiyle başlar. Bir işlevin bir başlığı vardır - int main(void) ve bir gövdesi vardır - sınırlıdır kıvırcık parantez {}.

int ana(geçersiz)
{
fonksiyon gövdesi
}

Kodumuzu fonksiyonun gövdesine ekleyeceğiz. Dönüş türü, işlev adından önce belirtilir. Fonksiyon bir değer döndürmezse anahtar kullanılır geçersiz.

int- bu 2 baytlık bir tam sayıdır, değer aralığı - 32768 ila 32767 arasındadır

İşlev adından sonra, işlev çağrıldığında işleve iletilen parametreler parantez () içinde gösterilir. Fonksiyonun parametresi yoksa anahtar kelime kullanılır geçersiz. İşlev ana bir dizi komut, sistem ayarları ve ana program döngüsünü içerir.

Daha sonra bağlantı noktasını yapılandırıyoruz D girişte. Bağlantı noktası çalışma modu, kaydın içeriğine göre belirlenir DDRD(bilgi aktarım yönü kaydı). Bu kayıt defterine “0x00” (0b0000000 - ikili biçimde) sayısını yazıyoruz, bu porta buton dışında hiçbir şey bağlı değil, bu nedenle D portunun tamamını giriş olarak yapılandırıyoruz. Kayıt defterinin her bir bitine (0 giriş, 1 çıkış) 0 veya 1 rakamlarını yazarak bağlantı noktasını bit parça yapılandırabilirsiniz; örneğin DDRD = 0x81 (0b10000001) - D bağlantı noktasının ilk ve son satırları şu şekilde çalışır: çıktı, geri kalanı girdi olarak. Dahili yük direnci de bağlanmalıdır. PORTx kaydı, port giriş modundayken dahili dirençlerin açılıp açılmayacağını kontrol eder. Birimleri oraya yazalım.

Bağlantı noktasını ayarlama Bçıkışa. Bağlantı noktası çalışma modu, kaydın içeriğine göre belirlenir DDRB. Bağlantı noktasına bir LED'den başka bir şey yok B bağlı olmadığından bağlantı noktasının tamamı çıkış olarak yapılandırılabilir. Bu, kayıt defterine yazılarak yapılır. DDRB sayılar "0xFF". LED'i ilk açtığınızda yanmasını önlemek için porta yazın. B mantıksal sıfırlar. Bu kayıt yapılarak yapılır PORTB= 0x00;

Değer atamak için "=" sembolü kullanılır ve "eşittir" işaretiyle karıştırılmaması için atama operatörü olarak adlandırılır.

Bağlantı noktası yapılandırması şöyle görünecektir:

DDRD = 0x00;
PORTD = 0xFF;
DDRB = 0xFF;
PORTB = 0x00;

Programın ana döngüsünü yazıyoruz. sırasında(“while” İngilizce'den) - bu komut, koşul karşılanana kadar, yani parantez içindeki ifade doğru olana kadar döngünün gövdesini birçok kez tekrarlayan bir döngü düzenler. C'de bir ifade sıfıra eşit değilse doğru, eşitse yanlış kabul edilir.

Komut şuna benzer:

süre (koşul)
{
döngü gövdesi
}

Bizim durumumuzda ana döngü yalnızca bir komuttan oluşacaktır. Bu komut kayıt atar PORTB ters çevrilecek kayıt değeri LİMAN.

PORTB = ~PIND; //D değerinden değeri alın, ters çevirin ve PORTB'ye atayın (PORTB'ye yazın)

// C ifadeleri sağdan sola doğru okunur

PIN kodu bilgi giriş kaydı. Denetleyicinin harici çıkışından bilgi okumak için öncelikle portun istenen bitini giriş moduna geçirmeniz gerekir. Yani, yazmacın karşılık gelen bitine yazın DDRx sıfır. Ancak bundan sonra harici bir cihazdan bu pime dijital bir sinyal sağlanabilir. Daha sonra mikrodenetleyici baytı kayıt defterinden okuyacaktır. PINx. Karşılık gelen bitin içeriği, portun harici pinindeki sinyale karşılık gelir. Programımız hazır ve şöyle görünüyor:

#katmak int main (void) ( DDRD = 0x00; //port D - giriş PORTD = 0xFF; //yük direncini bağlayın DDRB = 0xFF; //port B - çıkış PORTB = 0x00; //çıkış 0'a ayarlanır while(1 ) ( PORTB = ~PIND; //~ bitsel ters çevirme işareti ))

Yorumlar C dilinde yaygın olarak kullanılmaktadır. Yazmanın iki yolu vardır.

/*Bir yorum*/
//Bir yorum

Bu durumda derleyici yorumda yazılanlara dikkat etmeyecektir.

Aynı programı kullanırsanız ve Şekil 2'de gösterildiği gibi mikrodenetleyiciye 8 düğme ve 8 LED bağlarsanız, portun her bir bitinin D bağlantı noktası bitiyle eşleşiyor B. SB1 düğmesine basıldığında HL1 yanar, SB2 düğmesine basıldığında HL2 yanar vb.

şekil 2

Makalede A.V. Belov'un kitabından materyaller kullanıldı. "AVR cihazı geliştiricileri için eğitim"

MK'yi incelemenin montajcıyla başlaması gerektiğini bir veya iki kez söyledim. Web sitesindeki bir kursun tamamı buna ayrılmıştı (her ne kadar çok tutarlı olmasa da, yavaş yavaş onu yeterli bir görünüme kavuşturuyorum). Evet zor, sonuç ilk gün olmayacak ama kumandanızda neler olduğunu anlamayı öğreneceksiniz. Nasıl çalıştığını bilecek ve maymun gibi başkalarının kaynaklarını kopyalamayacak ve neden aniden çalışmayı bıraktığını anlamaya çalışacaksınız. Ayrıca C'nin en uygunsuz anda dirgenle ortaya çıkacak cahil kodu oluşturması çok daha kolaydır.

Ne yazık ki herkes hemen sonuç almak istiyor. Ben de diğer tarafa gitmeye karar verdim; C hakkında bir eğitim hazırladım ama iç çamaşırını gösterdim. İyi bir yerleştirme programcısı, donanım parçasını her zaman cıvatasından sıkıca tutar ve izinsiz tek bir adım atmasına izin vermez. Önce C kodu olacak, sonra derleyicinin ne ürettiği ve gerçekte nasıl çalıştığı :)

Öte yandan C'nin güçlü noktası kod taşınabilirliğidir. Tabii ki her şeyi doğru yazarsanız. İş algoritmalarını ve bunların donanım uygulamalarını projenin farklı bölümlerine ayırmak. Daha sonra algoritmayı başka bir mikrodenetleyiciye aktarmak için yalnızca donanıma yapılan tüm çağrıların yazıldığı arayüz katmanını yeniden yazmak ve tüm çalışma kodunu olduğu gibi bırakmak yeterli olacaktır. Ve elbette okunabilirlik. C kaynak kodunu ilk bakışta anlamak daha kolaydır (gerçi... örneğin, neyi işaret edeceğim umurumda değil - ister C ister ASM :)), ama yine de her şey doğru yazılmışsa. Bu noktalara da dikkat edeceğim.

Hata ayıklama panom, tüm örneklerin aslan payının kurulacağı deneysel donanım olarak görev yapacak.

AVR için ilk C programı

Derleyici seçme ve ortamı ayarlama
AVR için birçok farklı C derleyicisi vardır:
Her şeyden önce bu IAR AVR-C- neredeyse kesinlikle AVR için en iyi derleyici olarak tanınmaktadır, çünkü kontrolörün kendisi Atmel ve IAR uzmanları arasındaki yakın işbirliğiyle oluşturuldu. Ama her şeyin bedelini ödemek zorundasın. Ve bu derleyici sadece pahalı bir ticari yazılım değil, aynı zamanda o kadar çok ayara sahip ki, onu basitçe derlemek çok fazla çaba gerektiriyor. Onunla gerçekten bir dostluk kuramadım; proje, bağlantı aşamasındaki garip hatalar nedeniyle çürüyordu (daha sonra bunun çarpık bir çatlak olduğunu öğrendim).

İkinci gelir WinAVR GCC- güçlü bir optimizasyon derleyicisi. Tamamen açık kaynak, çapraz platform, genel olarak hayatın tüm zevkleri. Aynı zamanda AVR Studio'ya mükemmel bir şekilde entegre olur ve orada hata ayıklamanıza olanak tanır, bu da son derece kullanışlıdır. Genel olarak onu seçtim.

Ayrıca birde şu var CodeVision AVR Cçok popüler bir derleyicidir. Sadeliği nedeniyle popüler oldu. Sadece birkaç dakika içinde çalışan bir programa sahip olabilirsiniz - başlangıç ​​​​kodu sihirbazı, her türlü şeyin başlatılmasına yönelik standartları ortadan kaldırarak bunu büyük ölçüde kolaylaştırır. Dürüst olmak gerekirse, bundan biraz şüpheliyim; bu derleyici tarafından yazılan bir programı kaldırmak zorunda kaldığımda, bunun kod değil de bir tür karışıklık olduğu ortaya çıktı. Korkunç miktarda gereksiz hareket ve işlem, önemli miktarda kod ve yavaş performansla sonuçlandı. Ancak belki de orijinal yazılımı yazan kişinin DNA'sında bir hata vardı. Üstelik para istiyor. IAR kadar olmasa da dikkat çekici. Demo modunda ise 2kb'den fazla kod yazmanıza izin vermez.
Elbette çatlak var ama çalacaksanız IAR anlamında bir milyon :)

Ayrıca birde şu var Image Craft AVR C Ve MikroC mikroelektronikten. İkisini de kullanmak zorunda değildim ama S.W.G.çok övgü MikroPascal son derece kullanışlı bir programlama ortamı ve kütüphaneler olduğunu söylüyorlar. Bence MicroC daha da kötü olmayacak, ama aynı zamanda ücretli.

Dediğim gibi seçtim WinAVRüç nedenden dolayı: ücretsizdir, AVR Studio'ya entegre olur ve her durum için yazılmış bir ton hazır kod vardır.

Yani AVR Studio ile WinAVR kurulumunu indirin. Daha sonra önce stüdyo kurulur, ardından WinAVR en üste yuvarlanır ve stüdyoya eklenti şeklinde eklenir. WinAVR'yi C:\WinAVR gibi kısa bir yola kurmanızı şiddetle tavsiye ederim, bu şekilde yollarla ilgili birçok sorundan kaçınırsınız.

Proje oluşturma
Yani stüdyo kuruldu, C vidalandı, bir şeyler programlamanın zamanı geldi. En basitinden, en basitinden başlayalım. Stüdyoyu başlatın, AVR GCC derleyicisi olarak orada yeni bir proje seçin ve projenin adını girin.

Boş bir *.c dosyası içeren bir çalışma alanı açılır.

Artık stüdyo yer imlerindeki yolların görünümünü yapılandırmanın zararı olmayacak. Bunu yapmak için şu adrese gidin:
Menü Araçları - Seçenekler - Genel - Dosya Sekmeleri ve açılır listeden "Yalnızca Dosya Adı" seçeneğini seçin. Aksi takdirde çalışmak imkansız olacaktır - sekme dosyanın tam yolunu içerecek ve ekranda iki veya üçten fazla sekme olmayacaktır.

Proje kurulumu
Genel olarak, tüm bağımlılıkların tanımlandığı bir make dosyası oluşturmak klasik kabul edilir. Ve bu muhtemelen doğru. Ama benim gibi tamamen entegre IDE'lerle büyüyen benim için uVision veya AVR Stüdyosu bu yaklaşım son derece yabancıdır. Bu nedenle bunu kendi yöntemimle yapacağım, her şeyi stüdyo araçlarını kullanarak yapacağım.

Düğmeye dişliyle basın.


Bunlar proje ayarlarınızdır ve daha hassas ayarlar makefile'ın otomatik oluşturulması. İlk sayfada MK'nizin çalışacağı frekansı girmeniz yeterlidir. Bu sigorta bitlerine bağlıdır, dolayısıyla frekansımızın 8000000Hz olduğunu varsayıyoruz.
Ayrıca optimizasyon çizgisine de dikkat edin. Şimdi -Os var - bu boyut optimizasyonudur. Şimdilik bu şekilde bırakın, daha sonra bu parametreyle oynamayı deneyebilirsiniz. -O0 hiçbir şekilde optimizasyon değildir.

Bir sonraki adım yolları yapılandırmaktır. Öncelikle proje dizininizi buraya ekleyin; oraya üçüncü taraf kütüphaneleri ekleyeceksiniz. Listede “.\” yolu görünecektir.

Make dosyası oluşturuldu, ona projenizdeki varsayılan klasörde bakabilirsiniz, sadece bir göz atın ve orada ne olduğunu görün.


Şimdilik bu kadar. Her yerde Tamam'a tıklayın ve kaynağa gidin.

Sorunun formülasyonu
Bir diyotun banal yanıp sönmesi artık işe yaramadığı için boş bir kağıt sayfası kurnazca bir fikri hayata geçirmek için cazip geliyor. Hemen boğayı boynuzlarından tutalım ve bilgisayarla bağlantıyı kuralım - yaptığım ilk şey bu.

Bu şekilde çalışacak:
COM portuna bir (kod 0x31) geldiğinde diyotu açacağız ve sıfır geldiğinde (kod 0x30) sönüyor. Üstelik her şey kesintilerle yapılacak ve arka plan görevi başka bir diyotun yanıp sönmesi olacak. Basit ve anlamlı.

Devrenin montajı
USB-USART dönüştürücü modülünü mikrodenetleyicinin USART pinlerine bağlamamız gerekiyor. Bunu yapmak için iki kablodan bir jumper alın ve çapraz olarak pimlerin üzerine yerleştirin. Yani kontrolörün Rx'ini dönüştürücünün Tx'ine ve dönüştürücünün Tx'ini kontrolörün Rx'ine bağlarız.

Sonuçta şema şu:


Kalan pinleri bağlamayı, açmayı veya sıfırlamayı düşünmüyorum, standart.

Kod yazma

Hemen bir rezervasyon yapayım ki, özellikle C dilinin tanımına girmeyeceğim. Bunun için klasik "C Programlama Dili"nden K&R'a ve çeşitli kılavuzlara kadar muazzam miktarda malzeme var.

Zulumda böyle bir yöntem buldum; bir keresinde bu dili çalışmak için kullanmıştım. Orada her şey kısa, net ve anlamlı. Yavaş yavaş bunları bir araya getiriyorum ve web siteme sürüklüyorum.

Henüz tüm bölümlerin aktarılmadığı doğru ama bunun uzun süreceğini de düşünmüyorum.

Bunu daha iyi tanımlayabilmem pek olası değil, bu nedenle eğitim kursunda, inceliklerin ayrıntılı bir açıklaması yerine, bu kılavuzun ayrı ayrı sayfalarına doğrudan bağlantılar vereceğim.

Kitaplıklar ekleme.
Öncelikle gerekli kütüphaneleri ve başlıkları tanımlarla birlikte ekliyoruz. Sonuçta C evrensel bir dil ve ona özellikle AVR ile çalıştığımızı açıklamamız gerekiyor, bu nedenle kaynak koduna şu satırı yazın:

1 #katmak

#katmak

Bu dosya klasörde bulunur WinAVR ve denetleyicinin tüm kayıtlarının ve bağlantı noktalarının bir açıklamasını içerir. Dahası, derleyici tarafından aracılığıyla iletilen belirli bir denetleyiciye bağlanmayla ilgili her şey kurnazlıktır. yapmak parametredeki dosya MCU ve bu değişkene bağlı olarak projenize, bu özel denetleyici için tüm bağlantı noktalarının ve kayıtların adreslerinin açıklamasını içeren bir başlık dosyası bağlanır. Vay! Bu olmadan da mümkündür, ancak o zaman SREG veya UDR gibi sembolik kayıt adlarını kullanamazsınız ve "0xC1" gibi her birinin adresini hatırlamanız gerekir, bu da başınızı ağrıtacaktır.

Takımın kendisi #katmak<имя файла> projenize her türlü içeriği eklemenizi sağlar Metin dosyasıörneğin, işlevlerin açıklamasını veya başka bir kod parçasını içeren bir dosya. Ve direktifin bu dosyayı bulabilmesi için projemizin yolunu belirledik (WinAVR dizini zaten varsayılan olarak orada kayıtlıdır).

Ana işlev.
Bir C programı tamamen işlevlerden oluşur. Herhangi bir sırayla iç içe yerleştirilebilir ve birbirlerinden çağrılabilirler. Farklı yollar. Her işlevin üç gerekli parametresi vardır:

  • Dönüş değeri ör. günah(x) x'in sinüsünün değerini döndürür. Kısaca matematikte olduğu gibi.
  • İletilen parametreler aynı X'tir.
  • Fonksiyon gövdesi.

İletilen ve döndürülen tüm değerler, verilere bağlı olarak bir tür olmalıdır.

Herhangi bir C programı bir fonksiyon içermelidir ana ana programa giriş noktası olarak, aksi takdirde kesinlikle C değildir :). Bir milyon dosyadan başka birinin kaynak kodunda main'in varlığıyla, bunun programın her şeyin başladığı ana kısmı olduğunu anlayabilirsiniz. O halde soralım:

1 2 3 4 5 int main(void) ( dönüş 0 ; )

int main(void) ( dönüş 0; )

İşte bu, ilk en basit program yazılı, hiçbir şey yapmaması önemli değil, daha yeni başladık.

Ne yaptığımızı bulalım.
int Bu, ana işlevin döndürdüğü veri türüdür.

Elbette bir mikrodenetleyicide ana prensipte hiçbir şey iade edilemez ve teoride olması gerekir geçersiz ana (geçersiz), ancak GCC başlangıçta PC için tasarlandı ve orada program değeri döndürebilir işletim sistemi bitmesi uzerine. Bu nedenle GCC açık geçersiz ana (geçersiz) Uyarı'ya yemin eder.

Bu bir hata değil, işe yarayacak ama uyarıları sevmiyorum.

geçersiz bu, fonksiyona ilettiğimiz veri türüdür, bu durumda ana ayrıca dışarıdan hiçbir şeyi kabul edemez, bu nedenle geçersiz- Sahte. Herhangi bir şeyin iletilmesine veya geri gönderilmesine gerek olmadığında saplama kullanılır.

İşte buradalar { } süslü parantezler bir program bloğudur, bu durumda bir fonksiyonun gövdesidir ana, kod orada bulunacaktır.

geri dönmek- bu, ana işlevin tamamlandığında döndüreceği dönüş değeridir, çünkü elimizde bir int, yani bir sayı var, o zaman bir sayı döndürmeliyiz. Her ne kadar bu hala mantıklı olmasa da, çünkü... mikrodenetleyicide yalnızca ana komuttan hiçbir yere gidemiyoruz. Boş dönüyorum. Çünkü önemli değil. Ancak derleyici genellikle akıllıdır ve bu durum için kod üretmez.
Her ne kadar sapkın olsa da, o zaman ana MK'ye gidebilirsiniz - örneğin, önyükleyici bölümüne girip onu çalıştırabilirsiniz, ancak bu, geçiş adreslerini düzeltmek için ürün yazılımında düşük düzeyde düzeltmeler gerektirecektir. Aşağıda kendiniz görecek ve nasıl yapacağınızı anlayacaksınız. Ne için? Bu başka bir sorudur, vakaların %99,999'unda bu gerekli değildir :)

Biz bunu yaptık ve devam ettik. Hadi bir değişken ekleyelim, aslında ona ihtiyacımız yok ve değişkenleri onsuz tanıtmanın bir anlamı yok, ama öğreniyoruz. Değişkenler bir işlevin gövdesine eklenirse, bunlar yereldir ve yalnızca bu işlevde bulunur. Fonksiyondan çıktığınızda bu değişkenler silinir ve RAM belleği daha önemli ihtiyaçlar için ayrılır. .

1 2 3 4 5 6 int main(void ) ( unsigned char i; return 0 ; )

int main(void) ( unsigned char i; return 0; )

imzasız imzasız anlamına gelir. Gerçek şu ki, ikili gösterimde en anlamlı bit işarete tahsis edilmiştir, bu da +127/-128 sayısının bir bayta (karakter) sığdığı anlamına gelir, ancak işaret atılırsa 0'dan 0'a kadar sığacaktır. 255. Genellikle işarete ihtiyaç yoktur. Bu yüzden imzasız.
Ben yalnızca bir değişken adıdır. Daha fazla yok.

Şimdi portları başlatmamız gerekiyor ve UART. Tabii ki, kütüphaneyi alıp bağlayabilir ve bir çeşit UartInit(9600); ama o zaman gerçekte ne olduğunu bilemeyeceksiniz.

Biz bunu yaparız:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void ) ( unsigned char i; #define XTAL 8000000L #define baud hızı 9600L #define bauddivider (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(baudbölücü) ; UBRRH = HI(baudbölücü) ; UCSRA = 0; UCSRB = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) ( unsigned char i; #define XTAL 8000000L #define baud hızı 9600L #define bauddivider (XTAL/(16*baud hızı)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(baudbölücü); UBRRH = HI(baudbölücü); UCSRA = 0; UCSRB = 1<

Korkutucu? Aslında gerçek kodun yalnızca son beş satırı vardır. Her şey bu #tanımlamakÖnişlemcili bir makro dilidir. Assembly'dekiyle hemen hemen aynı şeyler, ancak sözdizimi biraz farklı.

Gerekli katsayıların hesaplanmasına ilişkin rutin işlemlerinizi kolaylaştıracaklardır. İlk satırda bunun yerine şunu söylüyoruz XTAL 8000000'i güvenle değiştirebilirsiniz ve L- tipin belirtilmesi, uzun ifadenin işlemcinin saat frekansı olduğunu söyleme. Aynısı baud hızı- UART aracılığıyla veri aktarım sıklığı.

baud bölücü zaten daha karmaşık olduğundan, bunun yerine önceki iki formül kullanılarak hesaplanan ifade kullanılacaktır.
Peki ve L.O. Ve MERHABA düşük ve yüksek baytlar bu sonuçtan alınacaktır, çünkü Açıkçası bir bayta sığmayabilir. İÇİNDE MERHABA X (makro giriş parametresi) sekiz kez sağa kaydırılır ve sonuçta yalnızca en önemli bayt kalır. Ve L.O. 00FF sayısıyla bit yönünde VE işlemi yaparız, sonuç olarak yalnızca düşük bayt kalır.

Yani yapılan her şey şöyle #tanımlamak güvenle atabilir ve gerekli sayıları hesap makinesinde hesaplayıp hemen UBBRL = … satırlarına girebilirsiniz. ve UBBRH = …..

Olabilmek. Ancak! Bunu yap KESİNLİKLE İMKANSIZ!

Bu şekilde ya da bu şekilde çalışacak, ancak sözde sihirli sayılar-hiçbir yerden ve bilinmeyen nedenlerle alınmış değerler ve birkaç yıl içinde böyle bir projeyi açarsanız bu değerlerin ne olduğunu anlamak çok zor olacaktır. Şimdi bile hızı değiştirmek veya kuvars frekansını değiştirmek istiyorsanız her şeyin yeniden hesaplanması gerekecek, ancak koddaki birkaç rakamı değiştirdiniz ve hepsi bu. Genel olarak, kodlayıcı olarak markalanmak istemiyorsanız kodunuzu okunması kolay, anlaşılır ve değiştirilmesi kolay olacak şekilde yapın.

O zaman her şey basit:
Tüm bu “UBRL ve Co”, yardımıyla dünyayla iletişim kuracağımız UART vericisinin konfigürasyon kayıtlarıdır. Ve şimdi onlara gerekli değerleri atadık, onları istenen hıza ve moda ayarladık.

Kayıt türü 1<Şu anlama gelir: 1 tanesini alın ve yerine koyun RXEN bayt cinsinden. RXEN bu kaydın 4. bitidir UCSRB, Bu yüzden 1< 00010000 ikili sayısını oluşturur, TXEN- bu 3. bit ve 1< 00001000 değerini verecektir. Tek "|" bit düzeyinde VEYA, yani 00010000 | 00001000 = 00011000. Aynı şekilde kalan gerekli konfigürasyon bitleri de ayarlanıp genel yığına eklenir. Sonuç olarak, toplanan sayı UCSRB'ye kaydedilir. Daha fazla ayrıntı USART bölümündeki MK veri sayfasında açıklanmaktadır. O yüzden teknik ayrıntılarla dikkatimizi dağıtmayalım.

Bitti, ne olduğunu görme zamanı. Derlemeye tıklayın ve öykünmeyi başlatın (Ctrl+F7).

Hata ayıklama
Her türlü ilerleme çubuğu geçti, stüdyo değişti ve ana işlevin girişinin yakınında sarı bir ok belirdi. İşlemcinin şu anda çalıştığı ve simülasyonun duraklatıldığı yer burasıdır.

Gerçek şu ki başlangıçta UBRRL = LO(bauddivider) satırındaydı; Sonuçta elimizde olan şey kod değil, sadece ön hesaplamalar, bu yüzden simülatör biraz sıkıcı. Ama şimdi fark etti ki, ilk talimat tamamlandı ve eğer ağaca tırmanırsan G/Ç Görünümü USART bölümüne gidin ve oradaki UBBRL baytına bakın, değerin zaten orada olduğunu göreceksiniz! 0x33.

Bir adım daha ileri götürün. Diğer kaydın içeriğinin nasıl değiştiğini görün. Yani hepsini gözden geçirin, belirtilen tüm bitlerin size söylediğim gibi ayarlandığına ve tüm bayt için aynı anda ayarlandığına dikkat edin. Geri Dönüş'ten öteye gitmeyecek; program bitti.

Açılış
Şimdi simülasyonu sıfıra sıfırlayın. Oraya tıklayın Sıfırla (Üst Karakter+F5). Demonte edilmiş listeyi açın, şimdi kontrol cihazında gerçekte neler olduğunu göreceksiniz. Görünüm -> Ayırıcı. Ve YYAAAAAAA değil!!! Montajcı!!! KORKU!!! VE GEREKLİDİR. Böylece daha sonra, bir şeyler ters gittiğinde, kod konusunda aptallık yapmaz ve forumlarda saçma sorular sormazsınız, bunun yerine hemen cesaretinizi toplayın ve nerede sıkışıp kaldığınızı görün. Orada korkutucu bir şey yok.

İlk olarak serinin üstleri olacak:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A Atla +00000002: 940C0034 JMP 0x00000034 Atla +00000004: 940C0034 JMP 0x00000034 Atla +00000006: 940C0034 JMP 0x0 0000034 Atla +00000008: 940C0034 JMP 0x00000034 Atla +0000000A: 940C0034 JMP 0x00000034 Atla +0000000C: 940C0034 JMP 0x00000034 Atla + 0000000E: 940C0034 JMP 0x00000034 Atla +00000010: 940C0034 JMP 0x00000034 Atla +00000012: 940C0034 JMP 0x00000034 Atla +00000014: 940C0034 JMP 0x0 0000034 Atlama +00000016: 940C0034 JMP 0x00000034 Atlama +00000018: 940C0034 JMP 0x00000034 Atlama +0000001A: 940C0034 JMP 0x00000034 Atlama +0000001C : 940C0034 JMP 0x00000034 Atla +0000001E: 940C0034 JMP 0x00000034 Atla +00000020: 940C0034 JMP 0x00000034 Atla +00000022: 940C0034 JMP 0x000000 34 Atla +00000024: 940C0034 JMP 0x00000034 Atla +00000026: 940C0034 JMP 0x00000034 Atla +00000028: 940C0034 JMP 0x00000034 Atla

00000000: 940C002A JMP 0x0000002A Atlama +00000002: 940C0034 JMP 0x00000034 Atlama +00000004: 940C0034 JMP 0x00000034 Atlama +00000006: 940C0034 JMP 0x0 0000034 Atlama +00000008: 940C0034 JMP 0x00000034 Atlama +0000000A: 940C0034 JMP 0x00000034 Atlama +0000000C: 940C0034 JMP 0x00000034 Atlama +0000000E : 940C0034 JMP 0x00000034 Atla +00000010: 940C0034 JMP 0x00000034 Atla +00000012: 940C0034 JMP 0x00000034 Atla +00000014: 940C0034 JMP 0x000000 34 Atla +00000016: 940C0034 JMP 0x00000034 Atla +00000018: 940C0034 JMP 0x00000034 Atla +0000001A: 940C0034 JMP 0x00000034 Atla +0000001C : 940C0034 JMP 0x00000034 Atla +0000001E: 940C0034 JMP 0x00000034 Atla +00000020: 940C0034 JMP 0x00000034 Atla +00000022: 940C0034 JMP 0x00000034 Atla + 00000024: 940C0034 JMP 0x00000034 Atla +00000026: 940C0034 JMP 0x00000034 Atla +00000028: 940C0034 JMP 0x00000034 Atla

Bu kesme vektör tablosudur. Ona daha sonra döneceğiz ama şimdilik sadece bakın ve onun var olduğunu hatırlayın. İlk sütun, komutun bulunduğu flaş hücresinin adresidir, ikincisi komut kodudur, üçüncüsü komut anımsatıcısıdır, aynı montaj talimatıdır, üçüncüsü komutun işlenenleridir. Otomatik yorum.
Yani bakarsanız sürekli geçişler var. Ve JMP komut kodu dört bayttır, geriye doğru yazılan atlama adresini içerir - düşük adresteki düşük bayt ve atlama komut kodu 940C

0000002B: BE1F OUT 0x3F,R1 Çıkışından G/Ç konumuna

Bu sıfır, 0x3F adresine kaydediliyor. G/Ç görünüm sütununa bakarsanız, 0x3F adresinin, kontrol cihazının bayrak kaydı olan SREG kaydının adresi olduğunu göreceksiniz. Onlar. programı sıfır koşullarda çalıştırmak için SREG'i sıfırlıyoruz.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Hemen yükle +0000002D: E0D4 LDI R29,0x04 Hemen yükle +0000002E: BFDE OUT 0x3E,R29 G/Ç konumuna çıkış +0000002F: BFCD OUT 0x3D,R28 G/Ç konumuna çıkış

0000002C: E5CF LDI R28,0x5F Hemen yükle +0000002D: E0D4 LDI R29,0x04 Hemen yükle +0000002E: BFDE OUT 0x3E,R29 G/Ç konumuna çıkış +0000002F: BFCD OUT 0x3D,R28 G/Ç konumuna çıkış

Bu yığın işaretçisini yüklüyor. G/Ç kayıtlarına doğrudan yükleme yapamazsınız, yalnızca bir ara kayıt aracılığıyla. Bu nedenle önce LDI'dan ara ürüne, sonra da OUT'tan I/O'ya. Ayrıca size daha sonra yığın hakkında daha fazla bilgi vereceğim. Şimdilik bunun RAM'in sonunda asılı olan ve adresleri ve ara değişkenleri saklayan dinamik bir bellek alanı olduğunu bilin. Artık yığınımızın nereden başlayacağını belirttik.

00000032: 940C0041 JMP 0x00000041 Atlama

Programın en sonuna atlayın ve orada kesintileri ve kendi kendine sıkı bir şekilde döngüyü yasaklıyoruz:

1 2 +00000041: 94F8 CLI Genel Kesme Devre Dışı +00000042: CFFF RJMP PC-0x0000 Göreli atlama

00000041: 94F8 CLI Genel Kesintiyi Devre Dışı Bırak +00000042: CFFF RJMP PC-0x0000 Göreli atlama

Bu, ana işlevden çıkmak gibi öngörülemeyen durumlarda geçerlidir. Denetleyici böyle bir döngüden donanımın sıfırlanmasıyla veya daha büyük olasılıkla bir gözlemcinin sıfırlanmasıyla çıkarılabilir. Peki ya da yukarıda söylediğim gibi bunu hex editöründe düzeltin ve dörtnala kalbimizin istediği yere doğru yola çıkın. Ayrıca iki tür geçiş olduğunu unutmayın: JMP ve RJMP; ilki bir adrese doğrudan geçiştir. Dört bayt kaplar ve doğrudan tüm hafıza alanına atlayabilir. İkinci geçiş türü RJMP'dir - göreceli. Komutu iki bayt alır, ancak mevcut konumdan (adres) 1024 adım ileri veya geri hareket eder. Ve parametreleri mevcut noktadan uzaklığı gösterir. Daha sık kullanılıyor çünkü bir floşta alanın yarısını kaplar ve uzun geçişlere nadiren ihtiyaç duyulur.

1 +00000034: 940C0000 JMP 0x00000000 Atlama

00000034: 940C0000 JMP 0x00000000 Atlama

Ve bu, kodun en başına bir sıçramadır. Bir çeşit yeniden başlatma. Tüm vektörlerin buradan atlayıp atlamadığını kontrol edebilirsiniz. Bundan çıkan sonuç, eğer şimdi kesintileri etkinleştirirseniz (varsayılan olarak devre dışıdırlar) ve kesinti gerçekleşirse ancak işleyici yoksa, bir yazılım sıfırlaması gerçekleşecektir - program en başlangıca geri atılacaktır.

Fonksiyon ana. Her şey aynı, anlatmaya gerek bile yok. Kayıtlara girilen önceden hesaplanmış sayıya bakın. Derleyici ön işlemcisi harika!!! Yani “sihirli” sayılar yok!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24,0x33 Hemen yükle +00000037: B989 OUT 0x09,R24 G/Ç konumuna çıkış 15: UBRRH = HI(bauddivider); +00000038: BC10 ÇIKIŞ 0x20,R1 G/Ç konumu 16'ya çıkış: UCSRA = 0; +00000039: B81B ÇIKIŞ 0x0B,R1 G/Ç konumu 17'ye çıkış: UCSRB = 1<

Ve işte hata:

1 2 3 +0000003E: E080 LDI R24.0x00 Hemen yükle +0000003F: E090 LDI R25.0x00 Hemen yükle +00000040: 9508 RET Alt program dönüşü

0000003E: E080 LDI R24.0x00 Hemen yükle +0000003F: E090 LDI R25.0x00 Hemen yükle +00000040: 9508 RET Alt program dönüşü

Soru şu: Derleyici neden bu tür üst kısımlar ekliyor? Ve bu da Return 0'dan başka bir şey değil, fonksiyonu int main(void) olarak tanımladık ve böylece dört byte'ı daha boşa harcadık :) Ve eğer void main(void) yaparsanız o zaman sadece RET kalacak, ancak bir uyarı görünecektir , ana fonksiyonumuzun hiçbir şey döndürmediğini. Genel olarak istediğinizi yapın :)

Zor? Görünüşe göre öyle değil. Ayırıcı modunda adım adım yürütmeye tıklayın ve işlemcinin bireysel talimatları nasıl yürüttüğünü, kayıtlara ne olduğunu görün. Komutlar arasında hareket etme ve son döngü nasıl gerçekleşir?

Bir kaç gün sonra devam edecek...

Üstü kapalı:
Alexei78 Firefox için sitemde ve forumumda gezinmeyi kolaylaştıran bir eklenti oluşturdum.
Tartışma ve indirme,


Modern amatör radyo, mikrodenetleyiciler olmadan hayal edilemez ve bu açıktır. Son yıllarda, çeşitli üreticilerin mikrodenetleyicileri insan faaliyetinin çeşitli alanlarında yaygınlaştı. Çoğu zaman en beklenmedik cihazlarda ve tasarımlarda bulunabilirler. Siz ve ben etrafımızdaki süreçlerin bilgisayarlaştırılmasına ve otomasyonuna tanık oluyoruz. Gerçek şu ki, programlamanın temelleri bilgisi olmadan, modern, rekabetçi cihazlar yaratmak neredeyse imkansız hale geldi...

Bu makaleyi okuyorsanız muhtemelen mikrodenetleyicilerin nasıl çalıştığını anlamak istiyorsunuz ve büyük olasılıkla sorularınız var:

4. Hangi literatürü incelemeliyim?

Bu soruları cevaplamaya çalışalım.

1. İş için hangi mikrodenetleyiciyi seçmeliyim?

8 bitlik mikrodenetleyiciler radyo amatörleri arasında oldukça popülerdir. resim Mikroçip Teknolojisi ve AVR Atmel, 16 bit MSP430 TI'dan ve ayrıca 32 bit mikrodenetleyicilerden, mimarilerden KOL.

Sanayide, biraz farklı olarak, büyük bir farkla ilk sırada yer alıyor. Renesas Elektronik ikincisinde Serbest ölçek, üçüncüde SAMSUNG, sonra gidin Mikroçip Ve T.I., sonra geri kalan her şey.
Popülerlik, fiyat ve bulunabilirliğe göre belirlenir; teknik bilgilerin bulunabilirliği ve yazılım desteğinin maliyeti önemli bir rol oynar.

8-bit AVR mikrodenetleyicilerini, ailelerini inceleyeceğiz ATMEGA 8 ve 16 serisi. Seçim yine erişilebilirlik, birçok amatör gelişmenin varlığı ve büyük miktarda eğitim materyali ile belirlendi. Bu ailenin çeşitli yerleşik bileşenlerinin ve işlevselliğinin varlığı.

2. Seçilen mikro denetleyiciyi programlamak için hangi geliştirme ortamını kullanmalıyım?

AVR için çeşitli entegre geliştirme ortamları (IDE, Entegre geliştirme ortamı) oluşturulmuştur.
IDE programcılar tarafından yazılım geliştirmek için kullanılan bir yazılım sistemidir ve şunları içerir:
Metin düzeltici,
derleyici ve/veya tercüman,
montaj otomasyon araçları,
hata ayıklayıcı

En yaygın olanları AVRStudio, ATmelStudio, WINAVR, CodeVision, IAR Gömülü Çalışma Tezgahı.
Program yazmak için ücretsiz olanı kullanacağız. IDE ATmelStudio sürüm 6 Ve daha yüksek.
Atmel Studio'yu kayıt olduktan sonra resmi web sitesinden indirebilirsiniz (kayıt tamamen ücretsizdir ve sizi hiçbir şeye yükümlü kılmaz!)

ATmelStudio hem çeviricide hem de SI'da projeler oluşturmanıza ve programlar yazmanıza olanak tanır.

Başlangıçta soru her zaman şudur: Etkili programlar yazmak için hangi programlama dilini seçmeliyim?

Cevabım basit: En az iki dilde yazabilmeniz gerekiyor: Assembly ve SI. Hızlı ve kompakt altprogramlar, makrolar ve çeşitli aygıt sürücüleri yazmanız gerektiğinde, Assembly dili basitçe gereklidir. Ancak, SI bilgisi olmadan karmaşık algoritmalar üzerine kurulu büyük bir proje oluşturmanız gerektiğinde, özellikle hata ayıklama sürecinde ve bunu başka bir platforma, örneğin PIC18'e aktarma isteği varsa, çok zaman harcanabilir. veya STM, çözülemez bir sorun haline gelebilir.
Ayrıca donanım bilgi işlem platformları da artık ortaya çıktı arduino, SI++ dili bilgisi gerektiren çalışmalar.
Bu nedenle hem assembler'da hem de SI'da programlar yazacağız.

Havya veya devre tahtası kullanmadan çalışmanızın sonucunu net bir şekilde görmek için programı kurmanız yeterli Proteus.

3. Denetleyici nasıl flaşlanır ve onlarla rahat çalışma için hangi ek cihazlara ve aksesuarlara ihtiyaç vardır?

Datagorian'ı kullanıyoruz. Ek olarak, devre tahtaları ve 5 Volt çıkış voltajına sahip bir güç kaynağı satın almanız gerekecektir. 5 voltluk zener diyot kullanarak düşük dalgalı güç kaynağı olarak kullanabilirsiniz.
Belki zamanla Igor ve ben bir hata ayıklama panosu oluşturmak için bir proje önereceğiz.

4. Hangi literatürü incelemeliyim?

Ancak örneğin:
Assembler'da AVR'nin pratik programlanması. Reviç, 2011
1000 ve bir mikrodenetleyici devresi Vol. 1-2. Ryumik, 2010-2011
AVR MK Kitap 1-2'deki 10 pratik cihaz. Kravçenko, 2008-2009
AVR MK kullanan bir cihaz geliştiricisine yönelik bir eğitim. Belov, 2008
MK AVR aileleri Tiny ve Atmega. Efstifeev, 2008
CodeVisionAVR. Yeni başlayanlar için bir rehber. Lebedev, 2008
Cihazların, tristörlerin, rölelerin mikroişlemci kontrolü. Belov, 2008
Analog arayüzler MK. Komiser, Top, 2007
AVR MK'de cihazlar yaratıyoruz. Belov, 2007
Amatör radyo uygulamalarında MK AVR. ATTINY2313'ün tam analizi. Belov, 2007
MK ile ağ ve ağlar arası veri alışverişi. Git, 2007
MK AVR'si. yeni başlayanlar için atölye. Hartov, 2007
AVR Şemalarının, algoritmalarının, programlarının uygulanması. Baranov, 2006
AVR mikro denetleyicileri. Giriş dersi. Morton, 2006
AVR kullanarak ölçüm, kontrol ve düzenleme. Trumpert, 2006
AVR ve PIC MK için C dilinde programlama. Şpak, 2006
MK'deki cihazların tasarımı. Belov, 2005
MK - çok basit, cilt 1-3. Frunze, 2002-2003
C Programlama Dili, 2. baskı. Kernighan, Ritchie, 2009
ATMEL mikrokontrolörlerinin S. Prokopenko dilinde programlanması, 2012

5. İnternette nerede soru sorabilir ve spesifik yanıtlar alabilirsiniz?

Sorularınızı bizim veya mikrodenetleyicilerle ilgili konuların şu veya bu şekilde ele alındığı herhangi bir forumda sorabilirsiniz. Forumlarda önemli olan, cevapları net bir şekilde alabilmek için soruları doğru bir şekilde formüle etmektir. Soyut sorular hoş karşılanmaz ve büyük olasılıkla cevap yerine sert eleştiriler alırsınız veya sorunuz cevapsız kalır!

Şimdi favorimiz olan ATMEGA 8 mikrokontrolcüsüne daha yakından bakalım

8 bit, yüksek performanslı, düşük güçlü AVR mikro denetleyici
Aşamalı RISC mimarisi
130 yüksek performanslı talimat, talimatların çoğu tek saat döngüsünde yürütülür
32 adet 8 bitlik genel amaçlı çalışma kayıtları
Tamamen statik çalışma
16 MIPS (16 MHz'de) performansına yaklaşıyor
Dahili 2 döngülü çarpan

Kalıcı program ve veri belleği
8 KB Sistem İçi Kendiliğinden Programlanabilir Flash bellek
1000 silme/yazma döngüsü sağlar
Bağımsız kilit bitlerine sahip ek önyükleme kodu sektörü
Eş zamanlı okuma/yazma modu sağlar (Okuma-Yazma Sırasında)
512 bayt EEPROM
100.000 silme/yazma döngüsü sağlar
1 KB çip üzerinde SRAM
Kullanıcı yazılımını korumak için programlanabilir kilitleme

Gömülü Çevre Birimleri
Ayrı ön ölçekleyicili, biri karşılaştırma modlu iki adet 8 bitlik zamanlayıcı/sayıcı
Ayrı ön ölçekleyici ve yakalama ve karşılaştırma modlarına sahip bir adet 16 bit zamanlayıcı/sayıcı
Ayrı jeneratörlü gerçek zamanlı sayaç
Üç PWM kanalı
8 kanallı A/D dönüştürücü (TQFP ve MLF)
10 bit hassasiyetle 6 kanal
6 kanallı analogdan dijitale dönüştürücü (PDIP paketinde)
10 bit hassasiyetle 4 kanal
8 bit hassasiyetli 2 kanal
Bayt odaklı 2 telli seri arayüz
Programlanabilir Seri USART
Seri arayüz SPI (ana/bağımlı)
Ayrı yerleşik osilatöre sahip programlanabilir watchdog zamanlayıcısı
Dahili analog karşılaştırıcı

Özel mikrokontrolör fonksiyonları
Açılışta sıfırlama ve programlanabilir voltaj kaybı tespiti
Dahili kalibre edilmiş RC osilatörü
Dahili ve harici kesme kaynakları
Beş düşük tüketim modu: Boşta, Güç Tasarrufu, Güç Kapatma, Bekleme ve ADC gürültü azaltma

G/Ç pinleri ve muhafazaları
23 programlanabilir I/O hattı
28 pinli PDIP paketi, 32 pinli TQFP paketi ve 32 pinli MLF paketi

Çalışma gerilimleri
2,7 - 5,5 V (ATmega8L)
4,5 - 5,5 V (ATmega8)

Çalışma frekansı
0 - 8 MHz (ATmega8L)
0 - 16 MHz (ATmega8)

ATMEGA16 ve 8 arasındaki farklar
16 KB Sistem İçi Kendiliğinden Programlanabilir Flash bellek

JTAG arayüzü (IEEE 1149.1 uyumlu)
JTAG standardıyla uyumlu çevresel tarama özelliği
Katıştırılmış hata ayıklama için genişletilmiş destek
JTAG arayüzü üzerinden programlama: Flash, EEPROM belleği, jumper'lar ve kilit bitleri

Dört kanallı PWM/PWM

8 kanallı 10 bit analogdan dijitale dönüştürücü
8 dengesiz kanal
7 diferansiyel kanal (yalnızca TQFP paketi)
1x, 10x veya 200x programlanabilir kazançlı 2 diferansiyel kanal (yalnızca TQFP paketi)

Altı düşük tüketim modu: Boşta, Güç Tasarrufu, Güç Kapatma, Bekleme, Uzatılmış Bekleme ve ADC gürültü azaltma

32 programlanabilir I/O hattı

40 pinli PDIP paketi ve 44 pinli TQFP paketi

AtmelStudio

Yeni başlıyorsanız, AtmelStudio programını atmel.com resmi sayfasından indirip yüklemeniz gerekir.
AtmelStudio programını kurduktan sonra proje oluşturmaya başlayabilirsiniz.
Proje- derleme sonrasında mikro denetleyicinin belleğine yazacağınız, hata ayıklayacağınız ve flaş yapacağınız programdır.

Bir proje oluşturmak için programı açmanız gerekir, aşağıdaki ekran koruyucu görünecektir,

ve proje oluşturma sayfası açılacaktır

Yeni bir proje oluşturmak için üzerine tıklamanız gerekir. "Yeni proje..."
Bu durumda, programlama dilini, projenin adını, konumunu, proje dosyalarını içeren paketin adını ve diğer çapraz projelerde daha fazla kullanmak üzere bir dizin oluşturma yeteneğini seçebileceğiniz yeni bir pencere açılacaktır. . Assembler'da programlayacağımız bir proje oluşturmak için şunu seçmemiz gerekiyor: Montajcı, bundan sonra projenin adını, konumunu değiştirip seçiyoruz TAMAM.

Bir sonraki pencere görünecektir

Seçmek “megaAVR, 8 bit” ve ihtiyacımız olan mikrodenetleyiciyi bulduk, seçtik ATmega8. Ekran koruyucunun sağ tarafında bu mikrodenetleyiciyle çalışan ve bunlardan birine bağlanabileceğimiz cihazların bir listesi çıkıyor. Seçmek TAMAM.

Programı düzenlemenize ve hata ayıklamanıza olanak tanıyan metin düzenleyici sayfası görüntülenir. Sayfa boşken, oluşturulma tarihi ve saati ile proje dosyasının adı ve kullanıcı adı belirtilir. Ek G/Ç aygıtları penceresi ve program derleme raporları penceresi vardır. şimdi biz


Assembler'da programlayabiliriz.
SI dilinde programlamaya yönelik bir proje de aynı şekilde oluşturulur.

Merhaba MySku sakinleri! İncelememizin kahramanı Atmega8A-16PU mikro denetleyicisidir. Bu mikrodenetleyiciyi CodeVisionAvr entegre geliştirme ortamında programlamayı anlatacağım, LED'i yakıp söndüreceğiz ve bu ortamda çalışmanın artılarını ve eksilerini ele alacağız. Belki gelecekte bu sizin için zaten "popüler" olan Arduino'ya bir alternatif olarak hizmet edecektir. Eğer ilgileniyorsanız, kesmeye gidin.

Önsöz.
Öyle oldu ki MK ile tanışmaya Arduino ile başladım. LED'i yakıp söndürdüm, çeşitli sensörleri ve kalkanları bağladım ve çeşitli projeler yaptım. Her şey işe yaradı, memnun kaldım ama daha fazlasını istedim. Atmega8A'nın dahil olduğu ve donanım yazılımını kendim yazmam gereken bir projeyle karşılaştım. Beni "çıplak" bir MK programlama sürecini incelemeye iten oydu.
Elimizde Atmel, AVR Atmega8A ailesinden bir mikrokontrolcü var.

Özellikler:


Pin yapısı:


Burada
Şimdi çalıştırma ve programlama için şemaya göre programlayıcıya bağlamanız gerekir:

Ne yazık ki, ben bir ayakkabıcı gibiyim - çizmesiz, artık elimde bir programcım yok, bu yüzden bitmiş ürün yazılımını mikrodenetleyiciye yüklemek ve sigortaları yapılandırmak için Arduino UNO'yu kullanacağım. Arduino IDE örnekleri klasöründen “Arduinoisp” taslağını indirmeniz ve şemaya göre bağlamanız yeterlidir:


Ancak bu çözümün önemli bir dezavantajı var, bundan biraz sonra bahsedeceğim. CodeVisionAvr'da (bundan sonra CvAvr olarak anılacaktır) program yazmaya başlamadan önce mikrokontrolcümüzün hangi frekansta çalışacağına karar vermemiz gerekiyor. Varsayılan olarak, kahramanımız fabrikadan 1 MHz frekansında (2, 4 ve 8 MHz'e yeniden yapılandırma yeteneği ile) dahili bir uzaktan kumanda jeneratöründen çalışır. Dahili uzaktan kumanda jeneratörü fabrikada belirli koşullar altında (tam voltaj, sıcaklık) kalibre edildiğinden, "saha" koşullarında çalışmasının doğruluğu %3 ila %10 arasında değişebilir. Yüksek zamanlama doğruluğunun gerekli olmadığı görevler için bu ihmal edilebilir; diğer durumlarda harici kuvars kullanmak daha iyidir. Projemde 8 MHz frekansında harici bir kuvars kullandım. Şimdi MC'ye harici kuvarstan çalışması gerektiğini "açıklamamız" gerekiyor. Bu sigortaları değiştirerek yapılır. Basitçe ifade etmek gerekirse, bu BIOS'a benzer, anakarttaki gibi, burada çalışma modlarını belirtirsiniz; benzer şekilde, MK'ye frekansın yanı sıra hangi modlarda çalışması gerektiğini de söyleriz. Tüm bilgiler kalıcı hafızada saklanacaktır.
Size spoiler altında firmware'i birleştirmeyi anlatacağım, bunu nasıl yapacağını bilenler daha da ilerleyebilir.

Ek Bilgiler

Aynı sigortalar nasıl kaydedilir?! Bunun için AvrDude programını kullandım, ücretsizdir ve internette kolayca bulunabilir. Sigortaları istenilen frekansa göre doğru şekilde ayarlamak için veri sayfasına bakın veya basit bir tane kullanabilirsiniz.
Parametreleri resimdeki gibi ayarlıyoruz.


Burada her şey basit:
Saat Kaynağı - harici kuvarstan frekansı (Harici Kristal 3 - 16 Mhz) ayarlayın.
Başlatma Süresi - RESET kaldırıldıktan veya güç uygulandıktan sonra MC başlatma hızı (16K CK + 4,1 ms hızlı).
Kutuyu işaretleyin: Dahili. Saat/RC Osc./Düşük frekans. Kristal: Dahili Kapasitörleri etkinleştirin (36 pF)
Dahili R/C Osc.: işaretlenmemiş halde bırakın! Harici Kristal: tam salınımı etkinleştirin (>8 MHz için gereklidir).
Böylece Düşük Sigorta 0xEF ve Yüksek Sigorta 0xC9'u elde ettik. Harika, işin yarısı tamamlandı. Şimdi mikrodenetleyiciyi sırasıyla Arduino UNO'ya ve Arduino'nun kendisini bilgisayara bağlıyoruz. Komut satırını başlatın, AvrDude'un bulunduğu klasöre gidin. Ardından şu satırı girin: avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U lfuse:w:0xef:m -U hfuse:w:0xc9:m
Resimde böyle görünüyor:


Girdiğiniz satırı ayrıştıralım:
avrisp, Arduino benzeri programlayıcımızın bir türüdür
COM13, sistemde Arduino'muzu tanımlayan com port numarasıdır (sizin durumunuzda bunu cihaz yöneticisinde aramanız gerekir)
19200 - iletişim bağlantı noktası hızı, olduğu gibi bırakın
m8 - MK'mizin Atmega8 olduğunu belirtin
-U lfuse:w:0xef:m -U hfuse:w:0xc9:m - Düşük Sigorta 0xEF ve Yüksek Sigorta 0xC9'umuz burada belirtilmiştir
Olmak LÜTFEN DİKKATLİ OLUN!!, Yanlış belirtilen Sigorta, MK'nin tuğlalanmasına yol açabilir (onu eski haline getirmek için tefle dans etmemize gerek yok).
“Enter” tuşuna basıyoruz ve çıktıda resimdeki gibi sonucu alıyoruz:


İşlem sırasında herhangi bir hata oluşmazsa iş bitmiş demektir, mikrodenetleyicimiz artık harici kuvarstan çalışacaktır.
Sigortalar hakkında çok detaylı bilgi edinebilir, ayrıca Google'da arama yaparak da okuyabilirsiniz.


Artık programlamaya başlamaya hazırız. Kendim için CvAvr geliştirme ortamını seçtim. Programlama dili Arduino'dan farklı olacaktır; CvAvr'da C benzeridir. İlk Blink'imizi yazalım.
Ortamı kurup başlattıktan sonra Proje Oluşturma Sihirbazını kullanacağız. “Dosya” - “Yeni” - “Proje”yi seçin. Sihirbazı kullanıp kullanmayacağımız sorulduğunda olumlu cevap veriyoruz. Hedef AVR Çip Türü: AT90, ATtity, ATmega.
Proje Sihirbazı şöyle görünür:


Çip sekmesinde ATmega8A, Saat 8.000000 Mhz'yi seçin. Bağlantı Noktaları sekmesine gidin. LED'imiz, PB0 pin çıkışına göre mikro denetleyicinin 14 numaralı pinine bağlanacaktır. Sekmede, Bağlantı Noktası B, Bit 0'ın IN'den OUT'a geçişini seçin; Mikrodenetleyicimizin 14. ayağının çalışma modunu çıkışa çeviriyoruz.


Bu, ustanın işini tamamlar. “Program” - “Oluştur, Kaydet ve Çık”ı seçin. Projemizi örneğin Blink adı altında kaydediyoruz.

Şöyle bir ayak örtüsü alalım

/*******************************************************
Bu program tarafından oluşturulmuştur.
CodeWizardAVR V3.12 Gelişmiş
Otomatik Program Oluşturucu
Çip türü: ATmega8A
Program türü: Uygulama
AVR Çekirdek Saat frekansı: 8.000000 MHz
Bellek modeli: Küçük
Harici RAM boyutu: 0
Veri Yığını boyutu: 256
*******************************************************/
#katmak
#katmak
// Global değişkenlerinizi burada bildirin

Geçersiz ana (geçersiz)
{
// Yerel değişkenlerinizi burada tanımlayın

// Giriş/Çıkış Portlarının başlatılması
// Port B'nin başlatılması
// Fonksiyon: Bit7=Giriş Bit6=Giriş Bit5=Giriş Bit4=Giriş Bit3=Giriş Bit2=Giriş Bit1=Giriş Bit0=Çıkış
DDRB=(0<// Durum: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTB=(0<

// Port C'nin başlatılması
// Fonksiyon: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<// Durum: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<

// Bağlantı Noktası D'nin başlatılması
// Fonksiyon: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<// Durum: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<

// Zamanlayıcı/Sayaç 0'ın başlatılması

// Saat değeri: Zamanlayıcı 0 Durduruldu
TCCR0=(0<TCNT0=0x00;

// Zamanlayıcı/Sayaç 1'in başlatılması
// Saat kaynağı: Sistem Saati
// Saat değeri: Timer1 Durduruldu
// Mod: Normal üst=0xFFFF
// OC1A çıkışı: Bağlantı kesildi
// OC1B çıkışı: Bağlantı kesildi
// Gürültü Önleyici: Kapalı
// Düşen Kenarda Giriş Yakalama
// Timer1 Taşma Kesintisi: Kapalı
// Giriş Yakalama Kesintisi: Kapalı
// Bir Eşleşme Kesintisini Karşılaştır: Kapalı
// B Eşleştirme Kesintisini Karşılaştır: Kapalı
TCCR1A=(0<TCCR1B=(0<TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Zamanlayıcı/Sayaç 2'nin başlatılması
// Saat kaynağı: Sistem Saati
// Saat değeri: Timer2 Durduruldu
// Mod: Normal üst=0xFF
// OC2 çıkışı: Bağlantı kesildi
ASSR=0<TCCR2=(0<TCNT2=0x00;
OCR2=0x00;

// Zamanlayıcı(lar)/Sayaç(lar) Kesinti(ler)in başlatılması
TİMSK=(0<

// Harici Kesintilerin başlatılması
// INT0: Kapalı
// INT1: Kapalı
MCUCR=(0<

// USART başlatma
// USART devre dışı bırakıldı
UCSRB=(0<

// Analog Karşılaştırıcının başlatılması
// Analog Karşılaştırıcı: Kapalı
// Analog Karşılaştırıcının pozitif girişi
// AIN0 pinine bağlanıldı
// Analog Karşılaştırıcının negatif girişi:
// AIN1 pinine bağlanıldı
ACSR=(1<SFIOR=(0<

//ADC başlatma
//ADC devre dışı
ADCSRA=(0<

// SPI başlatma
// SPI devre dışı
SPCR=(0<

// TWI başlatma
// TWI devre dışı
TWCR=(0<

(1) iken
{


Burada endişelenecek bir şey yok; proje portların, zamanlayıcıların, kesintilerin, USART, Analog Karşılaştırıcı, ADC, SPI ve bağlı kütüphanelerin çalışma modlarını belirtir. Kısacası sihirbazda belirttiğimiz tüm parametreler, portlar ve çip dışındaki her şey varsayılan olarak yapılandırılmıştır. Ana program döngüsünü while (1) (program metni) içerisine yazacağız. Çünkü PB0 (14 bacak) ile çalışıyoruz, program döngüsüne şunu yazacağız:
iken (1)
{
PORTB.0=1;
gecikme_ms(1000);
PORTB.0=0;
gecikme_ms(1000);
}
Burada PB0'ı yüksek ayarlıyoruz, 1 saniye bekleyip düşük ayarlıyoruz, ardından döngü tekrarlanıyor. Projenin başına kütüphaneyi dahil etmeyi unutmayın #include . Programımız hazır!!! Gördüğünüz gibi her şey çok basit. Şimdi “Proje” - “Tümünü Oluştur” seçeneğini seçin. Herhangi bir hata yapılmadıysa sihirbazın raporunu göreceğiz:

Programımızın boyutu 198 byte idi ve mikronun hafızasının %2,4'ünü kaplıyordu.
Daha sonra diyagramı bir araya getiriyoruz:


Şimdi projemizin bulunduğu klasöre gidin, “Debug” klasörüne gidin, ardından “Exe” ye gidin, hex uzantılı bir dosya var. Benim durumumda bu, flash.hex.
Son bir adım kaldı. Bu dosyayı AvrDude'un bulunduğu klasöre kopyalayın. Komut satırını tekrar başlatıyoruz, klasörümüze gidiyoruz. Avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U flash:w:blink.hex satırını girin
Resimde böyle görünüyor:


Her şey doğru girildiyse “Enter” tuşuna basın


Tebrikler! İş bitti, LED sizin için mutlu bir şekilde yanıp sönmeli :)
Çözüm.
Sonuç olarak Arduino benzeri programlayıcının dezavantajından bahsetmek istiyorum; CvAvr bunu kesinlikle desteklemiyor. Örneğin AVRISP mkII'yi elinizde bulundurarak sigortaları yakabilir ve programı doğrudan CodeVisionAvr'dan indirebilirsiniz. Bu arada, homebrew programcısı AvrDude grafik arayüzünü kullanmayı da reddetti ve yalnızca komut satırından çalıştı.
CodeVisionAvr'ı oldukça çabuk buldum; İnternet metin ve video dersleriyle dolu. Birkaç hafta içinde donanımsal PWM, kesintiler, zamanlayıcılar, düğmelerle çalışma ve grafik ekranı bağlama konusunda ustalaştım. Özellikle projemin bir kısmını yapmak zorundaydım: Atmega8'de 16 bitlik bir PWM donanımı düzenlemek, onu kontrol etmek için 2 düğme bağlamak ve ayrıca çalışma modlarını grafik ekranda görüntülemek ki bunu kolaylıkla yaptım :) İşte birkaç fotoğraf:

Ek Bilgiler





Arduino ile karşılaştırıldığında sonuçlar:
+ CvArv'ı anlamak zor değil çünkü bir proje oluşturma sihirbazı var;
+ Eklenti kitaplıklarının mevcudiyeti, bunlardan yeterince var;
+ Hızlı derleme;
+ Proteus'ta bir projeyi simüle etme ve yerleşik hata ayıklayıcıyı kullanarak hata ayıklama yeteneği;
+ Programın boyutu birkaç kat daha küçüktür. Standart Blink bize 198 Bayt aldı; Arduino IDE 1084 Bayt + 2 KB önyükleyicideki benzer bir taslak;
+ Arduino'da yapılamayan modları uygulama yeteneği. Örneğin, 16 bit PWM (genel olarak Arduino'da mümkündür, ancak yalnızca "koltuk değneğiyle");
+ Arduino'nun gereksiz olacağı projeleriniz için ATtiny, ATmega mikrokontrolörlerini kullanma yeteneği;
- Yine de yeni başlayan birinin Arduino ile MK konusunda uzmanlaşmaya başlaması daha iyidir;
- Programlama dili Arduino işlemesinden farklıdır;
- Arduino için hala daha fazla kütüphane var;
- CodeVisionAvr ücretli bir programdır, sınırlamaları olan ücretsiz sürümleri vardır;
CodeVisionAvr'da "çıplak" mikro denetleyiciyi programlayarak çok fazla deneyim kazandım. Zamanlayıcıları, kayıtları, çalışma modlarını, mimariyi incelemek, veri sayfalarını okumak becerilerinizi artıracak, ufkunuzu genişletecek ve mikrodenetleyicilerle çalışmanın yeni yönlerini açacaktır.
Bonus olarak, grafik LCD ekranı çözdüğümde ve biraz oynadığımda birkaç fotoğraf ekliyorum.





Not: Daha yazmak istediğim çok şey var ama bu bir inceleme değil, kocaman bir makale olacak. Yetkinliğim dahilindeki soruları özel olarak veya yorumlarda yanıtlamaya hazırım. AVR'de birçok dersi izleyebilirsiniz.

Tepe