Mündəricat:

AVRSH: Arduino/AVR üçün Command Interpreter Shell: 6 Addım (Şəkillərlə)
AVRSH: Arduino/AVR üçün Command Interpreter Shell: 6 Addım (Şəkillərlə)

Video: AVRSH: Arduino/AVR üçün Command Interpreter Shell: 6 Addım (Şəkillərlə)

Video: AVRSH: Arduino/AVR üçün Command Interpreter Shell: 6 Addım (Şəkillərlə)
Video: Arduino Boards rulez! Using avrdude with the Arduino Bootlader 2024, Noyabr
Anonim
AVRSH: Arduino/AVR üçün Command Interpreter Shell
AVRSH: Arduino/AVR üçün Command Interpreter Shell

Heç AVR mikro nəzarətçinizə "daxil olmaq" istəmisinizmi? Məzmununu görmək üçün bir reyestrə "pişik" salmağın yaxşı olacağını heç düşündünüzmü? Həmişə * real vaxtda AVR və ya Arduino fərdi periferik alt sistemlərinizi gücləndirmək və söndürmək üçün bir yol istəmisinizmi? Mən də buna görə UNIX-ə bənzər bir qabıq olan AVR Shell yazdım. UNIX-ə bənzəyir, çünki irc nick toqquşma botlarınızı işə salmaq üçün çıxdığınız və satın aldığınız shell hesabını xatırladır, eyni zamanda bir və ya iki ümumi əmrə sahibsiniz. Xarici bir EEPROM istifadə edərək UNIX extfs-ə bənzəyən bir fayl sisteminə də sahibdir, lakin bu, öz-özünə bir layihə halına gəldi, buna görə də bu modulu istehsalata hazır olduqda fərqli bir təlimat altında ayrıca buraxacağam. AVR Shell ilə edə biləcəyiniz şeylərin siyahısı budur:

  • Bütün Məlumat Yönü Qeydlərini (DDRn), limanlarınızı və pinlərinizi real vaxtda oxuyun
  • Mühərrikləri, LED-ləri açmaq və ya sensorları real vaxt rejimində oxumaq üçün bütün DDRn-lərinizə, limanlarınıza və pinlərinizə yazın.
  • Sistemdəki bütün tanınmış qeydləri sadalayın
  • EEPROM tərəfindən dəstəklənən istifadəçi tərəfindən təyin olunan dəyişənlərdə dəyərlər yaradın və saxlayın.
  • Kök parol yaradın və ona qarşı doğrulayın (telnet girişi üçün istifadə olunur)
  • Quraşdırılmış CPU saat sürətini oxuyun
  • Bir prescaler təyin edərək CPU saat sürətinizi dəyişdirin
  • Müxtəlif şeylərin vaxtını təyin etmək üçün 16 bitlik taymerləri işə salın və dayandırın
  • Periferik alt sistemləri gücləndirin və/və ya söndürün: Rəqəmsal Dönüştürücülərə (ADC), Serial Periferik İnterfeysə (SPI), İki telli Arayüzə (TWI/I2C), UART/USART. Mikrokontrolörün enerji istehlakını azaltmaq və ya müəyyən funksiyaları aktivləşdirmək istədiyiniz zaman faydalıdır.
  • Yenidən istifadə edilə bilən obyektlərlə C ++ dilində yazılmışdır.

Bu təlimatlandırıcı, avrsh -in quraşdırılması, istifadəsi və fərdiləşdirilməsindən keçəcək.

Addım 1: Nə lazımdır

Ehtiyacınız olacaq
Ehtiyacınız olacaq

