Isi kandungan:

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

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

Video: AVRSH: Shell Jurubahasa Perintah untuk Arduino / AVR .: 6 Langkah (dengan Gambar)
Video: Pika OS Distro Gaming Saingan Nobara OS - Review Linux Live USB Bahasa Indonesia 2024, Julai
Anonim
AVRSH: Shell Jurubahasa Perintah untuk Arduino / AVR
AVRSH: Shell Jurubahasa Perintah untuk Arduino / AVR

Pernah mahu "log masuk" ke mikrokontroler AVR anda? Pernah terfikir untuk "cat" daftar untuk melihat kandungannya? Adakah anda selalu mahukan kaedah untuk menghidupkan dan mematikan sub-sistem periferal individu AVR atau Arduino anda dalam * masa nyata *? Saya juga menuliskan Shell AVR, shell seperti UNIX. Ini seperti UNIX kerana mengingatkan pada akaun shell yang anda keluar dan beli untuk menjalankan bot perlanggaran irc nick anda, serta mempunyai satu atau dua perintah. Ia juga mempunyai sistem fail yang menyerupai ekstensi UNIX, menggunakan EEPROM luaran, tetapi itu menjadi projek untuk dirinya sendiri, jadi saya akan melepaskan modul itu secara berasingan dengan arahan yang berbeza apabila siap untuk pengeluaran. Berikut adalah senarai perkara yang boleh anda lakukan dengan AVR Shell:

  • Baca semua Daftar arah data, DDRn, port, dan pin anda dalam masa nyata
  • Tulis ke semua DDRn, port, dan pin anda untuk menghidupkan motor, LED, atau sensor baca dalam masa nyata
  • Senaraikan semua daftar yang diketahui di sistem
  • Buat dan simpan nilai dalam pemboleh ubah yang ditentukan pengguna yang disokong oleh EEPROM.
  • Buat kata laluan root dan mengesahkannya (digunakan untuk akses telnet)
  • Baca kelajuan jam CPU yang dikonfigurasi
  • Ubah kelajuan jam CPU anda dengan menetapkan prescaler
  • Mulakan dan hentikan pemasa 16-bit untuk menentukan masa dengan pelbagai perkara
  • Kuasa naik dan / atau matikan sub-sistem periferal: Analog ke Digital Converter (ADC), Serial Peripheral Interface (SPI), Two-wire Interface (TWI / I2C), UART / USART. Berguna ketika anda ingin mengurangkan penggunaan kuasa mikrokontroler atau untuk mengaktifkan fungsi tertentu.
  • Ditulis dalam C ++ dengan objek yang boleh digunakan semula.

Instruksional ini akan melalui pemasangan, penggunaan, dan penyesuaian avrsh.

Langkah 1: Apa yang Anda Perlu

Apa yang Anda Perlu
Apa yang Anda Perlu

Pengajaran ini tidak memerlukan banyak kecuali anda:

  • Mempunyai Arduino atau ATmega328P. AVR lain boleh berfungsi, tetapi anda mungkin perlu mengubah kod untuk menyenaraikan daftar yang unik untuk MCU anda. Nama-nama hanya perlu sepadan dengan yang disenaraikan dalam fail tajuk yang unik untuk MCU anda. Sebilangan besar nama daftar adalah sama antara AVR, jadi jarak tempuh anda mungkin berbeza ketika membuat port.
  • Mempunyai cara untuk menyambung ke USART bersiri Arduino / AVR anda. Sistem ini telah diuji secara meluas dengan Terminal AVR, aplikasi Windows yang membuat sambungan bersiri melalui port USB atau COM anda. Bekerja dengan Arduino menggunakan sambungan USB dan sebarang AVR menggunakan USB-BUB dari Moderndevice.com. Pilihan terminal lain termasuk: Putty, minicom (Linux dan FreeBSD), layar (Linux / FreeBSD), Hyperterminal, Teraterm. Saya mendapati putty dan teraterm menghantar sampah ketika menyambung supaya perintah pertama anda mungkin terganggu.
  • Pasang dan jalankan firmware AVR Shell, yang boleh anda muat turun dari halaman ini, atau selalu dapatkan versi terbaru di BattleDroids.net.

Untuk memasang Terminal AVR, buka sahaja dan jalankan. Untuk memasang firmware AVR Shell, muat turunnya dan muat naik fail hex secara langsung dan sambungkan terminal bersiri anda pada 9600 baud, atau kumpulkan sendiri dengan "make" dan kemudian "buat program" untuk memuat naik hex. Perhatikan, anda mungkin perlu mengubah tetapan AVRDUDE untuk mencerminkan port COM anda. Catatan: Atribut PROGMEM rosak dalam pelaksanaan AVR GCC semasa untuk C ++ dan ini adalah bug yang diketahui. Sekiranya anda menyusunnya, harap dapatkan banyak mesej amaran yang mengatakan "peringatan: hanya pemboleh ubah yang diinisialisasi dapat dimasukkan ke dalam kawasan memori program." Selain menjengkelkan, amaran ini tidak berbahaya. Oleh kerana C ++ pada platform yang disematkan tidak tinggi dalam senarai keutamaan AVR GCC, tidak diketahui kapan ini akan diperbaiki. Sekiranya anda melihat kodnya, anda akan melihat di mana saya telah berusaha untuk mengurangkan amaran ini dengan melaksanakan pernyataan atribut saya sendiri. Muat turun dan pasang apa sahaja yang mungkin anda perlukan kemudian buka halaman dan mari kita retak '.

Langkah 2: Membaca dan Menulis Daftar

Daftar Membaca dan Menulis
Daftar Membaca dan Menulis

Shell AVR ditulis terutamanya untuk mengakses beberapa sensor yang saya sambungkan ke AVR saya. Ia bermula dengan LED sederhana kemudian beralih ke sensor cahaya, sensor suhu, dan akhirnya ke dua transduser ultrasonik. avrsh dapat menetapkan komponen digital sensor ini dengan menulis kepada daftar yang mengawalnya. Memanipulasi daftar AVR semasa berjalan Untuk mendapatkan senarai semua daftar yang diketahui di Arduino anda, ketik:

daftar cetak dan anda akan mendapat cetakan seperti ini

Saya tahu mengenai daftar 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 Twar TWDR TWCR TWAMR UCSR0A UCSR0B UCSR0C UBRR0L UBRR0H UDR0 PORTB root @ ATmega328p> Untuk melihat bagaimana bit individu ditetapkan dalam mana-mana daftar, gunakan perintah cat atau echo

kucing% GPIOR0 Di sini saya meminta jurubahasa perintah untuk memaparkan, atau menggema, isi Daftar I / O Tujuan Umum # 0. Perhatikan tanda peratus (%) di hadapan nama daftar. Anda memerlukan ini untuk menunjukkan kepada shell bahawa ini adalah kata kunci terpelihara yang mengenal pasti daftar. Output khas dari arahan echo kelihatan seperti ini

GPIOR0 (0x0) ditetapkan ke [00000000] Keluaran menunjukkan nama daftar, nilai heksadesimal yang terdapat dalam daftar dan perwakilan binari daftar (menunjukkan setiap bit sebagai 1 atau 0). Untuk menetapkan bit tertentu dalam daftar apa pun, gunakan operator "indeks" . Sebagai contoh, katakan saya mahu bit ke-3 menjadi 1

% GPIOR0 [3] = 1 dan cengkerang akan memberi anda respons yang menunjukkan tindakan dan hasilnya

GPIOR0 (0x0) ditetapkan ke [00000000] (0x8) ditetapkan ke [00001000] Jangan lupa tanda peratus untuk memberitahu shell yang anda gunakan dengan daftar. Perhatikan juga bahawa dengan menetapkan bit ke-3, itu adalah 4 bit kerana AVR kami menggunakan indeks berasaskan sifar. Dengan kata lain, mengira bit ke-3 anda mengira 0, 1, 2, 3, yang merupakan tempat ke-4, tetapi bit ke-3. Anda boleh membersihkan sedikit dengan cara yang sama dengan menetapkan sedikit hingga sifar. Dengan menetapkan bit seperti ini, anda dapat mengubah fungsi AVR anda dengan cepat. Contohnya, dengan mengubah nilai pemadanan pemasa CTC yang terdapat di OCR1A. Ini juga memungkinkan anda melihat ke dalam tetapan tertentu yang anda perlukan untuk memeriksa kod anda secara terprogram, seperti nilai UBBR untuk kadar baud anda. Bekerja dengan DDRn, PORTn, dan PIN Pin I / O juga ditugaskan ke register dan dapat diatur dengan cara yang sama, tetapi sintaks khusus telah dibuat untuk bekerja dengan jenis register ini. Dalam kod, ada proses biasa untuk, misalnya, menghidupkan LED atau peranti lain yang memerlukan digital tinggi atau rendah. Ia memerlukan menetapkan Data Direction Register untuk menunjukkan pin itu untuk output, dan kemudian menulis 1 atau 0 ke bit tertentu di port yang betul. Dengan andaian kita mempunyai LED yang disambungkan ke pin digital 13 (PB5) dan kita mahu menyalakannya, inilah cara untuk melakukannya semasa AVR anda sedang berjalan

tetapkan pin pb5 outputwrite pin pb5 tinggi Keluarannya, selain dapat melihat LED anda menyala, akan kelihatan seperti ini

root @ ATmega328p> tetapkan pin pb5 output Tetapkan pb5 untuk outputroot @ ATmega328p> tulis pin pb5 tinggi Logik tulisan tinggi ke pin pb5 "Root @ ATmega328p>" adalah arahan shell yang menunjukkan bahawa ia sudah bersedia untuk menerima perintah dari anda. Untuk mematikan LED, anda hanya perlu menuliskan pin rendah. Sekiranya anda ingin membaca input digital dari pin, gunakan perintah baca. Menggunakan contoh di atas

root @ ATmega328p> pin baca pb5Pin: pb5 adalah TINGGI Sebagai alternatif, hanya gema daftar pin yang mengawal port pin itu. Sebagai contoh, jika kita mempunyai suis dip yang disambungkan ke pin digital 7 dan 8 (PD7 dan PD8), anda boleh menghantar arahan

gema% PIND dan shell kemudian akan memaparkan isi daftar itu, menunjukkan kepada anda semua keadaan input / output dari peranti yang disambungkan dan sama ada keadaan suis dihidupkan atau dimatikan.

Langkah 3: Membaca dan Menulis Fius

Fius Membaca dan Menulis
Fius Membaca dan Menulis

Fius adalah jenis daftar khas. Mereka mengawal segala-galanya dari kelajuan jam mikrokontroler anda hingga kaedah pengaturcaraan yang tersedia untuk melindungi EEPROM. Kadang kala anda perlu mengubah tetapan ini, terutamanya jika anda membuat sistem AVR yang berdiri sendiri. Saya tidak pasti anda harus mengubah tetapan fius anda di Arduino. Berhati-hati dengan sekering anda; anda boleh mengurung diri anda jika anda menetapkannya dengan tidak betul. Dalam arahan sebelumnya, saya menunjukkan bagaimana anda dapat membaca dan menetapkan sekering anda menggunakan programmer dan avrdude anda. Di sini, saya akan menunjukkan kepada anda cara membaca semula fius anda pada waktu berjalan untuk melihat bagaimana MCU anda sebenarnya telah menetapkannya. Perhatikan, bahawa ini bukan tetapan waktu kompilasi yang anda dapat dari definisi tetapi sekering sebenar kerana MCU membacanya pada waktu berjalan. Dari Jadual 27-9 dalam lembar data ATmega328P (pangkalan data, lebih seperti itu) bit Fuse Low Byte adalah seperti berikut:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Perkara yang menarik untuk diperhatikan ialah dengan sekering, 0 bermaksud diprogramkan dan 1 bermaksud bahawa bit tertentu tidak diprogramkan. Agak intuitif, tetapi setelah anda mengetahui, anda akan tahu.

  • CKDIV8 menetapkan jam CPU anda dibahagi dengan 8. ATmega328P berasal dari kilang yang diprogramkan untuk menggunakan pengayun dalamannya pada 8MHz dengan CKDIV8 diprogramkan (iaitu ditetapkan ke 0) yang memberi anda F_CPU akhir atau frekuensi CPU 1MHz. Pada Arduino, ini diubah kerana mereka dikonfigurasi untuk menggunakan pengayun luaran pada 16MHz.
  • CKOUT ketika diprogramkan akan mengeluarkan jam CPU anda pada PB0, yang merupakan pin digital 8 di Arduinos.
  • SUT [1..0] menentukan masa permulaan untuk AVR anda.
  • CKSEL [3..0] menetapkan sumber jam, seperti pengayun RC dalaman, pengayun luaran, dll.

Apabila anda membaca sekering anda, ia akan dikembalikan kepada anda dalam heksadesimal. Ini adalah format yang anda perlukan jika anda ingin menulis sekering melalui avrdude. Di arduino saya, inilah yang saya dapat ketika membaca bait fius bawah:

root @ ATmega328p> baca lfuseLower Fuse: 0xffJadi, semua bit ditetapkan ke 1. Saya melakukan prosedur yang sama pada klon Arduino dan mendapat nilai yang sama. Memeriksa salah satu sistem AVR yang berdiri sendiri, saya mendapat 0xDA yang merupakan nilai yang telah saya tetapkan beberapa saat semasa mengkonfigurasi cip. Prosedur yang sama digunakan untuk memeriksa sekering High Fuse Byte, Extended Fuse Byte, dan Lock. Bait fius penentukuran dan tanda tangan telah dilumpuhkan dalam kod dengan arahan preprocessor #if 0, yang boleh anda ubah jika anda merasa tidak senang.

Langkah 4: Perintah Lain

Perintah lain
Perintah lain

Terdapat beberapa arahan lain yang difahami oleh jurubahasa arahan lalai yang mungkin berguna bagi anda. Anda dapat melihat semua arahan pelepasan yang dilaksanakan dan akan datang dengan mengeluarkan bantuan atau menu pada arahan. Saya akan membahasnya dengan cepat di sini kerana kebanyakannya jelas. Tetapan 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 dikenali sebagai 16 MHz. Anda boleh mengubahnya dengan cepat, dengan alasan apa pun, dengan arahan jam. Perintah ini mengambil satu argumen: prescaler yang akan digunakan semasa membahagi kelajuan jam anda. Perintah jam memahami nilai prescaler ini:

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

Menggunakan arahan:

jam ckdiv2 apabila kelajuan cpu anda 16MHz akan mengakibatkan kecepatan jam anda berubah menjadi 8MHz. Menggunakan prescaler ckdiv64 dengan kelajuan jam awal 16MHz akan menghasilkan kelajuan jam akhir 250 KHz. Mengapa di Bumi anda mahu menjadikan MCU anda lebih perlahan? Nah, untuk satu, kelajuan jam yang lebih rendah menggunakan tenaga yang lebih sedikit dan jika MCU anda kehabisan bateri di kandang projek, anda mungkin tidak memerlukannya berjalan pada kelajuan tertinggi, dan oleh itu, dapat menurunkan kelajuan dan mengurangkan penggunaan kuasa, meningkatkan jangka hayat bateri. Juga, jika anda menggunakan jam untuk masalah masa dengan MCU lain, katakanlah, dengan menggunakan perisian UART atau beberapa perkara seperti itu, anda mungkin mahu menetapkannya pada nilai tertentu yang mudah untuk mendapatkan kadar genap yang baik dengan kadar ralat yang lebih rendah. Menghidupkan dan Menurunkan Sub-Sistem Periferal Pada catatan yang sama dengan mengurangkan penggunaan kuasa yang disebutkan sebelumnya, anda mungkin ingin mengurangkan kuasa dengan mematikan beberapa periferal on-board yang tidak anda gunakan. Jurubahasa perintah dan shell pada masa ini dapat menghidupkan dan mematikan periferal berikut:

  • Penukar Analog-ke-Digital (ADC). Periferal ini digunakan apabila anda mempunyai sensor analog yang menyediakan data (seperti suhu, cahaya, pecutan, dll) dan perlu mengubahnya menjadi nilai digital.
  • Antaramuka Siri Periferal (SPI). Bas SPI digunakan untuk berkomunikasi dengan peranti berkemampuan SPI lain, seperti memori luaran, pemacu LED, ADC luaran, dll. Bahagian SPI digunakan untuk pengaturcaraan ISP, atau sekurang-kurangnya pin, jadi berhati-hatilah semasa mematikannya jika anda memprogram melalui ISP.
  • Antara Muka Dua Wayar. Beberapa peranti luaran menggunakan bas I2C untuk berkomunikasi, walaupun ini dengan cepat digantikan oleh peranti yang didayakan SPI kerana SPI mempunyai throughput yang lebih besar.
  • USART. Ini adalah antara muka bersiri anda. Anda mungkin tidak mahu mematikannya jika anda bersambung ke AVR melalui sambungan bersiri! Walau bagaimanapun, saya menambahkannya di sini sebagai kerangka untuk membawa ke peranti yang mempunyai banyak USART seperti ATmega162 atau ATmega644P.
  • semua. Argumen ini untuk perintah powerup atau powerdown menghidupkan semua periferal yang disebutkan atau mematikan semuanya dengan satu perintah. Sekali lagi, gunakan arahan ini dengan bijak.

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

Memulakan dan Menghentikan Pemasa Cengkerang mempunyai pemasa 16-bit yang tersedia untuk digunakan. Anda memulakan pemasa dengan arahan pemasa:

permulaan pemasadan hentikan pemasa dengan argumen berhenti

pemasa berhentiPemasa ini tidak akan bertentangan dengan pemasa USART dalaman. Lihat kod untuk perincian pelaksanaan pemasa USART, jika detail seperti itu menarik minat anda

root @ ATmega328p> permulaan pemasaStarted timer.root@ATmega328p> pemberhentian pemasa Masa yang berlalu: ~ 157 saat Pengesahan Shell dapat menyimpan kata laluan 8 aksara ke dalam EEPROM. Mekanisme kata laluan ini dibuat untuk menyokong keupayaan log masuk telnet, tetapi dapat diperluas untuk melindungi perkara lain. Sebagai contoh, anda mungkin memerlukan arahan tertentu, seperti mengubah nilai daftar, melalui mekanisme pengesahan. Tetapkan kata laluan dengan perintah kata laluan

root @ ATmega328p> passwd blahTulis kata laluan root ke EEPROMBeri kuasa untuk mengesahkan kata laluannya (atau memerlukan pengesahan melalui kod secara terprogram) dengan perintah author. Perhatikan, jika anda cuba menukar kata laluan root dan sudah ada kata laluan root, anda mesti membenarkan diri anda daripada kata laluan lama sebelum dibenarkan menukarnya ke kata laluan baru

root @ ATmega328p> passwd blinkyAnda mesti memberi kebenaran kepada diri sendiri terlebih dahulu.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinkyWrote kata laluan root BARU ke EEPROMSudah tentu, anda perlu memuatkan fail avrsh.eep jika anda memadam firmware agar nilai dan pemboleh ubah lama anda dipulihkan. Makefile akan membuat fail EEPROM untuk anda. Pemboleh ubah Cengkerang memahami tanggapan pemboleh ubah yang ditentukan pengguna. Kod ini menghadkannya kepada 20, tetapi anda boleh mengubahnya jika anda mahu dengan mengubah MAX_VARIABLE menentukan dalam script.h. Anda boleh menyimpan sebarang nilai 16-bit (iaitu nombor hingga 65, 536) ke pemboleh ubah yang akan dipanggil semula kemudian. Sintaksnya mirip dengan register kecuali tanda dolar ($) digunakan untuk menunjukkan pemboleh ubah ke shell. Senaraikan semua pemboleh ubah anda dengan arahan pemboleh ubah cetak

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

$ newvar = 25 $ timeout = 23245Dapatkan nilai pemboleh ubah yang diberikan

root @ ATmega328p> gema $ newvar $ newvar 25Anda dapat melihat semua pemboleh ubah yang anda buat sekarang dengan perintah cetak yang sudah anda ketahui

Pemboleh ubah yang ditentukan pengguna: Nama Indeks -> Nilai (01): newvar -> 25 (02): timeout -> 23245 (03): $ PERCUMA $ -> 0 (04): $ PERCUMA $ -> 0 (05): $ PERCUMA $ -> 0 (06): $ PERCUMA $ -> 0 (07): $ PERCUMA $ -> 0 (08): $ PERCUMA $ -> 0 (09): $ PERCUMA $ -> 0 (10): $ PERCUMA $ -> 0 (11): $ PERCUMA $ -> 0 (12): $ PERCUMA $ -> 0 (13): $ PERCUMA $ -> 0 (14): $ PERCUMA $ -> 0 (15): $ PERCUMA $ -> 0 (16): $ PERCUMA $ -> 0 (17): $ PERCUMA $ -> 0 (18): $ PERCUMA $ -> 0 (19): $ PERCUMA $ -> 0 (20): $ PERCUMA $ -> 0Lengkap. Nama $ PERCUMA $ hanya menunjukkan bahawa lokasi pemboleh ubah itu percuma dan belum diberi nama pemboleh ubah.

Langkah 5: Menyesuaikan Shell

Menyesuaikan Shell
Menyesuaikan Shell

Anda bebas meretas kod tersebut dan menyesuaikannya dengan keperluan anda sendiri, jika anda mahu. Sekiranya saya tahu bahawa saya akan melepaskan kod ini, saya akan membuat kelas pentafsir perintah dan struktur perintah yang terpisah dan hanya melakukan lelaran melalui panggilan fungsi ini. Ini akan mengurangkan jumlah kod, tetapi saat ini shell mengurai baris perintah dan memanggil kaedah shell yang sesuai. Untuk menambahkan perintah tersuai anda sendiri, lakukan yang berikut: 1. Tambahkan perintah anda ke senarai parse Perintah parser akan menghuraikan baris arahan dan memberi anda arahan dan sebarang hujah secara berasingan. Argumen diserahkan sebagai pointer ke pointer, atau sebilangan pointer, namun anda ingin bekerjasama dengannya. Ini terdapat di shell.cpp. Buka shell.cpp dan cari kaedah ExecCmd kelas AVRShell. Anda mungkin ingin menambahkan perintah ke memori program. Sekiranya anda melakukannya, tambahkan perintah di progmem.h dan progmem.cpp. Anda boleh menambahkan perintah untuk memprogram memori secara langsung menggunakan makro PSTR (), tetapi anda akan menghasilkan amaran lain dari jenis yang disebutkan sebelumnya. Sekali lagi, ini adalah bug yang diketahui bekerja dengan C ++, tetapi anda dapat menyelesaikannya dengan menambahkan perintah secara langsung dalam fail progmem. *, Seperti yang telah saya lakukan. Sekiranya anda tidak keberatan untuk menambah penggunaan SRAM, anda dapat menambahkan perintah seperti yang telah saya gambarkan dengan perintah "jam". Katakan anda mahu menambahkan arahan baru yang disebut "newcmd." Pergi ke AVRShell:: ExecCmd dan cari tempat yang sesuai untuk memasukkan kod berikut:

lain jika (! strcmp (c, "newcmd")) cmdNewCmd (args);Ini akan menambahkan arahan anda dan memanggil kaedah cmdNewCmd yang akan anda tulis pada langkah seterusnya. 2. Tuliskan kod perintah khusus anda Dalam file yang sama, tambahkan kod perintah kustom anda. Ini adalah definisi kaedah. Anda masih mahu menambahkan deklarasi ke shell.h. Hanya tambahkan ke perintah lain. Dalam contoh sebelumnya, kodnya mungkin kelihatan seperti ini

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Perintah anda adalah% s / r / n", args [0]); WriteRAM (buff);}Terdapat beberapa perkara di sini. Pertama, "buff" adalah penyangga array 40-karakter yang disediakan dalam kod untuk kegunaan anda. Kami menggunakan versi memori program sprintf kerana kami meneruskannya sebagai PSTR. Anda boleh menggunakan versi biasa jika anda mahu, tetapi pastikan anda tidak lulus format dalam PSTR. Juga, argumen terdapat dalam array args. Sekiranya anda mengetik "newcmd arg1 arg2", anda boleh mendapatkan argumen ini dengan subskrip args [0] dan args [1]. Anda boleh memberikan maksimum MAX_ARGS argumen, seperti yang ditentukan dalam kod. Jangan ragu untuk menukar nilai itu apabila anda mengumpul semula jika anda memerlukan banyak lagi argumen untuk diserahkan sekaligus. WriteLine dan WriteRAM adalah fungsi global yang mengembalikan kaedah UART dengan nama yang sama. Hujah ke-2 untuk fungsi ini adalah tersirat. Sekiranya anda tidak memberikan apa-apa, arahan akan ditulis selepas itu. Sekiranya anda lulus 0 sebagai argumen ke-2, permintaan tidak akan ditulis. Ini berguna apabila anda ingin menulis beberapa rentetan yang berasingan ke output sebelum command prompt dikembalikan kepada pengguna. 3. Minta shell menjalankan kod perintah Anda sudah menyuruh pelaksana shell untuk menjalankan metode cmdNewCmd ketika Anda menyiapkan perintah baru, tetapi tambahkan ke file shell.h agar dapat difahami oleh objek shell. Cukup tambahkan di bawah arahan terakhir atau di hadapan arahan pertama, atau di mana sahaja di sana. Dan itu sahaja. Kumpulkan semula dan muat naik firmware ke Arduino anda dan arahan baru anda tersedia dari shell pada prompt.

Langkah 6: Ringkasan

Anda harus tahu cara memasang dan menyambung ke AVR / Arduino anda dan dapatkan arahan langsung pada mikrokontroler anda yang sedang berjalan. Anda tahu beberapa arahan yang akan menarik data runtime dari MCU atau menetapkan nilai ke dalam MCU dengan cepat. Anda juga telah ditunjukkan bagaimana menambahkan kod tersuai anda sendiri untuk membuat perintah unik anda sendiri ke shell untuk menyesuaikannya lebih jauh untuk keperluan anda sendiri. Anda bahkan boleh mematahkan jurubahasa perintah agar hanya mengandungi perintah tersuai anda, jika itu sesuai dengan keperluan anda. Saya harap anda menikmati instruksinya ini dan bahawa AVR Shell dapat berguna untuk anda, sama ada sebagai jurubahasa arahan masa nyata atau sebagai proses pembelajaran dalam melaksanakan sendiri. Seperti biasa, saya mengharapkan sebarang komen atau cadangan mengenai bagaimana arahan ini dapat ditingkatkan! Bersenang-senanglah dengan AVR anda!

Disyorkan: