İçindekiler:

AVR Assembler Eğitimi 6: 3 Adım
AVR Assembler Eğitimi 6: 3 Adım

Video: AVR Assembler Eğitimi 6: 3 Adım

Video: AVR Assembler Eğitimi 6: 3 Adım
Video: 6 ayda yazilim ogrenin, 3 ayda yazilimin icinden gecin... Balya yapin ahsgajajavsva 2024, Kasım
Anonim
AVR Assembler Eğitimi 6
AVR Assembler Eğitimi 6

Eğitim 6'ya hoş geldiniz!

Bugünkü eğitim, bir atmega328p ile diğerini birbirine bağlayan iki bağlantı noktası kullanarak veri iletmek için basit bir yöntem geliştireceğimiz kısa bir eğitim olacak. Daha sonra Öğretici 4'ten zar silindirini ve Öğretici 5'ten Kayıt Çözümleyicisini alacağız, bunları birbirine bağlayacağız ve silindirden analiz cihazına zar atışlarının sonucunu iletmek için yöntemimizi kullanacağız. Daha sonra, Eğitim 5'te analizör için oluşturduğumuz LED'leri kullanarak ruloyu ikili olarak yazdıracağız. Bu çalışmayı yaptıktan sonra, bir sonraki öğreticide genel projemizin bir sonraki parçasını oluşturabileceğiz.

Bu eğitimde ihtiyacınız olacak:

  1. Prototipleme panonuz
  2. Öğretici 4'teki zar silindiriniz
  3. Eğitim 5'ten Kayıt Çözümleyiciniz
  4. İki bağlantı kablosu
  5. Tam Veri Sayfasının bir kopyası (2014 revizyonu):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. Talimat Seti Kılavuzunun bir kopyası (2014 revizyonu):

    www.atmel.com/images/atmel-0856-avr-instruc…

İşte AVR montajcı eğitimlerimin tam koleksiyonuna bir bağlantı:

Adım 1: İki Mikrodenetleyicinin Birbiriyle Konuşmasını Nasıl Sağlayabiliriz?

İki Mikrodenetleyicinin Birbiriyle Konuşmasını Nasıl Sağlayabiliriz?
İki Mikrodenetleyicinin Birbiriyle Konuşmasını Nasıl Sağlayabiliriz?

Tek son ürünümüzün daha küçük parçalardan oluşması için projemizi genişletmeye başladığımızdan beri, tek bir Atmega328P'nin sağlayabileceğinden daha fazla pime ihtiyacımız olacak. Bu nedenle, genel projenin her bir parçasını ayrı bir mikrodenetleyici üzerinde yapacağız ve daha sonra verileri aralarında paylaşmalarını sağlayacağız. Öyleyse çözmemiz gereken sorun, kontrolörlerin birbirleriyle konuşması ve aralarında veri aktarımı yapması için basit bir yöntemi nasıl bulabiliriz? Bu denetleyicilerle ilgili bir şey, her birinin saniyede 16 milyon komut yürütmesidir. Bu çok hassas bir şekilde zamanlanmıştır ve bu zamanlamayı veri aktarmak için kullanabiliriz. Verileri oluşturmak için milisaniyelik gecikmeler kullanırsak, CPU tek bir milisaniyede 16.000 talimat yürüttüğü için o kadar kesin olmak zorunda değiliz. Başka bir deyişle, bir milisaniye, CPU için bir sonsuzluktur. Zar ruloları ile deneyelim. Bir zar atışının sonucunu zar atma çipinden analiz cihazı çipine iletmek istiyorum. Diyelim ki caddenin karşısında duruyorsunuz ve size bir çift zar atışımın sonucunu bildirmek istedim. Yapabileceğim bir şey, ikimizin de saati olsaydı, bir el feneri açabilirdim, sonra verilerimi almaya hazır olduğunda el fenerini açarsın ve ikimiz de saatlerimizi başlatırız. Sonra, zar atılırken el fenerimi tam milisaniye sayısı kadar açık tutuyorum ve sonra kapatıyorum. Yani eğer 12 atarsam ışığımı 12 milisaniye boyunca açık tutardım. Şimdi yukarıdakilerle ilgili sorun şu ki, sizin ve benim için, 5 milisaniye ile 12 arasında ayrım yapmak için işleri yeterince doğru bir şekilde zamanlamamızın hiçbir yolu yok. milisaniye. Ama şuna ne dersiniz: Zardaki her sayı için ışığımı bir yıl boyunca açık tutmaya karar verdiğimizi varsayalım? O zaman 12 atarsam sana 12 yıl boyunca ışık tutarım ve sayıyı bulmakta hata yapma olasılığının olmadığını kabul edersin değil mi? Bir ara verebilir ve beyzbol oynayabilirsiniz, hatta 6 ay boyunca Vegas'ta barbut oynayabilirsiniz, yeter ki yılın bir noktasında caddenin karşısına bakıp ışığın açık olup olmadığını görmek için hiçbir sayıyı kaçırmazsınız. Mikrodenetleyiciler için yaptığımız tam olarak bu! CPU için tek bir milisaniye bir yıl gibidir. Bu nedenle, sinyali 12 milisaniye boyunca açarsam, diğer mikrodenetleyicinin, bu arada ne kesintiye uğrarsa ve ne olursa olsun, onu 10 veya 11 için karıştırma şansı neredeyse yoktur. Mikrodenetleyiciler için bir milisaniye bir sonsuzluktur. İşte yapacağımız şey bu. İlk önce kontrolör üzerinde iletişim portlarımız olması için iki port seçeceğiz. PD6'yı Veri Almak için kullanacağım (istersek Rx olarak adlandırabiliriz) ve veri iletmek için PD7'yi seçeceğim (istersek buna Tx diyebiliriz). Analiz cihazı çipi periyodik olarak Rx pinini kontrol edecek ve eğer bir sinyal görürse bir "iletişim alt rutinine" düşecek ve ardından almaya hazır olduğunu söyleyen zar silindirine bir geri dönüş sinyali iletecektir. Her ikisi de zamanlamayı başlatacak ve zar silindiri, zardaki sayı başına bir milisaniye boyunca bir sinyal (yani 5V) iletecektir. Bu nedenle, atış çift altılı veya 12 ise, zar silindiri PD7'yi 12 milisaniye boyunca 5V'ye ayarlayacak ve ardından tekrar 0V'a ayarlayacaktır. Analiz cihazı, her milisaniyede bir PD6 pinini kontrol edecek, her seferinde sayacak ve 0V'a geri döndüğünde, elde edilen sayıyı analizör ekranına göndererek LED'lerde ikili olarak on iki gösteriyor. Yani plan bu. Bakalım uygulayabilecek miyiz.

Adım 2: İletişim Alt Programları

Yapmamız gereken ilk şey, iki denetleyiciyi bağlamak. Birinde PD6'dan bir kablo alın ve diğerinde PD7'ye bağlayın ve tam tersi. Ardından, her ikisinde de PD7'yi OUTPUT olarak ve her ikisinde de PD6'yı INPUT olarak ayarlayarak bunları başlatın. Sonunda hepsini 0V'a ayarlayın. Spesifik olarak, her mikro denetleyicideki kodun Init veya Reset bölümüne aşağıdakileri ekleyin:

sbi DDRD, 7; PD7 çıkışa ayarlandı

cbi PortD, 7; PD7 başlangıçta 0V cbi DDRD, 6; PD6, cbi PortD, 6 girişine ayarlandı; PD6 başlangıçta 0V clr toplam; başlangıçta zardaki toplam 0

Şimdi zar atma çipinde iletişim alt rutinini kuralım. İlk önce üstte "toplam" adında yeni bir değişken tanımlayın, bu değişken zar çiftine atılan toplam sayıyı depolayacak ve sıfıra sıfırlayacaktır.

Ardından, analizör ile iletişim kurmak için bir alt program yazın:

iletişim kurmak:

cbi PortD, 7 sbi PortD, 7; Hazır sinyali gönder bekle: sbic PinD, 6; PinD'yi okuyun ve 0V rjmp bekleme gecikmesi varsa atlayın 8; senkronizasyon gecikmesi (bunu deneysel olarak buldum) gönder: dec toplam gecikme 2; her kalıp sayısı için gecikme cpi toplamı, 0; 0 burada "toplam" gecikme sayısı gönderildiği anlamına gelir breq PC+2 rjmp send cbi PortD, 7; PD7 - 0V clr toplam; zar toplamını 0 ret'e sıfırla

Analiz cihazında ana rutinden iletişim alt rutinine bir geri arama ekliyoruz:

clr analizörü; yeni numara için hazırlanın

sbic PinD, 6; PD6'yı 5V sinyal geri çağırma iletişimi için kontrol edin; 5V, mov analizörü iletişimine giderse, toplam; analiz cihazına çıktı görüntüleme rcall analiz cihazına

ve ardından iletişim alt yordamını aşağıdaki gibi yazın:

iletişim kurmak:

clr toplam; toplamı 0 gecikmeye sıfırla 10; sıçramalardan kurtulma gecikmesi sbi PortD, 7; hazır alım sinyali için PB7'yi 5V'a ayarlayın: gecikme 2; bir sonraki sayıyı bekle toplam; artış toplam sbic PinD, 6; PD6 0V'a geri dönerse rjmp alımımız biter; aksi takdirde daha fazla veri için döngüye girin cbi PortD, 7; ret bittiğinde PD7'yi sıfırla

Buyrun! Artık her mikro denetleyici, zar atışının sonucunu iletecek ve ardından bunu analizörde gösterecek şekilde ayarlanmıştır.

Bir kaydın içeriğini sadece bir zar atmak yerine kontrolörler arasında aktarmamız gerektiğinde daha sonra çok daha verimli bir iletişim yolu uygulayacağız. Bu durumda, onları bağlayan sadece iki kablo kullanacağız ama "iletime başlamak" için 1, 1 kullanacağız; 0, 1 "1" anlamına gelir; 1, 0 "0" anlamına gelir; ve son olarak 0, 0 "iletimin bitmesi" anlamına gelir.

Alıştırma 1: Daha iyi yöntemi uygulayıp uygulayamayacağınıza bakın ve bunu zar rulosunu 8 bitlik ikili sayı olarak aktarmak için kullanın.

Benimkinin çalıştığını gösteren bir video ekleyeceğim.

3. Adım: Sonuç

Çözüm
Çözüm

Referansınız için tam kodu ekledim. İstediğim kadar temiz ve düzenli değil ama ilerideki derslerde genişlettikçe temizleyeceğim.

Bundan sonra, hepsini buraya yazmak yerine sadece kod içeren dosyaları ekleyeceğim. Sadece tartışmak istediğimiz bölümleri yazacağız.

Bu, yalnızca iki bağlantı noktası kullanırken, zar atma mikro denetleyicimizden zar atmamızın sonucunun ne olduğunu analizör mikro denetleyicimize söylemenin basit bir yöntemini bulduğumuz kısa bir eğitimdi.

Alıştırma 2: Zar silindirinin iletmeye hazır olduğunu ve analiz cihazının almaya hazır olduğunu gösteren bir hazır sinyali kullanmak yerine, "Pin Change Interrupt" adı verilen bir "harici kesme" kullanın. atmega328p üzerindeki pinler bu şekilde kullanılabilir, bu yüzden pinout şemasında yanlarında PCINT0 ve PCINT23 bulunur. Bunu, timer overflow interrupt'ta yaptığımıza benzer bir şekilde bir interrupt olarak uygulayabilirsiniz. Bu durumda, kesme "işleyicisi", zar silindiri ile iletişim kuran alt program olacaktır. Bu şekilde, ana iletişim alt programını gerçekten çağırmanız gerekmez: o pindeki bir durum değişikliğinden gelen herhangi bir kesinti olduğunda oraya gidecektir.

Alıştırma 3: Bir mikrodenetleyici arasında diğerlerinin bir koleksiyonuna veri iletmenin ve iletmenin çok daha iyi bir yolu, mikrodenetleyicinin kendisinde yerleşik 2 kablolu seri arabirimi kullanmaktır. Veri sayfasının 22. bölümünü okumaya çalışın ve nasıl uygulayacağınızı çözüp çözemeyeceğinize bakın.

Gelecekte daha fazla kontrolör eklediğimizde bu daha gelişmiş teknikleri kullanacağız.

Analiz cihazımızla yaptığımız tek şeyin, zarların toplamını alıp LED'ler kullanarak ikili olarak yazdırmak olması önemli değil. Gerçek şu ki, artık analizörümüz zar atışının ne olduğunu "biliyor" ve onu buna göre kullanabilir.

Bir sonraki derste "analizörümüzün" amacını değiştireceğiz, birkaç devre elemanı daha tanıtacağız ve zar atmasını daha ilginç bir şekilde kullanacağız.

Bir sonrakine kadar…

Önerilen: