Πίνακας περιεχομένων:

AVRSH: Ένα κέλυφος διερμηνέα εντολών για Arduino/AVR .: 6 βήματα (με εικόνες)
AVRSH: Ένα κέλυφος διερμηνέα εντολών για Arduino/AVR .: 6 βήματα (με εικόνες)

Βίντεο: AVRSH: Ένα κέλυφος διερμηνέα εντολών για Arduino/AVR .: 6 βήματα (με εικόνες)

Βίντεο: AVRSH: Ένα κέλυφος διερμηνέα εντολών για Arduino/AVR .: 6 βήματα (με εικόνες)
Βίντεο: На всех мировых ПОДИУМАХ! Съёмный ВОРОТНИК крючком. Вяжем вместе. 2024, Νοέμβριος
Anonim
AVRSH: Shell διερμηνέα εντολών για Arduino/AVR
AVRSH: Shell διερμηνέα εντολών για Arduino/AVR

Θέλατε ποτέ να είστε "συνδεδεμένοι" στον μικροελεγκτή AVR; Σκεφτήκατε ποτέ ότι θα ήταν ωραίο να «γατάρετε» ένα μητρώο για να δείτε το περιεχόμενό του; Θέλατε πάντα έναν τρόπο να ενεργοποιήσετε και να απενεργοποιήσετε μεμονωμένα περιφερειακά υποσυστήματα του AVR ή του Arduino σε * πραγματικό χρόνο *; Και εγώ, έτσι έγραψα το κέλυφος AVR, ένα κέλυφος που μοιάζει με UNIX. Είναι σαν το UNIX επειδή θυμίζει τον λογαριασμό κελύφους που βγήκατε και αγοράσατε για να εκτελέσετε τα bots σύγκρουσης irc nick σας, καθώς και μια κοινή εντολή ή δύο. Διαθέτει επίσης ένα σύστημα αρχείων που μοιάζει με UNIX extfs, χρησιμοποιώντας εξωτερικό EEPROM, αλλά αυτό έγινε ένα έργο από μόνο του, οπότε θα κυκλοφορήσω αυτό το δομοστοιχείο ξεχωριστά με διαφορετικό οδηγό όταν είναι έτοιμο για παραγωγή. Ακολουθεί μια λίστα με τα πράγματα που μπορείτε να κάνετε αυτήν τη στιγμή με το κέλυφος AVR:

  • Διαβάστε όλους τους καταχωρητές κατεύθυνσης δεδομένων (DDRn), τις θύρες και τις καρφίτσες σας σε πραγματικό χρόνο
  • Γράψτε σε όλα τα DDRn, τις θύρες και τις καρφίτσες σας για να ενεργοποιήσετε κινητήρες, LED ή αισθητήρες ανάγνωσης σε πραγματικό χρόνο
  • Παραθέστε όλους τους γνωστούς καταχωρητές στο σύστημα
  • Δημιουργήστε και αποθηκεύστε τιμές σε μεταβλητές που καθορίζονται από το χρήστη και υποστηρίζονται από το EEPROM.
  • Δημιουργήστε έναν κωδικό πρόσβασης ρίζας και πραγματοποιήστε έλεγχο ταυτότητας έναντι αυτού (χρησιμοποιείται για πρόσβαση στο telnet)
  • Διαβάστε τη ρυθμισμένη ταχύτητα ρολογιού της CPU
  • Αλλάξτε την ταχύτητα ρολογιού της CPU ρυθμίζοντας έναν προκαθορισμένο πίνακα
  • Ξεκινήστε και σταματήστε χρονοδιακόπτες 16 bit για χρονισμό διαφόρων πραγμάτων
  • Ενεργοποιήστε ή/και απενεργοποιήστε περιφερειακά υποσυστήματα: Αναλογικοί σε ηφιακοί Μετατροπείς (ADC), Σειριακή Περιφερειακή Διεπαφή (SPI), Διεπαφή Διεπαφή (TWI/I2C), UART/USART. Χρήσιμο όταν θέλετε να μειώσετε την κατανάλωση ενέργειας του μικροελεγκτή ή να ενεργοποιήσετε ορισμένες λειτουργίες.
  • Γραμμένο σε C ++ με αντικείμενα επαναχρησιμοποίησης.

Αυτό το εκπαιδευτικό θα περπατήσει στην εγκατάσταση, τη χρήση και την προσαρμογή του avrsh.

Βήμα 1: Τι θα χρειαστείτε

Αυτό που θα χρειαστείτε
Αυτό που θα χρειαστείτε

Αυτό το διδακτικό δεν απαιτεί πολλά εκτός από το ότι:

  • Πάρτε ένα Arduino ή ATmega328P. Άλλα AVR θα μπορούσαν να λειτουργήσουν, αλλά ίσως χρειαστεί να τροποποιήσετε τον κώδικα για να καταχωρίσετε τυχόν καταχωρητές που είναι μοναδικοί για το MCU σας. Τα ονόματα πρέπει να ταιριάζουν μόνο με αυτά που αναφέρονται στο αρχείο κεφαλίδας μοναδικό για το MCU σας. Πολλά από τα ονόματα καταχωρητών είναι τα ίδια μεταξύ των AVR, επομένως τα χιλιόμετρα μπορεί να διαφέρουν κατά τη μεταφορά.
  • Βρείτε έναν τρόπο σύνδεσης με το σειριακό USART του Arduino/AVR. Το σύστημα έχει δοκιμαστεί εκτενέστερα με το τερματικό AVR, μια εφαρμογή Windows που πραγματοποιεί σειριακή σύνδεση μέσω της θύρας USB ή COM. Λειτουργεί με το Arduinos χρησιμοποιώντας τη σύνδεση USB και οποιοδήποτε AVR χρησιμοποιώντας το USB-BUB από το Moderndevice.com. Άλλες επιλογές τερματικού περιλαμβάνουν: Putty, minicom (Linux και FreeBSD), οθόνη (Linux/FreeBSD), Hyperterminal, Teraterm. Έχω διαπιστώσει ότι ο στόκος και το teraterm στέλνουν κάποια σκουπίδια κατά τη σύνδεση, έτσι ώστε η πρώτη σας εντολή να παραμορφωθεί.
  • Εγκαταστήστε και εκτελέστε το υλικολογισμικό AVR Shell, το οποίο μπορείτε να κατεβάσετε από αυτές τις σελίδες ή να λάβετε πάντα την πιο πρόσφατη έκδοση στο BattleDroids.net.

Για να εγκαταστήσετε το τερματικό AVR, απλώς αποσυσκευάστε το και εκτελέστε το. Για να εγκαταστήσετε το υλικολογισμικό AVR Shell, κατεβάστε το και είτε ανεβάστε απευθείας το εξάγωνο αρχείο και συνδέστε το σειριακό τερματικό σας στα 9600 baud, είτε μεταγλωττίστε το μόνοι σας με το "make" και στη συνέχεια "κάντε πρόγραμμα" για να ανεβάσετε το εξάγωνο. Σημείωση, ίσως χρειαστεί να αλλάξετε τις ρυθμίσεις AVRDUDE για να αντικατοπτρίζουν τη θύρα COM. Σημείωση: Το χαρακτηριστικό PROGMEM είναι σπασμένο στην τρέχουσα υλοποίηση AVR GCC για C ++ και αυτό είναι ένα γνωστό σφάλμα. Αν το μεταγλωττίσετε, περιμένετε να λάβετε πολλά προειδοποιητικά μηνύματα που λένε "προειδοποίηση: μόνο οι αρχικοποιημένες μεταβλητές μπορούν να τοποθετηθούν στην περιοχή μνήμης του προγράμματος." Εκτός από ενοχλητικό να βλέπεις, αυτή η προειδοποίηση είναι ακίνδυνη. Καθώς το C ++ στην ενσωματωμένη πλατφόρμα δεν βρίσκεται ψηλά στη λίστα προτεραιοτήτων του AVR GCC, είναι άγνωστο πότε θα διορθωθεί. Εάν ελέγξετε τον κώδικα, θα δείτε πού έχω κάνει προσπάθειες για να μειώσω αυτήν την προειδοποίηση εφαρμόζοντας τις δικές μου δηλώσεις χαρακτηριστικών. Πολύ απλό. Κατεβάστε και εγκαταστήστε ό, τι μπορεί να χρειαστείτε για να γυρίσετε τη σελίδα και να πάμε να σπάσουμε.

Βήμα 2: Ανάγνωση και εγγραφή μητρώων

Ανάγνωση και εγγραφή μητρώων
Ανάγνωση και εγγραφή μητρώων

Το κέλυφος AVR γράφτηκε κυρίως για πρόσβαση σε ορισμένους αισθητήρες που είχα συνδέσει στο AVR μου. Ξεκίνησε με ένα απλό LED στη συνέχεια μεταφέρθηκε σε αισθητήρες φωτός, αισθητήρες θερμοκρασίας και τέλος σε δύο μορφοτροπείς υπερήχων. Το avrsh μπορεί να ρυθμίσει τα ψηφιακά στοιχεία αυτών των αισθητήρων γράφοντας στα μητρώα που τα ελέγχουν. Χειρισμός εγγραφών AVR κατά την εκτέλεση Για να λάβετε μια λίστα με όλους τους γνωστούς καταχωρητές στο Arduino σας, πληκτρολογήστε:

εκτύπωση μητρώων και θα λάβετε μια εκτύπωση που μοιάζει με αυτήν

Γνωρίζω τα ακόλουθα μητρώα:

TIFR0 PORTC TIFR1 PORTD TIFR2 DDRD PCIFR DDRB EIFR DDRC EIMSK PINB EECR ΕΠΠ 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> Για να δείτε πώς έχουν ρυθμιστεί τα μεμονωμένα bit σε οποιονδήποτε καταχωρητή, χρησιμοποιήστε την εντολή cat ή echo

cat %GPIOR0 Εδώ ζητώ από τον διερμηνέα εντολών να εμφανίσει ή να κάνει ηχώ, τα περιεχόμενα του Μητρώου Γενικών Σκοπών I/O #0. Σημειώστε το σύμβολο ποσοστού (%) μπροστά από το όνομα του μητρώου. Χρειάζεστε αυτό για να υποδείξετε στο κέλυφος ότι πρόκειται για δεσμευμένη λέξη -κλειδί που προσδιορίζει έναν καταχωρητή. Η τυπική έξοδος από μια εντολή echo μοιάζει με αυτήν

GPIOR0 (0x0) ορίστηκε σε [00000000] Η έξοδος δείχνει το όνομα του καταχωρητή, την δεκαεξαδική τιμή που βρίσκεται στον καταχωρητή και τη δυαδική αναπαράσταση του καταχωρητή (εμφανίζει κάθε bit ως 1 ή 0). Για να ορίσετε ένα συγκεκριμένο bit σε οποιονδήποτε καταχωρητή, χρησιμοποιήστε τον τελεστή "index of" . Για παράδειγμα, ας πούμε ότι θέλω το 3ο bit σε 1

%GPIOR0 [3] = 1 και το κέλυφος θα σας δώσει μια απάντηση υποδεικνύοντας τη δράση και το αποτέλεσμα

Το GPIOR0 (0x0) έχει οριστεί σε [00000000] (0x8) έχει οριστεί σε [00001000] Μην ξεχάσετε το σύμβολο ποσοστού για να πείτε στο κέλυφος ότι εργάζεστε με ένα μητρώο. Σημειώστε επίσης ότι ορίζοντας το 3ο bit, δηλαδή 4 bits επειδή το AVR μας χρησιμοποιεί μηδενικό δείκτη. Με άλλα λόγια, μετρώντας στο 3ο bit μετράτε 0, 1, 2, 3, που είναι η 4η θέση, αλλά το 3ο bit. Μπορείτε να καθαρίσετε λίγο με τον ίδιο τρόπο ρυθμίζοντας λίγο στο μηδέν. Ορίζοντας τέτοια κομμάτια μπορείτε να αλλάξετε τη λειτουργία του AVR σας εν κινήσει. Για παράδειγμα, αλλάζοντας την τιμή αντιστοίχισης χρονομέτρου CTC που βρίσκεται στο OCR1A. Σας επιτρέπει επίσης να ρίξετε μια ματιά σε συγκεκριμένες ρυθμίσεις που θα πρέπει να ελέγξετε μέσω κώδικα μέσω προγραμματισμού, όπως η τιμή UBBR για το ρυθμό baud. Εργασία με DDRn, PORTn και PINn Οι ακίδες εισόδου/εξόδου εκχωρούνται επίσης σε καταχωρητές και μπορούν να ρυθμιστούν με τον ίδιο ακριβώς τρόπο, αλλά έχει δημιουργηθεί μια ειδική σύνταξη για να λειτουργεί με αυτούς τους τύπους καταχωρητών. Στον κώδικα, υπάρχει μια κανονική διαδικασία, για παράδειγμα, για την ενεργοποίηση ενός LED ή άλλης συσκευής που απαιτεί ψηφιακό υψηλό ή χαμηλό. Απαιτεί τη ρύθμιση του Μητρώου Κατεύθυνσης Δεδομένων για να υποδεικνύει ότι η καρφίτσα προορίζεται για έξοδο και, στη συνέχεια, να γράψει 1 ή 0 στο συγκεκριμένο bit στη σωστή θύρα. Ας υποθέσουμε ότι έχουμε ένα LED συνδεδεμένο στον ψηφιακό ακροδέκτη 13 (PB5) και θέλουμε να το ενεργοποιήσουμε, δείτε πώς να το κάνετε αυτό ενώ λειτουργεί το AVR

ορίστε την ακίδα pb5 εξόδου γράψτε την καρφίτσα pb5 υψηλή Η έξοδος, εκτός από το ότι μπορείτε να δείτε το LED σας να ανάβει, θα μοιάζει με αυτό

root@ATmega328p> set pin pb5 outputSet pb5 for outputroot@ATmega328p> εγγραφή pin pb5 high Γράψτε λογική υψηλή σε pin pb5 Το "root@ATmega328p>" είναι η προτροπή του κελύφους που δείχνει ότι είναι έτοιμο να δεχτεί εντολές από εσάς. Για να απενεργοποιήσετε τη λυχνία LED, απλά γράψτε ένα χαμηλό στην καρφίτσα. Εάν θέλετε να διαβάσετε την ψηφιακή είσοδο από μια καρφίτσα, χρησιμοποιήστε την εντολή ανάγνωσης. Χρησιμοποιώντας το παραπάνω παράδειγμα μας

root@ATmega328p> διαβάστε την καρφίτσα pb5Pin: το pb5 είναι Υ HIGHΗΛΟ Εναλλακτικά, απλώς επαναλάβετε τον καταχωρητή pin που ελέγχει τη θύρα pin. Για παράδειγμα, εάν έχουμε διακόπτες εμβύθισης συνδεδεμένους με τον ψηφιακό ακροδέκτη 7 και 8 (PD7 και PD8), μπορείτε να στείλετε την εντολή

ηχώ %PIND και το κέλυφος θα εμφανίσει στη συνέχεια το περιεχόμενο αυτού του καταχωρητή, δείχνοντάς σας όλες τις καταστάσεις εισόδου/εξόδου των συνδεδεμένων συσκευών και αν η κατάσταση του διακόπτη ήταν ενεργοποιημένη ή απενεργοποιημένη.

Βήμα 3: Ανάγνωση και εγγραφή ασφαλειών

Ασφάλειες ανάγνωσης και γραφής
Ασφάλειες ανάγνωσης και γραφής

Οι ασφάλειες είναι ειδικοί τύποι καταχωρητών. Ελέγχουν τα πάντα, από την ταχύτητα ρολογιού του μικροελεγκτή σας έως τις διαθέσιμες μεθόδους προγραμματισμού για την προστασία εγγραφής EEPROM. Μερικές φορές θα χρειαστεί να αλλάξετε αυτές τις ρυθμίσεις, ειδικά αν δημιουργείτε ένα αυτόνομο σύστημα AVR. Δεν είμαι σίγουρος ότι πρέπει να αλλάξετε τις ρυθμίσεις ασφάλειας στο Arduino. Να είστε προσεκτικοί με τις ασφάλειές σας. Μπορείτε να κλειδώσετε τον εαυτό σας εάν τα ορίσετε εσφαλμένα. Σε προηγούμενο οδηγό, έδειξα πώς μπορείτε να διαβάσετε και να ρυθμίσετε τις ασφάλειές σας χρησιμοποιώντας τον προγραμματιστή και το avrdude. Εδώ, θα σας δείξω πώς να διαβάζετε τις ασφάλειές σας κατά την εκτέλεση για να δείτε πώς τις έχει ρυθμίσει πραγματικά η MCU. Σημειώστε ότι αυτή δεν είναι η ρύθμιση χρόνου μεταγλώττισης που λαμβάνετε από τους ορισμούς, αλλά η πραγματική ασφάλεια καθώς η MCU τις διαβάζει κατά την εκτέλεση. Από τον Πίνακα 27-9 στο φύλλο δεδομένων ATmega328P (βιβλιοθήκη βάσης δεδομένων, περισσότερο παρόμοιο) τα κομμάτια του Fuse Low Byte είναι τα εξής:

CKDIV8 CKOUT SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0Ένα ενδιαφέρον πράγμα που πρέπει να σημειωθεί είναι ότι με τις ασφάλειες, το 0 σημαίνει προγραμματισμένο και το 1 σημαίνει ότι το συγκεκριμένο bit δεν είναι προγραμματισμένο. Κάπως αντι-διαισθητικό, αλλά μόλις το μάθετε το γνωρίζετε.

  • Το CKDIV8 ρυθμίζει το ρολόι της CPU σας να διαιρείται με το 8. Το ATmega328P προέρχεται από το εργοστασιακά προγραμματισμένο να χρησιμοποιεί τον εσωτερικό ταλαντωτή του στα 8MHz με CKDIV8 προγραμματισμένο (δηλ. Ρυθμισμένο στο 0) δίνοντάς σας μια τελική συχνότητα F_CPU ή CPU 1MHz. Στα Arduino, αυτό αλλάζει αφού έχουν διαμορφωθεί για χρήση εξωτερικού ταλαντωτή στα 16MHz.
  • Το CKOUT όταν προγραμματιστεί θα βγάλει το ρολόι της CPU σας στο PB0, το οποίο είναι η ψηφιακή ακίδα 8 στο Arduinos.
  • Το SUT [1..0] καθορίζει τον χρόνο εκκίνησης για το AVR σας.
  • Το CKSEL [3..0] ρυθμίζει την πηγή ρολογιού, όπως τον εσωτερικό ταλαντωτή RC, τον εξωτερικό ταλαντωτή κ.λπ.

Όταν διαβάζετε τις ασφάλειές σας, θα σας επιστρέφονται σε δεκαεξαδική μορφή. Αυτή είναι η μορφή που χρειάζεστε εάν θέλετε να γράψετε τις ασφάλειες μέσω avrdude. Στο arduino μου, ιδού τι παίρνω όταν διαβάζω το κάτω byte ασφάλειας:

root@ATmega328p> διαβάστε lfuse Κάτω ασφάλεια: 0xffΈτσι, όλα τα bit έχουν οριστεί στο 1. Έκανα την ίδια διαδικασία σε έναν κλώνο Arduino και πήρα την ίδια τιμή. Ελέγχοντας ένα από τα αυτόνομα συστήματά μου AVR, πήρα 0xDA που είναι η τιμή που είχα ορίσει πριν από τη διαμόρφωση του τσιπ. Η ίδια διαδικασία χρησιμοποιείται για τον έλεγχο των ασφαλειών High Fuse Byte, Extended Fuse Byte και Lock. Τα byte ασφάλειας βαθμονόμησης και υπογραφής έχουν απενεργοποιηθεί στον κώδικα με μια οδηγία προεπεξεργαστή #if 0, την οποία μπορείτε να αλλάξετε εάν αισθάνεστε ακατάστατοι.

Βήμα 4: Άλλες εντολές

Άλλες εντολές
Άλλες εντολές

Υπάρχουν πολλές άλλες εντολές που ο προεπιλεγμένος διερμηνέας εντολών καταλαβαίνει ότι μπορεί να σας φανούν χρήσιμες. Μπορείτε να δείτε όλες τις εντολές που έχουν υλοποιηθεί και μελλοντικές εκδόσεις, εκδίδοντας βοήθεια ή μενού στη γραμμή προτροπής. Θα τα καλύψω γρήγορα εδώ, καθώς είναι ως επί το πλείστον αυτονόητα. Ρυθμίσεις συχνότητας ρολογιού CPU Μπορείτε να μάθετε τι έχει ρυθμιστεί για να χρησιμοποιεί το υλικολογισμικό σας ως ρυθμίσεις ρολογιού CPU με την εντολή fcpu:

root@ATmega328p> fcpuCPU Συχνότητα: 16000000Αυτό είναι 16 εκατομμύρια ή 16 εκατομμύρια herz, πιο γνωστό ως 16 MHz. Μπορείτε να το αλλάξετε εν κινήσει, για οποιονδήποτε λόγο, με την εντολή ρολογιού. Αυτή η εντολή παίρνει ένα όρισμα: το πρόγραμμα προώθησης που χρησιμοποιείται κατά τη διαίρεση της ταχύτητας του ρολογιού σας. Η εντολή ρολογιού καταλαβαίνει αυτές τις τιμές προεπιλογής:

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

Χρησιμοποιώντας την εντολή:

ρολόι ckdiv2 όταν η ταχύτητα του επεξεργαστή σας είναι 16MHz θα είχε ως αποτέλεσμα η ταχύτητα του ρολογιού σας να αλλάξει σε 8MHz. Η χρήση ενός prescaler του ckdiv64 με αρχική ταχύτητα ρολογιού 16MHz θα έχει ως αποτέλεσμα μια τελική ταχύτητα ρολογιού 250 KHz. Γιατί στη γη θα θέλατε να κάνετε το MCU σας πιο αργό; Λοιπόν, για πρώτη φορά, μια χαμηλότερη ταχύτητα ρολογιού καταναλώνει λιγότερη ενέργεια και εάν το MCU σας εξαντληθεί από μια μπαταρία σε ένα περίβλημα έργου, μπορεί να μην το χρειάζεστε για να λειτουργήσει στην τελική ταχύτητα και, συνεπώς, θα μπορούσε να μειώσει την ταχύτητα και να μειώσει την κατανάλωση ενέργειας, αυξάνοντας τη διάρκεια ζωής της μπαταρίας. Επίσης, εάν χρησιμοποιείτε το ρολόι για κάθε είδους προβλήματα χρονισμού με άλλο MCU, ας πούμε, υλοποίηση λογισμικού UART ή κάτι τέτοιο, ίσως θελήσετε να το ορίσετε σε μια συγκεκριμένη τιμή που είναι εύκολο να αποκτήσετε έναν ωραίο ρυθμό ισορροπίας χαμηλότερα ποσοστά σφάλματος. Ενεργοποίηση και απενεργοποίηση περιφερειακών υποσυστημάτων Με την ίδια σημείωση με τη μείωση της κατανάλωσης ενέργειας που αναφέρθηκε προηγουμένως, ίσως θελήσετε να μειώσετε περαιτέρω την ισχύ τερματίζοντας ορισμένες από τις περιφερειακές συσκευές που δεν χρησιμοποιείτε. Ο διερμηνέας εντολών και το κέλυφος μπορούν επί του παρόντος να ενεργοποιήσουν και να απενεργοποιήσουν τα ακόλουθα περιφερειακά:

  • Μετατροπέας αναλογικού σε ψηφιακό (ADC). Αυτό το περιφερειακό χρησιμοποιείται όταν έχετε έναν αναλογικό αισθητήρα που παρέχει δεδομένα (όπως θερμοκρασία, φως, επιτάχυνση κ.λπ.) και πρέπει να τα μετατρέψετε σε ψηφιακή τιμή.
  • Σειριακή περιφερειακή διεπαφή (SPI). Ο δίαυλος SPI χρησιμοποιείται για επικοινωνία με άλλες συσκευές με δυνατότητα SPI, όπως εξωτερικές μνήμες, προγράμματα οδήγησης LED, εξωτερικά ADC, κ.λπ. Μέρη του SPI χρησιμοποιούνται για προγραμματισμό ISP, ή τουλάχιστον οι ακίδες είναι, οπότε προσέξτε όταν το κλείσετε εάν προγραμματίζετε μέσω ISP.
  • Διασύνδεση δύο καλωδίων. Ορισμένες εξωτερικές συσκευές χρησιμοποιούν το δίαυλο I2C για επικοινωνία, αν και αυτές αντικαθίστανται γρήγορα από συσκευές με δυνατότητα SPI, καθώς το SPI έχει μεγαλύτερη απόδοση.
  • USART. Αυτή είναι η σειριακή σας διεπαφή. Πιθανότατα δεν θέλετε να το απενεργοποιήσετε εάν είστε συνδεδεμένοι στο AVR μέσω της σειριακής σύνδεσης! Ωστόσο, το πρόσθεσα εδώ ως σκελετό για τη μεταφορά σε συσκευές που έχουν πολλαπλά USART όπως το ATmega162 ή το ATmega644P.
  • όλα. Αυτό το όρισμα στην εντολή powerup ή powerdown ενεργοποιεί όλα τα περιφερειακά που αναφέρονται ή τα απενεργοποιεί όλα με μία εντολή. Και πάλι, χρησιμοποιήστε αυτήν την εντολή με σύνεση.

root@ATmega328p> powerdown twiPowerdown of twi complete.root@ATmega328p> powerup twiPowerup του twi ολοκληρωμένο.

Έναρξη και διακοπή χρονοδιακόπτη Το κέλυφος διαθέτει ενσωματωμένο χρονοδιακόπτη 16 bit που είναι διαθέσιμο για χρήση. Ξεκινάτε το χρονόμετρο με την εντολή χρονοδιακόπτη:

έναρξη χρονοδιακόπτηκαι σταματήστε το χρονόμετρο με το όρισμα διακοπής

χρονόμετρο διακοπήΑυτός ο χρονοδιακόπτης δεν θα έρθει σε αντίθεση με τον εσωτερικό χρονοδιακόπτη USART. Ανατρέξτε στον κώδικα για τις λεπτομέρειες εφαρμογής του χρονοδιακόπτη USART, αν σας ενδιαφέρουν αυτές οι λεπτομέρειες

root@ATmega328p> εκκίνηση χρονοδιακόπτη Ξεκίνησε timer.root@ATmega328p> χρονόμετρο διακοπή Χρόνος που παρέμεινε: ~ 157 δευτερόλεπτα Έλεγχος ταυτότητας Το κέλυφος μπορεί να αποθηκεύσει έναν κωδικό πρόσβασης 8 χαρακτήρων στο EEPROM. Αυτός ο μηχανισμός κωδικού πρόσβασης δημιουργήθηκε για να υποστηρίζει τις δυνατότητες σύνδεσης στο telnet, αλλά θα μπορούσε να επεκταθεί για να προστατεύσει άλλα πράγματα. Για παράδειγμα, μπορεί να απαιτήσετε ορισμένες εντολές, όπως αλλαγή τιμών καταχωρητή, μέσω του μηχανισμού ελέγχου ταυτότητας. Ορίστε τον κωδικό πρόσβασης με την εντολή κωδικού πρόσβασης

root@ATmega328p> passwd blahΈγραψε κωδικό πρόσβασης ρίζας στο EEPROMΕξουσιοδοτήστε έναν κωδικό πρόσβασης (ή απαιτήστε εξουσιοδότηση μέσω προγραμματισμού μέσω του κώδικα) με την εντολή author. Σημειώστε ότι εάν προσπαθήσετε να αλλάξετε τον κωδικό πρόσβασης ρίζας και υπάρχει ήδη ένας κωδικός πρόσβασης ρίζας, πρέπει να εξουσιοδοτηθείτε από τον παλιό κωδικό πρόσβασης προτού σας επιτραπεί να τον αλλάξετε σε νέο κωδικό πρόσβασης

root@ATmega328p> passwd blinky Πρέπει πρώτα να εξουσιοδοτήσετε τον εαυτό σας.root@ATmega328p> auth blahAuthorized.root@ATmega328p> passwd blinkyΓράψτε νέο κωδικό πρόσβασης ρίζας στο EEPROMΦυσικά, θα χρειαστεί να φορτώσετε το αρχείο avrsh.eep εάν διαγράψετε το υλικολογισμικό για να αποκατασταθούν οι παλιές τιμές και οι μεταβλητές σας. Το Makefile θα δημιουργήσει το αρχείο EEPROM για εσάς. Μεταβλητές Το κέλυφος κατανοεί την έννοια των μεταβλητών που ορίζονται από το χρήστη. Ο κώδικας το περιορίζει σε 20, αλλά μπορείτε να το αλλάξετε αν θέλετε αλλάζοντας τον ορισμό MAX_VARIABLES στο script.h. Μπορείτε να αποθηκεύσετε οποιαδήποτε τιμή 16-bit (δηλαδή οποιονδήποτε αριθμό έως 65, 536) σε μια μεταβλητή που θα ανακληθεί αργότερα. Η σύνταξη είναι παρόμοια με τους καταχωρητές, εκτός εάν ένα σύμβολο δολαρίου ($) χρησιμοποιείται για να δηλώσει μεταβλητές στο κέλυφος. Καταχωρίστε όλες τις μεταβλητές σας με την εντολή μεταβλητές εκτύπωσης

μεταβλητές εκτύπωσης Μεταβλητές καθορισμένες από το χρήστη: Όνομα ευρετηρίου -> Αξία (01): $ ΔΩΡΕΑΝ $ -> 0 (02): $ ΔΩΡΕΑΝ $ -> 0 (03): $ ΔΩΡΕΑΝ $ -> 0 (04): $ ΔΩΡΕΑΝ $ -> 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): $ ΔΩΡΕΑΝ $ -> 0Ολοκληρώθηκε. Ορίστε μια μεταβλητή

$ newvar = 25 $ timeout = 23245Λάβετε την τιμή μιας δεδομένης μεταβλητής

root@ATmega328p> echo $ newvar $ newvar 25Μπορείτε να δείτε ποιες μεταβλητές έχετε ενεργοποιήσει αυτήν τη στιγμή με την εντολή εκτύπωσης που γνωρίζετε ήδη

Μεταβλητές που καθορίζονται από τον χρήστη: Όνομα ευρετηρίου -> Αξία (01): newvar -> 25 (02): χρονικό όριο -> 23245 (03): $ ΔΩΡΕΑΝ $ -> 0 (04): $ ΔΩΡΕΑΝ $ -> 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): $ ΔΩΡΕΑΝ $ -> 0Ολοκληρώθηκε. Το όνομα ΔΩΡΕΑΝ $ $ υποδηλώνει απλώς ότι η θέση της μεταβλητής είναι δωρεάν και δεν έχει εκχωρηθεί ακόμη όνομα μεταβλητής.

Βήμα 5: Προσαρμογή του κελύφους

Προσαρμογή του κελύφους
Προσαρμογή του κελύφους

Είστε ελεύθεροι να παραβιάσετε τον κώδικα και να τον προσαρμόσετε στις δικές σας ανάγκες, αν θέλετε. Αν ήξερα ότι θα έβγαζα αυτόν τον κώδικα, θα είχα κάνει μια ξεχωριστή κλάση διερμηνέα εντολών και δομή εντολών και απλώς θα επαναλάμβανα μέσω αυτού του καλούντος δείκτη συνάρτησης. Θα μειώσει τον αριθμό του κώδικα, αλλά ως έχει το κέλυφος αναλύει τη γραμμή εντολών και καλεί την κατάλληλη μέθοδο κελύφους. Για να προσθέσετε τις δικές σας προσαρμοσμένες εντολές, κάντε τα εξής: 1. Προσθέστε την εντολή σας στη λίστα ανάλυσης Ο αναλυτής εντολών θα αναλύστε τη γραμμή εντολών και δώστε ξεχωριστά την εντολή και τυχόν ορίσματα. Τα ορίσματα μεταβιβάζονται ως δείκτες σε δείκτες, ή μια σειρά από δείκτες, όπως σας αρέσει να εργάζεστε μαζί τους. Αυτό βρίσκεται στο shell.cpp. Ανοίξτε το shell.cpp και βρείτε τη μέθοδο ExecCmd της κλάσης AVRShell. Μπορεί να θέλετε να προσθέσετε την εντολή στη μνήμη του προγράμματος. Αν το κάνετε, προσθέστε την εντολή στα progmem.h και progmem.cpp. Μπορείτε να προσθέσετε την εντολή στη μνήμη προγράμματος απευθείας χρησιμοποιώντας τη μακροεντολή PSTR (), αλλά θα δημιουργήσετε μια άλλη προειδοποίηση για τον τύπο που αναφέρθηκε προηγουμένως. Και πάλι, αυτό είναι ένα γνωστό σφάλμα που λειτουργεί με C ++, αλλά μπορείτε να το ξεπεράσετε προσθέτοντας την εντολή απευθείας στα αρχεία.*, Όπως έχω κάνει. Εάν δεν σας πειράζει να προσθέσετε στη χρήση του SRAM, μπορείτε να προσθέσετε την εντολή όπως έχω επεξηγήσει με την εντολή "ρολόι". Πείτε ότι θέλετε να προσθέσετε μια νέα εντολή που ονομάζεται "newcmd". Μεταβείτε στο AVRShell:: ExecCmd και βρείτε ένα βολικό μέρος για να εισαγάγετε τον ακόλουθο κώδικα:

αλλιώς εάν (! strcmp (c, "newcmd")) cmdNewCmd (args);Αυτό θα προσθέσει την εντολή σας και θα καλέσει τη μέθοδο cmdNewCmd που θα γράψετε στο επόμενο βήμα. 2. Γράψτε τον προσαρμοσμένο κωδικό εντολής σας Στο ίδιο αρχείο, προσθέστε τον προσαρμοσμένο κωδικό εντολής. Αυτός είναι ο ορισμός της μεθόδου. Θα εξακολουθείτε να θέλετε να προσθέσετε τη δήλωση στο shell.h. Προσθέστε το στις άλλες εντολές. Στο προηγούμενο παράδειγμα, ο κώδικας μπορεί να μοιάζει κάπως έτσι

voidAVRShell:: cmdNewCmd (char ** args) {sprintf_P (buff, PSTR ("Η εντολή σας είναι %s / r / n", args [0]); WriteRAM (buff);}Υπάρχουν πολλά πράγματα εδώ. Πρώτον, το "buff" είναι ένα buffer συστοιχίας 40 χαρακτήρων που παρέχεται στον κώδικα για χρήση σας. Χρησιμοποιούμε την έκδοση μνήμης προγράμματος του sprintf αφού το περνάμε με PSTR. Εάν θέλετε, μπορείτε να χρησιμοποιήσετε την κανονική έκδοση, αλλά βεβαιωθείτε ότι δεν περνάτε τη μορφή σε PSTR. Επίσης, τα ορίσματα βρίσκονται στον πίνακα args. Εάν πληκτρολογήσατε "newcmd arg1 arg2", μπορείτε να βρείτε αυτά τα ορίσματα με τους συντελεστές args [0] και args [1]. Μπορείτε να περάσετε έως και MAX_ARGS ορίσματα, όπως ορίζεται στον κώδικα. Μη διστάσετε να αλλάξετε αυτήν την τιμή κατά την επανασύνταξη, εάν χρειάζεστε πολλά άλλα ορίσματα ταυτόχρονα. Τα WriteLine και WriteRAM είναι καθολικές συναρτήσεις που επιστρέφουν τις μεθόδους του UART με το ίδιο όνομα. Το 2ο όρισμα αυτής της συνάρτησης είναι σιωπηρό. Εάν δεν περάσετε τίποτα, θα γραφτεί στη συνέχεια μια γραμμή εντολών. Εάν περάσετε ένα 0 ως το 2ο όρισμα, μια προτροπή δεν θα γραφτεί. Αυτό είναι χρήσιμο όταν θέλετε να γράψετε πολλές ξεχωριστές συμβολοσειρές στην έξοδο πριν επιστρέψει η γραμμή εντολών στο χρήστη. 3. Αφήστε το κέλυφος να εκτελέσει τον κώδικα εντολής Έχετε ήδη πει στον εκτελεστή κελύφους να εκτελέσει τη μέθοδο cmdNewCmd όταν ρυθμίζετε τη νέα εντολή, αλλά προσθέστε την στο αρχείο shell.h για να γίνει κατανοητή από το αντικείμενο κελύφους. Απλώς προσθέστε το κάτω από την τελευταία εντολή ή μπροστά από την πρώτη εντολή ή οπουδήποτε εκεί. Και αυτό είναι όλο. Επανασυγκολλήστε και ανεβάστε το υλικολογισμικό στο Arduino σας και η νέα σας εντολή είναι διαθέσιμη από το κέλυφος στη γραμμή εντολών.

Βήμα 6: Περίληψη

Θα πρέπει να γνωρίζετε πώς να εγκαταστήσετε και να συνδεθείτε στο AVR/Arduino και να λάβετε μια ζωντανή προτροπή στον τρέχοντα μικροελεγκτή σας. Γνωρίζετε πολλές εντολές που θα αντλούν δεδομένα χρόνου εκτέλεσης από το MCU ή θα ορίζουν τιμές στο MCU εν κινήσει. Έχετε επίσης δείξει πώς μπορείτε να προσθέσετε τον δικό σας προσαρμοσμένο κώδικα για να δημιουργήσετε τις δικές σας μοναδικές εντολές στο κέλυφος για να το προσαρμόσετε περαιτέρω για τις δικές σας ανάγκες. Μπορείτε ακόμη και να διώξετε τον διερμηνέα εντολών να περιέχει μόνο τις προσαρμοσμένες εντολές σας, αν αυτό ταιριάζει στις ανάγκες σας. Ελπίζω να σας άρεσε αυτό το διδακτικό και ότι το κέλυφος AVR μπορεί να είναι χρήσιμο για εσάς, είτε ως διερμηνέας εντολών σε πραγματικό χρόνο είτε ως διαδικασία εκμάθησης στην εφαρμογή του δικού σας. Όπως πάντα, ανυπομονώ για τυχόν σχόλια ή προτάσεις για το πώς μπορεί να βελτιωθεί αυτό το διδακτικό! Διασκεδάστε με το AVR σας!

Συνιστάται: