İçindekiler:

AVRSH: Arduino/AVR için bir Komut Yorumlayıcı Kabuğu.: 6 Adım (Resimlerle)
AVRSH: Arduino/AVR için bir Komut Yorumlayıcı Kabuğu.: 6 Adım (Resimlerle)

Video: AVRSH: Arduino/AVR için bir Komut Yorumlayıcı Kabuğu.: 6 Adım (Resimlerle)

Video: AVRSH: Arduino/AVR için bir Komut Yorumlayıcı Kabuğu.: 6 Adım (Resimlerle)
Video: Arduino ile Neopixel Masa Lambası Yapımı (3D STL dosyaları ile birlikte) 2024, Temmuz
Anonim
AVRSH: Arduino/AVR için bir Komut Yorumlayıcı Kabuğu
AVRSH: Arduino/AVR için bir Komut Yorumlayıcı Kabuğu

Hiç AVR mikro denetleyicinizde "oturum açmak" istediniz mi? İçeriğini görmek için bir kaydı "kedilemenin" harika olacağını hiç düşündünüz mü? AVR veya Arduino'nuzun bireysel çevresel alt sistemlerini *gerçek zamanlı* olarak açıp kapatmanın her zaman bir yolunu mu istediniz? Ben de UNIX benzeri bir kabuk olan AVR Shell'i yazdım. UNIX benzeridir, çünkü dışarı çıkıp irc nick çarpışma botlarınızı çalıştırmak için satın aldığınız ve bir veya iki ortak komuta sahip olduğunuz kabuk hesabını andırır. Ayrıca, harici bir EEPROM kullanan UNIX extfs'e benzeyen bir dosya sistemine sahiptir, ancak bu kendi başına bir proje haline geldi, bu yüzden üretime hazır olduğunda bu modülü farklı bir talimat altında ayrı ayrı yayınlayacağım. AVR Shell ile şu anda yapabileceğiniz şeylerin bir listesi:

  • Tüm Veri Yönü Kayıtlarınızı (DDRn), bağlantı noktalarınızı ve pinlerinizi gerçek zamanlı olarak okuyun
  • Motorları, LED'leri açmak veya sensörleri gerçek zamanlı olarak okumak için tüm DDRn'lerinize, bağlantı noktalarına ve pinlere yazın
  • Sistemdeki tüm bilinen kayıtları listeleyin
  • EEPROM tarafından yedeklenen kullanıcı tanımlı değişkenlerde değerler oluşturun ve saklayın.
  • Bir kök parola oluşturun ve buna karşı kimlik doğrulaması yapın (telnet erişimi için kullanılır)
  • Yapılandırılan CPU saat hızını okuyun
  • Bir ön ölçekleyici ayarlayarak CPU saat hızınızı değiştirin
  • Çeşitli şeylerin zamanlaması için 16 bit zamanlayıcıları başlatın ve durdurun
  • Çevre birimi alt sistemlerini açma ve/veya kapatma: Analogdan Dijitale Dönüştürücüler (ADC), Seri Çevre Birimi Arabirimi (SPI), İki Telli Arabirim (TWI/I2C), UART/USART. Mikrodenetleyicinin güç tüketimini azaltmak veya belirli işlevleri etkinleştirmek istediğinizde kullanışlıdır.
  • Yeniden kullanılabilir nesnelerle C++ ile yazılmıştır.

Bu talimat, avrsh'ın kurulumu, kullanımı ve özelleştirilmesini anlatacaktır.

Adım 1: İhtiyacınız Olan Şeyler

Neye ihtiyacınız olacak
Neye ihtiyacınız olacak

Bu talimat, sizin dışında fazla bir şey gerektirmez:

  • Bir Arduino veya ATmega328P'ye sahip olun. Diğer AVR'ler çalışabilir, ancak MCU'nuza özgü kayıtları listelemek için kodu değiştirmeniz gerekebilir. Adların yalnızca MCU'nuza özgü başlık dosyasında listelenenlerle eşleşmesi gerekir. Kayıt adlarının çoğu, AVR'ler arasında aynıdır, bu nedenle taşıma sırasında kilometreniz değişebilir.
  • Arduino/AVR'nizin seri USART'ına bağlanmanın bir yolunu bulun. Sistem en kapsamlı şekilde USB veya COM bağlantı noktanız üzerinden seri bağlantı yapan bir Windows uygulaması olan AVR Terminali ile test edilmiştir. USB bağlantısını kullanarak Arduinos ve Moderndevice.com'dan USB-BUB kullanan herhangi bir AVR ile çalışır. Diğer terminal seçenekleri şunlardır: Putty, minicom (Linux ve FreeBSD), ekran (Linux/FreeBSD), Hyperterminal, Teraterm. Macun ve teraterm'in bağlanırken biraz çöp gönderdiğini buldum, böylece ilk komutunuz bozulabilir.
  • Bu sayfalardan indirebileceğiniz veya her zaman BattleDroids.net adresinden en son sürümü edinebileceğiniz AVR Shell ürün yazılımının kurulu ve çalışır durumda olmasını sağlayın.

AVR Terminalini kurmak için sadece paketini açın ve çalıştırın. AVR Shell aygıt yazılımını kurmak için, onu indirin ve doğrudan hex dosyasını yükleyin ve seri terminalinizi 9600 baud'da bağlayın ya da hex'i yüklemek için "make" ve ardından "make program" ile kendiniz derleyin. AVRDUDE ayarlarını COM bağlantı noktanızı yansıtacak şekilde değiştirmeniz gerekebileceğini unutmayın. Not: PROGMEM özelliği, C++ için mevcut AVR GCC uygulamasında bozuktur ve bu bilinen bir hatadır. Derlerseniz, "uyarı: program bellek alanına yalnızca başlatılmış değişkenler yerleştirilebilir" diyen birçok uyarı mesajı almayı bekleyin. Görülmesi can sıkıcı olmasının yanı sıra, bu uyarı zararsızdır. Gömülü platformdaki C++, AVR GCC öncelikleri listesinde üst sıralarda yer almadığından, bunun ne zaman düzeltileceği bilinmiyor. Kodu kontrol ederseniz, kendi öznitelik ifadelerimi uygulayarak bu uyarıyı azaltmak için nerede geçici çözümler yaptığımı göreceksiniz. Oldukça basit. İhtiyacınız olabilecek her şeyi indirin ve yükleyin, ardından sayfayı çevirin ve hadi başlayalım.

Adım 2: Kayıtları Okuma ve Yazma

Okuma ve Yazma Kayıtları
Okuma ve Yazma Kayıtları

AVR Kabuğu, öncelikle AVR'me bağladığım bazı sensörlere erişmek için yazılmıştır. Basit bir LED ile başladı, ardından ışık sensörlerine, sıcaklık sensörlerine ve son olarak iki ultrasonik dönüştürücüye geçti. avrsh, bu sensörlerin dijital bileşenlerini, onları kontrol eden kayıtlara yazarak ayarlayabilir. Çalışırken AVR kayıtlarını manipüle etme Arduino'nuzdaki bilinen tüm kayıtların bir listesini almak için şunu yazın:

baskı kayıtları ve buna benzeyen bir çıktı alacaksınız

Aşağıdaki kayıtlar hakkında bilgim 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 ADCI 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 TWAR028 Bireysel bitlerin herhangi bir kayıtta nasıl ayarlandığını görmek için cat veya echo komutunu kullanın.

kedi %GPIOR0 Burada komut yorumlayıcıdan Genel Amaçlı G/Ç Kaydı #0'ın içeriğini görüntülemesini veya yankılanmasını istiyorum. Kayıt adının önündeki yüzde işaretine (%) dikkat edin. Kabuğa bunun bir kaydı tanımlayan ayrılmış bir anahtar kelime olduğunu belirtmek için buna ihtiyacınız var. Bir yankı komutunun tipik çıktısı şöyle görünür

GPIOR0(0x0), [00000000] olarak ayarlandı Çıktı, kaydın adını, kayıtta bulunan onaltılık değeri ve kaydın ikili gösterimini gösterir (her biti 1 veya 0 olarak gösterir). Herhangi bir kayıtta belirli bir biti ayarlamak için, operatörünün "indeksini" kullanın. Örneğin, 3. bitin 1 olmasını istediğimi varsayalım.

%GPIOR0[3] = 1 ve kabuk size eylemini ve sonucunu belirten bir yanıt verecektir.

GPIOR0(0x0), [00000000] (0x8) olarak ayarlandı, [00001000] olarak ayarlandı Kabuğa bir kayıtla çalıştığınızı söylemek için yüzde işaretini unutmayın. Ayrıca, AVR'lerimiz sıfır tabanlı bir dizin kullandığından 3. biti ayarlayarak bunun 4 bit olduğunu unutmayın. Başka bir deyişle, 3. bit'e kadar sayarsanız, 0, 1, 2, 3 sayarsınız, bu da 4. sıradadır, ancak 3. bittir. Bir biti sıfıra ayarlayarak aynı şekilde biraz temizleyebilirsiniz. Bunun gibi bitleri ayarlayarak, AVR'nizin işleyişini anında değiştirebilirsiniz. Örneğin, OCR1A'da bulunan CTC zamanlayıcı eşleşme değerini değiştirerek. Ayrıca, baud hızınızın UBBR değeri gibi kodunuzu programlı olarak kontrol etmeniz gereken belirli ayarlara göz atmanızı sağlar. DDRn, PORTn ve PINn ile Çalışma I/O pinleri de registerlara atanmıştır ve tam olarak aynı şekilde ayarlanabilir, ancak bu tip registerlerle çalışmak için özel bir sözdizimi oluşturulmuştur. Kodda, örneğin bir LED'i veya dijital yüksek veya düşük gerektiren başka bir cihazı açmak için normal bir işlem vardır. Pimin çıkış için olduğunu belirtmek için Veri Yön Kaydının ayarlanmasını ve ardından doğru bağlantı noktasındaki belirli bit için 1 veya 0 yazılmasını gerektirir. Dijital pin 13'e (PB5) bağlı bir LED'imiz olduğunu ve onu açmak istediğimizi varsayarsak, AVR'niz çalışırken bunu nasıl yapacağınız aşağıda açıklanmıştır.

set pin pb5 outputwrite pin pb5 yüksek Çıktı, LED'inizin yandığını görebilmenin yanı sıra şöyle görünürdü

root@ATmega328p> pb5 pinini ayarla outputroot@ATmega328p için pb5 setini ayarla> pin pb5 yüksek yaz mantığı pb5 pinine yüksek yaz "root@ATmega328p>", kabuğun sizden gelen komutları kabul etmeye hazır olduğunu gösteren istemidir. LED'i kapatmak için pime düşük yazmanız yeterlidir. Bir pinden dijital girişi okumak istiyorsanız, read komutunu kullanın. Yukarıdaki örneğimizi kullanarak

root@ATmega328p> pb5Pin pinini oku: pb5 YÜKSEK Alternatif olarak, sadece o pin portunu kontrol eden pin kaydını yankılayın. Örneğin, dijital pin 7 ve 8'e (PD7 ve PD8) bağlı dip switch'lerimiz varsa, komutu gönderebilirsiniz.

yankı %PIND ve daha sonra kabuk, bağlı cihazların tüm giriş/çıkış durumlarını ve anahtarın durumunun açık veya kapalı olup olmadığını size göstererek bu kaydın içeriğini görüntüler.

Adım 3: Sigortaları Okuma ve Yazma

Sigortaları Okuma ve Yazma
Sigortaları Okuma ve Yazma

Sigortalar özel kayıt türleridir. Mikrodenetleyicinizin saat hızından yazmaya karşı korumalı EEPROM için hangi programlama yöntemlerinin mevcut olduğuna kadar her şeyi kontrol ederler. Özellikle bağımsız bir AVR sistemi oluşturuyorsanız, bazen bu ayarları değiştirmeniz gerekecektir. Arduino'daki sigorta ayarlarınızı değiştirmeniz gerektiğinden emin değilim. Sigortalarınıza dikkat edin; yanlış ayarlarsanız kendinizi kilitleyebilirsiniz. Daha önceki bir talimatta, programlayıcınızı ve avrdude'nizi kullanarak sigortalarınızı nasıl okuyabileceğinizi ve ayarlayabileceğinizi gösterdim. Burada, MCU'nuzun gerçekte nasıl ayarladığını görmek için çalışma zamanında sigortalarınızı nasıl geri okuyacağınızı göstereceğim. Bunun, içindeki tanımlardan elde ettiğiniz derleme zamanı ayarı değil, MCU'nun çalışma zamanında okuduğu gibi gerçek sigortalar olduğunu unutmayın. ATmega328P veri sayfasındaki Tablo 27-9'dan (veri kitabı, daha çok buna benzer) Sigorta Düşük Baytının bitleri aşağıdaki gibidir:

CKDIV8 ÇIKIŞ SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Dikkat edilmesi gereken ilginç bir nokta, sigortalarda 0'ın programlanmış ve 1'in o belirli bitin programlanmamış olduğu anlamına gelmesidir. Biraz mantık dışı, ama bir kez bildikten sonra anlarsın.

  • CKDIV8, CPU saatinizi 8'e bölünecek şekilde ayarlar. ATmega328P, CKDIV8 programlanmış (yani 0'a ayarlanmış) ile 8MHz'de dahili osilatörünü kullanmak üzere programlanmış fabrikadan gelir ve size 1MHz'lik son bir F_CPU veya CPU frekansı verir. Arduino'larda bu, 16MHz'de harici bir osilatör kullanacak şekilde yapılandırıldıkları için değiştirilir.
  • Programlandığında CKOUT, CPU saatinizi Arduinos'taki dijital pin 8 olan PB0'a çıkaracaktır.
  • SUT[1..0], AVR'niz için başlangıç zamanını belirtir.
  • CKSEL[3..0], dahili RC osilatörü, harici osilatör vb. gibi saat kaynağını ayarlar.

Sigortalarınızı okuduğunuz zaman onaltılı olarak size geri dönecektir. Sigortaları avrdude ile yazmak istiyorsanız ihtiyacınız olan format budur. Arduino'mda, alt sigorta baytını okuduğumda aldığım şey:

root@ATmega328p> lfuseDüşük Sigortayı oku: 0xffYani, tüm bitler 1'e ayarlanmıştır. Aynı prosedürü bir Arduino klonunda yaptım ve aynı değeri aldım. Bağımsız AVR sistemlerimden birini kontrol ederken, bir süre önce çipi yapılandırırken belirlediğim değer olan 0xDA'yı aldım. Yüksek Sigorta Baytı, Genişletilmiş Sigorta Baytı ve Kilit sigortalarını kontrol etmek için aynı prosedür kullanılır. Kalibrasyon ve imza sigorta baytları, bir #if 0 önişlemci yönergesi ile kodda devre dışı bırakılmıştır; bu, kendinizi kötü hissediyorsanız değiştirebilirsiniz.

Adım 4: Diğer Komutlar

Diğer Komutlar
Diğer Komutlar

Varsayılan komut yorumlayıcısının sizin yararlı bulabileceğinizi anladığı birkaç komut daha vardır. İstemde yardım veya menü vererek tüm uygulanan ve gelecekte yayınlanacak komutları görebilirsiniz. Çoğunlukla kendi kendini açıklayıcı oldukları için onları burada çabucak ele alacağım. CPU Clock Frequency Settings (CPU Saat Frekansı Ayarları) fcpu komutu ile firmware'inizin CPU saat ayarları olarak ne kullanmak üzere yapılandırıldığını öğrenebilirsiniz:

root@ATmega328p> fcpuCPU Sıklık: 16000000Bu, daha yaygın olarak 16 MHz olarak bilinen 16 milyon veya 16 milyon herz'dir. Bunu, herhangi bir nedenle, saat komutuyla anında değiştirebilirsiniz. Bu komut bir argüman alır: saat hızınızı bölerken kullanılacak ön ölçekleyici. Clock komutu şu ön ölçekleyici değerlerini anlar:

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

Komutu kullanarak:

saat ckdiv2 işlemci hızınız 16MHz olduğunda, saat hızınızın 8MHz olarak değiştirilmesine neden olur. Başlangıç saat hızı 16 MHz olan bir ckdiv64 ön ölçekleyicisinin kullanılması, 250 KHz'lik bir son saat hızı ile sonuçlanacaktır. Neden MCU'nuzu yavaşlatmak isteyesiniz ki? Birincisi, daha düşük bir saat hızı daha az güç tüketir ve bir proje kasasında MCU'nuzun pili bitiyorsa, en yüksek hızda çalışmasına ihtiyacınız olmayabilir ve bu nedenle hızı düşürebilir ve güç tüketimini azaltabilir., pil ömrünü artırıyor. Ayrıca, saati başka bir MCU ile herhangi bir zamanlama sorunu için kullanıyorsanız, örneğin bir yazılım UART'ı veya benzeri bir şey uygulayarak, onu güzel bir hatta baud hızı elde etmek için kolay olan belirli bir değere ayarlamak isteyebilirsiniz. daha düşük hata oranları. Çevresel Alt Sistemleri Açma ve Kapatma Daha önce bahsedilen güç tüketimini azaltmakla aynı notta, kullanmadığınız bazı yerleşik çevre birimlerini kapatarak gücü daha da azaltmak isteyebilirsiniz. Komut yorumlayıcı ve kabuk şu anda aşağıdaki çevre birimlerini açıp kapatabilir:

  • Analogdan Dijitale Dönüştürücü (ADC). Bu çevre birimi, veri sağlayan (sıcaklık, ışık, hızlanma vb.) bir analog sensörünüz olduğunda ve bunu dijital bir değere dönüştürmeniz gerektiğinde kullanılır.
  • Seri Çevre Birimi Arayüzü (SPI). SPI veri yolu, harici bellekler, LED sürücüleri, harici ADC'ler, vb. gibi diğer SPI-etkin aygıtlarla iletişim kurmak için kullanılır. SPI'nin parçaları, ISP programlaması için kullanılır veya en azından pinler kullanılır, bu yüzden bunu kapatırken dikkatli olun. ISP üzerinden programlama yapıyorsanız.
  • İki Telli Arayüz. Bazı harici cihazlar, iletişim kurmak için I2C veri yolunu kullanır, ancak bunlar, SPI'nin daha fazla verime sahip olması nedeniyle hızla SPI özellikli cihazlarla değiştirilmektedir.
  • USART. Bu sizin seri arayüzünüz. AVR'ye seri bağlantı ile bağlıysanız, muhtemelen bunu kapatmak istemezsiniz! Ancak, bunu ATmega162 veya ATmega644P gibi birden fazla USART'a sahip cihazlara taşımak için bir iskelet olarak buraya ekledim.
  • herşey. Powerup veya powerdown komutuna yönelik bu argüman, bahsedilen tüm çevre birimlerini açar veya hepsini tek bir komutla kapatır. Yine, bu komutu akıllıca kullanın.

root@ATmega328p> twi'nin güç kesintisi twi tamamlandı.root@ATmega328p> twi'nin güçlenmesi tamamlandı.

Zamanlayıcıları Başlatma ve Durdurma Kabuk, kullanıma hazır yerleşik bir 16 bit zamanlayıcıya sahiptir. Zamanlayıcıyı zamanlayıcı komutuyla başlatırsınız:

zamanlayıcı başlangıcıve stop argümanıyla zamanlayıcıyı durdurun

zamanlayıcı durdurmaBu zamanlayıcı dahili USART zamanlayıcı ile çakışmayacaktır. Bu tür kanlı ayrıntılar ilginizi çekiyorsa, USART zamanlayıcısının uygulama ayrıntıları için koda bakın.

root@ATmega328p> zamanlayıcı startStarted timer.root@ATmega328p> zamanlayıcı stopGeçen zaman: ~ 157 saniye Kimlik Doğrulama Kabuk, EEPROM'da 8 karakterlik bir parola saklayabilir. Bu parola mekanizması, telnet oturum açma özelliklerini desteklemek için oluşturulmuştur, ancak diğer şeyleri korumak için genişletilebilir. Örneğin, kimlik doğrulama mekanizması aracılığıyla kayıt değerlerini değiştirmek gibi belirli komutlara ihtiyaç duyabilirsiniz. Parolayı parola komutuyla ayarlayın

root@ATmega328p> passwd blahEEPROM'a kök şifre yazdıauth komutuyla parolaya karşı yetkilendirin (veya kod aracılığıyla programlı olarak yetkilendirme gerektirin). Kök parolayı değiştirmeye çalışırsanız ve önceden ayarlanmış bir kök parola varsa, yeni bir parolayla değiştirmeye izin verilmeden önce eski parolaya karşı kendinizi yetkilendirmeniz gerektiğini unutmayın.

root@ATmega328p> passwd bluryÖnce kendinizi yetkilendirmelisiniz.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd bluryEEPROM'a YENİ kök şifresi yazdınızElbette, eski değerlerinizi ve değişkenlerinizi geri yüklemek için bellenimi silerseniz avrsh.eep dosyasını yüklemeniz gerekecektir. Makefile, sizin için EEPROM dosyasını oluşturacaktır. Değişkenler Kabuk, kullanıcı tanımlı değişkenler kavramını anlar. Kod bunu 20 ile sınırlar, ancak isterseniz script.h'de MAX_VARIABLES tanımını değiştirerek bunu değiştirebilirsiniz. Herhangi bir 16 bitlik değeri (yani 65, 536'ya kadar herhangi bir sayı) daha sonra geri çağrılmak üzere bir değişkene kaydedebilirsiniz. Sözdizimi, kabuktaki değişkenleri belirtmek için bir dolar işareti ($) kullanılması dışında kayıtlara benzer. Print değişkenleri komutuyla tüm değişkenlerinizi listeleyin

değişkenleri yazdırKullanıcı tanımlı değişkenler:Dizin Adı -> Değer(01): $ÜCRETSİZ$ -> 0(02): $ÜCRETSİZ$ -> 0(03): $ÜCRETSİZ$ -> 0(04): $ÜCRETSİZ$ -> 0(05): $ÜCRETSİZ$ -> 0(06): $ÜCRETSİZ$ -> 0(07): $ÜCRETSİZ$ -> 0(08): $ÜCRETSİZ$ -> 0(09): $ÜCRETSİZ$ -> 0(10): $ÜCRETSİZ$ -> 0(11): $ÜCRETSİZ$ -> 0(12): $ÜCRETSİZ$ -> 0(13): $ÜCRETSİZ$ -> 0(14): $ÜCRETSİZ$ -> 0(15): $ÜCRETSİZ$ -> 0(16): $ÜCRETSİZ$ -> 0(17): $ÜCRETSİZ$ -> 0(18): $ÜCRETSİZ$ -> 0(19): $ÜCRETSİZ$ -> 0(20): $ÜCRETSİZ$ -> 0Tamamlandı. Bir değişken ayarla

$newvar = 25$zaman aşımı = 23245Belirli bir değişkenin değerini alın

root@ATmega328p> yankı $yenivar$ yenivar 25Halihazırda bildiğiniz print komutu ile somutlaştırdığınız tüm değişkenlerin neler olduğunu görebilirsiniz.

Kullanıcı tanımlı değişkenler:Dizin Adı -> Değer(01): yenivar -> 25(02): zaman aşımı -> 23245(03): $ÜCRETSİZ$ -> 0(04): $ÜCRETSİZ$ -> 0(05): $ÜCRETSİZ$ -> 0(06): $ÜCRETSİZ$ -> 0(07): $ÜCRETSİZ$ -> 0(08): $ÜCRETSİZ$ -> 0(09): $ÜCRETSİZ$ -> 0(10): $ÜCRETSİZ$ -> 0(11): $ÜCRETSİZ$ -> 0(12): $ÜCRETSİZ$ -> 0(13): $ÜCRETSİZ$ -> 0(14): $ÜCRETSİZ$ -> 0(15): $ÜCRETSİZ$ -> 0(16): $ÜCRETSİZ$ -> 0(17): $ÜCRETSİZ$ -> 0(18): $ÜCRETSİZ$ -> 0(19): $ÜCRETSİZ$ -> 0(20): $ÜCRETSİZ$ -> 0Tamamlandı.$FREE$ ismi sadece o değişken lokasyonunun serbest olduğunu ve henüz bir değişken ismi atanmamış olduğunu gösterir.

Adım 5: Kabuğu Özelleştirme

Kabuğu Özelleştirme
Kabuğu Özelleştirme

İsterseniz kodu hackleyebilir ve kendi ihtiyaçlarınıza göre özelleştirebilirsiniz. Bu kodu yayınlayacağımı bilseydim, ayrı bir komut yorumlayıcı sınıfı ve komut yapısı yapar ve bu çağrıyı bir işlev işaretçisi aracılığıyla yinelerdim. Kod miktarını azaltır, ancak olduğu gibi, kabuk komut satırını ayrıştırır ve uygun kabuk yöntemini çağırır. Kendi özel komutlarınızı eklemek için aşağıdakileri yapın: 1. Komutunuzu ayrıştırma listesine ekleyin Komut ayrıştırıcı komut satırını ayrıştırın ve size komutu ve bağımsız değişkenleri ayrı ayrı verin. Argümanlar, işaretçilere işaretçiler veya bir işaretçiler dizisi olarak iletilir, ancak onlarla çalışmaktan hoşlanırsınız. Bu, shell.cpp'de bulunur. shell.cpp dosyasını açın ve AVRShell sınıfının ExecCmd yöntemini bulun. Belleği programlamak için komutu eklemek isteyebilirsiniz. Bunu yaparsanız, komutu progmem.h ve progmem.cpp'ye ekleyin. PSTR() makrosunu kullanarak doğrudan belleği programlamak için komut ekleyebilirsiniz, ancak daha önce bahsedilen türde başka bir uyarı oluşturacaksınız. Yine, bu C++ ile çalışan bilinen bir hatadır, ancak benim yaptığım gibi komutu doğrudan progmem.* dosyalarına ekleyerek bu sorunu çözebilirsiniz. SRAM kullanımınıza ekleme yapmakta bir sakınca yoksa, "clock" komutu ile gösterdiğim şekilde komutu ekleyebilirsiniz. "newcmd" adında yeni bir komut eklemek istediğinizi varsayalım. AVRShell::ExecCmd'ye gidin ve aşağıdaki kodu eklemek için uygun bir yer bulun:

else if (!strcmp(c, "newcmd")) cmdNewCmd(args);Bu, komutunuzu ekleyecek ve bir sonraki adımda yazacağınız cmdNewCmd yöntemini çağıracaktır. 2. Özel komut kodunuzu yazın Aynı dosyaya özel komut kodunuzu ekleyin. Yöntem tanımı budur. Yine de bildirimi shell.h'ye eklemek isteyeceksiniz. Sadece diğer komutlara ekleyin. Önceki örnekte, kod şöyle görünebilir

voidAVRShell::cmdNewCmd(char ** args){ sprintf_P(buff, PSTR("Komutunuz %s\r\n", args[0]); WriteRAM(buff);}Burada birkaç şey var. İlk olarak, "buff", kullanımınız için kodda sağlanan 40 karakterlik bir dizi arabelleğidir. Bir PSTR'den geçtiğimiz için sprintf'in program bellek sürümünü kullanıyoruz. İsterseniz normal sürümü kullanabilirsiniz, ancak biçimi bir PSTR'de geçirmediğinizden emin olun. Ayrıca, argümanlar args dizisindedir. "newcmd arg1 arg2" yazdıysanız, bu argümanlara args[0] ve args[1] abonelikleriyle ulaşabilirsiniz. Kodda tanımlandığı gibi maksimum MAX_ARGS bağımsız değişkeni iletebilirsiniz. Aynı anda çok daha fazla argümanın iletilmesine ihtiyacınız varsa, yeniden derlerken bu değeri değiştirmekten çekinmeyin. WriteLine ve WriteRAM, UART'ın aynı ada sahip yöntemlerini döndüren global fonksiyonlardır. Bu işlevin 2. argümanı örtüktür. Hiçbir şey iletmezseniz, daha sonra bir komut istemi yazılacaktır. 2. argüman olarak bir 0 iletirseniz, bir bilgi istemi yazılmaz. Bu, komut istemi kullanıcıya döndürülmeden önce çıktı için birkaç ayrı dize yazmak istediğinizde kullanışlıdır. 3. Shell'in komut kodunu yürütmesini sağlayın Yeni komutu kurarken kabuk yürütücüsüne cmdNewCmd yöntemini yürütmesini söylediniz, ancak kabuk nesnesi tarafından anlaşılmasını sağlamak için onu shell.h dosyasına ekleyin. Sadece son komutun altına veya ilk komutun önüne veya orada herhangi bir yere ekleyin. İşte bu kadar. Bellenimi yeniden derleyin ve Arduino'nuza yükleyin ve yeni komutunuz komut isteminde kabuktan edinilebilir.

6. Adım: Özet

AVR/Arduino'nuza nasıl kurulacağını ve bağlanacağını bilmeli ve çalışan mikro denetleyicinizde canlı bir bilgi istemi almalısınız. Çalışma zamanı verilerini MCU'dan çekecek veya değerleri anında MCU'ya ayarlayacak birkaç komut biliyorsunuz. Ayrıca, kendi ihtiyaçlarınız için daha fazla özelleştirmek için kabuğa kendi benzersiz komutlarınızı oluşturmak için kendi özel kodunuzu nasıl ekleyeceğiniz de gösterildi. Hatta ihtiyaçlarınıza uygunsa, yalnızca özel komutlarınızı içermesi için komut yorumlayıcının içini boşaltabilirsiniz. Umarım bu öğreticiyi beğenmişsinizdir ve AVR Kabuğu gerçek zamanlı bir komut yorumlayıcı olarak sizin için yararlı olabilir veya Kendinizinkini uygulamada bir öğrenme süreci olarak. Her zaman olduğu gibi, bu talimatın nasıl geliştirilebileceğine dair herhangi bir yorum veya öneriyi dört gözle bekliyorum! AVR'nizle iyi eğlenceler!

Önerilen: