Daftar Isi:

BAGIAN 2 - GPIO ARM ASSEMBLY - RGB - PANGGILAN FUNGSI - Switch: 6 Langkah
BAGIAN 2 - GPIO ARM ASSEMBLY - RGB - PANGGILAN FUNGSI - Switch: 6 Langkah

Video: BAGIAN 2 - GPIO ARM ASSEMBLY - RGB - PANGGILAN FUNGSI - Switch: 6 Langkah

Video: BAGIAN 2 - GPIO ARM ASSEMBLY - RGB - PANGGILAN FUNGSI - Switch: 6 Langkah
Video: Raspberry Pi Pico for Robotics 2024, Juli
Anonim
BAGIAN 2 - PERAKITAN LENGAN GPIO - RGB - PANGGILAN FUNGSI - Sakelar
BAGIAN 2 - PERAKITAN LENGAN GPIO - RGB - PANGGILAN FUNGSI - Sakelar

Di Bagian 1, kami mempelajari cara mengaktifkan satu LED Merah pada papan pengembangan LaunchPad MSP432 dari Texas Instruments, menggunakan perakitan alih-alih C / C++.

Dalam Instruksi ini, kita akan melakukan hal serupa - mengontrol LED RGB yang juga ada di papan yang sama.

Sepanjang jalan, kami berharap untuk meningkatkan pengetahuan kami tentang perakitan ARM, dan tidak hanya bersenang-senang menyalakan beberapa LED.

Langkah 1: Ayo Langsung Masuk

Sungguh, video pertama mengatakan itu semua. Tidak banyak lagi yang bisa ditambahkan.

Poin utamanya adalah untuk mendorong pulang gagasan bahwa setiap port I/O pada MSP432 terdiri dari blok alamat "register", yang pada gilirannya masing-masing terdiri dari beberapa bit.

Selanjutnya, bit dikelompokkan secara ortogonal. Artinya, bit 0 dari setiap alamat register merujuk ke pin I/O eksternal yang sama.

Kami mengulangi gagasan bahwa dibutuhkan beberapa alamat register untuk port itu, untuk melakukan sesuatu bahkan hanya dengan satu bit atau pin.

Tetapi dalam kasus ini, karena kita berurusan dengan LED RGB, kita perlu menangani tiga bit untuk setiap alamat register.

Kami tegaskan bahwa kami membutuhkan beberapa register: register DIR, register SEL0, register SEL1, dan register OUTPUT. Dan tiga bit setiap kali.

Langkah 2: Tingkatkan Kode - Tambahkan Fungsi

Image
Image

Seperti yang Anda lihat pada Langkah di atas, loop program utama memiliki banyak kode berulang, yaitu saat kita mematikan LED.

Jadi kita bisa menambahkan fungsi ke program. Kami masih harus memanggil fungsi itu setiap kali kami ingin mematikan LED, tetapi itu menyebabkan beberapa kode runtuh menjadi satu pernyataan.

Seandainya kode LED-off kami lebih terlibat dengan lebih banyak instruksi, ini akan menjadi penghemat memori yang nyata.

Bagian dari pemrograman tertanam dan pengontrol mikro menjadi lebih sadar akan ukuran program.

Video menjelaskan.

Pada dasarnya, kami menambahkan pernyataan percabangan ke kode utama kami, dan kami memiliki blok kode lain yang merupakan fungsi percabangan kami. Dan kemudian setelah kita selesai, atau di akhir fungsi, kita bercabang kembali ke pernyataan berikutnya di dalam program utama.

Langkah 3: Tambahkan Penundaan Sibuk-Loop

Di bagian Deklarasi kode, tambahkan konstanta untuk memudahkan tweek untuk waktu yang diinginkan:

; kata apa pun setelah titik koma (';') memulai komentar.

; kode di bagian ini memberikan nama ke nilai.; Anda juga bisa menggunakan '.equ' tetapi mereka sedikit berbeda.; '.equ' (saya pikir) tidak dapat diubah, sedangkan '.set' berarti Anda dapat; ubah nilai 'DLYCNT' nanti di kode jika Anda mau.;'DLYCNT' akan digunakan sebagai nilai hitung mundur dalam subrutin penundaan. DLYCNT.set 0x30000

Tambahkan fungsi penundaan baru:

penundaan:.asmfunc; awal dari subrutin atau fungsi 'penundaan'.

MOV R5, #DLYCNT; memuat core cpu register R5 dengan nilai yang ditetapkan ke 'DLYCNT'. dlyloop; ini menandai awal dari penundaan loop. assembler menentukan alamat. SUB R5, #0x1; kurangi 1 dari nilai saat ini di core cpu register R5. CMP R5, #0x0; bandingkan nilai saat ini di R5 ke 0. BGT dlyloop; cabang jika nilai dalam R5 lebih besar 0, untuk memberi label (alamat) 'dlyloop'. BX LR; jika kita sampai di sini, berarti nilai R5 adalah 0. kembali dari subrutin..endasmfunc; menandai akhir dari subrutin.

Kemudian di badan utama, di dalam loop utama, panggil atau panggil fungsi penundaan itu:

; ini adalah potongan kode, dari main body atau main function (lihat file 'main.asm').

; ini adalah loop di 'main', dan menunjukkan bagaimana kita memanggil atau menggunakan fungsi 'delay' baru itu.; '#REDON' dan '#GRNON' juga merupakan deklarasi (konstanta) (lihat bagian atas 'main.asm').; itu hanya cara mudah untuk mengatur warna tertentu dari LED RGB. loop MOV R0, #REDON;Red - setel core cpu register R0 dengan nilai yang ditetapkan ke 'REDON'. STRB R0, [R4];register inti R4 sebelumnya disetel dengan alamat keluaran GPIO.; tulis apa yang ada di R0, ke alamat yang ditentukan oleh R4. Penundaan BL; cabang ke fungsi 'penundaan' baru. BL ledsoff; cabang ke fungsi 'ledsoff' yang sudah ada sebelumnya. BL delay;ditto MOV R0, #GRNON;Green - ditto STRB R0, [R4]; dan seterusnya. BL delay BL ledsoff BL delay

Video masuk ke detail.

Langkah 4: Standar Panggilan Prosedur Arsitektur ARM (AAPCS)

Mungkin ini saat yang tepat untuk memperkenalkan sesuatu. Ini adalah konvensi bahasa assembly. Juga dikenal sebagai Prosedur Panggilan Standar untuk Arsitektur ARM.

Ada banyak untuk ini, tapi itu hanya standar. Itu tidak menghalangi kami untuk mempelajari pemrograman assembly, dan kami dapat mengadopsi bagian dari standar itu saat kami pergi, setelah kami merasa nyaman dengan beberapa konsep yang kami pelajari.

Jika tidak, kita mungkin merasa seperti sedang minum dari selang air yang besar. Terlalu banyak informasi.

Registrasi Inti

Karena kita sudah terbiasa dengan register inti MSP432, sekarang mari kita coba mengadopsi beberapa standar ini. Kami akan menyesuaikan dengan ini ketika kami menulis fungsi berikutnya (menghidupkan / mematikan LED).

1) Kita seharusnya menggunakan R0 sebagai parameter fungsi. Jika kita ingin memasukkan nilai ke dalam fungsi (subrutin), kita harus menggunakan R0 untuk melakukannya.

2) Kita harus menggunakan Daftar Tautan untuk tujuan yang dimaksudkan - Daftar Tautan menyimpan alamat yang menunjukkan ke mana harus kembali setelah subrutin selesai.

Anda akan melihat bagaimana kami menerapkan ini.

Langkah 5: Fungsi Dengan Parameter - Fungsi Bersarang

Kami dapat membersihkan kode kami dan mengurangi jumlah memori yang digunakan dengan menggabungkan bagian berulang menjadi satu fungsi. Satu-satunya perbedaan di badan loop utama adalah bahwa kita memerlukan parameter sehingga kita dapat melewatkan berbagai warna berbeda yang ingin kita lihat dari LED RGB.

Lihat video untuk detailnya. (maaf kepanjangan)

Langkah 6: Masukan GPIO - Tambahkan Sakelar

Biar lebih menarik. Saatnya menambahkan beberapa kontrol sakelar ke program perakitan kami.

Instruksi ini memiliki gambar yang menunjukkan bagaimana dua sakelar terpasang terhubung ke MSP432.

Pada dasarnya: Sakelar 1 (SW1 atau S1) terhubung ke P1.1, dan Sakelar 2 (SW2 atau S2) terhubung ke P1.4.

Hal ini membuat hal-hal sedikit menarik bukan hanya karena kita berurusan dengan input, bukan output, tetapi juga karena kedua switch ini menempati atau mengambil dua bit dari blok alamat register yang sama seperti halnya LED merah tunggal yang merupakan output.

Kami berurusan dengan mengubah satu LED merah di Instructable ini, jadi kami hanya perlu menambahkan kode untuk menangani sakelar.

Port 1 Daftar Alamat Blok

Ingat bahwa kita telah membahas ini di Instructable sebelumnya, tetapi kita harus menyertakan yang baru:

  • Port 1 Input Alamat register = 0x40004C00
  • Port 1 Output Alamat register = 0x40004C02
  • Port 1 Arah Alamat register = 0x40004C04
  • Port 1 Resistor Aktifkan Alamat register = 0x40004C06
  • Port 1 Pilih 0 Alamat pendaftaran = 0x40004C0A
  • Port 1 Pilih 1 Alamat register = 0x40004C0C

Saat menggunakan port sebagai input, sebaiknya gunakan resistor pull-up atau pull-down internal MSP432.

Karena papan pengembangan Launchpad telah menghubungkan kedua sakelar ke ground (LOW saat ditekan), itu berarti kita harus menggunakan resistor pull UP untuk memastikan kita memiliki HIGH yang solid saat tidak ditekan.

Pull Up / Pull Down Resistor

Dibutuhkan dua alamat Register Port 1 yang berbeda untuk mengikat input switch tersebut ke resistor pull-up.

1) Gunakan register Port 1 Resistor-Enable (0x40004C06) untuk menunjukkan bahwa Anda menginginkan resistor (untuk dua bit itu), 2) dan kemudian gunakan register Output Port 1 (0x40004C02) untuk mengatur resistor sebagai pull-up atau pull-down. Mungkin tampak membingungkan bahwa kita menggunakan register Output pada input. Register Output memiliki hampir seperti tujuan ganda.

Jadi, untuk menyatakan kembali dengan cara lain, register Output dapat mengirimkan TINGGI atau RENDAH ke output (seperti LED merah tunggal), dan / atau digunakan untuk mengatur resistor pull-up atau pull-down untuk input, TAPI HANYA jika fitur tersebut telah diaktifkan melalui register Resistor-Enable.

Penting dalam hal di atas - saat mengirim/menyetel LOW atau HIGH ke bit output apa pun, Anda harus mempertahankan status pull-up/pull-down dari bit input secara bersamaan.

(video mencoba menjelaskan)

Membaca Bit Input Port

  • Atur SEL0/ SEL1 untuk fungsionalitas GPIO
  • Atur register DIR sebagai input untuk bit switch, tetapi sebagai output untuk LED (bersamaan dalam byte yang sama)
  • Aktifkan resistor
  • Tetapkan sebagai resistor pull-up
  • Baca pelabuhan
  • Anda mungkin ingin memfilter nilai yang dibaca untuk mengisolasi hanya bit yang Anda butuhkan (sakelar 1 dan 2)

Direkomendasikan: