İçindekiler:
- Adım 1: RAM'e Yazmayı / RAM'den Okumayı Deneyelim
- Adım 2: Bazı Temel Bağlantı Noktası Bilgileri
- 3. Adım: Videodaki Bir Kusuru Yakaladınız mı?
Video: GPIO KOL MONTAJI - T.I. ROBOTİK SİSTEM ÖĞRENME KİTİ - LAB 6: 3 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:20
Merhaba, Texas Instruments TI-RSLK (MSP432 mikrodenetleyiciyi kullanır) kullanarak ARM montajını öğrenme hakkında önceki bir Talimatta, yani T. I. Tabii ki, bir kayıt defterine yazma ve koşullu döngü gibi bazı çok temel talimatların üzerinden geçtik. Eclipse IDE'yi kullanarak yürütmeyi adımladık.
Yürüttüğümüz ufacık programlar dış dünyayla etkileşime geçmek için hiçbir şey yapmadı.
Biraz sıkıcı.
Giriş/çıkış portları, özellikle dijital GPIO pinleri hakkında biraz öğrenerek bugün bunu biraz değiştirmeye çalışalım.
Öyle oluyor ki bu MSP432 bir geliştirme panosunda geliyor, hepsi de bazı GPIO bağlantı noktalarına bağlı olan iki basmalı düğme anahtarına, bir RGB LED'e ve bir kırmızı LED'e sahip.
Bu, bu pinleri montaj yoluyla kurmayı ve manipüle etmeyi öğrendiğimizde, bu etkileri görsel olarak görebildiğimiz anlamına gelir.
Hata ayıklayıcıya adım atmaktan çok daha ilginç.
(Hala adım atacağız - bu bizim 'gecikme' işlevimiz olacak):-D
Adım 1: RAM'e Yazmayı / RAM'den Okumayı Deneyelim
GPIO'ya erişmeye ve onu kontrol etmeye geçmeden önce küçük bir adım atmalıyız.
Sadece standart bir bellek adresini okuyup yazarak başlayalım. Önceki Eğitilebilir Tablodan (oradaki resimlere bakın) RAM'in 0x2000 0000'da başladığını biliyoruz, bu yüzden bu adresi kullanalım.
Verileri bir çekirdek kayıt (R0) ile 0x2000 0000 arasında taşıyacağız.
Bir derleme programının temel dosya yapısı veya içeriği ile başlıyoruz. TI'nin Code Composer Studio'sunu (CCS) ve bazı örnek projeleri kullanarak bir montaj projesi oluşturmak için lütfen bu Eğitilebilir Tabloya bakın.
.baş parmak
.text.align 2.global ana.thumbfunc ana ana:.asmfunc;--------------------------------- --------------------------------------------------; (kodumuz buraya gelecek);------------------------------------------ ------------------------------------------.endasmfunc.end
Üst bölüme yeni bir şey eklemek istiyorum, bazı bildirimler (direktifler) var mıydı? Daha sonra daha net hale gelecektir.
ACONST.set 0x20000000; bunu daha aşağıda kullanacağız (bu bir sabittir)
; açıkçası, '0x', aşağıdakilerin bir onaltılık değer olduğunu belirtir.
Yani başlangıç dosya içeriğimiz şimdi şöyle görünüyor:
.baş parmak
.text.align 2 ACONST.set 0x20000000; bunu daha aşağıda kullanacağız (bu bir sabittir); açıkçası, '0x', aşağıdakilerin bir onaltılık değer olduğunu belirtir..global ana.thumbfunc ana ana:.asmfunc;--------------------------------------- ------------------------------------------; (kodumuz buraya gelecek);------------------------------------------ ------------------------------------------.endasmfunc.end
Şimdi yukarıdakilere sahip olduğumuza göre, kesikli çizgiler arasına kod ekleyelim.
Bir RAM konumuna yazmaya başlıyoruz. İlk önce RAM'e yazacağımız veri modelini, bir değeri oluşturacağız. Bu değeri veya verileri oluşturmak için bir çekirdek kayıt kullanırız.
Not: Kodda, noktalı virgül (';') olan herhangi bir satırın, o noktalı virgülden sonra bir yorum olduğu anlamına geldiğini unutmayın.
;-----------------------------------------------------------------------------------------------
; YAZI;------------------------------------------------ -------------------------------------------------- HAREKET R0, #0x55; çekirdek kaydı R0 RAM konumuna yazmak istediğimiz verileri içerecektir.; açıkçası, '0x', aşağıdakilerin bir onaltılık değer olduğunu belirtir.
Ardından, ÇALIŞMAYAN ifadelere bir göz atalım.
; MOV MOV, bir RAM konumuna veri yazmak için kullanılamaz.
; MOV sadece kayıt içine anlık veriler içindir,; veya bir kayıttan diğerine; yani, MOV R1, R0.; STR, STR kullanmalıdır.; STR R0, =ACONST; İfadede hatalı terim ('='); STR R0, 0x20000000; Mağaza talimatı için geçersiz adresleme modu; STR R0, ACONST; Mağaza talimatı için geçersiz adresleme modu
Çok fazla açıklamadan yukarıdaki 'ACONST'u kullanmaya çalıştık. Esasen, 0x20000000 gibi değişmez bir değer kullanmak yerine bir yedek veya sabittir.
Yukarıdakileri kullanarak RAM konumuna yazmak için yazamadık. Başka bir şey deneyelim.
; RAM konumunu içeren başka bir kayıt kullanmalıyız gibi görünüyor
; bu RAM konumuna depolamak için MOV R1, #0x20000000; RAM konumunu (içeriği değil, konumu) R1'e ayarlayın.; açıkçası, '0x', aşağıdakilerin bir onaltılık değer olduğunu belirtir. STR R0, [R1]; R1'i kullanarak R0'da (0x55) olanı RAM'e (0x20000000) yazın.; RAM konum adresi olan başka bir kayıt (R1) kullanıyoruz; bu RAM konumuna yazmak için.
Yukarıdakileri yapmanın başka bir yolu, ancak değişmez adres değeri yerine 'ACONST' kullanmak:
; Yukarıdakileri tekrar yapalım ama gerçek bir RAM konum değeri yerine bir sembol kullanalım.
; 0x20000000 için bir yedek olarak 'ACONST' kullanmak istiyoruz.; acil bir değeri belirtmek için hala '#' yapmamız gerekiyor; yani (yukarıya bakın), '.set' yönergesini kullanmak zorunda kaldık.; Bunu kanıtlamak için, R0'daki veri desenini değiştirelim. HAREKET R0, #0xAA; tamam MOV R1, #ACONST STR R0, [R1] literal adres değeri yerine sembolünü kullanarak RAM'e yazmaya hazırız
Video, bellek konumundan okumaya adım atmanın yanı sıra biraz daha ayrıntıya giriyor.
Ekli kaynak.asm dosyasını da görüntüleyebilirsiniz.
Adım 2: Bazı Temel Bağlantı Noktası Bilgileri
Artık bir RAM konumuna nasıl yazacağımız/okuyacağımız konusunda iyi bir fikre sahip olduğumuza göre, bu, GPIO pinini nasıl kontrol edip kullanacağımızı daha iyi anlamamıza yardımcı olacaktır.
Peki GPIO pinleriyle nasıl etkileşime geçeceğiz? Bu mikrodenetleyiciye ve onun ARM komutlarına önceki bakışımızdan, onun dahili yazmaçlarıyla nasıl başa çıkacağımızı ve bellek (RAM) adresleriyle nasıl etkileşime geçeceğimizi biliyoruz. Ama GPIO pinleri?
Öyle oluyor ki bu pinler hafıza haritalıdır, bu yüzden onlara hafıza adresleri ile aynı şekilde davranabiliriz.
Bu, bu adreslerin ne olduğunu bilmemiz gerektiği anlamına gelir.
Aşağıda port başlangıç adresleri verilmiştir. Bu arada, MSP432 için bir "port" sadece bir pin değil, bir pin koleksiyonudur. Raspberry Pi'ye aşina iseniz, bunun buradaki durumdan farklı olduğuna inanıyorum.
Yukarıdaki resimdeki mavi daireler, iki anahtar ve LED için tahtadaki yazıyı göstermektedir. Mavi çizgiler gerçek LED'leri gösterir. Başlık atlama tellerine dokunmamız gerekmeyecek.
İlgilendiğimiz bağlantı noktalarını aşağıda kalın harflerle yaptım.
- GPIO P1: 0x4000 4C00 + 0 (çift adresler)
- GPIO P2: 0x4000 4C00 + 1 (tek adresler)
- GPIO P3: 0x4000 4C00 + 20 (çift adresler)
- GPIO P4: 0x4000 4C00 + 21 (tek adresler)
- GPIO P5: 0x4000 4C00 + 40 (çift adresler)
- GPIO P6: 0x4000 4C00 + 41 (tek adresler)
- GPIO P7: 0x4000 4C00 + 60 (çift adresler)
- GPIO P8: 0x4000 4C00 + 61 (tek adresler)
- GPIO P9: 0x4000 4C00 + 80 (eş adresler)
- GPIO P10: 0x4000 4C00 + 81 (tek adresler)
Henüz işimiz bitmedi. Daha fazla bilgiye ihtiyacımız var.
Bir portu kontrol etmek için birkaç adrese ihtiyacımız var. Bu yüzden yukarıdaki listede "çift adresler" veya "tek adresler" görüyoruz.
G/Ç Kayıt Adres Blokları
Başka adreslere ihtiyacımız olacak, örneğin:
- Port 1 Giriş Kayıt adresi = 0x40004C00
- Port 1 Çıkış Kayıt adresi = 0x40004C02
- Port 1 Yön Kayıt adresi = 0x40004C04
- Port 1 Seç 0 Kayıt adresi = 0x40004C0A
- Port 1 Seç 1 Kayıt adresi = 0x40004C0C
Ve başkalarına ihtiyacımız olabilir.
Tamam, artık tek kırmızı LED'i kontrol etmek için GPIO kayıt adresleri aralığını biliyoruz.
Çok önemli bir not: MSP432 LaunchPad kartındaki her G/Ç Bağlantı Noktası, birkaç (genellikle 8) pin veya çizgiden oluşur ve her biri ayrı ayrı bir giriş veya çıkış olarak ayarlanabilir.
Bu, örneğin, "Port 1 Yön Kayıt Adresi" için değerler ayarlıyorsanız, o adreste hangi biti (veya bitleri) ayarladığınız veya değiştirdiğiniz ile ilgilenmeniz gerektiği anlamına gelir. Bu konuda daha sonra.
GPIO Port Programlama Sırası
İhtiyacımız olan son parça, LED'i kontrol etmek için kullanılacak bir süreç veya algoritmadır.
Tek seferlik başlatma:
- Normal GPIO işlevselliği için P1.0'ı (P1SEL1REG:P1SEL0REG Register) <--- 0x00, 0x00 yapılandırın.
- P1DIRREG'in Yön kayıt biti 1'i çıkış veya YÜKSEK olarak ayarlayın.
Döngü:
Kırmızı LED'i açmak için P1OUTREG kaydının 0 bitine HIGH yazın
- Bir gecikme işlevi çağırın
- Kırmızı LED'i kapatmak için P1OUTREG kaydının 0 bitine LOW yazın
- Bir gecikme işlevi çağırın
- Tekrar Döngüsü
Hangi Giriş/Çıkış İşlevi (SEL0 ve SEL1'i yapılandırın)
LaunchPad'deki pinlerin birçoğunun birden fazla kullanımı vardır. Örneğin, aynı pin standart dijital GPIO olabilir veya UART veya I2C seri iletişimde de kullanılabilir.
Bu pin için belirli bir işlevi kullanmak için o işlevi seçmeniz gerekir. Pin işlevini yapılandırmanız gerekir.
Bu adım için yukarıda bu kavramı görsel biçimde açıklamaya çalışan bir resim var.
SEL0 ve SEL1 adresleri, bir tür işlev/özellik seçimi gibi davranan bir çift kombinasyonu oluşturur.
Amaçlarımız için, 0 biti için standart dijital GPIO istiyoruz. Bu, SEL0 ve SEL1'in DÜŞÜK olması için 0 bitine ihtiyacımız olduğu anlamına gelir.
Port Programlama Sırası (Tekrar)
1. P1 SEL 0 Register'a 0x00 yazın (adres 0x40004C0A). Bu, bit 0 için bir DÜŞÜK ayarlar
2. P1 SEL 1 Register'a 0x00 yazın (adres 0x40004C0C). Bu, bit 0 için DÜŞÜK, GPIO için bir ayar yapar.
3. P1 DIR Register'a 0x01 yazın (adres 0x40004C04). Bu, 0 biti için YÜKSEK, yani ÇIKIŞ anlamına gelir.
4. P1 OUTPUT Register'a bir 0x01 yazarak LED'i açın (adres 0x40004C02)
5. Bir tür gecikme yapın (veya hata ayıklama sırasında yalnızca tek adımlı geçiş yapın)
6. P1 OUTPUT Register'a 0x00 yazarak LED'i kapatın (adres 0x40004C02)
7. Bir tür gecikme yapın (veya hata ayıklama sırasında yalnızca tek adımlı geçiş yapın)
8. 4'ten 7'ye kadar olan adımları tekrarlayın.
Bu adımla ilgili video, her bir montaj talimatını tek bir adımla incelediğimiz ve LED eylemini gösterdiğimiz için, canlı bir demoda tüm süreç boyunca bizi yönlendirir. Lütfen videonun uzunluğunu mazur görün.
3. Adım: Videodaki Bir Kusuru Yakaladınız mı?
LED'in tüm programlama ve aydınlatma sürecini anlatan videoda, ana döngüde tek seferlik başlatmaya taşınabilecek fazladan bir adım vardı.
Bu Eğitilebilir Tablodan geçmek için zaman ayırdığınız için teşekkür ederiz.
Bir sonraki, burada başladığımız şeyi genişletiyor.
Önerilen:
Tutuculu Robotik Kol: 9 Adım (Resimli)
Kavrayıcılı Robot Kol: Ağaçların büyüklüğü ve limon ağaçlarının dikildiği bölgelerin sıcak iklimi nedeniyle limon ağaçlarının hasadı zor bir iş olarak kabul edilir. Bu yüzden tarım işçilerinin işlerini daha kolay tamamlamalarına yardımcı olacak başka bir şeye ihtiyacımız var
Rpibot - Robotik Öğrenme Hakkında: 9 Adım
Rpibot - Robotik Öğrenme Hakkında: Bir Alman otomotiv şirketinde gömülü yazılım mühendisiyim. Bu projeye gömülü sistemler için bir öğrenme platformu olarak başladım. Proje erken iptal oldu ama ben o kadar keyif aldım ki boş zamanlarımda devam ettim. Sonuç bu…Ben
PS2 Kablosuz Uzaktan Kumanda ile Robotik Araç Kiti Montajı ve Kontrolü: 6 Adım
PS2 Kablosuz Uzaktan Kumanda ile Robotik Araç Kiti Montajı ve Kontrolü: Bu proje Robotik dünyasındaki temel adımlar ile ilgilidir, 4WD Robotik araç kitini monte etmeyi, üzerine donanım yerleştirmeyi ve kablosuz PS2 uzaktan kumanda ile kontrol etmeyi öğreneceksiniz
BÖLÜM 2 - GPIO KOL MONTAJI - RGB - FONKSİYON ÇAĞRILARI - Anahtarlar: 6 Adım
BÖLÜM 2 - GPIO ARM MONTAJ - 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. benzer bir şey yapacak - o sam üzerinde de bulunan bir RGB LED'i kontrol edin
DIY Arduino Robotik Kol, Adım Adım: 9 Adım
Kendin Yap Arduino Robot Kol, Adım Adım: Bu eğitim size kendi başınıza bir Robot Kolunu nasıl oluşturacağınızı öğretiyor