Bu təlimat sizə çox şey tələb etmir:

  • Arduino və ya ATmega328P var. Digər AVR -lər işləyə bilər, ancaq MCU -ya xas olan hər hansı qeydləri siyahıya almaq üçün kodu dəyişdirməyiniz lazım ola bilər. Adların yalnız MCU -ya xas olan başlıq sənədində göstərilənlərə uyğun olması lazımdır. Qeyd adlarının çoxu AVR -lər arasında eynidır, buna görə də hərəkət edərkən məsafəniz dəyişə bilər.
  • Arduino/AVR -nin serial USART -a qoşulmaq üçün bir yol var. Sistem ən geniş şəkildə USB və ya COM portu vasitəsilə seriya bağlantısı quran Windows proqramı olan AVR Terminal ilə sınaqdan keçirilmişdir. USB bağlantısı və Moderndevice.com-dan USB-BUB istifadə edərək hər hansı bir AVR istifadə edərək Arduinos ilə işləyir. Digər terminal seçimlərinə aşağıdakılar daxildir: Putty, minicom (Linux və FreeBSD), ekran (Linux/FreeBSD), Hyperterminal, Teraterm. Bağlandıqda macun və teraterm zibil göndərdiyini gördüm ki, ilk əmriniz çirklənə bilsin.
  • Bu səhifələrdən yükləyə biləcəyiniz və ya hər zaman BattleDroids.net -də ən son versiyanı əldə edə biləcəyiniz AVR Shell firmware proqramını quraşdırın və işlədin.

AVR Terminalını qurmaq üçün onu açıb işə salın. AVR Shell firmware proqramını yükləmək üçün onu yükləyin və ya ya onaltılıq faylını birbaşa yükləyin və seriyalı terminalınızı 9600 baud -a qoşun, ya da özünüz "hec" yükləmək üçün "proqram et" ilə tərtib edin. Qeyd edək ki, COM portunuzu əks etdirmək üçün AVRDUDE parametrlərini dəyişdirməyiniz lazım ola bilər. Qeyd: PROGMEM atributu C ++ üçün mövcud AVR GCC tətbiqində pozulmuşdur və bu məlum bir səhvdir. Bunu tərtib etsəniz, "xəbərdarlıq: proqram yaddaşına yalnız başlanğıc dəyişənlər yerləşdirilə bilər" deyən bir çox xəbərdarlıq mesajı almağı gözləyin. Görməkdən bezdirməklə yanaşı, bu xəbərdarlıq da zərərsizdir. Gömülü platformada C ++ AVR GCC prioritetləri siyahısında yüksək olmadığından bunun nə vaxt düzəldiləcəyi bilinmir. Kodu yoxlasanız, öz atribut bəyanatlarımı tətbiq edərək bu xəbərdarlığı azaltmaq üçün harada işlədiyimi görərsiniz. Səhifəni çevirərək ehtiyac duyduğunuz hər şeyi yükləyin və quraşdırın.

Addım 2: Oxu və Yazı Qeydləri

Oxu və Yazı Qeydləri
Oxu və Yazı Qeydləri

AVR Shell, ilk növbədə AVR -ə qoşduğum bəzi sensorlara daxil olmaq üçün yazılmışdır. Sadə bir LED ilə başladı, sonra işıq sensorlarına, temperatur sensorlarına və nəhayət iki ultrasəs çeviriciyə keçdi. avrsh, bu sensorların rəqəmsal komponentlərini nəzarət edən reyestrlərə yazaraq təyin edə bilər. Çalışarkən AVR qeydlərini manipulyasiya etmək Arduino -da bilinən bütün qeydlərin siyahısını almaq üçün yazın:

çap qeydləri və buna bənzər bir çap alacaqsınız

Aşağıdakı qeydlər haqqında məlumatım var:

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 ATmega328p @ ADMUX DIDR0 DIDR1 TCCR1A TCCR1B TCCR1C TCNT1L TCNT1H ICR1L ICR1H OCR1AL OCR1AH OCR1BL OCR1BH TCCR2A TCCR2B TCNT2 OCR2A OCR2B MSSR TWBR TWSR TWAR TWDR TWCR TWAMR UCSR0A UCSR0B UCSR0C UBRR0L UBRR0H UDR0 PORTB kök> Fərdi bitlərin hər hansı bir qeyddə necə qurulduğunu görmək üçün cat və ya echo əmrindən istifadə edin

pişik %GPIOR0 Burada əmr tərcüməçisindən Ümumi Məqsədli G/Ç Qeydiyyatının #0 məzmununu göstərməsini və ya əks -səda verməsini xahiş edirəm. Qeydiyyat adının qarşısındakı faiz işarəsinə (%) diqqət yetirin. Qabığa bunun bir reyestri təyin edən ayrılmış bir açar söz olduğunu göstərmək üçün buna ehtiyacınız var. Bir echo əmrinin tipik çıxışı belə görünür

GPIOR0 (0x0) [00000000] olaraq təyin edildi Çıxış qeydin adını, qeyddə olan onaltılı dəyəri və qeydin ikili təmsilçiliyini (hər biti 1 və ya 0 olaraq göstərir) göstərir. Hər hansı bir qeyddə müəyyən bir bit təyin etmək üçün "index of operator" istifadə edin. Məsələn, deyək ki, 3 -cü biti 1 -ə çatdırmaq istəyirəm

%GPIOR0 [3] = 1 və qabıq sizə hərəkətini və nəticəsini göstərən bir cavab verəcək

GPIOR0 (0x0) [00000000] olaraq təyin edildi (0x8) [00001000] olaraq təyin edildi Bir qeydlə işlədiyinizi söyləmək üçün faiz işarəsini unutmayın. Üçüncü biti təyin edərək, 4 bit olduğunu unutmayın, çünki AVR-lərimiz sıfır əsaslı bir indeksdən istifadə edir. Başqa sözlə, 3 -cü bitə qədər saymaqla 0, 1, 2, 3 sayılır ki, bu da 4 -cü yerdir, amma 3 -cü bit. Bir az sıfıra endirərək eyni şəkildə bir az təmizləyə bilərsiniz. Bu kimi bitləri təyin edərək AVR -in işini dərhal dəyişə bilərsiniz. Məsələn, OCR1A -da tapılan CTC timer uyğunluq dəyərini dəyişdirərək. Kodunuzu proqram olaraq yoxlamağınız lazım olan xüsusi parametrlərə nəzər salmağa imkan verir, məsələn, ötürmə sürətiniz üçün UBBR dəyəri. DDRn, PORTn və PINn ilə işləmək I/O pinləri də qeydlərə təyin edilir və eyni şəkildə təyin edilə bilər, lakin bu tip qeydlərlə işləmək üçün xüsusi bir sintaksis yaradılmışdır. Kodda, məsələn, rəqəmsal yüksək və ya aşağı tələb edən bir LED və ya digər cihazı açmaq üçün normal bir proses var. Pinin çıxış üçün olduğunu göstərmək üçün Məlumat İstiqamətinin Qeydiyyatını təyin etməyi və sonra doğru limanda müəyyən bitə 1 və ya 0 yazmağı tələb edir. Rəqəmsal pin 13 -ə (PB5) bağlı bir LEDimiz olduğunu və onu açmaq istədiyimizi fərz etsək, AVR işləyərkən bunu necə edəcəyiniz burada

pin pb5 çıxış yazmaq pin pb5 yüksək Çıxış, LED -in yandığını görməyin yanında, belə görünür

root@ATmega328p> pin pb5 çıxışı təyin edin Çıxış kökü üçün pb5 qurun@ATmega328p> pin pb5 yüksək yazın pb5 -ə pin yazın yüksək "Kök@ATmega328p>", sizdən əmrləri qəbul etməyə hazır olduğunu göstərən qabığın istəyidir. LED -i söndürmək üçün pinə aşağı yazmaq kifayətdir. Pimdən rəqəmsal girişi oxumaq istəyirsinizsə, oxumaq əmrindən istifadə edin. Yuxarıdakı nümunəmizdən istifadə edərək

root@ATmega328p> pb5Pin pinini oxuyun: pb5 YÜKSEKdir Alternativ olaraq, bu pin portunu idarə edən pin qeydini əks etdirin. Məsələn, rəqəmsal pin 7 və 8 -ə (PD7 və PD8) bağlı daldırma açarlarımız varsa, əmri göndərə bilərsiniz.

eko %PIND və qabıq daha sonra bağlı cihazların bütün giriş/çıxış vəziyyətlərini və açarın vəziyyətinin açıq olub -olmadığını göstərərək həmin reyestrin məzmununu göstərəcək.

Addım 3: Qoruyucuları oxumaq və yazmaq

Oxuyan və yazan qoruyucular
Oxuyan və yazan qoruyucular

Sigortalar xüsusi qeyd növləridir. Mikro nəzarətçinizin saat sürətindən tutmuş EEPROM-un yazmaqdan qorunması üçün hansı proqramlaşdırma üsullarına qədər hər şeyi idarə edirlər. Bəzən bu parametrləri dəyişdirməlisiniz, xüsusən də müstəqil bir AVR sistemi yaradırsınızsa. Arduino'da qoruyucu parametrlərinizi dəyişdirməyinizə əmin deyiləm. Sigortalarınıza diqqətli olun; Yanlış qurarsanız özünüzü kilidləyə bilərsiniz. Əvvəlki bir təlimatda, proqramçı və avrdude istifadə edərək qoruyucularınızı necə oxuya və qura biləcəyinizi göstərmişdim. Burada, MCU'nuzun onları necə qurduğunu görmək üçün iş vaxtında qoruyucularınızı necə oxuyacağınızı sizə göstərəcəyəm. Diqqət yetirin ki, bu təriflərdən aldığınız tərtib vaxtı ayarı deyil, MCU onları iş vaxtı oxuduğu üçün faktiki qoruyuculardır. ATmega328P məlumat cədvəlindəki Cədvəl 27-9-dan (verilənlər bazası kitabı, buna bənzər), Fuse Low Byte-nin bitləri belədir:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Diqqət yetirməli olan maraqlı bir şey, qoruyucularla 0 proqramlaşdırılmış, 1 isə müəyyən bir bitin proqramlaşdırılmaması deməkdir. Bir qədər əks-intuitivdir, ancaq bunu bildikdən sonra bilirsiniz.

  • CKDIV8, CPU saatınızı 8 -ə bölmək üçün təyin edir. ATmega328P, daxili osilatörü 8MHz -də CKDIV8 ilə proqramlaşdırılmış (yəni 0 olaraq təyin edilmiş) istifadə etmək üçün proqramlaşdırılmış fabrikdən gəlir, sizə son F_CPU və ya CPU tezliyi 1MHz verir. Arduino -da bu dəyişir, çünki onlar 16MHz -də xarici osilatordan istifadə edəcəklər.
  • Proqramlaşdırıldıqda CKOUT, CPU saatınızı Arduinosdakı rəqəmsal pin 8 olan PB0 -da çıxaracaq.
  • SUT [1..0], AVR üçün başlanğıc vaxtını təyin edir.
  • CKSEL [3..0], daxili RC osilatoru, xarici osilator və sair kimi saat mənbəyini təyin edir.

Sigortalarınızı oxuduğunuzda, onaltılıq olaraq sizə qaytarılacaq. Qoruyucuları avrdude vasitəsi ilə yazmaq istəyirsinizsə, sizə lazım olan format budur. Arduino -da, aşağı qoruyucu baytı oxuduqda əldə etdiyim budur:

root@ATmega328p> oxuyun lfuseLower Fuse: 0xffBeləliklə, bütün bitlər 1 olaraq təyin olunur. Eyni proseduru bir Arduino klonunda etdim və eyni dəyəri aldım. Müstəqil AVR sistemlərimdən birini yoxlayarkən, çipi konfiqurasiya edərkən bir müddət əvvəl təyin etdiyim dəyər olan 0xDA aldım. Eyni prosedur Yüksək Sığorta Baytı, Genişləndirilmiş Sigorta Baytı və Kilidi qoruyucularını yoxlamaq üçün istifadə olunur. Kalibrləmə və imza qoruyucu baytları kodda #if 0 önişlemci direktivi ilə deaktiv edilmişdir, bunu pis hiss edirsinizsə dəyişdirə bilərsiniz.

Addım 4: Digər əmrlər

Digər əmrlər
Digər əmrlər

Varsayılan əmr tərcüməçisinin faydalı ola biləcəyini başa düşdüyü bir neçə başqa əmr var. İstifadəyə kömək və ya menyu verərək həyata keçirilən və gələcəkdə buraxılacaq bütün əmrləri görə bilərsiniz. Onları tez-tez burada izah edəcəyəm, çünki onlar əsasən özünü izah edir. CPU Saat Tezlik Ayarları Firmanızın fcpu əmri ilə CPU saat parametrləri olaraq istifadə etmək üçün konfiqurasiya edildiyini öyrənə bilərsiniz:

root@ATmega328p> fcpuCPU Tezlik: 16000000Bu daha çox 16 MHz olaraq bilinən 16 milyon və ya 16 milyon herzdir. Bunu hər hansı bir səbəbdən saat əmri ilə dəyişə bilərsiniz. Bu əmr bir arqument götürür: saat sürətinizi bölərkən istifadə edəcək prescaler. Saat əmri bu prescaler dəyərlərini başa düşür:

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

Əmrdən istifadə edərək:

saat ckdiv2 CPU sürətiniz 16 MHz olduqda, saat sürətinizin 8 MHz -ə dəyişdirilməsi ilə nəticələnərdi. Başlanğıc saat sürəti 16MHz olan ckdiv64 -dən əvvəlcədən bir kalkulyatordan istifadə etməklə 250 KHz -lik son bir saat sürəti əldə ediləcək. Niyə Yer üzündə MCU'nuzu yavaşlatmaq istərdiniz? Birincisi, daha aşağı bir saat sürəti daha az enerji istehlak edir və MCU'nun bir layihə korpusunda bir batareyası tükənirsə, bunun ən yüksək sürətlə işləməsinə ehtiyacınız olmayacaq və buna görə də sürəti aşağı sala və enerji istehlakını azalda bilərsiniz., batareyanın ömrünü artırır. Ayrıca, saatı başqa bir MCU ilə hər hansı bir zamanlama problemi üçün istifadə edirsinizsə, məsələn, bir proqram UART və ya başqa bir şey tətbiq etsəniz, onu gözəl bir baud dərəcəsi əldə etmək asan olan müəyyən bir dəyərə təyin etmək istəyə bilərsiniz. daha aşağı səhv dərəcələri. Periferik Alt Sistemləri Gücləndirmək və Gücləndirmək Daha əvvəl qeyd etdiyimiz enerji istehlakını azaltmaqla yanaşı, istifadə etmədiyiniz təyyarədəki bəzi ətraf cihazları bağlayaraq enerjini daha da azaltmaq istəyə bilərsiniz. Komanda tərcüməçisi və qabığı hal -hazırda aşağıdakı ətraf cihazları işə sala və söndürə bilər:

  • Analoq-rəqəmsal çevirici (ADC). Bu periferik cihaz, məlumat verən bir temperatur sensoru (temperatur, işıq, sürətlənmə və s.) Olduqda və onu rəqəmsal bir dəyərə çevirmək lazım olduqda istifadə olunur.
  • Serial Periferik İnterfeys (SPI). SPI avtobusu, xarici yaddaşlar, LED sürücülər, xarici ADC-lər və s. ISP vasitəsilə proqramlaşdırırsınızsa.
  • İki telli interfeys. Bəzi xarici qurğular ünsiyyət qurmaq üçün I2C avtobusundan istifadə edirlər, baxmayaraq ki, SPI-nin daha yüksək ötürmə qabiliyyətinə malik olduqları üçün sürətlə SPI ilə işləyən cihazlar əvəz olunur.
  • USART. Bu sizin serial interfeysinizdir. AVR -ə serial bağlantısı ilə bağlısınızsa, yəqin ki, bunu söndürmək istəmirsiniz! Bununla birlikdə, bunu ATmega162 və ya ATmega644P kimi birdən çox USART olan cihazlara köçürmək üçün bir skelet olaraq əlavə etdim.
  • hamısı. Gücləndirmə və ya söndürmə əmrinə dair bu arqument, qeyd olunan bütün qurğuları işə salır və ya hamısını bir əmrlə söndürür. Yenə də bu əmrdən ağıllı şəkildə istifadə edin.

root@ATmega328p> powerdown twi twi -nin gücünü tamamladı

Taymerlərin işə salınması və dayandırılması Qabıqda istifadə üçün mövcud olan 16 bitlik taymer var. Taymeri timer əmri ilə başladın:

taymer başlanğıcıvə dayandırmaq arqumenti ilə taymeri dayandırın

taymer dayanmasıBu zamanlayıcı daxili USART timer ilə ziddiyyət təşkil etməyəcək. USART taymerinin tətbiqi təfərrüatları üçün koda baxın, əgər belə bir detal sizi maraqlandırırsa

root@ATmega328p> timer start Started timer.root@ATmega328p> timer stop Keçən vaxt: ~ 157 saniyə Doğrulama Qabıq EEPROM-da 8 simvoldan ibarət parol saxlaya bilər. Bu parol mexanizmi telnet giriş imkanlarını dəstəkləmək üçün yaradılıb, lakin başqa şeyləri qorumaq üçün genişləndirilə bilər. Məsələn, autentifikasiya mexanizmi vasitəsi ilə qeyd dəyərlərinin dəyişdirilməsi kimi müəyyən əmrlər tələb oluna bilər.

root@ATmega328p> passwd blahEEPROM üçün kök parol yazınAuth əmri ilə paroluna qarşı icazə verin (və ya kod vasitəsilə proqramlaşdırılmış şəkildə icazə tələb edin). Diqqət yetirin ki, kök parolunu dəyişdirməyə cəhd edirsinizsə və artıq kök parol dəsti varsa, onu yeni bir şifrəyə dəyişdirmədən əvvəl köhnə şifrəyə qarşı özünüzü təsdiqləməlisiniz.

root@ATmega328p> passwd blinkyÖzünüzə əvvəlcə icazə verməlisiniz.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinkyEEPROM -a YENİ kök parol yazınƏlbəttə ki, köhnə dəyərlərinizi və dəyişənlərinizi bərpa etmək üçün firmware proqramını silsəniz, avrsh.eep faylını yükləməlisiniz. Makefile sizin üçün EEPROM faylını yaradacaq. Dəyişənlər Qabıq istifadəçi tərəfindən təyin olunan dəyişənlər anlayışını başa düşür. Kod bunu 20 ilə məhdudlaşdırır, ancaq isterseniz script.h -də MAX_VARIABLES təyinini dəyişdirərək dəyişə bilərsiniz. 16 bitlik hər hansı bir dəyəri (yəni 65, 536-ya qədər olan hər hansı bir rəqəmi) daha sonra geri çağırılacaq bir dəyişənə saxlaya bilərsiniz. Sintaksis, qeydlərə bənzəyir, qabığa dəyişənləri ifadə etmək üçün bir dollar işarəsi ($) istifadə edilmir. Çap dəyişənləri əmri ilə bütün dəyişənlərinizi sadalayın

çap dəyişənləri İstifadəçi tərəfindən təyin olunan dəyişənlər: İndeks Adı -> Dəyər (01): $ PULSUZ $ -> 0 (02): $ PULSUZ $ -> 0 (03): $ PULSUZ $ -> 0 (04): $ PULSUZ $ -> 0 (05): $ FREE $ -> 0 (06): $ FREE $ -> 0 (07): $ FREE $ -> 0 (08): $ FREE $ -> 0 (09): $ FREE $ -> 0 (10): $ FREE $ -> 0 (11): $ FREE $ -> 0 (12): $ FREE $ -> 0 (13): $ FREE $ -> 0 (14): $ FREE $ -> 0 (15): $ FREE $ -> 0 (16): $ FREE $ -> 0 (17): $ FREE $ -> 0 (18): $ FREE $ -> 0 (19): $ FREE $ -> 0 (20): $ PULSUZ $ -> 0 Tamamlayın. Bir dəyişən təyin edin

$ newvar = 25 $ zaman aşımı = 23245Verilmiş bir dəyişənin dəyərini əldə edin

root@ATmega328p> echo $ newvar $ newvar 25Bildiyiniz çap əmri ilə hazırladığınız bütün dəyişənləri görə bilərsiniz

İstifadəçi tərəfindən təyin olunan dəyişənlər: İndeks Adı -> Dəyər (01): newvar -> 25 (02): zaman aşımı -> 23245 (03): $ PULSUZ $ -> 0 (04): $ PULSUZ $ -> 0 (05): $ PULSUZ $ -> 0 (06): $ PULSUZ $ -> 0 (07): $ PULSUZ $ -> 0 (08): $ PULSUZ $ -> 0 (09): $ PULSUZ $ -> 0 (10): $ PULSUZ $ -> 0 (11): $ PULSUZ $ -> 0 (12): $ PULSUZ $ -> 0 (13): $ PULSUZ $ -> 0 (14): $ PULSUZ $ -> 0 (15): $ PULSUZ $ -> 0 (16): $ PULSUZ $ -> 0 (17): $ PULSUZ $ -> 0 (18): $ PULSUZ $ -> 0 (19): $ PULSUZ $ -> 0 (20): $ PULSUZ $ -> 0 Tamamlandı.$ PULSUZ $ adı, yalnız dəyişən yerin pulsuz olduğunu və hələ bir dəyişən adı verilmədiyini göstərir.

Addım 5: Qabığın fərdiləşdirilməsi

Shell -in fərdiləşdirilməsi
Shell -in fərdiləşdirilməsi

İstəsəniz, kodu sındırmaq və öz ehtiyaclarınıza uyğunlaşdırmaqda sərbəstsiniz. Bu kodu buraxacağımı bilsəydim, ayrı bir əmr tərcüməçisi sinfi və əmr quruluşu edərdim və sadəcə bu funksiya göstəricisi ilə təkrarlanırdım. Kodun miqdarını azaldır, ancaq qabıq dayandıqca əmr satırını təhlil edir və uyğun qabıq metodunu çağırır. Öz xüsusi əmrlərinizi əlavə etmək üçün aşağıdakıları edin: 1. Əmrinizi təhlil siyahısına əlavə edin. əmr satırını təhlil edin və ayrıca əmr və hər hansı bir arqument verin. Arqumentlər göstəricilərə və ya bir sıra göstəricilərə ötürülür, lakin onlarla işləmək xoşunuza gəlir. Bu shell.cpp -də tapılmışdır. Shell.cpp açın və AVRShell sinifinin ExecCmd metodunu tapın. Əmri proqram yaddaşına əlavə etmək istəyə bilərsiniz. Əgər edirsinizsə, əmrini progmem.h və progmem.cpp -ə əlavə edin. Komandanı birbaşa PSTR () makrosundan istifadə edərək proqram yaddaşına əlavə edə bilərsiniz, lakin əvvəllər qeyd etdiyimiz başqa bir xəbərdarlıq yaradacaqsınız. Yenə də bu, C ++ ilə işləyən məlum bir səhvdir, ancaq əmrini birbaşa proqrama əlavə edərək bu problemi həll edə bilərsiniz.* Faylları, mənim etdiyim kimi. SRAM istifadənizi əlavə etməkdən çəkinmirsinizsə, "saat" əmrində göstərdiyim kimi əmri əlavə edə bilərsiniz. "Newcmd" adlı yeni bir əmr əlavə etmək istədiyinizi söyləyin. AVRShell:: ExecCmd -ə gedin və aşağıdakı kodu daxil etmək üçün əlverişli bir yer tapın:

başqa əgər (! strcmp (c, "newcmd")) cmdNewCmd (args);Bu, əmrinizi əlavə edəcək və növbəti addımda yazacağınız cmdNewCmd metodunu çağıracaq. 2. Xüsusi əmr kodunuzu yazın Eyni fayla xüsusi komanda kodunuzu əlavə edin. Metodun tərifi budur. Hələ də bəyannaməni shell.h -ə əlavə etmək istəyəcəksiniz. Yalnız digər əmrlərə əlavə edin. Əvvəlki nümunədə kod belə bir şeyə bənzəyə bilər

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Əmriniz %s / r / n", args [0]); WriteRAM (buff);}Burada bir neçə şey var. Birincisi, "buff", istifadə üçün kodda verilən 40 simvoldan ibarət bir sıra tampondur. Bir PSTR keçdiyimiz üçün sprintf proqram yaddaş versiyasını istifadə edirik. İstəsəniz adi versiyadan istifadə edə bilərsiniz, ancaq PSTR formatında keçmədiyinizə əmin olun. Ayrıca, arqumentlər args sırasındadır. "Newcmd arg1 arg2" yazmısınızsa, bu arqumentləri args [0] və args [1] alt yazıları ilə əldə edə bilərsiniz. Kodda göstərildiyi kimi maksimum MAX_ARGS arqument ötürə bilərsiniz. Yenidən tərtib edərkən bir anda daha çox arqumentə ehtiyacınız olarsa bu dəyəri dəyişdirməkdən çekinmeyin. WriteLine və WriteRAM, UART -ın eyni adlı metodlarını qaytaran qlobal funksiyalardır. Bu funksiyanın 2 -ci arqumenti gizlidir. Heç bir şey verməsəniz, sonra bir əmr istəyi yazılacaq. 2 -ci arqument olaraq 0 -ı ötürsəniz, sorğu yazılmayacaq. Komanda istəyi istifadəçiyə qaytarılmadan əvvəl çıxmaq üçün bir neçə ayrı sətir yazmaq istədiyiniz zaman faydalıdır. 3. Qabığın əmr kodunu yerinə yetirməsini təmin edin Yeni bir əmr qurarkən qabıq icraçısına cmdNewCmd metodunu yerinə yetirməyi söylədiniz, ancaq shell obyekti tərəfindən başa düşülməsi üçün shell.h faylına əlavə edin. Yalnız son əmrin altına və ya ilk əmrin qarşısında və ya oranın hər hansı bir yerinə əlavə edin. Firmware proqramını yenidən tərtib edin və Arduino -ya yükləyin və yeni əmrinizi qabıqdan əldə edə bilərsiniz.

Addım 6: Xülasə

AVR/Arduino'ya necə qurulacağını və qoşulacağını bilməlisən və işləyən mikro nəzarətçinizdə canlı bir bildiriş almalısınız. MCU -dan iş vaxtı məlumatlarını çəkəcək və ya dəyərləri dərhal MCU -ya qoyacaq bir neçə əmr bilirsiniz. Öz ehtiyaclarınız üçün daha da fərdiləşdirmək üçün qabığa öz unikal əmrlərinizi yaratmaq üçün öz xüsusi kodunuzu necə əlavə etməyiniz göstərilmişdir. Komanda tərcüməçisinə ehtiyaclarınıza uyğun olarsa, yalnız xüsusi əmrlərinizi ehtiva edə bilərsiniz. Ümid edirəm ki, bu təlimatdan zövq aldınız və AVR Shell sizin üçün faydalı ola bilər. Həmişə olduğu kimi, bu təlimatlandırmanın necə yaxşılaşdırılacağına dair hər hansı bir şərh və ya təklif gözləyirəm! AVR ilə əylənin!

Tövsiyə: