Taula de continguts:

AVRSH: un intèrpret d’ordres per a Arduino / AVR .: 6 passos (amb imatges)
AVRSH: un intèrpret d’ordres per a Arduino / AVR .: 6 passos (amb imatges)

Vídeo: AVRSH: un intèrpret d’ordres per a Arduino / AVR .: 6 passos (amb imatges)

Vídeo: AVRSH: un intèrpret d’ordres per a Arduino / AVR .: 6 passos (amb imatges)
Vídeo: Equipment Corner - Gcodes and Slic3r basics 2024, De novembre
Anonim
AVRSH: un intèrpret d’ordres Shell per Arduino / AVR
AVRSH: un intèrpret d’ordres Shell per Arduino / AVR

Alguna vegada heu volgut "iniciar la sessió" al vostre microcontrolador AVR? Alguna vegada heu pensat que seria genial "catar" un registre per veure'n el contingut? Sempre heu desitjat una manera d’encendre i apagar subsistemes perifèrics individuals del vostre AVR o Arduino en * temps real *? Jo també, així que vaig escriure l'AVR Shell, un shell similar a UNIX. És semblant a UNIX perquè recorda el compte de shell que vau comprar i que vau executar per executar els vostres robots de col·lisió d'irc nick, a més de tenir una comanda o dues en comú. També té un sistema de fitxers que s'assembla a l'extix UNIX, que utilitza una EEPROM externa, però que s'ha convertit en un projecte per si mateix, de manera que llançaré aquest mòdul per separat sota un altre instructable quan estigui preparat per a la producció. Aquí teniu una llista de les coses que podeu fer actualment amb l'AVR Shell:

  • Llegiu tots els vostres registres de direcció de dades (DDRn), ports i pins en temps real
  • Escriviu a tots els vostres DDRn, ports i pins per encendre motors, LEDs o llegir sensors en temps real
  • Enumereu tots els registres coneguts del sistema
  • Creeu i emmagatzemeu valors en variables definides per l'usuari amb còpia de seguretat per EEPROM.
  • Creeu una contrasenya de root i autentifiqueu-la (s'utilitza per a l'accés telnet)
  • Llegiu la velocitat de rellotge de la CPU configurada
  • Canvieu la velocitat de rellotge de la CPU configurant un precalador
  • Inicieu i atureu temporitzadors de 16 bits per sincronitzar diverses coses
  • Encendre i / o apagar subsistemes perifèrics: convertidors analògics a digitals (ADC), interfície sèrie perifèrica (SPI), interfície de dos fils (TWI / I2C), UART / USART. Útil per quan es vol reduir el consum d'energia del microcontrolador o per habilitar determinades funcions.
  • Escrit en C ++ amb objectes reutilitzables.

Aquesta instrucció permetrà recórrer la instal·lació, l’ús i la personalització d’avrsh.

Pas 1: què necessiteu

El que necessiteu
El que necessiteu

Aquesta instrucció no requereix gaire excepte que vosaltres:

  • Teniu un Arduino o ATmega328P. Podrien funcionar altres AVR, però és possible que hàgiu de modificar el codi per llistar els registres exclusius de la vostra MCU. Els noms només han de coincidir amb el que apareix al fitxer de capçalera exclusiu de la vostra MCU. Molts dels noms de registre són els mateixos entre els AVR, de manera que el vostre quilometratge pot variar quan porteu.
  • Teniu una manera de connectar-vos a la sèrie USART del vostre Arduino / AVR. El sistema s’ha provat més extensament amb el terminal AVR, una aplicació de Windows que estableix una connexió en sèrie a través del port USB o COM. Funciona amb Arduinos mitjançant la connexió USB i qualsevol AVR amb USB-BUB de Moderndevice.com. Altres opcions de terminal inclouen: Putty, minicom (Linux i FreeBSD), pantalla (Linux / FreeBSD), Hyperterminal, Teraterm. He trobat que la massilla i el teraterm envien una mica d’escombraries a l’hora de connectar-me, de manera que la vostra primera ordre es pot confondre.
  • Teniu instal·lat i en execució el microprogramari AVR Shell, que podeu descarregar des d’aquestes pàgines, o bé sempre obteniu la versió més recent a BattleDroids.net.

Per instal·lar el terminal AVR, només cal desempaquetar-lo i executar-lo. Per instal·lar el microprogramari de l'AVR Shell, descarregueu-lo i carregueu directament el fitxer hexadecimal i connecteu el terminal sèrie a 9600 baud, o compileu-lo vosaltres mateixos amb "make" i després "make program" per penjar l'hex. Tingueu en compte que potser haureu de canviar la configuració d'AVRDUDE per reflectir el vostre port COM. Nota: L'atribut PROGMEM està trencat a la implementació AVR GCC actual per a C ++ i es tracta d'un error conegut. Si el compileu, espereu a rebre molts missatges d'advertència que diuen "avís: només es poden col·locar variables inicialitzades a l'àrea de memòria del programa". A més de ser molest de veure, aquesta advertència és inofensiva. Com que C ++ a la plataforma incrustada no es troba a la llista de prioritats de l'AVR GCC, no se sap quan es solucionarà. Si comproveu el codi, veureu on he treballat per reduir aquesta advertència implementant les meves pròpies declaracions d’atributs. Bastant senzill. Descarregueu i instal·leu qualsevol cosa que pugueu necessitar per després passar la pàgina i començar a crackin '.

Pas 2: Registres de lectura i escriptura

Registres de lectura i escriptura
Registres de lectura i escriptura

L'AVR Shell es va escriure principalment per accedir a alguns sensors que havia connectat al meu AVR. Va començar amb un LED senzill i després es va passar a sensors de llum, sensors de temperatura i, finalment, a dos transductors d'ultrasons. avrsh pot configurar els components digitals d’aquests sensors escrivint als registres que els controlen. Manipulació de registres AVR mentre s’executa Per obtenir una llista de tots els registres coneguts al vostre Arduino, escriviu:

imprimir registres i obtindreu una impressió així

Conec els registres següents:

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 arran 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 @ ATmega328P> Per veure com es configuren els bits individuals en qualsevol registre, utilitzeu l'ordre cat o echo

cat% GPIOR0 Aquí demano a l’intèrpret d’ordres que mostri o faci ressò del contingut del registre d’E / S d’ús general # 0. Tingueu en compte el signe de percentatge (%) davant del nom del registre. Necessiteu això per indicar a l'intèrpret d'ordres que es tracta d'una paraula clau reservada que identifica un registre. La sortida típica d'una ordre echo té aquest aspecte

GPIOR0 (0x0) definit com a [00000000] La sortida mostra el nom del registre, el valor hexadecimal que es troba al registre i la representació binària del registre (mostrant cada bit com a 1 o 0). Per establir un bit concret en qualsevol registre, utilitzeu l'operador "índex de" . Per exemple, suposem que vull que el tercer bit sigui un 1

% GPIOR0 [3] = 1 i l'intèrpret d'ordres us donarà una resposta indicant la seva acció i el resultat

GPIOR0 (0x0) definit a [00000000] (0x8) definit a [00001000] No oblideu el signe de percentatge per dir a l'intèrpret d'ordres que esteu treballant amb un registre. Tingueu en compte també que si configureu el 3r bit, hi ha 4 bits perquè els nostres AVR utilitzen un índex basat en zero. En altres paraules, comptant fins al 3r bit es compta 0, 1, 2, 3, que és el quart lloc, però el tercer bit. Podeu esborrar una mica de la mateixa manera establint una mica a zero. Si configureu bits com aquest, podeu canviar el funcionament del vostre AVR sobre la marxa. Per exemple, canviant el valor de concordança del temporitzador CTC que es troba a OCR1A. També us permet examinar paràmetres específics que hauríeu de comprovar programàticament el vostre codi, com ara el valor UBBR de la vostra velocitat en bauds. Treballar amb DDRn, PORTn i PINn Els pins d'E / S també s'assignen als registres i es poden configurar exactament de la mateixa manera, però s'ha creat una sintaxi especial per treballar amb aquest tipus de registres. En el codi, hi ha un procés normal per, per exemple, encendre un LED o un altre dispositiu que requereixi un alt o baix digital. Cal configurar el registre de direcció de dades per indicar que el pin és per a la sortida i, a continuació, escriure un 1 o 0 al bit concret al port correcte. Suposant que tenim un LED connectat al pin digital 13 (PB5) i el volem encendre, a continuació us expliquem com fer-ho mentre s’executa el vostre AVR

definiu el pin pb5 a la sortida escriviu el pin pb5 alt La sortida, a més de poder veure el vostre LED encès, seria així

root @ ATmega328p> establir la sortida del pin pb5 Establir pb5 per a l'arrel @ ATmega328p> escriure el pin pb5 high Escriure una lògica alta al pin pb5 L '"arrel @ ATmega328p>" és l'indicador de l'intèrpret d'ordres que indica que està preparat per acceptar ordres vostres. Per apagar el LED, simplement escriviu un mínim al pin. Si voleu llegir l'entrada digital des d'un pin, utilitzeu l'ordre read. Utilitzant el nostre exemple anterior

root @ ATmega328p> llegiu el pin pb5 Pin: pb5 és ALT Com a alternativa, només cal fer ressò del registre de pins que controla aquest port de pins. Per exemple, si tenim interruptors dip connectats al pin digital 7 i 8 (PD7 i PD8), podeu enviar l’ordre

ressò de% PIND i l'intèrpret d'ordres mostrarà el contingut d'aquest registre, mostrant-vos tots els estats d'entrada / sortida dels dispositius connectats i si l'estat del commutador estava activat o desactivat.

Pas 3: fusibles de lectura i escriptura

Fusibles de lectura i escriptura
Fusibles de lectura i escriptura

Els fusibles són tipus de registres especials. Controlen des de la velocitat de rellotge del microcontrolador fins als mètodes de programació disponibles per protegir contra escriptura la EEPROM. De vegades, haureu de canviar aquests paràmetres, sobretot si esteu creant un sistema AVR autònom. No estic segur que hagueu de canviar la configuració del fusible a Arduino. Aneu amb compte amb els fusibles; Podeu bloquejar-vos si els configureu incorrectament. En una instrucció prèvia, he demostrat com podeu llegir i configurar els fusibles mitjançant el programador i l'avrdude. Aquí us mostraré com llegir els fusibles en temps d'execució per veure com els ha configurat la vostra MCU. Tingueu en compte que aquest no és el paràmetre de temps de compilació que obteniu de les definicions, sinó els fusibles reals a mesura que la MCU els llegeix en temps d'execució. A la taula 27-9 del full de dades ATmega328P (llibre de dades, més semblant), els bits del byte baix de fusible són els següents:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Una cosa interessant a tenir en compte és que amb fusibles, 0 significa programat i un 1 significa que aquest bit concret no està programat. Una mica contraintuïtiu, però un cop ho sabeu ja ho sabeu.

  • CKDIV8 estableix que el rellotge de la vostra CPU es divideixi per 8. L’ATmega328P prové de fàbrica programat per utilitzar el seu oscil·lador intern a 8 MHz amb CKDIV8 programat (és a dir, definit a 0), donant-vos una F_CPU final o una freqüència de CPU de 1 MHz. A Arduino, això canvia ja que estan configurats per utilitzar un oscil·lador extern a 16 MHz.
  • CKOUT quan estigui programat, generarà el rellotge de la CPU a PB0, que és el pin digital 8 d'Arduinos.
  • SUT [1..0] especifica el temps d'inici del vostre AVR.
  • CKSEL [3..0] estableix la font del rellotge, com ara l'oscil·lador RC intern, l'oscil·lador extern, etc.

Quan llegiu els fusibles, se us tornarà en format hexadecimal. Aquest és el format que necessiteu si voleu escriure els fusibles mitjançant avrdude. Al meu arduino, això és el que rebo quan llegeixo el byte de fusible inferior:

root @ ATmega328p> llegeix lfuse Fusible inferior: 0xffPer tant, tots els bits es defineixen a 1. Vaig fer el mateix procediment en un clon Arduino i vaig obtenir el mateix valor. En comprovar un dels meus sistemes AVR autònoms, he obtingut 0xDA, que és el valor que havia establert un temps enrere en configurar el xip. El mateix procediment s’utilitza per comprovar els fusibles High Fuse Byte, Extended Fuse Byte i Lock. Els bytes de fusibles de calibratge i signatura s’han desactivat al codi amb una directiva de preprocessador #if 0, que podeu canviar si us sentiu descartada.

Pas 4: altres ordres

Altres ordres
Altres ordres

Hi ha diverses altres ordres que l’intèrpret d’ordres per defecte entén que us poden semblar útils. Podeu veure totes les ordres implementades i futures emetent ajuda o menú a la sol·licitud. Els tractaré ràpidament aquí, ja que s’expliquen per si mateixos. Configuració de la freqüència de rellotge de la CPU Podeu esbrinar què s'ha configurat el firmware per utilitzar-lo com a configuració de rellotge de la CPU amb l'ordre fcpu:

root @ ATmega328p> Freq fcpuCPU: 16000000Són 16 milions, o 16 milions d’herzes, més coneguts com a 16 MHz. Podeu canviar això sobre la marxa, sigui pel motiu que sigui, amb l'ordre de rellotge. Aquesta ordre té un argument: el prescaler que cal utilitzar quan es divideix la velocitat del rellotge. L'ordre rellotge entén aquests valors de prescaler:

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

Amb l'ordre:

rellotge ckdiv2 si la velocitat de la CPU és de 16 MHz, es canviaria la velocitat del rellotge a 8 MHz. L’ús d’un precaler de ckdiv64 amb una velocitat de rellotge inicial de 16 MHz donarà lloc a una velocitat de rellotge final de 250 KHz. Per què a la Terra voldríeu que la vostra MCU sigui més lenta? Bé, per una banda, una velocitat de rellotge inferior consumeix menys energia i, si teniu la vostra MCU sense bateria en un recinte del projecte, potser no la necessiteu per funcionar a la màxima velocitat i, per tant, podríeu baixar la velocitat i reduir-ne el consum., augmentant la durada de la bateria. A més, si utilitzeu el rellotge per a qualsevol tipus de problema de sincronització amb una altra MCU, per exemple, implementant un programari UART o alguna cosa semblant, és possible que vulgueu establir-lo a un valor particular que sigui fàcil d’obtenir una bona velocitat taxes d'error més baixes. Encendre i apagar subsistemes perifèrics A la mateixa nota que es redueix el consum d'energia esmentat anteriorment, potser voldreu reduir encara més la potència apagant alguns dels perifèrics integrats que no esteu utilitzant. Actualment, l'intèrpret d'ordres i l'intèrpret d'ordres poden encendre i apagar els perifèrics següents:

  • Convertidor analògic a digital (ADC). Aquest perifèric s’utilitza quan teniu un sensor analògic que proporciona dades (com ara temperatura, llum, acceleració, etc.) i heu de convertir-lo a un valor digital.
  • Interfície perifèrica en sèrie (SPI). El bus SPI s’utilitza per comunicar-se amb altres dispositius compatibles amb SPI, com ara memòries externes, controladors LED, ADC externs, etc. si esteu programant via ISP.
  • Interfície de dos cables. Alguns dispositius externs utilitzen el bus I2C per comunicar-se, tot i que aquests se substitueixen ràpidament per dispositius compatibles amb SPI, ja que SPI té un rendiment superior.
  • USART. Aquesta és la vostra interfície sèrie. Probablement no vulgueu desactivar-ho si esteu connectat a l'AVR mitjançant la connexió en sèrie. Tanmateix, he afegit això aquí com a esquelet per portar a dispositius que tinguin diversos USART, com l'ATmega162 o l'ATmega644P.
  • tot. Aquest argument de l'ordre d'engegada o apagada activa tots els perifèrics esmentats o els desactiva amb una sola ordre. Una vegada més, utilitzeu aquesta ordre amb prudència.

root @ ATmega328p> powerdown twi Powerdown of twi complete.root@ATmega328p> powerup twi Powerup of twi complete.

Iniciar i aturar els temporitzadors El shell té un temporitzador de 16 bits integrat que està disponible per al seu ús. Inicieu el temporitzador amb l'ordre temporitzador:

temporitzador d’inicii atureu el temporitzador amb l'argument de parada

parada del temporitzadorAquest temporitzador no entrarà en conflicte amb el temporitzador intern USART. Consulteu el codi per obtenir informació detallada sobre la implementació del temporitzador USART, si aquest tipus de detall sagnant us interessa

root @ ATmega328p> starter del temporitzador Started timer.root@ATmega328p> stop del temporitzador Temps transcorregut: ~ 157 segons Autenticació El shell pot emmagatzemar una contrasenya de 8 caràcters a EEPROM. Aquest mecanisme de contrasenya es va crear per donar suport a les capacitats d'inici de sessió de telnet, però es va poder ampliar per protegir altres coses. Per exemple, podeu requerir certes ordres, com ara canviar els valors del registre, mitjançant el mecanisme d’autenticació. Establiu la contrasenya amb l’ordre password

root @ ATmega328p> passwd blah Escriviu la contrasenya de root a EEPROMAutoritzeu contra la contrasenya (o necessiteu una autorització programàtica mitjançant el codi) amb l'ordre auth. Tingueu en compte que si intenteu canviar la contrasenya de root i ja hi ha una contrasenya de root establerta, heu d’autoritzar-vos contra la contrasenya anterior abans de permetre-la canviar-la per una nova.

root @ ATmega328p> passwd blinky Heu d’autoritzar-vos primer.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinky Escriviu una contrasenya d’arrel nova a EEPROMPer descomptat, haureu de carregar el fitxer avrsh.eep si esborreu el firmware per restaurar els vostres valors i variables antics. El Makefile us crearà el fitxer EEPROM. Variables El shell entén la noció de variables definides per l'usuari. El codi ho limita a 20, però podeu canviar-ho si voleu canviant la definició de MAX_VARIABLES a script.h. Podeu desar qualsevol valor de 16 bits (és a dir, qualsevol número fins a 65, 536) en una variable que es recuperarà més endavant. La sintaxi és similar als registres, tret que s'utilitza un signe de dòlar ($) per indicar variables a l'intèrpret d'ordres. Enumereu totes les vostres variables amb l’ordre print variables

variables d'impressió Variables definides per l'usuari: Nom de l'índex -> Valor (01): $ GRATU $T $ -> 0 (02): $ GRATU $T $ -> 0 (03): $ GRATU $T $ -> 0 (04): $ GRATU $T $ -> 0 (05): $ GRATU $T $ -> 0 (06): $ GRATU $T $ -> 0 (07): $ GRATU $T $ -> 0 (08): $ GRATU $T $ -> 0 (09): $ GRATU $T $ -> 0 (10): $ GRATU $T $ -> 0 (11): $ GRATU $T $ -> 0 (12): $ GRATU $T $ -> 0 (13): $ GRATU $T $ -> 0 (14): $ GRATU $T $ -> 0 (15): $ GRATU $T $ -> 0 (16): $ GRATU $T $ -> 0 (17): $ GRATU $T $ -> 0 (18): $ GRATU $T $ -> 0 (19): $ GRATU $T $ -> 0 (20): $ GRATU $T $ -> 0 Complet. Definiu una variable

$ newvar = 25 $ timeout = 23245Obteniu el valor d'una variable determinada

root @ ATmega328p> echo $ newvar $ newvar 25Podeu veure quines són les variables que actualment heu creat amb l'ordre print que ja coneixeu

Variables definides per l'usuari: Nom de l'índex -> Valor (01): newvar -> 25 (02): temps d'espera -> 23245 (03): $ GRATU $T $ -> 0 (04): $ GRATU $T $ -> 0 (05): $ GRATU $T $ -> 0 (06): $ GRATU $T $ -> 0 (07): $ GRATU $T $ -> 0 (08): $ GRATU $T $ -> 0 (09): $ GRATU $T $ -> 0 (10): $ GRATU $T $ -> 0 (11): $ GRATU $T $ -> 0 (12): $ GRATU $T $ -> 0 (13): $ GRATU $T $ -> 0 (14): $ GRATU $T $ -> 0 (15): $ GRATU $T $ -> 0 (16): $ GRATU $T $ -> 0 (17): $ GRATU $T $ -> 0 (18): $ GRATU $T $ -> 0 (19): $ GRATU $T $ -> 0 (20): $ GRATU $T $ -> 0 Complet. El nom $ FREE $ només indica que aquesta ubicació variable és gratuïta i que encara no se li ha assignat cap nom de variable.

Pas 5: personalització de l'intèrpret d'ordres

Personalització del Shell
Personalització del Shell

Si voleu, podeu piratejar el codi i personalitzar-lo segons les vostres necessitats. Si hagués sabut que alliberaria aquest codi, hauria fet una classe d'intèrpret d'ordres i una estructura d'ordres separades i simplement hauria iterat a través d'aquesta trucada a un punter de funció. Es reduiria la quantitat de codi, però tal com està, l'intèrpret d'ordres analitza la línia d'ordres i crida al mètode d'intèrpret d'ordres adequat. Per afegir les vostres pròpies ordres personalitzades, feu el següent: 1. Afegiu l'ordre a la llista d'anàlisi. analitzeu la línia d'ordres i us proporcionarà l'ordre i els arguments per separat. Els arguments es passen com a indicadors a indicadors, o bé com a matriu d’indicadors, per molt que vulgueu treballar amb ells. Es troba a shell.cpp. Obriu shell.cpp i cerqueu el mètode ExecCmd de la classe AVRShell. És possible que vulgueu afegir l'ordre a la memòria del programa. Si ho feu, afegiu l'ordre a progmem.h i progmem.cpp. Podeu afegir l'ordre a la memòria del programa directament mitjançant la macro PSTR (), però generareu un altre advertiment del tipus esmentat anteriorment. De nou, es tracta d’un error conegut que funciona amb C ++, però podeu solucionar-ho afegint l’ordre directament als fitxers progmem. *, Com he fet. Si no us importa afegir al vostre ús de SRAM, podeu afegir l'ordre tal com he il·lustrat amb l'ordre "clock". Suposem que voleu afegir una ordre nova anomenada "newcmd". Aneu a AVRShell:: ExecCmd i trobeu un lloc convenient per inserir el codi següent:

else if (! strcmp (c, "newcmd")) cmdNewCmd (args);Això afegirà la vostra ordre i cridarà al mètode cmdNewCmd que escrivireu al següent pas. 2. Escriviu el codi d'ordre personalitzat Al mateix fitxer, afegiu el codi d'ordre personalitzat. Aquesta és la definició del mètode. Encara voldreu afegir la declaració a shell.h. Només cal afegir-lo a les altres ordres. A l'exemple anterior, el codi pot semblar així

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("La vostra comanda és% s / r / n", args [0]); WriteRAM (buff);}Aquí hi ha diverses coses. En primer lloc, "buff" és un buffer de matriu de 40 caràcters que es proporciona al codi per al vostre ús. Utilitzem la versió de memòria del programa de sprintf ja que li passem un PSTR. Podeu utilitzar la versió normal si voleu, però assegureu-vos de no passar el format en un PSTR. A més, els arguments es troben a la matriu args. Si heu escrit "newcmd arg1 arg2" podeu obtenir aquests arguments amb els subíndexs args [0] i args [1]. Podeu passar un màxim de MAX_ARGS arguments, tal com es defineix al codi. No dubteu a canviar aquest valor quan torneu a compilar si necessiteu passar molts més arguments alhora. WriteLine i WriteRAM són funcions globals que retornen els mètodes UART del mateix nom. El segon argument d'aquesta funció és implícit. Si no passa res, s'escriurà un indicador d'ordres després. Si passeu un 0 com a segon argument, no s'escriurà una sol·licitud. Això és útil quan voleu escriure diverses cadenes separades per a la sortida abans que es retorni el símbol del sistema a l'usuari. 3. Feu que l'intèrpret d'ordres executi el codi d'ordres Ja heu dit a l'executor d'intèrpret d'ordres que executi el mètode cmdNewCmd quan configureu la nova ordre, però afegiu-lo al fitxer shell.h perquè l'objecte d'intèrpret ho entengui. Només cal que l’afegiu a sota de l’última ordre o davant de la primera ordre o a qualsevol lloc que hi hagi. Compileu i pengeu el microprogramari al vostre Arduino i la vostra nova ordre estarà disponible a l'intèrpret d'ordres.

Pas 6: resum

Hauríeu de saber com instal·lar-vos i connectar-vos al vostre AVR / Arduino i rebre una sol·licitud en directe al microcontrolador en funcionament. Coneixeu diverses ordres que extreuran les dades en temps d'execució de l'MCU o establiran valors a l'MCU sobre la marxa. També us ha mostrat com afegir el vostre propi codi personalitzat per crear les vostres pròpies ordres exclusives a l'intèrpret d'ordres per personalitzar-lo encara més segons les vostres necessitats. Fins i tot podeu evitar l’intèrpret d’ordres perquè només contingui les vostres ordres personalitzades, si això s’adapta a les vostres necessitats. Espero que us hagi agradat aquesta instrucció i que l’AVR Shell us pugui ser útil, ja sigui com a intèrpret d’ordres en temps real o com a procés d’aprenentatge per implementar el vostre. Com sempre, espero qualsevol comentari o suggeriment sobre com es pot millorar aquest instructiu. Diverteix-te amb el teu AVR.

Recomanat: