Daftar Isi:

AVRSH: Shell Interpreter Perintah untuk Arduino/AVR.: 6 Langkah (dengan Gambar)
AVRSH: Shell Interpreter Perintah untuk Arduino/AVR.: 6 Langkah (dengan Gambar)

Video: AVRSH: Shell Interpreter Perintah untuk Arduino/AVR.: 6 Langkah (dengan Gambar)

Video: AVRSH: Shell Interpreter Perintah untuk Arduino/AVR.: 6 Langkah (dengan Gambar)
Video: Fitur Arduino Leonardo Membuat Ketar Ketir Pengguna Arduino uno 2024, Juli
Anonim
AVRSH: Shell Penerjemah Perintah untuk Arduino/AVR
AVRSH: Shell Penerjemah Perintah untuk Arduino/AVR

Pernah ingin "masuk" ke mikrokontroler AVR Anda? Pernah berpikir akan keren untuk "kucing" register untuk melihat isinya? Apakah Anda selalu menginginkan cara untuk menghidupkan dan mematikan sub-sistem periferal individual AVR atau Arduino Anda secara *real time*? Saya juga, jadi saya menulis AVR Shell, shell mirip UNIX. Ini seperti UNIX karena mengingatkan pada akun shell yang Anda beli dan gunakan untuk menjalankan bot tabrakan nick irc Anda, serta memiliki satu atau dua perintah yang sama. Ini juga memiliki sistem file yang menyerupai UNIX extfs, menggunakan EEPROM eksternal, tapi itu menjadi proyek tersendiri jadi saya akan merilis modul itu secara terpisah di bawah instruksi yang berbeda ketika sudah siap produksi. Berikut adalah daftar hal-hal yang saat ini dapat Anda lakukan dengan AVR Shell:

  • Baca semua Data Direction Registers (DDRn), port, dan pin Anda secara real-time
  • Menulis ke semua DDRn, port, dan pin Anda untuk menyalakan motor, LED, atau membaca sensor secara real-time
  • Daftar semua register yang dikenal pada sistem
  • Buat dan simpan nilai dalam variabel yang ditentukan pengguna yang didukung oleh EEPROM.
  • Buat kata sandi root dan autentikasi terhadapnya (digunakan untuk akses telnet)
  • Baca kecepatan jam CPU yang dikonfigurasi
  • Ubah kecepatan jam CPU Anda dengan menyetel prescaler
  • Mulai dan hentikan penghitung waktu 16-bit untuk mengatur waktu berbagai hal
  • Menghidupkan dan/atau mematikan subsistem periferal: Analog to Digital Converters (ADC), Serial Peripheral Interface (SPI), Two-wire Interface (TWI/I2C), UART/USART. Berguna ketika Anda ingin mengurangi konsumsi daya mikrokontroler atau untuk mengaktifkan fungsi tertentu.
  • Ditulis dalam C++ dengan objek yang dapat digunakan kembali.

Instruksi ini akan memandu Anda melalui instalasi, penggunaan, dan penyesuaian avrsh.

Langkah 1: Apa yang Anda Butuhkan

Apa yang Anda Butuhkan
Apa yang Anda Butuhkan

Instruksi ini tidak memerlukan banyak hal kecuali Anda:

  • Memiliki Arduino atau ATmega328P. AVR lain dapat berfungsi, tetapi Anda mungkin perlu memodifikasi kode untuk mendaftar register apa pun yang unik untuk MCU Anda. Nama hanya perlu cocok dengan apa yang tercantum dalam file header yang unik untuk MCU Anda. Banyak dari nama register yang sama di antara AVR, jadi jarak tempuh Anda mungkin berbeda saat melakukan porting.
  • Miliki cara untuk terhubung ke serial USART Arduino/AVR Anda. Sistem telah diuji paling luas dengan Terminal AVR, aplikasi Windows yang membuat koneksi serial melalui port USB atau COM Anda. Bekerja dengan Arduino menggunakan koneksi USB dan AVR apa pun menggunakan USB-BUB dari Moderndevice.com. Opsi terminal lainnya termasuk: Putty, minicom (Linux dan FreeBSD), layar (Linux/FreeBSD), Hyperterminal, Teraterm. Saya telah menemukan dempul dan teraterm mengirim beberapa sampah saat menghubungkan sehingga perintah pertama Anda mungkin kacau.
  • Pasang dan jalankan firmware AVR Shell, yang dapat Anda unduh dari halaman ini, atau selalu dapatkan versi terbaru di BattleDroids.net.

Untuk menginstal Terminal AVR, cukup buka kemasannya dan jalankan. Untuk menginstal firmware AVR Shell, unduh dan langsung unggah file hex dan sambungkan terminal serial Anda pada 9600 baud, atau kompilasi sendiri dengan "make" dan kemudian "make program" untuk mengunggah hex. Catatan, Anda mungkin perlu mengubah pengaturan AVRDUDE untuk mencerminkan port COM Anda. Catatan: Atribut PROGMEM rusak dalam implementasi AVR GCC saat ini untuk C++ dan ini adalah bug yang diketahui. Jika Anda mengompilasinya, berharap untuk mendapatkan banyak pesan peringatan yang mengatakan "peringatan: hanya variabel yang diinisialisasi yang dapat ditempatkan ke dalam area memori program." Selain mengganggu untuk dilihat, peringatan ini tidak berbahaya. Karena C++ pada platform tersemat tidak termasuk dalam daftar prioritas AVR GCC, tidak diketahui kapan ini akan diperbaiki. Jika Anda memeriksa kodenya, Anda akan melihat di mana saya telah bekerja untuk mengurangi peringatan ini dengan menerapkan pernyataan atribut saya sendiri. Cukup sederhana. Unduh dan instal apa pun yang mungkin Anda perlukan untuk membalik halaman dan mari kita mulai.

Langkah 2: Membaca dan Menulis Register

Membaca dan Menulis Register
Membaca dan Menulis Register

Shell AVR ditulis terutama untuk mengakses beberapa sensor yang telah saya sambungkan ke AVR saya. Dimulai dengan LED sederhana kemudian pindah ke sensor cahaya, sensor suhu, dan akhirnya ke dua transduser ultrasonik. avrsh dapat mengatur komponen digital dari sensor ini dengan menulis ke register yang mengontrolnya. Memanipulasi register AVR saat menjalankan Untuk mendapatkan daftar semua register yang diketahui di Arduino Anda, ketik:

register cetak dan Anda akan mendapatkan hasil cetak seperti ini

Saya tahu tentang register berikut:

TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR pinc EEDR PIND sreg EEARL GPIOR0 EEARH GPIOR1 GTCCR GPIOR2 TCCR0A TCCR0B TCNT0 OCR0A OCR0B SPCR SPDR ACSR SMCR MCUSR MCUCR SPMCSR WDTCSR CLKPR PRR OSCCAL PCICR EICRA PCMSK0 PCMSK1 TIMSK0 TIMSK1 TIMSK2 ADCL ADCH ADCSRA ADCSRB ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B ASSR TWBR TWSR TWSR TWAR TWDR SRUB@ RTHPORT Untuk melihat bagaimana masing-masing bit diatur dalam register apa pun, gunakan perintah cat atau echo

kucing %GPIOR0 Di sini saya meminta penerjemah perintah untuk menampilkan, atau menggemakan, isi Register I/O Tujuan Umum #0. Perhatikan tanda persen (%) di depan nama register. Anda memerlukan ini untuk menunjukkan ke shell bahwa ini adalah kata kunci yang dicadangkan yang mengidentifikasi register. Output khas dari perintah echo terlihat seperti ini

GPIOR0(0x0) disetel ke [00000000] Output menunjukkan nama register, nilai heksadesimal yang ditemukan dalam register dan representasi biner dari register (menunjukkan setiap bit sebagai 1 atau 0). Untuk mengatur bit tertentu dalam register apa pun, gunakan operator "indeks" . Misalnya, katakanlah saya ingin bit ke-3 menjadi 1

%GPIOR0[3] = 1 dan shell akan memberi Anda respons yang menunjukkan tindakan dan hasilnya

GPIOR0(0x0) disetel ke [00000000] (0x8) disetel ke [00001000] Jangan lupa tanda persen untuk memberi tahu shell bahwa Anda sedang bekerja dengan register. Perhatikan juga bahwa dengan menyetel bit ke-3, itu adalah 4 bit karena AVR kami menggunakan indeks berbasis nol. Dengan kata lain, menghitung ke bit ke-3 Anda menghitung 0, 1, 2, 3, yang merupakan tempat ke-4, tetapi bit ke-3. Anda dapat menghapus sedikit dengan cara yang sama dengan menyetel sedikit ke nol. Dengan mengatur bit seperti ini, Anda dapat mengubah fungsi AVR Anda dengan cepat. Misalnya, dengan mengubah nilai kecocokan timer CTC yang ditemukan di OCR1A. Ini juga memungkinkan Anda mengintip pengaturan tertentu yang harus Anda periksa secara terprogram dalam kode Anda, seperti nilai UBBR untuk baud rate Anda. Bekerja dengan DDRn, PORTn, dan PINn Pin I/O juga ditetapkan ke register dan dapat diatur dengan cara yang persis sama, tetapi sintaks khusus telah dibuat untuk bekerja dengan jenis register ini. Dalam kode, ada proses normal untuk, katakanlah, menyalakan LED atau perangkat lain yang membutuhkan tinggi atau rendah digital. Ini membutuhkan pengaturan Register Arah Data untuk menunjukkan pin untuk output, dan kemudian menulis 1 atau 0 ke bit tertentu di port yang benar. Dengan asumsi kami memiliki LED yang terhubung ke pin digital 13 (PB5) dan kami ingin menyalakannya, berikut ini cara melakukannya saat AVR Anda berjalan

setel pin pb5 outputtulis pin pb5 tinggi Outputnya, selain dapat melihat LED Anda menyala, akan terlihat seperti ini

root@ATmega328p> setel pin pb5 outputSet pb5 untuk outputroot@ATmega328p> tulis pin pb5 highTulis logika high ke pin pb5 "root@ATmega328p>" adalah prompt shell yang menunjukkan bahwa shell siap menerima perintah dari Anda. Untuk mematikan LED, Anda cukup menulis nilai rendah ke pin. Jika Anda ingin membaca input digital dari pin, gunakan perintah read. Menggunakan contoh kami di atas

root@ATmega328p> baca pin pb5Pin: pb5 HIGH Atau, cukup gema register pin yang mengontrol port pin itu. Misalnya, jika kita memiliki sakelar celup yang terhubung ke pin digital 7 dan 8 (PD7 dan PD8), Anda dapat mengirim perintah

gema %PIND dan shell kemudian akan menampilkan konten register itu, menunjukkan kepada Anda semua status input/output dari perangkat yang terhubung dan apakah status sakelar hidup atau mati.

Langkah 3: Membaca dan Menulis Sekring

Membaca dan Menulis Sekring
Membaca dan Menulis Sekring

Sekering adalah jenis register khusus. Mereka mengontrol semuanya, mulai dari kecepatan clock mikrokontroler Anda hingga metode pemrograman apa yang tersedia untuk menulis perlindungan EEPROM. Terkadang Anda perlu mengubah pengaturan ini, terutama jika Anda membuat sistem AVR yang berdiri sendiri. Saya tidak yakin Anda harus mengubah pengaturan sekering Anda di Arduino. Hati-hati dengan sekering Anda; Anda dapat mengunci diri sendiri jika Anda mengaturnya dengan tidak benar. Dalam instruksi sebelumnya, saya menunjukkan bagaimana Anda dapat membaca dan mengatur sekering Anda menggunakan programmer dan avrdude Anda. Di sini, saya akan menunjukkan kepada Anda cara membaca kembali sekering Anda saat dijalankan untuk melihat bagaimana sebenarnya MCU Anda telah menyetelnya. Perhatikan, bahwa ini bukan pengaturan waktu kompilasi yang Anda dapatkan dari definisi tetapi sekering yang sebenarnya saat MCU membacanya saat run time. Dari Tabel 27-9 pada datasheet ATmega328P (databook, lebih seperti itu) bit dari Fuse Low Byte adalah sebagai berikut:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Hal yang menarik untuk dicatat adalah bahwa dengan sekering, 0 berarti terprogram dan 1 berarti bit tertentu tidak terprogram. Agak kontra-intuitif, tetapi begitu Anda mengetahuinya, Anda mengetahuinya.

  • CKDIV8 mengatur jam CPU Anda untuk dibagi 8. ATmega328P berasal dari pabrik yang diprogram untuk menggunakan osilator internalnya pada 8MHz dengan CKDIV8 diprogram (yaitu diatur ke 0) memberikan Anda F_CPU akhir atau frekuensi CPU 1MHz. Pada Arduino, ini diubah karena dikonfigurasi untuk menggunakan osilator eksternal pada 16MHz.
  • CKOUT ketika diprogram akan menampilkan jam CPU Anda pada PB0, yang merupakan pin digital 8 pada Arduinos.
  • SUT[1..0] menentukan waktu mulai untuk AVR Anda.
  • CKSEL[3..0] mengatur sumber clock, seperti osilator RC internal, osilator eksternal, dll.

Ketika Anda membaca sekering Anda, itu akan dikembalikan kepada Anda dalam heksadesimal. Ini adalah format yang Anda butuhkan jika Anda ingin menulis sekering melalui avrdude. Di arduino saya, inilah yang saya dapatkan ketika saya membaca byte sekering yang lebih rendah:

root@ATmega328p> baca lfuseLower Fuse: 0xffJadi, semua bit disetel ke 1. Saya melakukan prosedur yang sama pada klon Arduino dan mendapatkan nilai yang sama. Memeriksa salah satu sistem AVR yang berdiri sendiri, saya mendapatkan 0xDA yang merupakan nilai yang telah saya tetapkan beberapa waktu lalu ketika mengkonfigurasi chip. Prosedur yang sama digunakan untuk memeriksa sekring High Fuse Byte, Extended Fuse Byte, dan Lock. Byte fuse kalibrasi dan tanda tangan telah dinonaktifkan dalam kode dengan arahan praprosesor #if 0, yang dapat Anda ubah jika Anda merasa tidak nyaman.

Langkah 4: Perintah Lainnya

Perintah lainnya
Perintah lainnya

Ada beberapa perintah lain yang dipahami oleh penerjemah perintah default yang mungkin berguna bagi Anda. Anda dapat melihat semua perintah yang diimplementasikan dan rilis mendatang dengan mengeluarkan bantuan atau menu saat diminta. Saya akan segera membahasnya di sini karena sebagian besar sudah cukup jelas. Pengaturan Frekuensi Jam CPU Anda dapat mengetahui firmware yang telah dikonfigurasi untuk digunakan sebagai pengaturan jam CPU dengan perintah fcpu:

root@ATmega328p> frekuensi fcpuCPU: 16000000Itu 16 juta, atau 16 juta herz, lebih dikenal sebagai 16 MHz. Anda dapat mengubah ini dengan cepat, untuk alasan apa pun, dengan perintah jam. Perintah ini membutuhkan satu argumen: prescaler untuk digunakan saat membagi kecepatan clock Anda. Perintah clock memahami nilai prescaler ini:

  • ckdiv2
  • ckdiv4
  • ckdiv8
  • ckdiv16
  • ckdiv32
  • ckdiv64
  • ckdiv128
  • ckdiv256

Menggunakan perintah:

jam ckdiv2 ketika kecepatan cpu Anda 16MHz akan mengakibatkan kecepatan clock Anda diubah menjadi 8MHz. Menggunakan prescaler ckdiv64 dengan kecepatan clock awal 16MHz akan menghasilkan kecepatan clock akhir 250 KHz. Mengapa Anda ingin membuat MCU Anda lebih lambat? Nah, untuk satu, kecepatan clock yang lebih rendah mengkonsumsi lebih sedikit daya dan jika MCU Anda kehabisan baterai di enklosur proyek, Anda mungkin tidak memerlukannya untuk berjalan pada kecepatan tertinggi, dan oleh karena itu, dapat menurunkan kecepatan dan mengurangi konsumsi dayanya., meningkatkan masa pakai baterai. Juga, jika Anda menggunakan jam untuk masalah pengaturan waktu apa pun dengan MCU lain, katakanlah, menerapkan UART perangkat lunak atau semacamnya, Anda mungkin ingin mengaturnya ke nilai tertentu yang mudah untuk mendapatkan baud rate yang bagus dengan tingkat kesalahan yang lebih rendah. Menghidupkan dan Mematikan Sub-Sistem Periferal Sama halnya dengan mengurangi konsumsi daya yang disebutkan sebelumnya, Anda mungkin ingin mengurangi daya lebih lanjut dengan mematikan beberapa periferal terpasang yang tidak Anda gunakan. Penerjemah perintah dan shell saat ini dapat menghidupkan dan mematikan periferal berikut:

  • Konverter Analog-ke-Digital (ADC). Periferal ini digunakan ketika Anda memiliki sensor analog yang menyediakan data (seperti suhu, cahaya, akselerasi, dll) dan perlu mengubahnya menjadi nilai digital.
  • Antarmuka Periferal Serial (SPI). Bus SPI digunakan untuk berkomunikasi dengan perangkat lain yang mendukung SPI, seperti memori eksternal, driver LED, ADC eksternal, dll. Bagian dari SPI digunakan untuk pemrograman ISP, atau setidaknya pinnya, jadi berhati-hatilah saat mematikannya jika Anda memprogram melalui ISP.
  • Antarmuka Dua Kawat. Beberapa perangkat eksternal menggunakan bus I2C untuk berkomunikasi, meskipun ini dengan cepat digantikan oleh perangkat yang mendukung SPI karena SPI memiliki throughput yang lebih besar.
  • USART. Ini adalah antarmuka serial Anda. Anda mungkin tidak ingin mematikan ini jika Anda terhubung ke AVR melalui koneksi serial! Namun, saya menambahkan ini di sini sebagai kerangka untuk porting ke perangkat yang memiliki beberapa USART seperti ATmega162 atau ATmega644P.
  • semua. Argumen untuk perintah powerup atau powerdown ini mengaktifkan semua periferal yang disebutkan atau mematikan semuanya dengan satu perintah. Sekali lagi, gunakan perintah ini dengan bijak.

root@ATmega328p> powerdown twiPowerdown of twi complete.root@ATmega328p> powerup twiPowerup of twi complete.

Memulai dan Menghentikan Timer Shell memiliki timer 16-bit built-in yang tersedia untuk digunakan. Anda memulai timer dengan perintah timer:

pengatur waktu mulaidan hentikan penghitung waktu dengan argumen berhenti

penghitung waktu berhentiTimer ini tidak akan bertentangan dengan timer USART internal. Lihat kode untuk detail implementasi penghitung waktu USART, jika detail mengerikan semacam itu menarik minat Anda

root@ATmega328p> timer startStarted timer.root@ATmega328p> timer stopWaktu yang berlalu: ~ 157 detik Otentikasi Shell dapat menyimpan sandi 8 karakter ke dalam EEPROM. Mekanisme kata sandi ini dibuat untuk mendukung kemampuan login telnet, tetapi dapat diperluas untuk melindungi hal-hal lain. Misalnya, Anda dapat meminta perintah tertentu, seperti mengubah nilai register, melalui mekanisme otentikasi. Atur kata sandi dengan perintah kata sandi

root@ATmega328p> passwd blah Tulis kata sandi root ke EEPROMOtorisasi terhadap kata sandinya (atau minta otorisasi secara terprogram melalui kode) dengan perintah auth. Perhatikan, bahwa jika Anda mencoba mengubah kata sandi root dan sudah ada set kata sandi root, Anda harus mengotorisasi diri Anda sendiri terhadap kata sandi lama sebelum diizinkan untuk mengubahnya menjadi kata sandi baru

root@ATmega328p> passwd blinkyAnda harus mengotorisasi diri Anda terlebih dahulu.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinkyTulis kata sandi root BARU ke EEPROMTentu saja, Anda perlu memuat file avrsh.eep jika Anda menghapus firmware untuk mengembalikan nilai dan variabel lama Anda. Makefile akan membuat file EEPROM untuk Anda. Variabel Shell memahami pengertian variabel yang ditentukan pengguna. Kode membatasi ini hingga 20, tetapi Anda dapat mengubahnya jika Anda suka dengan mengubah definisi MAX_VARIABLES di script.h. Anda dapat menyimpan nilai 16-bit (yaitu, angka apa pun hingga 65.536) ke variabel untuk dipanggil kembali nanti. Sintaksnya mirip dengan register kecuali tanda dolar ($) digunakan untuk menunjukkan variabel ke shell. Daftar semua variabel Anda dengan perintah variabel cetak

variabel cetak Variabel yang ditentukan pengguna: Nama Indeks -> Nilai(01): $GRATIS$ -> 0(02): $GRATIS$ -> 0(03): $GRATIS$ -> 0(04): $GRATIS$ -> 0(05): $GRATIS$ -> 0(06): $GRATIS$ -> 0(07): $GRATIS$ -> 0(08): $GRATIS$ -> 0(09): $GRATIS$ -> 0(10): $GRATIS$ -> 0(11): $GRATIS$ -> 0(12): $GRATIS$ -> 0(13): $GRATIS$ -> 0(14): $GRATIS$ -> 0(15): $GRATIS$ -> 0(16): $GRATIS$ -> 0(17): $GRATIS$ -> 0(18): $GRATIS$ -> 0(19): $GRATIS$ -> 0(20): $GRATIS$ -> 0Selesai. Tetapkan variabel

$newvar = 25$waktu habis = 23245Dapatkan nilai dari variabel yang diberikan

root@ATmega328p> echo $newvar$ newvar 25Anda dapat melihat semua variabel yang saat ini Anda buat dengan perintah print yang sudah Anda ketahui

Variabel yang ditentukan pengguna: Nama Indeks -> Nilai(01): newvar -> 25(02): batas waktu -> 23245(03): $GRATIS$ -> 0(04): $GRATIS$ -> 0(05): $GRATIS$ -> 0(06): $GRATIS$ -> 0(07): $GRATIS$ -> 0(08): $GRATIS$ -> 0(09): $GRATIS$ -> 0(10): $GRATIS$ -> 0(11): $GRATIS$ -> 0(12): $GRATIS$ -> 0(13): $GRATIS$ -> 0(14): $GRATIS$ -> 0(15): $GRATIS$ -> 0(16): $GRATIS$ -> 0(17): $GRATIS$ -> 0(18): $GRATIS$ -> 0(19): $GRATIS$ -> 0(20): $GRATIS$ -> 0Selesai. Nama $FREE$ hanya menunjukkan bahwa lokasi variabel itu gratis dan belum diberi nama variabel.

Langkah 5: Menyesuaikan Shell

Menyesuaikan Shell
Menyesuaikan Shell

Anda bebas meretas kode dan menyesuaikannya dengan kebutuhan Anda sendiri, jika Anda mau. Jika saya tahu saya akan merilis kode ini, saya akan membuat kelas penerjemah perintah dan struktur perintah yang terpisah dan hanya mengulangi melalui pemanggilan penunjuk fungsi ini. Ini akan mengurangi jumlah kode, tetapi karena shell mem-parsing baris perintah dan memanggil metode shell yang sesuai. Untuk menambahkan perintah kustom Anda sendiri, lakukan hal berikut: 1. Tambahkan perintah Anda ke daftar parse Perintah parser akan mengurai baris perintah dan memberi Anda perintah dan argumen apa pun secara terpisah. Argumen dilewatkan sebagai pointer ke pointer, atau array pointer, namun Anda ingin bekerja dengan mereka. Ini ditemukan di shell.cpp. Buka shell.cpp dan temukan metode ExecCmd dari kelas AVRShell. Anda mungkin ingin menambahkan perintah ke memori program. Jika ya, tambahkan perintah di progmem.h dan progmem.cpp. Anda dapat menambahkan perintah ke memori program secara langsung menggunakan makro PSTR(), tetapi Anda akan membuat peringatan lain dari jenis yang disebutkan sebelumnya. Sekali lagi, ini adalah bug yang diketahui bekerja dengan C++, tetapi Anda dapat menyiasatinya dengan menambahkan perintah langsung di file progmem.*, seperti yang telah saya lakukan. Jika Anda tidak keberatan menambahkan penggunaan SRAM Anda, Anda dapat menambahkan perintah seperti yang telah saya ilustrasikan dengan perintah "jam". Katakanlah Anda ingin menambahkan perintah baru yang disebut "newcmd." Pergi ke AVRShell::ExecCmd dan temukan tempat yang nyaman untuk memasukkan kode berikut:

else if (!strcmp(c, "newcmd")) cmdNewCmd(args);Ini akan menambahkan perintah Anda dan memanggil metode cmdNewCmd yang akan Anda tulis di langkah berikutnya. 2. Tulis kode perintah khusus Anda Di file yang sama, tambahkan kode perintah khusus Anda. Ini adalah definisi metode. Anda masih ingin menambahkan deklarasi ke shell.h. Tambahkan saja ke perintah lain. Pada contoh sebelumnya, kodenya mungkin terlihat seperti ini

voidAVRSShell::cmdNewCmd(char ** args){ sprintf_P(buff, PSTR("Perintah Anda adalah %s\r\n", args[0]); WriteRAM(buff);}Ada beberapa hal di sini. Pertama, "buff" adalah buffer array 40 karakter yang disediakan dalam kode untuk Anda gunakan. Kami menggunakan versi memori program sprintf karena kami memberikannya PSTR. Anda dapat menggunakan versi reguler jika Anda mau, tetapi pastikan Anda tidak melewatkan format dalam PSTR. Juga, argumennya ada di array args. Jika Anda mengetik "newcmd arg1 arg2" Anda bisa mendapatkan argumen ini dengan subskrip args[0] dan args[1]. Anda dapat memberikan maksimum MAX_ARGS argumen, seperti yang didefinisikan dalam kode. Jangan ragu untuk mengubah nilai tersebut saat Anda mengkompilasi ulang jika Anda membutuhkan lebih banyak argumen untuk diteruskan sekaligus. WriteLine dan WriteRAM adalah fungsi global yang mengembalikan metode UART dengan nama yang sama. Argumen ke-2 untuk fungsi ini bersifat implisit. Jika Anda tidak melewatkan apa pun, prompt perintah akan ditulis setelahnya. Jika Anda memberikan 0 sebagai argumen ke-2, prompt tidak akan ditulis. Ini berguna ketika Anda ingin menulis beberapa string terpisah ke output sebelum prompt perintah dikembalikan ke pengguna. 3. Perintahkan shell untuk mengeksekusi kode perintah Anda telah memberi tahu eksekutor shell untuk mengeksekusi metode cmdNewCmd saat Anda mengatur perintah baru, tetapi tambahkan ke file shell.h agar dipahami oleh objek shell. Tambahkan saja di bawah perintah terakhir atau di depan perintah pertama, atau di mana saja di sana. Dan hanya itu. Kompilasi ulang dan unggah firmware ke Arduino Anda dan perintah baru Anda tersedia dari shell saat diminta.

Langkah 6: Ringkasan

Anda harus tahu cara menginstal dan menghubungkan ke AVR/Arduino Anda dan mendapatkan prompt langsung pada mikrokontroler Anda yang sedang berjalan. Anda mengetahui beberapa perintah yang akan menarik data runtime dari MCU atau menetapkan nilai ke MCU dengan cepat. Anda juga telah diperlihatkan cara menambahkan kode kustom Anda sendiri untuk membuat perintah unik Anda sendiri ke shell untuk menyesuaikannya lebih lanjut dengan kebutuhan Anda sendiri. Anda bahkan dapat meminta juru bahasa perintah agar hanya berisi perintah khusus Anda, jika itu sesuai dengan kebutuhan Anda. Saya harap Anda menikmati instruksi ini dan bahwa AVR Shell dapat berguna bagi Anda, baik sebagai juru bahasa perintah waktu nyata atau sebagai proses pembelajaran dalam menerapkan Anda sendiri. Seperti biasa, saya menantikan komentar atau saran tentang bagaimana instruksi ini dapat ditingkatkan! Selamat bersenang-senang dengan AVR Anda!

Direkomendasikan: