İçindekiler:

BÖLÜM 2 - GPIO KOL MONTAJI - RGB - FONKSİYON ÇAĞRILARI - Anahtarlar: 6 Adım
BÖLÜM 2 - GPIO KOL MONTAJI - RGB - FONKSİYON ÇAĞRILARI - Anahtarlar: 6 Adım

Video: BÖLÜM 2 - GPIO KOL MONTAJI - RGB - FONKSİYON ÇAĞRILARI - Anahtarlar: 6 Adım

Video: BÖLÜM 2 - GPIO KOL MONTAJI - RGB - FONKSİYON ÇAĞRILARI - Anahtarlar: 6 Adım
Video: Hatay..! Sen benim..🤍 2024, Temmuz
Anonim
BÖLÜM 2 - GPIO KOL MONTAJI - RGB - FONKSİYON ÇAĞRILARI - Anahtarlar
BÖLÜM 2 - GPIO KOL MONTAJI - RGB - FONKSİYON ÇAĞRILARI - Anahtarlar

Bölüm 1'de Texas Instruments'tan MSP432 LaunchPad geliştirme kartındaki tek bir Kırmızı LED'in C/C++ yerine Assembly kullanarak nasıl değiştirileceğini öğrendik.

Bu Eğitilebilir Tabloda benzer bir şey yapacağız - yine aynı panoda bulunan bir RGB LED'i kontrol edeceğiz.

Yol boyunca, sadece bazı LED'leri aydınlatırken eğlenmekle kalmayıp, ARM montajı hakkındaki bilgimizi de geliştirmeyi umuyoruz.

Adım 1: Hemen İçeri Geçelim

Gerçekten, ilk video her şeyi söylüyor. Eklenecek fazla bir şey yok.

Bunun ana amacı, MSP432'deki her G/Ç bağlantı noktasının, sırayla her biri birkaç bitten oluşan bir "kayıt" adresleri bloğundan oluştuğu fikrini eve götürmek.

Ayrıca, bitler ortogonal bir şekilde gruplandırılmıştır. Yani, her kayıt adresinin 0 biti aynı harici G/Ç pinine atıfta bulunur.

Sadece bir bit veya pin ile bile bir şeyler yapmak için o port için birkaç kayıt adresi gerektiği fikrini tekrarladık.

Ancak bu durumda, bir RGB LED ile uğraştığımız için, her kayıt adresi için üç bit ile uğraşmamız gerekiyor.

Birkaç kayda ihtiyacımız olduğunu pekiştirdik: DIR kaydı, SEL0 kaydı, SEL1 kaydı ve OUTPUT kaydı. Ve her seferinde üç bit.

2. Adım: Kodu İyileştirin - Bir İşlev Ekleyin

Image
Image

Yukarıdaki Adımda gördüğünüz gibi, ana program döngüsü, LED'leri kapattığımızda, çok sayıda tekrarlanan koda sahipti.

Böylece programa bir fonksiyon ekleyebiliriz. LED'leri her kapatmak istediğimizde hala bu işlevi çağırmamız gerekiyor, ancak bu, kodun bir kısmının tek bir ifadeye çökmesine neden oluyor.

LED-off kodumuz çok daha fazla talimatla daha fazla ilgili olsaydı, bu gerçek bir hafıza koruyucu olurdu.

Gömülü programlama ve mikro denetleyicilerin bir parçası, program boyutunun çok daha fazla farkında olmaktır.

Video açıklıyor.

Esasen, ana kodumuza bir dallanma ifadesi ekliyoruz ve dallanma yaptığımız fonksiyon olan başka bir kod bloğumuz var. Ve işimiz bittiğinde veya fonksiyonun sonunda, ana program içindeki bir sonraki ifadeye geri dönüyoruz.

3. Adım: Bir Meşgul Döngüsü Gecikmesi Ekleyin

Kodun Bildirimler bölümünde, istenen zamanlama için düzeltmeyi kolaylaştırmak için bir sabit ekleyin:

; noktalı virgülden (';') sonra herhangi bir kelime bir yorum başlatır.

; bu bölümdeki kod, bir değere bir ad atar.; '.equ' da kullanmış olabilirsin ama bunlar biraz farklı.; '.equ' (sanırım) değiştirilemez, '.set' ise yapabileceğiniz anlamına gelir; Dilerseniz 'DLYCNT' değerini kodda daha sonra değiştirin.;'DLYCNT' gecikme alt programında geri sayım değeri olarak kullanılacaktır. DLYCNT.set 0x30000

Yeni bir gecikme işlevi ekleyin:

gecikme:.asmfunc; 'gecikme' alt rutininin veya fonksiyonunun başlangıcı.

MOV R5, #DLYCNT; 'DLYCNT' değerine atanan değerle çekirdek işlemci kaydı R5'i yükleyin. dlyloop; bu, gecikme döngüsünün başlangıcını işaretler. assembler adresi belirler. ALT R5, #0x1; çekirdek işlemci kaydı R5'teki mevcut değerden 1 çıkarın. CMP R5, #0x0; R5'teki mevcut değeri 0 ile karşılaştırın. BGT dlyloop; R5'teki değer 0'dan büyükse, 'dlyloop' olarak etiketlemek(adres) için dal. BX LR; buraya kadar gelirsek R5 değeri 0 demektir. alt programdan dönüş..endasmfunc; alt rutinin sonunu işaretler.

Ardından ana gövdede, ana döngü içinde bu gecikme işlevini çağırın veya çağırın:

; bu, ana gövdenin veya ana işlevin bir kod parçasıdır ('main.asm' dosyasına bakın).

; bu, 'ana'da bir döngüdür ve bu yeni 'gecikme' işlevini nasıl çağırdığımızı veya kullandığımızı gösterir.; '#REDON' ve '#GRNON' da bildirimlerdir (sabitler) ('main.asm'ın başına bakın).; RGB LED'in belirtilen rengini ayarlamanın kolay bir yoludur. loop MOV R0, #REDON;Kırmızı - 'REDON'a atanan değerle çekirdek işlemci kaydı R0'ı ayarlayın. STRB R0, [R4];core register R4 önceden bir GPIO çıkış adresi ile ayarlanmıştı.;R0'da olanı R4 tarafından belirtilen adrese yazın. BL gecikmesi;yeni 'gecikme' işlevine dal. BL ledsoff;önceden var olan 'ledsoff' işlevine dal. BL gecikmesi; aynen MOV R0, #GRNON;Yeşil - aynen STRB R0, [R4]; ve bunun gibi. BL gecikmesi BL ledsoff BL gecikmesi

Video ayrıntıya giriyor.

Adım 4: ARM Mimarisi Prosedür Çağrı Standardı (AAPCS)

Muhtemelen bir şey tanıtmak için iyi bir zaman. Bu bir montaj dili sözleşmesidir. ARM Mimarisi için Prosedür Çağrı Standardı olarak da bilinir.

Bunun için çok şey var, ama bu sadece bir standart. Bu, bizi Assembly programlamayı öğrenmekten alıkoymaz ve öğrenmekte olduğumuz bazı kavramlar konusunda kendimizi rahat hissettiğimizde bu standardın parçalarını benimseyebiliriz.

Aksi takdirde büyük bir su hortumundan su içiyormuş gibi hissedebiliriz. Çok fazla bilgi.

Çekirdek Kayıtlar

MSP432'nin çekirdek kayıtlarına aşina olduğumuza göre, şimdi bu standartlardan bazılarını benimsemeye çalışalım. Bir sonraki işlevi yazarken buna uyacağız (bir LED'i aç / kapat).

1) Fonksiyon parametresi olarak R0 kullanmamız gerekiyor. Eğer fonksiyona (alt program) bir değer iletmek istiyorsak, bunu yapmak için R0 kullanmalıyız.

2) Bağlantı Kaydı'nı amacına uygun olarak kullanacağız - alt program tamamlandıktan sonra nereye dönüleceğini gösteren adresi tutar.

Bunları nasıl uyguladığımızı göreceksiniz.

Adım 5: Parametreli İşlev - İç İçe İşlevler

Tekrarlanan bölümleri tek bir işlevde birleştirerek kodumuzu temizleyebilir ve kapladığı bellek miktarını azaltabiliriz. Ana döngü gövdesindeki tek fark, RGB LED'den görmek istediğimiz çeşitli farklı renkleri geçirebilmemiz için bir parametreye ihtiyacımız olmasıdır.

Ayrıntılar için videoya bir göz atın. (uzunluk için üzgünüm)

Adım 6: GPIO Girişi - Anahtar Ekleme

Daha ilginç hale getirelim. Montaj programımıza biraz anahtar kontrolü eklemenin zamanı geldi.

Bu Eğitilebilir Tablo, iki yerleşik anahtarın MSP432'ye nasıl bağlandığını gösteren resimlere sahiptir.

Esasen: Anahtar 1 (SW1 veya S1), P1.1'e bağlıdır ve Anahtar 2 (SW2 veya S2), P1.4'e bağlıdır.

Bu, yalnızca çıkışlar yerine girişlerle uğraştığımız için değil, aynı zamanda bu iki anahtarın bir çıkış olan tek kırmızı LED'in yaptığı gibi aynı kayıt adres bloğunun iki bitini işgal etmesi veya alması nedeniyle işleri biraz ilginç kılıyor.

Bu Eğitilebilir Tabloda tek kırmızı LED'i değiştirmekle ilgilendik, bu yüzden anahtarları işlemek için sadece kod eklememiz gerekiyor.

Port 1 Kayıt Adres Bloğu

Bunları önceki Eğitilebilir Kitapta ele aldığımızı unutmayın, ancak yeni bir tane eklememiz gerekiyor:

  • Port 1 Giriş Kayıt adresi = 0x40004C00
  • Port 1 Çıkış Kayıt adresi = 0x40004C02
  • Port 1 Yön Kayıt adresi = 0x40004C04
  • Port 1 Direnç Etkin Kayıt adresi = 0x40004C06
  • Port 1 Seç 0 Kayıt adresi = 0x40004C0A
  • Port 1 Seç 1 Kayıt adresi = 0x40004C0C

Bağlantı noktalarını giriş olarak kullanırken, MSP432'nin dahili pull-up veya pull-down dirençlerini kullanmak iyidir.

Launchpad geliştirme kartı iki anahtarı toprağa bağladığından (basıldığında DÜŞÜK), bu, basılmadığında sağlam bir YÜKSEK değerine sahip olduğumuzdan emin olmak için çekme YUKARI dirençlerini kullanmamız gerektiği anlamına gelir.

Yukarı Çekme / Aşağı Çekme Dirençleri

Bu anahtar girişlerini pull-up dirençlerine bağlamak için iki farklı Port 1 Register adresi gerekir.

1) Port 1 Direnç Etkinleştirme kaydını (0x40004C06) sadece direnç istediğinizi belirtmek için kullanın (bu iki bit için), 2) ve ardından dirençleri yukarı çekme veya aşağı çekme olarak ayarlamak için Bağlantı Noktası 1 Çıkış kaydını (0x40004C02) kullanın. Girişlerde bir Çıkış kaydı kullanmamız kafa karıştırıcı görünebilir. Çıktı kaydının neredeyse iki amacı vardır.

Bu nedenle, başka bir şekilde yeniden belirtmek için, Çıkış kaydı bir çıkışa (tek kırmızı LED gibi) bir YÜKSEK veya DÜŞÜK gönderebilir ve / veya girişler için yukarı çekme veya aşağı çekme dirençlerini ayarlamak için kullanılır., AMA YALNIZCA bu özellik Direnç Etkinleştirme kaydı aracılığıyla etkinleştirildiyse.

Yukarıda önemli olan - herhangi bir çıkış bitine DÜŞÜK veya YÜKSEK gönderirken/ayarlarken, giriş bitlerinin yukarı çekme/aşağı çekme durumunu aynı anda korumanız gerekir.

(video açıklamaya çalışır)

Port Giriş Biti Okuma

  • GPIO işlevselliği için SEL0 / SEL1'i ayarlayın
  • DIR kaydını anahtar bitleri için giriş olarak, ancak LED için çıkış olarak ayarlayın (aynı baytta aynı anda)
  • Dirençleri etkinleştir
  • Bunları pull-up dirençleri olarak ayarlayın
  • bağlantı noktasını oku
  • Yalnızca ihtiyacınız olan bitleri izole etmek için okunan değeri filtrelemek isteyebilirsiniz (1 ve 2 anahtarı)

Önerilen: