MK'yi sıfırdan programlama. AVR Programlama

Bir zamanlar ve iki değil, MK'nın çalışmasının assembler ile başlatılması gerektiğini söylemiştim. Bu, sitede bir bütün bir kurstan adanmıştır (çok tutarlı olmasa da, ancak yavaş yavaş yeterli bir türle tarıyorum). Evet, bu zor, sonuç ilk gün olmayacak, ancak denetleyicinizde neler olup bittiğini anlamayı öğreneceksiniz. Nasıl çalıştığını bileceksiniz ve Maymun'da başkalarının kaynaklarını kopyaladın ve neden aniden çalışmayı bıraktığını anlamaya çalışın. Buna ek olarak, Si'nin en çok enportundaki andaki çatallarla çıkacak olan Orta LOOD tarafından ele geçirilmesi çok daha kolaydır.

Ne yazık ki, herkes sonucu derhal istiyor. Bu nedenle, diğer yandan gitmeye karar verdim - SI'de eğitim almak için, ama iç çamaşırının şovu ile. İyi bir programcı-emicder, izinsiz bir adım atmadan bir adım vermeden her zaman demir parçasını bir squall için tutar. Böylece, bu yüzden kodun başında olacak, sonra derleyici neyin doğduğu ve gerçekte nasıl çalıştığı şey :)

Öte yandan, si güçlü taraf Bu, PORTEA KODU. Tabii ki, her şeyi doğru yazarsa. Çalışma algoritmalarını ve demir uygulamalarını projenin farklı bölgelerinde ayırın. Ardından, algoritmayı başka bir MK'ya aktarmak için, sadece beze olan tüm temyiz başvurusunda bulunan arabirim katmanını yeniden yazmak yeterlidir ve tüm çalışma kodunu olduğu gibi bırakın. Ve elbette okunabilirlik. Kanat kaynak kaynağının ilk görüşte anlaşılması daha kolaydır (örneğin. Ben, örneğin, en azından flört etmenin en azından Si, en azından AFM :)), ancak tekrar her şeyi doğru yazarsanız. Bu anlarla da dikkat edeceğim.

Aslanın tüm örneklerinin payının benim olacağı bir donanım parçası olarak hata ayıklama ücreti.

AVR için C'deki ilk program

Bir derleyici seçimi ve çevrenin kurulumu
AVR için, birçok farklı C derleyicisi var:
Her şeyden önce IAR AVR C. - Neredeyse eşsiz bir şekilde AVR için en iyi derleyici olarak kabul edilir, çünkü Kontrolörün kendisi, Atmel'in yakın işbirliği ve IAR'lardan uzmanlar tarafından yaratılmıştır. Ama ödemek zorunda olan her şey için. Ve bu derleyici pahalı ticari yazılım olanın yeterli olmadığı, aynı zamanda sadece bu şekilde alıp derlemesi gereken bir kahvaltı ayarlarına sahiptir. Gerçekten onunla bir dostluğum yoktu, proje bağlantı aşamasında garip hatalarda sarhoştu (daha sonra bir çatlak eğrisi olduğunu öğrendim).

İkincisi geliyor Winavr gcc. - Güçlü optimizasyon derleyicisi. Tam açılır, çapraz platform, genel olarak, yaşamın tüm sevinçleri. Ayrıca AVR Studio'da mükemmel bir şekilde entegre eder. Genel olarak, onu seçtim.

Ayrıca var CODEVISION AVR C.- Çok popüler derleyici. Sadeliği ile bağlantılı olarak popüler oldu. Çalışma programı Birkaç dakika içinde içeri girebilirsiniz - başlangıç \u200b\u200bkodunun ustası büyük ölçüde terfi edilir, her türlü kulağın başlatılmasının damgası. Dürüst olmak gerekirse, kendisine şüphenizle özür dilerim - bir şekilde bu derleyici tarafından yazılmış bir prog'yu sökmek zorunda kaldım, bir tür demek, ancak kod elde edilmedi. Hafif bir kodlara ve yavaş hıza dökülen korkunç miktarda gereksiz televizyon ve operasyonlar. Ancak, belki de DNA'da orijinal ürün yazılımını yazan bir hata vardı. Artı para istiyor. Iar gibi değil, ancak farkedilir. Ve Demozhim'de 2KB'den fazla kod vermiyor.
Tabii ki çatlak var, ama eğer çaldıysanız, bir milyon, IAR duygusunda :)

Ayrıca birde şu var Görüntü zanaat avr c ve Microc mikroelektronik olarak. Başka bir kullanımı kullanmak, ama burada SWG. Çok çiftçilik MikropaskalEriyik, çok uygun bir programlama ortamı ve kütüphanesidir. Bence Microc daha kötü olmayacak, aynı zamanda ödedi.

Dediğim gibi, ben seçiyorum Winavr. Üç nedenden dolayı: ücretsiz, AVR Studio'ya entegre edilmiştir ve tüm durumlar için bitmiş kodun bir dağılımı yazılmıştır.

Öyleyse, Winavr C ve AVR Studio'yu yüklemek için kendinizi indirin. Sonra stüdyo ilk önce, daha sonra, yukarıdan, WinAVR rulo ve bir eklenti biçiminde stüdyoya yapışır. WinAVR'yı kısa bir şekilde yüklemenizi şiddetle tavsiye ederim, böylece C: \\ Winavr gibi bir şey, böylece yollarla sorunların yığınlarından kaçınırsınız.

Proje Oluşturma
Bu nedenle, stüdyo teslim edilir, SI tutturulur, program yapacak bir şeyler denemenin zamanı geldi. Basit, en basit biriyle başlayalım. Stüdyoyu başlatın, orada seçin yeni proje, bir derleyici AVR GCC olarak ve projenin adını girin.

Çalışma alanını boş * .c dosyasıyla açar.

Şimdi, Studio sekmelerindeki yolların ekranını yapılandırmayı engellemez. Bunun için Eğik:
Araçlar menüsü - Seçenekler - Genel - Filetablar ve açılır listedeki "Sadece Dosya Adı" yi seçin. Aksi takdirde çalışmak imkansız olacak - sekmede, dosyanın tam yolu olacak ve ekranda ikiden fazla sekme olmayacak.

Proje Kurulumu
Genel olarak, tüm bağımlılıkların açıklanacağı dosyanın oluşturulması. Ve bu muhtemelen doğru. Ama ben gibi tamamen entegre ide üzerinde büyüdüm uvision. veya AVR Studio. Bu yaklaşım derinden uzaylı. Bu nedenle, kendi yolumda, tüm stüdyolarda yapacağım.

Bir dişli ile düğmeye yerleştirin.


Bunlar, projenizin ayarları veya daha doğrusu otomatik neslinin otomatik neslinin ayarlarıdır. İlk sayfada, sadece MK'nizin çalışacağı sıklığı girmeniz gerekir. Bit sigortalarına bağlıdır, bu yüzden sıklığın 8000000GZ olduğuna inanıyoruz.
Ayrıca optimizasyon dizesine dikkat edin. Şimdi Var - SOS Optimizasyonu boyutunda. Olarak ayrılırken, bu parametre ile oynamayı deneyebilirsiniz. -O0 hiç çıkarılabilir optimizasyondur.

Bir sonraki adım, yolları yapılandırmaktır. Projenizin dizinini ekleyen ilk şey var - orada üçüncü taraf bir kütüphane koyacaksınız. Liste görünecektir ". \\"

Dosya oluşturulun, projenizdeki varsayılan klasörde görebilirsiniz, sadece gözlerinizden geçerek, bakınız.


Bu kadar. Jim her yerde Tamam ve kaynağa gidin.

Sorunun formülasyonu
Boş levha, bazı zor bir fikri somutlaştırmak için çok sallandı, çünkü diyotun banal yanıp sönmesi eklenmiyor. Hadi boynuzlar için bir boğa alalım ve bilgisayarla bir bağlantı uygulayalım - bu yaptığım ilk şey bu.

Böyle çalışacak:
COM portunun gelişi altında, ünite (kod 0x31) diyozyonu yanacak ve sıfırın gelişi (kod 0x30) söndüğünde. Dahası, kesintilerde her şey yapılacak ve arka plan görevi başka bir diyot yanıp sönecektir. Sadece ve anlamı ile.

Şemayı topla
USB-USART Converter modülünü Microdentroller Usart Converters ile bağlamamız gerekir. Bunu yapmak için, iki kablolamadan bir jumper alın ve haçı haç pimlerine koyun. Yani, RX denetleyicisi, TX Converter ve TX Converter ile RX denetleyicisi ile bağlanır.

Sonuç olarak ortaya çıkıyor, bu böyle bir şema:


Diğer sonuçların bağlanması, beslenme, boşaltma, standarttır

Kod yazıyoruz

Hemen SI dilinin kendisinin tanımında özellikle derinleşmeyeceğimi hemen bir rezervasyon yapın. Bunun için, "SI programlama dili" klasiklerinden K & R'den ve farklı tekniklerle biten çok büyük miktarda malzeme vardır.

Böyle bir yöntem bana petekte bulundu, bir zamanlar bu dili üzerine çalıştım. Orada her şey kısa, anlaşılır ve durumunda. Yavaş yavaş yaparım ve siteme yeniden düzenlerim.

Ertelenmiş tüm bölüm yok, ama bence uzun süre değil.

Daha iyi tanımlayacağım, bu yüzden eğitim kursundan, mavi inceliklerin ayrıntılı bir şekilde maruz kalması yerine, bu tekniğin belirli sayfalarına doğrudan bağlantılar vereceğim.

Kütüphaneler ekleyin.
Her şeyden önce, gerekli kütüphaneleri ve unvanları tanımlarla ekleriz. Sonuçta, Si evrensel bir dildir ve AVR ile çalıştığımızı açıklaması gerekiyor, bu yüzden kaynak çizgisine girin:

1 #Dahil etmek.

#Dahil etmek.

Bu dosya klasörde Winavr. Ve kontrol cihazının tüm kayıtlarının ve limanlarının bir açıklamasını içerir. Ve tüm cunning, derleyici tarafından iletilen belirli bir kontrolöre referansla birlikte yapmak Parametredeki dosya MCU. Ve projenizdeki bu değişken temelinde, tüm bağlantı noktalarının ve kayıtların adreslerinin açıklamasına sahip bir başlık dosyası bu kontrol cihazındadır. Nasıl! Onsuz da, mümkündür, ancak daha sonra bir SREG veya UDR gibi kayıtların sembolik isimlerini kullanamazsınız ve "0xc1" gibi her birinin adresini hatırlamak zorunda kalmazsınız ve bu bir kafa.

Aynı ekibin kendisi #Dahil etmek.<имя файла> Projenize herhangi bir metin dosyasının içeriğini, örneğin, işlevleri veya başka bir kodun bir parçasını tanımlayan bir dosyanın içeriğini eklemenizi sağlar. Ve böylece direktif bu dosyayı bulabileceği için, projemizin yollarını belirttik (WinAVR dizini zaten orada belirtilmiş).

Ana işlev.
SI dilindeki program fonksiyonlardan oluşur. Herhangi bir sırayla ve farklı şekillerde birbirlerinden gömülebilir ve getirilebilirler. Her fonksiyonun üç gerekli parametreye sahiptir:

  • Dönüş değeri, örneğin, günah (x) X sinüsünün değerini döndürür. Matematikte olduğu gibi, kısaca.
  • İletilen parametreler, aynı X.
  • Vücut fonksiyonu.

Verilere bağlı olarak iletilen ve iade edilen tüm değerler herhangi bir tür olmalıdır.

C'deki herhangi bir program bir fonksiyon içermelidir ana. Ana programa giriş noktası olarak, aksi takdirde Nifiga değil Si :). Birinin bir milyon dosyadan başka birinin kaynağında ana varlığına göre, bunun her şeyin başladığı programın başı olduğu anlaşılabilir. Öyleyse soralım:

1 2 3 4 5 İnt ana (boşluk) (geri dönüş 0;)

İnt ana (boşluk) (geri dönüş 0;)

Her şey, ilk en basit program yazılır, hiçbir şey yapmadığı önemli değil, yeni başladık.

Yaptıklarımızı analiz edeceğiz.
int. Bu tür veri, ana fonksiyonun geri döndüğü.

Tabii ki, bir mikrodenetleyicide ana. Prensipte bir şey iade edemiyorum ve teoride olmalı void ana (boşluk)Ancak, GCC başlangıçta PC'de keskinleştirilir ve program tamamlandıktan sonra işletim sisteminin değerini döndürebilir. Bu nedenle gcc void ana (boşluk) küfür uyarısı.

Bu bir hata değil, işe yarayacak, ancak verningleri sevmiyorum.

geçersiz. Bu durumda fonksiyona ilettiğimiz bu tür veri ana. Ayrıca dışarıdan hiçbir şey alamaz, şair geçersiz. - Kukla. Fiş, bir şey iletmek veya geri dönmek için gerekli olmadığında uygulanır.

Bunlar { } Şekil ayraçları bir yazılım bloğudır, bu durumda vücut fonksiyonu ana., kod olacak.

dönüş. - Bu, ana işlevin tamamlandıktan sonra vereceğinden, yani, yani numarayı iade etmesi gereken sayıdır. Hala mantıklı gelmese de, çünkü Main'den mikrodenetleyicide, hiçbir yerde hariç. Sıfır döndüm. Figh için. Ve derleyici genellikle akıllıdır ve kod kod oluşturmaz.
Her ne kadar, eğer sapıksan, sonra ana. MC'ye gidebilirsiniz - örneğin, bootloader bölümüne girebilir ve bunu yerine getirin, ancak geçiş adreslerini ayarlamak için zaten düşük seviyeli bir ürün yazılımı toplama var. Aşağıda nasıl yapılacağını görecek ve anlayacaksınız. Ne için? Bu başka bir soru, bu Nafig'in gerekli olmadığı durumların% 99,999'unda :)

Yapılmış, daha ileri gitti. Bir değişken ekleyin, özellikle bizim için gerekli değildir ve değişkenleri tanıtmak gerekli değildir, ancak öğreniyoruz. Değişkenler fonksiyonun gövdesi içine eklenirse - o zaman yereldir ve yalnızca bu işlevde bulunur. İşlevi bıraktığınızda, bu değişkenler kaldırılır ve RAM hafızası daha önemli ihtiyaçlara verilir. .

1 2 3 4 5 6 İnt ana (geçersiz) (imzasız char i; geri dönüş 0;)

İnt ana (geçersiz) (imzasız char i; geri dönüş 0;)

imzasız. Çok dikkatli olmayan. Gerçek şu ki, ikili temsilde, işaret için kıdemli bir bitimiz var, bu da bir bayt (char) + 127 / -128 numaralı sayısında, ancak işaretleri 0 ila 255 arasında olursa. Genellikle işaretidir. gerekli değil. Böylece imzasız..
bEN. - Bu sadece değişkenin adıdır. Daha fazla yok.

Şimdi limanları başlatmanız gerekir ve UART.. Tabii ki, kütüphaneyi alabilir ve bağlayabilir ve bir tür Uartinit (9600); Ama o zaman aslında ne olduğunu bilemezsin.

Biz bunu yaparız:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 İnt ana (geçersiz) (imzasız karakter I; #define xtal 8000000L #define baudrate 9600L #Define Bauddivider (XTAL / (16 * Baudrate) -1) #Define Hi (x) ((x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) Ubrrl \u003d lo (bauddivider); Ubrrh \u003d Merhaba (Bauddivider); UCSRA \u003d 0; UCSRB \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

İnt ana (geçersiz) (İmzasız Char I; #DEFINE XTAL 8000000L #define Baudrate 9600L #define BaudDivider (XTAL / (16 * Baudrate) -1) #define Hi (x) ((x) \u003e\u003e 8) #define lo ( x) ((x) & 0xff) Ubrrl \u003d lo (Bauddivider); Ubrrh \u003d Merhaba (Bauddivider); UCSRA \u003d 0; UCSRB \u003d 1<

Korkutucu? Aslında, buradaki gerçek kod sadece beş satırdır. Her şey bu #Tanımlamak Bu bir makro-dil ön işlemdir. Assemble'teki gibi neredeyse aynı toplar, ancak sözdizimi biraz farklıdır.

Gerekli katsayıları hesaplamak için rutin işlemlerinizi kolaylaştırırlar. İlk satırda bunun yerine Xtal 80.000.000'i güvenli bir şekilde değiştirebilirsiniz ve L.- Tip Şartname, Long Mall, işlemci saat frekansıdır. Aynı baudrate. - UART tarafından veri sıklığı.

bauddivider. Zaten daha karmaşıklaşın, önceki iki kişinin formülü ile hesaplanan ifade yerine ikame edilecektir.
İyi ve Lo. ve SELAM Bu sonuçtan daha genç ve kıdemli baytları alacak, çünkü Bir baytta açıkça sığmayabilir. İÇİNDE SELAM ICSE kayması (Makroyun giriş parametresi) sağda sekiz kez, sonuç olarak, sadece en eski bayt kalacaktır. A B. Lo. Bir parti yaparız ve bir sayı 00FF ile sonuç olarak, bunun sonucunda sadece en genç bayt kalacaktır.

Öyleyse her şey yapılır #Tanımlamak Güvenli bir şekilde atabilirsiniz ve istenen numaralar hesap makinesinde sayılabilir ve hemen bunları UBBRL \u003d satırlarına girin .... ve ubbrh \u003d ... .. ..

Yapabilmek. Fakat! Bunu yap Kategorik olarak imkansız!

Ayrıca çalışmak için çalışacak, ama sözde söz sahibi olacaksın sihirli sayılar - NEDEN NEREDEN NEDEN NEDEN NEDEN NEDEN NEDEN ÖNCEKİ DEĞERLENDİRMEYEN DEĞERLER, birkaç yıl içinde böyle bir projeyi bağışırsanız, o zaman onu lanet olacağını anlamak zordur. Evet ve şimdi, hızı değiştirmek veya kuvars sıklığını değiştirmek istiyorsunuz ve her şeyin yeniden hesaplaması gerekecek ve bu yüzden kodda ve her şeyin kendisinde bir kaç tsiferok'u değiştirdi. Genel olarak, bydlokoder'ın keyfini çıkarmak istemiyorsanız, kodu yapın, böylece okunması kolaydır, anlaşılabilir ve kolay değiştirildi.

Sonra her şey basit:
Tüm bu "Ubrrl ve Co", dünyayla iletişim kuracağımız vericinin yapılandırmasının kayıtlarıdır. Ve şimdi istenen hızı ve doğru modu yapılandırarak gerekli değerleri atadık.

Kayıt Görünümü 1< Aşağıdakiler anlamına gelir: 1 alın ve yerine koyun Rxen. Anında. Rxen. Bu, sicilin 4. bitidir. UCSRB., Böylece 1< İkili sayı 00010000, Txen. - Bu 3. bir bit ve 1< DAST 00001000. Bekar "|" O kırık VEYASO 00010000 | 00001000 \u003d 00011000. Gerekli gerekli yapılandırma bitleri aynı şekilde sergilenir ve genel demet'e eklenir. Sonuç olarak, montaj numarası UCSRB'de yazılmıştır. Ayrıntılar USART bölümündeki MC'de verihede yazılmıştır. Öyleyse teknik detaylar ile dikkatini dağıtmayın.

Hazır, ne olduğunu görmenin zamanı geldi. Derleme ve emülasyonun lansmanında pips (Ctrl + F7).

Hata ayıklama
Her türlü ilerleme çubuğu koştu, stüdyo değişti ve sarı bir ok ana fonksiyonun yakınında ortaya çıktı. Bu, işlemcinin şu anda güncel olduğu yerdir ve duraklamadaki simülasyon.

Gerçek şu ki, başlangıçta aslında, Ubrrl \u003d lo (Bauddivider) satırında durdu; Ne de olsa, tanımlamamızda olduğumuz gerçeği kod değil, sadece ön hesaplamalar, sonra simülatör biraz tutturulur. Ama şimdi gerçekleşti, ilk talimat tamamlandı ve eğer bir ağaca tırmanırsanız G / Ç Görünümü, USART bölümünde ve UBBRL baytında orada kazanın, zaten orada olduğunu göreceksiniz! 0x33.

Bir adım daha yapın. Başka bir kayıt değişikliğinin nasıl değiştiğine bakıldığında. Öyleyse hepsini sigorta, tüm belirtilen bitlerin söylediğim gibi sergilendiği gerçeğine dikkat edin ve baytın tamamı için bir zamanlar ayarlanır. Bir sonraki dönüş çalışmıyor, program bitti.

Açılış
Şimdi simülasyonu sıfırla sıfırlayın. Oraya tıklayın Sıfırla (Shift + F5). Sökme listesini açın, şimdi kontrol ünitesinde ne olacağını göreceksiniz. Görünüm -\u003e Disonsembler. Ve Yyaaaa değil !!! Assembler !!! Uzhos !!! Ama yapmalısın. Böylece, daha sonra, bir şeyler ters gittiğinde, koda girmedi ve forumlardaki Lamer sorunlarını sormadı ve derhal kaybedersiniz ve nerede durduğunu izledi. Orada korkunç bir şey yok.

İlk olarak, seri bir üst olacaktır:

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 atlama 00.000.002: 940C0034 JMP 0x00000034 atlama 00.000.004: 940C0034 JMP 0x00000034 atlama 00.000.006: 940C0034 JMP 0x00000034 atlama 00.000.008: 940C0034 JMP 0x00000034 atlama + 0000000A: 940C0034 JMP 0x00000034 atlama + 0000000C: 940C0034 JMP 0x00000034 atlama + 0000000E: 940C0034 JMP 0x00000034 atlama 00.000.010: 940C0034 JMP 0x00000034 atlama 00.000.012: 940C0034 JMP 0x00000034 atlama 00.000.014: 940C0034 JMP 0x00000034 atlama 00.000.016: 940C0034 JMP 0x00000034 atlama 00.000.018: 940C0034 JMP 0x00000034 atlama + 0000001A: 940C0034 JMP 0x00000034 atlama + 0000001C : 940C0034 JMP 0x00000034 atlama + 0000001E: 940C0034 JMP 0x00000034 atlama 00.000.020: 940C0034 JMP 0x00000034 atlama 00.000.022: 940C0034 JMP 0x00000034 atlama 00.000.024: 940C0034 JMP 0x00000034 atlama 00.000.026: 940C0034 JMP 0x00000034 atlama 00.000.028: 940C0034 JMP 0x00000034 atlama

00000000: 940C002A JMP 0x0000002A atlama 00.000.002: 940C0034 JMP 0x00000034 atlama 00.000.004: 940C0034 JMP 0x00000034 atlama 00.000.006: 940C0034 JMP 0x00000034 atlama 00.000.008: 940C0034 JMP 0x00000034 atlama + 0000000A: 940C0034 JMP 0x00000034 atlama + 0000000C: 940C0034 JMP 0x00000034 atlama + 0000000E : 940C0034 JMP 0x00000034 atlama 00.000.010: 940C0034 JMP 0x00000034 atlama 00.000.012: 940C0034 JMP 0x00000034 atlama 00.000.014: 940C0034 JMP 0x00000034 atlama 00.000.016: 940C0034 JMP 0x00000034 atlama 00.000.018: 940C0034 JMP 0x00000034 atlama + 0000001A: 940C0034 JMP 0x00000034 atlama + 0000001C: 940C0034 JMP 0x00000034 atlama + 0000001E: 940C0034 JMP 0x00000034 atlama 00.000.020: 940C0034 JMP 0x00000034 atlama 00.000.022: 940C0034 JMP 0x00000034 atlama 00.000.024: 940C0034 JMP 0x00000034 atlama 00.000.026: 940C0034 JMP 0x00000034 atlama 00.000.028: 940C0034 JMP 0x00000034 atlama

Bu, kesme vektörlerinin tablosudur. Buna geri döneceğiz, sadece olduğunu görür ve hatırlayacağız. İlk sütun, komutun yalan söylediği flaşın flaş adresidir, üçüncü Mnemonic ekibinin ikinci komut kodu, aynı montaj talimatı, ekibin üçüncü işleneni. Otomatik bir yorum.
Öyleyse, bakarsanız, katı geçişler vardır. Ve JMP komut kodu dört bayt, geriye doğru kaydedilen geçiş adresini içerir - genç adres için genç bayt ve Geçiş komutu 940C kodu kodu

0000002B: BE1F 0x3F, R1, G / Ç konumuna kadar

Bu sıfırı 0x3f adresine kaydetme G / Ç Görünür sütununu görürseniz, o zaman 0x3f adresinin SREG - Bayrak Kayıt Kumanda Kayıt Kayıtlarının adresi olduğunu göreceksiniz. Şunlar. Programı sıfır koşullarda çalıştırmak için SREG'yi sıfırlıyoruz.

1 2 3 4 + 0000002C: E5CF LDI R28.0x5F Yük Acemi + 0000002D: E0D4 LDI R29.0x04 Yük Arama + 0000002E: BFDE OUT 0x3E, R29 G / Ç YER + 0000002F OUT: BFCD OUT 0x3D, R28 OUT-I / O Konum

0000002C: E5CF LDI R28.0x5F Yük Acemi + 0000002D: E0D4 LDI R29.0x04 Yük Arama + 0000002E: BFDE OUT 0x3E, R29 OUT G / Ç YER + 0000002F: BFCD OUT 0x3D, R28 OUT-G / O Konum

Bu, yığın işaretçisinin yüklenmesidir. G / Ç kayıtlarında doğrudan nakliye, yalnızca orta kayıt yoluyla yapamaz. Bu nedenle, ara üründe ilk LDI ve sonra oradan I / O'da. Ayrıca sana yığın hakkında daha fazla şey söyleyeceğim. Bu arada, bunun, RAM'in sonunda asılı, bu kadar dinamik bir bellek alanı olduğu bilinmektedir ve adresleri ve ara değişkenleri tutar. Şimdi bir yığımın nerede olacağını belirttik.

00000032: 940C0041 JMP 0x00000041 Atlama

Programın Saaaeaeee'nin ucuna atla ve orada kesintilerin yasağına sahibiz ve kendiliğinden sıkıca döndürüyoruz:

1 2 +00000041: 94F8 CLI Global Interrupt Devre Dışı Bırak +00000042: CFFF RJMP PC-0X0000 Göreceli Atlama

00000041: 94F8 CLI Global Interrupt Disable +00000042: CFFF RJMP PC-0x0000 Göreceli Atlama

Bu, ana işlevden çıktı gibi öngörülemeyen koşullar durumunda. Böyle bir döngüden, denetleyici bir donanım sıfırlama ile görüntülenebilir veya muhtemelen Watchdog Dog - WatchDog'dan deşarj edilebilir. Peki ya da yukarıda söylediğim gibi, bu yerleri hex editöründe düzeltin ve bir ruhumuz var. Ayrıca, iki tür JMP ve RJMP geçişi olduğu gerçeğine, ilki adrese doğrudan geçiş olduğu gerçeğine dikkat edin. Dört bayt alır ve hafıza alanı boyunca doğrudan bir geçiş yapabilir. İkinci tip geçiş - RJMP - akraba. Ekibi iki bayt alır, ancak geçiş, mevcut pozisyondan (adresler) 1024 adımdan ileri veya geri geçişi. Ve parametrelerinde, akım noktasından ofset belirtilir. Daha sık kullanılır, çünkü Floşta iki kat daha az alan alır ve uzun faktörler nadiren gereklidir.

1 +000034: 940C0000 JMP 0x00000000 Atlama

00000034: 940C0000 JMP 0x00000000 atlama

Ve bu, kodun başlangıcında bir atlama. Bir tür yeniden başlat. Kontrol edebilirsiniz, tüm vektörler buraya atlar. Bu çıktıdan - kesmelerine izin vermenize izin verirseniz (varsayılan olarak yasaktırlar) ve kesintiye uğrayacaksınız, ancak işleyici yoktur, ancak bir program sıfırlama olacak - programın sıfırlanması olacak - program programı en başında atacak.

Ana işlev. Her şey benzer, hatta tarif edemezsiniz. Sadece kayıtlara bakmak zaten numarayı hesapladı. Ön İşlemci Derleyici Taksiler !!! Yani hayır "sihir" numaraları yok!

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

00000036: E383 LDI R24.0x33 Acintion +000037 yükü: B989 OUT 0x09, R24 G / Ç YER 15: UBRRH \u003d HI (Bauddivider); +000038: BC10 OUT 0x20, R1'e G / Ç YER 16: UCSRA \u003d 0; +000039: B81B OUT 0x0b, R1, G / Ç YER 17: UCSRB \u003d 1<

Ve işte jamb:

1 2 3 + 0000003E: E080 LDI R24.0x00 Load Hemen + 0000003F: E090 LDI R25.0x00 Halfer +00000040: 9508 RET Subroutine Return

0000003E: E080 LDI R24.0x00 Load Hemen + 0000003F: E090 LDI R25.0x00 Acinge +00000040: 9508 RET Subroutine Return

Bu derleyicinin neden böyle bir topmaster eklediği sorulur. Ve bu hiçbir şey değil, 0 değerinden başka bir şey değil, daha sonra int ana (geçersiz) olarak tanımladık. Bu yüzden dört bayttan fazlasını kazandım :) ve eğer bir void ana (boşluk) yaparsanız, sadece ret olacaktır, ancak varlık olacaktır. Ne söylüyorlar ki, ana fonksiyona hiçbir şey iade etmiyoruz. Genel olarak, senin gibi yap :)

Karmaşık? Hayır gibi görünüyor. Disonsembler modunda adım adım performansı ve işlemci, kayıtlarla gerçekleşen bireysel talimatlar gerçekleştirirken Pokery'de adım adım performansı atlarım. Komutlar ve son döngü üzerinde nasıl hareket edersiniz.

Devam birkaç gün içinde takip ediyor ...

Üstü kapalı:
Alexei78. Firefox için firefox için sabitleme takibi Sitem ve forumda navigasyonu kolaylaştırıyor.
Tartışma ve indir

AVR mikrodenetleyicilerini programlamak için, bir sürü geliştirme aracı vardır, ancak, şüphesiz, bir paket tanınmalıdır. AVR Studio. . Böyle bir popülerliğin birkaç nedeni var - bu Şirket tarafından geliştirilen ücretsiz bir pakettir. Atmel , Metin editörünü, montajcıları ve simülatörü birleştirir. AVR Studio paketi ayrıca sabitleme donanımı ile birlikte kullanılır. Önerilen makalede, örnekler, AVR Studio'nun bireysel bileşenlerinin bireysel bileşenlerinin etkileşimini anlamalarına yardımcı olacak bir paketle çalışma tekniklerini göz önünde bulundurur.

Makalenin bir sonraki bölümünde, SI'de yazılı programların AVR Studio ortamında hata ayıklama hakkında açıklanacaktır.

AVR Studio paketi, mevcut sürümlerin sayısına yansıyan sağlam bir gelişme geçmişine sahiptir. 2003'ün sonunda, 4.08, bir dizi faydalı ilavelere sahip olan ve 2004 yılının başında bir güncelleme (Service Pack 1) piyasaya sürüldü, ATMEGA48'in üçüncü neslinin AVR kontrolörlerine destek ekledi. aile. Bu ailenin cipslerinin üretimi 2004 yılının ikinci yarısı için planlanıyor.

Paket dağıtım ve servis paketi www.atmel.com adresinden indirilebilir veya bu dağılımı Rusça'nın Rus distribütöründen alınabilir.

AVR Studio paketinin çalışmaları, herhangi bir özel programda rahatlıkla gözden geçirilir. Bir fikir olarak, iki LED'i aydınlatacak en basit program için bir proje oluşturmayı düşüneceğiz. Kesinlikle, bir mikro krema Atmega128. ve iki LED'i sonuçlar 31 ve 32'sinde bağlayın (Bunlar, D Port D Chip ATMEGA128'in bitleri 6 ve 7'dir). AVR kontrolörleri Güçlü çıkış basamaklarına sahip olan her bir çıkışın tipik akımı 20 mA, maksimum çıkış akımı 40 mA'dır ve bu, hem akış hem de akış akımını ifade eder. Örneğimizde, LED'ler anotlara kontrolörün sonuçlarına bağlanır ve su verme dirençleri içindeki katotlar toprağa bağlanır. Bu, LED'in "1" besleme ile ilgili bağlantı noktası çıkışına kadar ateşlendiği anlamına gelir. Şematik diyagramı şekilde gösterilmiştir. Diyagram ayrıca, programlardan birinde kullanılacak iki düğmeyi de gösterir.

Burada, en basit örnek için bir çip türü seçme konusunda küçük bir daldırma yapmak uygundur. Nitekim, ilk bakışta, garip görünebilir, neden yeterli 8 pinli çipin olduğu 64 pinli bir durumda böyle güçlü bir kristal gerekir Attiny12. ? Ancak, bu yaklaşımda mantık var. Neredeyse herhangi bir AVR kontrol cihazının kalbinde aynı çekirdeğe geçtiği bilinmektedir. Ve büyük ve büyük, kontrolörler bellekte farklılık gösterir, G / Ç bağlantı noktalarının sayısı ve bir dizi çevresel modül. Her spesifik kontrol cihazının özellikleri - Bağlama mantıksal isim / çıktı kayıtları fiziksel adreslere, kesme vektörlerinin adresleri, bağlantı noktası bitleri, vb. AVR Studio paketine dahil olan dahili dosyalarda açıklanmaktadır. Sonuç olarak, belirli bir kristal türü kullanarak, programı kendisi için ve daha genç kristal için hata ayıklayabilirsiniz. Ayrıca, en üst düzey kristali hata ayıklama olarak kullanırsanız, bugün ATMEGA128, hemen hemen her AVR kontrol cihazı için bir programı hata ayıklayabilirsiniz, sadece hedef mikrodenetleyiciden eksik olan donanım kaynaklarını kullanmanız yeterlidir. Böylece, örneğin, ATMEGA128'de yapılacak programı hata ayıklayabilirsiniz. Attiny13. . Bu durumda, kaynak kodu pratik olarak aynı kalacaktır, yalnızca 128def.inc ile bağlı dosyanın adı TN13DEF.Inc. Bu yaklaşımın da avantajları vardır. Örneğin, "Ekstra" G / Ç bağlantı noktaları bağlamak için kullanılabilir. Lcd göstergesi Hata ayıklama bilgisini çekebilirsiniz. Veya, ATMEGA128 çipinin JTAG portuna bağlanan intrahemum emülatörünü kullanın (Attiny13 denetleyicisi bu bağlantı noktasına sahip değil). Böylece, "Kıdemli" AVR kontrol cihazının takıldığı tek bir hata ayıklama tahtası, doğal olarak AVR mikrodenetleyicilere dayanan yeni geliştirilen herhangi bir sistemleri hata ayıklamak için mümkündür. Bu panolardan biri AS-MEGAM olarak adlandırılır. Makalede verilen program örnekleri oluşturmak için kullanıldı. Bu, harici RAM içeren, iki port içeren ATMEGA128 çipine dayanan evrensel bir tek pano kontrol cihazıdır. RS-232. , LCD göstergeyi bağlamak için liman, intrahemnoe programcı ve emülatörü Jtag Buzunda . Kurul ayrıca flash-rom serisi çipi bölmek için bir yeri vardır. At45 Konutlarda TSOP32 / 40/48 ve iki kanallı bir serisi DAC AD5302 / AD5312 / AD5322 . Şimdi, AVR Canavarının kullanımının nedenlerini bir çift swatodyiot'u ateşlemek için açıkladıktan sonra, daha ileri gidebilirsiniz.

AVR stüdyo ortamında programlama yaparken, standart bir eylem dizisi yapmanız gerekir:

  • derleme
  • Proje oluşturma, Project \\ New Project menüsünün seçilmesiyle başlar. Açılan "Yeni Proje Oluştur" penceresinde, projenin adını, (bizim durumumuzda - Sample1) ve başlatma dosyasının adını belirtmelisiniz. "İleri" düğmesine bastıktan sonra, Hata ayıklama platformu ve Aygıt penceresi, hata ayıklama platformunun (simülatör veya emülatör) seçildiyse ve mikrodenetleyicinin türü açılır.

    Sunulan Intrahemny emülatörlerinden birini seçebilirsiniz, her emülatörün desteklenen kendi mikroçatif listesine sahip olduğunu unutmayın. Dikkate alınan örnek için, bir hata ayıklama platformu AVR simülatörü ve ATMEGA128 yongası olarak seçiyoruz. "Son" düğmesine bastıktan sonra, çıktımız boş iken AVR Studio paketinin çalışma pencereleri görünür. Programın kaynak metnini yerleştirmek için doğru pencereyi izler. Bu iki şekilde yapılabilir veya tüm metni doğrudan Editör penceresinde çevirin veya mevcut bir dosyayı indirin. Aşağıda, yorumları olan en basit programın tam metnidir.

    ; Örnek "LED kontrol"; AS-Megam Hata Ayıklama Kurulu için yazılmış; Parametre jeneratörünün sıklığı 7.37 MHz; LED'ler PD6 ve PD7 sonuçlarına ve dirençler aracılığıyla - paylaşılan bir tel üzerinde bağlanır. ; ATMEGA128 Devre G / Ç Ayrıntılarının "M128DEF.Inc"; Başlangıç \u200b\u200bprogramının başlangıcı:; İlk operasyon - Yığın başlatılması; Bu yapılmazsa, daha sonra bir alt yordam veya durdurun; kontrolü geri dönmeyecek; Yığının sonundaki işaretçi, iç RAM'in son adresine ayarlanır - Ramend LDI R16, Düşük (Ramend) Out SPL, R16 LDI R16, Yüksek (Ramend) Out SPH, R16; PD6 ve PD7 sonuçlarına bağlı LED'leri kontrol etmek için; Bu sonuç çıktılarını ilan etmek gerekir. ; Bunu yapmak için, DDRD Kaydının (DataDirection) LDI R16'sının karşılık gelen bitlerine "1" yazın, (1<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    Proje birkaç dosyadan oluşabilirken, bir dosya ana olanı atanır. Tüm işlemler, farenin bağlam düğmesini kullanarak üretmek için uygundur. Kaynak dosyayı bağladıktan sonra, Windows aşağıdaki forma sahiptir.

    Projenin derlenmesi \\ Project \\ Build komutu veya F7 düğmesine basarak yapılır. Derleme işlemi "çıktı" penceresinde görüntülenir. Bu pencere, \\ view \\ çıkış komutunu "çekerek" olabilir.

    Prensip olarak, zaten Microcircuit'a yüklenebilir ve LED'lerin mütevazı heyeti gözlemleyebilen Format.hex'te bir çıktı dosyası aldık. Bununla birlikte, makalenin amacı AVR Studio ortamında tam çalışma döngüsünü göstermektir, bu yüzden hata ayıklama aşamasına gidiyoruz. Bu, \\ debug \\ Start hata ayıklama ekibi tarafından yapılır.

    Şimdi, programın yürütme süresini doğru bir şekilde ölçmek için "Simülatör Seçenekleri" penceresinde kuvars frekansı 7,3728 MHz sıklığını ayarlayın.

    Kalan seçenekler değişmeden bırakılmalıdır. Artık fareyi veya F11 düğmesini kullanarak adım adım modunda bir program yapabilirsiniz.

    AVR Studio Paketi, Hata Ayıklanmış Mikrodenetleyici'nin iç kayıtlarının ve G / Ç bağlantı noktalarının yanı sıra, programın yürütülmesi durumunun yanı sıra, iç kayıtların ve G / Ç bağlantı noktaları görüntülemek ve düzenlemek için güçlü araçlar içerir. Bunlara erişim "G / Ç" penceresinden gerçekleştirilir.

    Aslında, AVR Studio Paketi ile mevcut olan bilgi miktarı, Windows'u görüntüleme, maksimum rahatlık elde etmek için iki monitör bir yapılandırmada bir bilgisayarın kullanılması gereklidir.

    Örneğimizi hata ayıklamak için, D bağlantı noktalarına erişmek için, G / Ç ATMEGA128 dizesini ve ardından PORTD satırını açmanız gerekir. Artık bu portun üç kayıtının tümü, Portd, DDRD ve Pind, görünür. Değer, bit ve adres alanlarını görmek için, pencerenin sağ sınırını genişletmeniz, pencereyi programın kaynak metni ile terletmeniz gerekir.

    Şimdi programı adım adım modunda geçerken, bu kayıtların geçerli durumlarındaki değişiklikleri bit alanındaki görebilirsiniz. Port kayıtlarının herhangi bir bitinin durumunu hızlı bir şekilde değiştirmek mümkündür ve bu, değer alanına yeni bir kod yazarak veya doğrudan kaydının istediğiniz biti tıklayarak yapılabilir.

    Bağımsız alıştırmalar için, öncekinden, LED'lerin ateşlemesinin iki düğme tarafından kontrol edildiği öncekinden farklı olan aşağıdaki program önerilmiştir.

    ; Örnek "Düğmelerden LED Kontrol"; AS-Megam Hata Ayıklama Kurulu için yazılmış; LED'ler PD6 ve PD7 sonuçlarına ve dirençler aracılığıyla - paylaşılan bir tel üzerinde bağlanır. ; Düğmeler - PE4 ve PE5. "M128DEF.Inc"; Ana Programa Başlayın :; Yığın başlatılması LDI R16, Düşük (Ramend) Out SPL, R16 LDI R16, Yüksek (Ramend) OUT SPH, R16; LED LED'lerin R16'sının başlatılması (1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    Böylece, en basit programların örneğinde, AVR Studio paketinin bazı özellikleri gösterilmiştir. Bunun sadece temel paket komutlarıyla hızlı bir şekilde kullanmanızı sağlayan ilk tanışma olduğunu anlamak gerekir. Bu arada, dikkate alınan paketin yetenekleri çok daha geniştir. Örneğin, burada üst düzey dillerde yazılan programları hata ayıklayabilirsiniz. Özellikle, ImageCraft şirketinin C-derleyicisi, AVR Studio hata ayıklayıcısını "yerli olarak" kullanır. Bunu yapmak için, kaynak kodunu derlerken, çıktı dosya oluşturma seçeneğini AVR Studio ile uyumlu bir biçimde ayarlamanız gerekir. Aynı zamanda, kaynak kodları hata ayıklamak mümkündür.

    AVR Studio paketinin birçok özelliğinden başka bir diğeri, harici programları bağlayabilme yeteneğidir. Örneğin, birkaç basit işlemi gerçekleştirmek için AS2 denetim programcısının gerekli olduğundan emin olmak için.

    Ana pencerenin AVR stüdyosunun Araçlar menüsünde, özelleştir seçeneğini belirlemelisiniz;

    Pencereyi özelleştirin, Araçlar öğesini seçin;

    Fare düğmesine çift tıklamak veya klavyeye ekle'ye basmak, listeye yeni bir komut ekleyin ve "AS2 programcısı" olarak adlandırın;

    Programcı yürütülebilir dosyanın yolunu doğrudan "Komut" giriş alanına girerek veya bu alanın sağındaki "..." düğmesine tıklayarak;

    Şimdi Araçlar menüsü "Programcı AS2" görünür.

    AVR Studio 4.08 Paket, yardımcı programları bağlamanıza izin ver - Eklentiler. AVR Studio için ilk eklenti, AVR Controller ATMEGA169'u doğrudan yönetebilen LCD göstergesinin başlatma işlemini basitleştiren bir grafikselleştirici programdır. LCD göstergesinin maksimum mantık boyutu 100 segmenttir, göstergenin her bir elemanı, kontrol cihazının özel kayıtlarında bite göre yapılır. Her bölüm için belirli bitler için rutin bağlanma prosedürünü basitleştirmek için yukarıda belirtilen programı kullanabilirsiniz.

    "AVR anavananını" ziyaret ederken - Maddenin Norveç Ofisi, Makalenin yazarlarından biri, AVR Studio paketini oluşturan ve destekleyen Programcı Grubu'nun başı olan Lars Quener ile konuştu. Klasik bir programcı olan bu kişi, sakallı, bir kazakta ve çorap sandaletlerinde dokuma olan bu kişi, paketin gelişimi için beklentiler hakkında konuştu. Bir sonraki sürümde (4.09), arayüz yeni bir intrahemnoe emülatörü için etkinleştirilecektir - Yılın ikinci yarısında Jtagice'de yerini alacak olan JTAGICE MKII (Jtagice2'de de denir). Bu emülatın iki önemli farkı var. Bir yandan, genç AVR kontrolörleri, debugwire için yeni bir tek kablolu hata ayıklama arayüzü için destek verdi. Bu arayüz ilginçtir, çünkü RESET mikrodenetleyicinin çıktısını değiştirmek için kullandığı için, mikrodenetleyicinin ek bir sonucu işgal etmemesidir. Öte yandan (bu ifadeyi kelimenin tam anlamıyla anlayabilirsiniz), Jtagice2'de Emulator, sonunda, bilgisayarla iletişim kurmak için USB arayüzü görünecektir.

    Edebiyat

    1. AVR Teknik Eğitim Teknik Seminer Malzemeleri. Atmel. Norveç. Deceptber 2003.
    2. Nikolay Korolev, Dmitry Korolev AVR-Mikrodenetçiler İkinci nesil: Geliştiricinin ortamı. // Bileşenler ve Teknolojiler, 2003 No. 7
    3. İkinci nesil AVR-mikrodenetleyiciler: Yeni Donanım Yetenekleri // Bileşenler ve Teknolojiler. 2003. No. 4.
    4. Nikolay Korolev, Dmitry Korolev. AVR Mikrodenetleyiciler: Küçük küçük. // Schemery ", 2001, №5
    5. Nikolay Korolev, Dmitry Korolev. AVR Mikrodenetleyiciler: Yazılım // Bileşenler ve Teknolojiler, 2000. No. 4.
    6. Nikolay Korolev. AVR: Geliştirici Donanım // Bileşenler ve Teknolojiler, 1999 № 1
    7. Nikolay Korolev. ATMEL RISC-MICROKONTROLLERS // Chip-News 1998, №2
    8. Nikolay KOROLOV, DMITRY KOROLOV AVR: Şirketin yeni 8-bit RISC-Mikrodenetçiler Atmel // Mikroişlemci yorumu, 1998, №1

    Her nasılsa, AVR kontrolörleri için programlama ortamı seçeneği hakkında tavsiyede bulunmak için hemen çekti. Sadece bana spor ayakkabılarını atmayın. Ben biraz biraz

    Mikrodenetleyici için programlanan diller çok. Programlama ortamı da yeterli değildir ve bunlarla yanlış. Daha iyi programlama dilleri yoktur. Bu yüzden sizin için en uygun dili ve programlama ortamını seçmeniz gerekir.

    Şu anda iseniz, seçimin önünde durun, çalışmaya başlayacağınız, işte birkaç öneri.

    Eski programlama deneyimi. Programlamadaki eski deneyimi ihmal etmeyin. Baisik olsa bile. Okulda uzun zaman olsa bile. Bisiklete binmek gibi programlama - sadece başlamak zorundasınız ve unutulmuş her şeyi hatırlamak zorundasınız. Beyika ile başlayın - istenmeyen - daha sonra amaçlarınız için daha uygun bir şey seçmek daha kolay olacaktır.

    Çevreye yardım et.Arkadaşların Pascal'a yazıyor mu? Sizin için bir soru çözülür - Pascal'a yazın! Her zaman konseye yardım edeceksiniz, kütüphaneler kütüphanelere atılacak, hazır projeler verecek. Genel olarak, topluluklarına mutlu olur. Aksine yaparsanız, zıt sonucu alın. Arkadaşlar Sishers, montajcıyı incelemeye karar veren sizi eğlendirir. Yardım beklemeyin.

    İyi AVR Programlama Kitabı Çok iyi yardımcı olacak. Ne yazık ki, çok azı var. Eğer elinizde bir kitap var ve her şeyin içinde çok uygun olduğunu düşünüyorsunuz. - Deneyin. Son çare olarak, e-kitaplarla öğrenmeyi tavsiye etmiyorum. Dosya dosyasının çevre ve metin arasında geçiş yapmak için çok rahatsız. Kitabı okumak çok daha hoş, hemen değiştirerek dikkatini dağıtmadan deneyin, ek olarak, alanlarda bir işaret yapabilirsiniz, ortaya çıkan fikirleri yazabilirsiniz.

    Programlama ortamı daha basit. Dil programlamanızın çeşitli programlarının bir seçimi varsa - şüphe etmeyin, daha kolay olanı seçin. Daha az işlevsel olmasına izin verin. Korkunç şişirilmiş kodları derleyin. Asıl şey sadece çalışmaya başlamaktır. Basit bir ortamda eğildikten sonra, daha gelişmiş ve "doğru" bir ortama kolayca gidersiniz. Ve daha fazla zaman kaybedeceğinizi söyleyenleri dinlemeyin - yanlışlar. Junior sınıflarının öğrencilerinden "Savaş ve Barış" okuması istenmez, onlara kitapları kolaylaştırırlar - resimlerle.

    Kütüphaneler. Kütüphanelerin varlığı, dil öğrenmek için tartışmalıdır. Tabii ki, daha sonra, hayatı büyük ölçüde kolaylaştıracaklar, ancak ilk "kara kutular" da anlaşılmaz ve dilin anlaşılmasına çok yardımcı olmuyorlar. Öte yandan, programı okumayı kolaylaştırır ve özellikle zorlanmayan, karmaşık programlar oluşturmaz. Böylece, varlıkları özellikle sıkılmamıştır. En azından ilk başta.

    Etkili kod. Programlama ortamını seçmek, programlamayı yalnızca derlemenin kodunun ne kadar etkili olduğu ile seçmek kötü bir fikirdir. Temel olarak rahatça öğrenmeye başlarsınız - onuncu şey "çıkışta". Tabii ki, daha sonra üzerinde çalışabilirsiniz.

    Vizard.Kurulun üzerindeki herhangi bir cihaz, portlar kullanılarak yapılandırılmalıdır. Prosedür oldukça kuvvetlidir ve veri sayfaları gereklidir. Buna ek olarak, yeni gelenlerin sadece vermek olmadığı nüanslar var. Bu nedenle, ortamda, yapıların varlığı için çok arzu edilir. Bültenler otomatik SPI, I2C, USART, vb. Otomatik ayarlamalardır. Daha fazla cihaz desteklenir, daha iyidir. Gerekli çevresel parametreleri ortaya çıkarın ve vizörün kendisi belirtilen parametreleri sağlayacak bir kod oluşturur. Hayatı çok basitleştirir.


    Genel öneriler Böyle - ilk aşamada programlama mümkün olduğunca basit olmalıdır (ilkel olsa bile). Programlama ortamının öğrenmesi kolay olmalıdır (ihtiyacınız olarak, başlatmak, programlamayı öğrenmek, programlamayı öğrenmek, ayarları öğrenmek için). Russifi için tavsiye edilir. Ayrıca, Rus el kitabını ve programların örneklerini engellemez. Crystal'ın ortamdan ürün yazılımı olasılığı arzu edilir. Daha sonra, programlamanın temellerini terk ederken, daha karmaşık kabuklara geçebilirsiniz.


    Sonunda, gerçek bir kristal ile çalışın. Yakmaktan korkma. Pratik deneyimi geliştirmek. Emulatörlerle (örneğin proteus) ile çalışmak, ancak lehimleme demirden kurtulacak, ancak kazanılan programdan alacağınız memnuniyeti, LED tarafından ilk kupalardan alacaksınız! Kendi ellerinizle ne yaptığınızı anlamak Gerçek çalışma devresi güven ve uyarıcı harekete geçer!

    (7 377 kez ziyaret etti, bugün 1 ziyaret)

    LPT bağlantı noktasındaki programcı kavramı şekilde gösterilmiştir. Bir lastik eski olarak 74AC 244 veya 74HC244 çipini (K1564AP5), 74LS244 (K5555AP5) veya 74ALS244 (K1533AP5) kullanın.

    VD1 LED'i bir mikrodenetleyici kayıt modunu gösterir,

    vD2 LED - Okuma,

    vD3 LED - Bir diyagramın varlığı.

    Şemayı güçlendirmek için gereken voltaj, ISP konektöründen, yani. Programlanabilir cihazdan. Bu şema geri dönüştürülmüş bir STK200 / 300 programcıdır (kolay kullanım için LED'ler eklendi), bu nedenle STK200 / 300 şeması ile çalışan tüm PC programcısı programlarıyla uyumludur. Bu programcı ile çalışmak için bir program kullanın Cvavr.

    Programcı, baskılı devre kartında yapılabilir ve resimlerde gösterildiği gibi LPT konnektör muhafazasına yerleştirilebilir:




    Programcı ile çalışmak için, kendinizi kolaylaştırmak için kolay olan portun LPT ekstansiyonunu kullanmak uygundur (örneğin, yazıcı için Cableronix kablosundan), ana şey, iletkenler için "pişman olmamak". Dünya (konektörün 18-25 ayağı) veya satın al. Programcı ile programlanabilir mikro-kireç arasındaki kablo 20-30 cm'yi geçmemelidir.

    Merhaba, Sevgili Habrarites!

    Bu yazıda, bir günün, bunun için gereken mikrodenetleyicileri programlamaya nasıl başlamaya karar verdiğimden ve sonunda ortaya çıktığını söylemek istiyorum.

    Mikrodenetleyicilerin konusu, 2001 yılında uzun bir süredir beni ilgilendirir. Fakat daha sonra ikamet yerindeki programcıyı elde etmek için problemliydi ve internette ve konuşmada bir satın alma yoktu. Bu durumu en iyi zamana kadar ertelemek zorunda kaldım. Ve böylece, bir gün en iyi zamanların evden ayrılmadan geldiğini keşfettim, ihtiyacım olan her şeyi satın alabilirsiniz. Denemeye karar verdim. Öyleyse, ihtiyacımız olan şey:

    1. Programcı
    Piyasada birçok seçenek vardır - en ucuz ISS (sistem içi programlama) programcılarından birkaç dolar için, birkaç yüz için güçlü hata ayıklayıcı programcılarına kadar. Bu konuda daha fazla deneyim olmadan, ilk önce en kolay ve en ucuz - USBasp'tan birini denemeye karar verdim. Bir seferde eBay'de 12 dolara satın aldım, şimdi 3-4 dolara bile bulabilirsiniz. Aslında, bu programcının Thomas Fischl'den Çince versiyonudur. Onun hakkında ne söyleyebilirim? Sadece bir şey - işe yarıyor. Ek olarak, ATMEGA ve Attiny serisinin çok fazla AVR kontrol cihazı vardır. Linux altında bir sürücü gerektirmez.

    Ürün yazılımı için, ilgili mikrodenetleyici çıkışları ile VCC, GND, RESET, SCK, MOSI, MISO programcı çıkışlarını bağlamanız gerekir. Sadelik için, Yardımcı şemasını erkeğe göre topladım:

    Tahta üzerinde kaldı - yanıp söneceğimiz aynı mikrodenetleyici.

    2. Mikrodenetleyici
    Bir mikrodenetleyici seçimi ile, özellikle rahatsız etmedim ve AtmEga8'ten Atmel'den - 23 G / Ç Çamı, iki 8-bit zamanlayıcı, bir 16 bit, frekans - 16 MHz, küçük tüketim (1-3.6 mA) , ucuz ($ 2). Genel olarak, bir başlangıç \u200b\u200biçin - fazlasıyla yeterli.

    Linux altında, denetleyicideki ürün yazılımını derlemek ve indirmek için, AVR-GCC + Avrdede paketi mükemmel çalışır. Kurulum önemsiz. Talimatların ardından, ihtiyacınız olan her şeyi birkaç dakika içinde yükleyebilirsiniz. AVRDUDE'ye ödenmesi gereken tek elekler (kontrol cihazına kayıt için yazılım), programcıya erişme için süper bir kullanıcı hakkı gerektirebilir. Çıkış - sudo (çok iyi bir fikir değil) ile koşun veya özel UDEV haklarını kaydedin. Sözdizimi, işletim sisteminin farklı sürümlerinde farklılık gösterebilir, ancak durumumda (Linux nint 15), /etc/udev/rules.d/41-atmega.rules dosyasına aşağıdaki kural eklenerek yapıldı:

    # Usbasp Programcı Subsystem \u003d\u003d "USB", attr (iDvendor) \u003d\u003d "16C0", attr (idproduct) \u003d\u003d "05dc", Grup \u003d "PlugDev", MOD \u003d "0666"

    Bundan sonra, doğal olarak, hizmetin yeniden başlatılması gerekiyor.
    Hizmet UDEV Yeniden Başlat
    Doğrudan komut satırından (kimden şüphe uyandırır) sorunsuz bir sorun olmadan derleyebilir ve flaş edebilirsiniz, ancak birçok proje varsa, eklentiyi koymak ve her şeyi doğrudan tutulma ortamından yapmak daha uygundur.

    Windows'un altında sürücüyü teslim etmek zorunda kalacak. Gerisi içinde sorun yok. Bilimsel ilgi için, Windows'ta AVR Studio + Extreme Bringer Bundle'ı denedim. Yine, her şey bir patlama ile çalışır.

    Programlamaya başlıyoruz

    AVR kontrol cihazlarının programlanması hem montajcı (AVR assembler) hem de C'de olabilir. Burada, belirli göreve ve tercihlerine bağlı olarak herkesin kendi tercihini yapması gerektiğini düşünüyorum. Şahsen, ilk önce montaj almaya başladım. Montajcı üzerinde programlama yaparken, cihazın mimarisi daha netleşir ve duygu doğrudan kontrol cihazının içine kazdıkları görülür. Ek olarak, özellikle kritik programlarda, montajcının bilgisinin çok faydalı olabileceğine inanıyorum. AVR Assembler ile tanıştığımızdan sonra, Si'ye bağlıyım.

    Mimarlık ve temel ilkelerle tanıştıktan sonra, faydalı ve ilginç bir şey toplamaya karar verdim. Kızım bana yardım etti, satranç yapıyordu ve bir güzel akşam bir süre partiler için bir zamanlayıcı izlemesi yapmak istediğini ilan etti. Batz! İşte bu - ilk projenin fikri! Onları aynı eBay'de sipariş etmek mümkündü, ancak kendi saatinizi, siyah ... uhları ile yapmak istedim ... göstergeleri ve düğmeleri ile. Daha erken olmaz dedi ve bitirdi!

    Ekran olarak, iki 7 segmentli diyot göstergesi kullanmaya karar verildi. Kontrol etmek için yeterli 5 düğme idi - "Oyuncu 1", "Oyuncu 2", "Reset", "Ayar" ve "Duraklat". Oyunun ses göstergesini unutma. Böyle görün. Aşağıdaki şekil, mikrodenetleyiciyi göstergelere ve düğmelere bağlama genel şemasını göstermektedir. Programın kaynak kodunu ayrıştırırken ihtiyaç duyacaktır:

    Kolaylaştırıcı uçuş

    Başlayalım, çünkü programın giriş noktasından - ana işlevler. Aslında, içinde olağanüstü bir şey değil - bağlantı noktaları, veri başlatma ve sonsuz tuş basma düğmelerinin ayarlanması. Peki, SEI () çağrısı, kesintilerin işlenmesinin çözülmesi, bunlar hakkında biraz sonra.

    İnt ana (geçersiz) (init_io (); init_data (); sound_off (); sei (); (1) (1) (1) döndürme 0;)
    Her işlevi ayrı ayrı düşünün.

    Void init_io () (// set çıkış dddrb \u003d 0xff; ddrd \u003d 0xff; // Giriş DDRC \u003d 0B11100000; // Pull-up dirençleri Portc | \u003d 0B00011111; // Zamanlayıcı Keser Timsk \u003d (1<

    G / Ç bağlantı noktalarının ayarlanması çok basittir - DDRX kaydının içine (burada X harfi, bağlantı noktasıdır), her bir bit, her bir bit, karşılık gelen pimin giriş cihazı (0'a karşılık gelir) veya çıkışa (karşılık geldiği) anlamına gelir. 1'e). Böylece, DDRB ve DDRD Numarası 0xFF içerisinde Seasushal, B ve D çıkış portlarını yaptık. Buna göre, DDRC \u003d 0B11100000 komutu; C bağlantı noktasının ilk 5 portunu giriş pimlerine döner ve hafta sonu kaldı. Takım Portc | \u003d 0B00011111; Kontrol cihazının 5 girişinde iç sıkıcı dirençleri içerir. Şemaya göre, düğmeler bu girişlere bağlanır, bu da basıldığında onları toprağa kapatılır. Böylece, kontrol cihazı düğmenin basıldığını anlar.

    Daha sonra, iki zamanlayıcı, zamanlayıcı0 ve zamanlayıcı1 ayarını izlersiniz. İlk önce göstergeleri güncelledikçe ve ikincisini, her saniye tetiklemeye ayarladıktan sonra, zamanın geri sayımı için kullanıyoruz. Tüm sabitlerin ve zamanlayıcı ayar yönteminin ayrıntılı bir açıklaması, ATMEGA8'in belgelerinde belirli bir aralıkta bulunur.

    İşleme kesintisi

    ISR (ekran (); eğer (_buzzer\u003e 0) (_buzzer\u003e 0) (_buzzer--; eğer (_buzzer \u003d\u003d 0) sound_off ();))))) ISR (Timer1_Compa_Vect) (eğer (ActiveTiTimer \u003d\u003d 1 && Timer1\u003e 0) (Zamanlayıcı1-- eğer (Timer1 \u003d\u003d 0) proses_timeoff ();) ise (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2--; ise (Timer2 \u003d\u003d 0) Process_TimeOff ();))

    Zamanlayıcı tetiklendiğinde, kontrol karşılık gelen kesme işleyicisine iletilir. Bizim durumumuzda, bu, zaman çıkış prosedürünün göstergelere ve geri sayımı işleyen Timer1_compa_vect'e neden olan Timer0_ovf_vect işlemcisidir.

    Göstergelere Sonuç

    Geçersiz ekran () () (Display_Number ((((Timer1 / 60) / 10, 0b00001000); _delay_ms (0.25); Display_Number ((Timer1 / 60)% 10, 0B00000100); _delay_ms (0.25); Display_Number (((Timer1% 60) / 10, 0B00000010); _delay_ms (0,25); Display_Number (((% 10)% 10, 0B00000001); _delay_ms (0.25); Display_Number (((Timer2 / 60) / 10, 0b10000000); _delay_ms (0.25); Display_Number ((Zamanlayıcı2) / 60)% 10, 0b01000000); _delay_ms (0.25); Display_Number (((% (% 60) / 10, 0b00100000); _delay_ms (0.25); Display_Number (((((((((Timer2% 60)% 10, 0B00010000); _delay_ms (0.25); ; portd \u003d 0;) geçersiz display_number (int numarası, int maskesi) (portb \u003d number_mask (sayı); portdd \u003d maske;)

    Ekran özelliği, dinamik bir gösterge yöntemi kullanır. Gerçek şu ki, her bir göstergenin 9 kontak bulunmasıdır (Segmentler kontrolü için 7, POWER için 1 ve 1 güç kaynağı için 1). 4 haneyi kontrol etmek için 36 kişi alır. Çok israf. Bu nedenle, deşarjların çok basamaklı bir göstergeye çıktısı, aşağıdaki prensibe göre düzenlenir:

    Gerilim, aynı 8 kontrol kontaklarını kullanarak karşılık gelen göstergedeki istediğiniz rakamı vurgulamanıza olanak sağlayan paylaşılan kişilere dönüşümlü olarak beslenir. Yeterince yüksek bir çıkış frekansı ile statik bir resme benziyor. Bu nedenle, diyagramdaki her iki göstergenin de besleme temaslarının tümü 8 bağlantı noktasına bağlanır ve 16 temas kontrol segmentleri çiftler halinde bağlanır ve 8 bağlantı noktasına bağlanır. Böylece, ekranın 0.25 gecikmesi ile işlevi MS, alternatif olarak istenen numarayı göstergelerin her birine görüntüler. Sonun altına, göstergelerdeki voltajı besleyen tüm çıkışlar kapatılır (komut portdd \u003d 0;). Bu yapılmazsa, son ekran hanesi, bir sonraki çağrı adlandırılıncaya kadar yanmaya devam edecektir, bu da daha parlak luminesansına yatkınlığa kıyasla daha parlak luminesansına yol açacaktır.

    Preslerin tedavisi

    Void tool_buttons () (Auto_Button (Key_Setup); HOLDER_BUTTON (KEY_TESET); HOLDER_BUTTON (Key_Player1); Book_Button (Key_Player1); Book_Button (Key_Player2);) Void Book_Button (int tuşu) (int biti; anahtar (anahtar) (Key_Setup: bit) \u003d SETUP_BIT; BRAKET; KESİM KEYNETİ: BIT \u003d reset_bit; Bit; Bit \u003d PAUSE_PITE; BIT \u003d PLAYERS1_BITER1: Bit \u003d Player1_bit; Break; Vaka Key_Player2: Bit \u003d Player2_bit; Bitti; Varsayılan: iade;) Eğer (Bit_IS_CLEAR () Button_pin, bit)) (eğer (_pressed \u003d\u003d 0) (_delay_ms (Boşaltma_time); eğer (Bit_IS_CLEAR (BIT_PIN, BIT) (_SPLACTED | \u003d tuşu; // tuş eylem anahtarı (Key_Setup: proses_setup (); Break; Case Key_reset : proses_reset (); Break; Case Key_ Patik: Proses_pause (); Break; Case Key_Player1: Proses_Player1 () (), Break; Case Key_Player2: proses_player2 ();))) Sound_On (15);))) Sound_On (15);))) ;))

    Bu özellik sırasıyla 5 düğmeyi ve işlemlerin tümünü oluşturursa, basın. Bit_is_clear (button_pin, bit), yani Düğmeye, düğmeye, düğmeye bastığınızda, şemaya göre olacak şekilde, toprağa bağlı ise, düğmeye basılır. Gecikmeli gecikme süresi, temas çıngızları nedeniyle birden fazla gereksiz tepkileri önlemek için gereklidir ve tekrar kontrol gereklidir. Basın durumunu, uygun değişken uçlarında kaydetme _Pressed, uzun basın düğmesiyle yeniden tetiklenmeyi ortadan kaldırmak için kullanılır.
    Presleme fonksiyonları oldukça önemsizdir ve ek yorumlarda ihtiyaç duymadığına inanmaktadır.

    Tam Metin Programı

    #Define F_CPU 4000000L #include #Dahil etmek. #Dahil etmek. #define debounce_time 20 #define button_pin pinc #define setup_bit pc0 #define reset_bit pc1 #define pc3 #define player1_bit pc3 #define player2_bit pc4 #define Key_Setup 0B0000000010 #define key_pause 0B00000010 #define key_plause 0B00000100 #define key_Player1 0B00001000 #define key_Player2 0B00010000 Vakumlu int ActiveTimer \u003d 0; Volatile Int Timer1 \u003d 0; Volatile Int Timer2 \u003d 0; Volatile int _buzzer \u003d 0; Vakumlu int _pressed \u003d 0; // fonksiyon bildirimleri void init_io (); void init_data (); İnt number_mask (int num); void holt_buttons (); void handle_button (int tuşu); Void proses_setup (); Void prosesti_reset (); Void Process_Pause (); void proses_timeoff (); Void proses_player1 (); Void proses_player2 (); boşluk göstergesi (); void display_number (int maskesi, int numarası); Void sound_on (int aralığı); void sound_off (); // isr keser (ekran (); eğer (_buzzer\u003e 0) (_buzzer\u003e 0) (_buzzer--; ise (_buzzer \u003d\u003d 0) Sound_off ();))) ISR (Timer1_Compa_Vect) (eğer (ActiveTerimer \u003d\u003d 1 && Timer1\u003e 0) ( Zamanlayıcı1--; eğer (Timer1 \u003d\u003d 0) proses_timeoff ();) Eğer (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2--; ise (Timer2 \u003d\u003d 0) Process_TimeOff ();)) int ana (geçersiz) (init_io (); init_data (); sound_off (); sei (); Giriş DDRC \u003d 0B11100000; // Pull-up dirençleri Portc | \u003d 0B00011111; // Timer Timsk \u003d (1< 5940 || Timer2\u003e 5940) (Timer1 \u003d 0; Timer2 \u003d 0;)) void prosesti_reset () (init_data ();) void proses_timeoff () (init_data (); sound_on (30);) void proses_pause () (ActiveTimer \u003d 0;) Void Process_Player1 () () (ActiveTimer \u003d 2;) Void Proses_Player2 () (aktif) _Player2 () (ActiveTetimer \u003d 1;) Void Book_Button (Int tuşu) (Key_Setup: Bit \u003d Setup_BIT; Break; Case Key_Reset: bit \u003d reset_bit; ara; Case Key_PAUSE: Bit \u003d PAUSE_BITE; BRID; CASE KEY_PLAYER1: Bit \u003d Player1_bit; Break; Case Key_Player2: Bit \u003d Player2_bit; Break; Varsayılan: Geri dönüş;) Eğer (eğer (_pressed \u003d\u003d 0) (eğer (_pressed \u003d\u003d 0) ( _Delay_MS (Boşa_time); eğer (Bit_IS_CLEAR (BIT_PIN, BIT) (_SPLACTED | \u003d tuşu; // key_setup: proses_setup (); kırılma; Case Key_reset: proses_reset (); Break; Case Key_PAUSE: Process_player1; Case Key_Player1 : proses_player1 (); Break; Case Key_Player2: proses_player2 (); kopma;) Sound_on (15);))) başka (_pre SSED & \u003d ~ anahtar; )) Void taahhüt_buttons () () (tool_button (Key_Setup); HOLDEN_BUTTON (KEY_TESET); HOLDER_BUTTON (Key_Player1); HOLDER_BUTTON (Key_Player1); Book_Button (Key_Player2);) Void Ekran () (Display_Number ((Timer1 / 60) / 10, 0B00001000) ; _delay_ms (0,25); Display_Number (((Zamanlayıcı1 / 60)% 10, 0B00000100); _delay_ms (0.25); Display_Number ((Timer1% 60) / 10, 0b0000000010); _delay_ms (0.25); Display_Number (((Zamanlayıcı1% 60) % 10, 0B00000001); _delay_ms (0.25); Display_Number (((Timer2 / 60) / 10, 0b10000000); _delay_ms (0.25); Display_Number ((Zamanlayıcı2 / 60)% 10, 0B01000000); _delay_ms (0.25); Display_Number ((( % 60) / 10, 0b00100000); _delay_ms (0,25); Display_Number (((((((((((%% 60)% 10, 0B00010000); _delay_ms (0.25); Portdd \u003d 0;) void display_number (int number_mask) (portb \u003d number_mask ( Numara); portd \u003d maske;) void sound_on (int aralığı) (_buzzer \u003d aralık; // buzzer pinini yüksek portu koyun | \u003d 0B00100000;) void sound_off () (// Buzzer Pin Düşük Portc & \u003d 0B00100000);)

    Prototip bir çöplük paneline monte edildi.