Γράψτε ένα πρόγραμμα εκκίνησης OTA για το ATmega128RFA1 (ως μέρος της συσκευής Smart Response XE)

Γράψτε ένα πρόγραμμα εκκίνησης OTA για το ATmega128RFA1 (ως μέρος της συσκευής Smart Response XE)

Όλα ξεκίνησαν όταν ο συγγραφέας αγόρασε μια ενδιαφέρουσα συσκευή στη δευτερογενή αγορά - Smart Response XE (Σύντομη περιγραφή). Προορίζεται για σχολεία: κάθε μαθητής της τάξης λαμβάνει μια συσκευή παρόμοια με ένα ηλεκτρονικό σημειωματάριο ή έναν μεταφραστή της δεκαετίας του '802.15.4, ο δάσκαλος κάνει μια ερώτηση και οι μαθητές πληκτρολογούν τις απαντήσεις στα πληκτρολόγια των συσκευών, οι οποίες λαμβάνονται μέσω ραδιοφωνικό κανάλι (XNUMX) σε δέκτη συνδεδεμένο στον Η/Υ του δασκάλου.

Αυτές οι συσκευές διακόπηκαν πριν από αρκετά χρόνια, και όσα σχολεία αγόρασαν για $100-$200 το καθένα εμφανίζονται τώρα στο eBay για $10 ή λιγότερο. Το υλικό εκεί είναι πολύ κατάλληλο για geeky πειράματα:

  • Πληκτρολόγιο 60 πλήκτρων
  • οθόνη με ανάλυση 384×136, 2 bit ανά pixel - παρόμοια με BC, CGA, αλλά 4 όχι χρώματα, αλλά διαβαθμίσεις φωτεινότητας
  • μικροελεγκτής ATmega128RFA1 (μνήμη flash 128 kB, ROM 4 kB, RAM 16 kB, πομποδέκτης 802.15.4)
  • εξωτερική (σε σχέση με τον μικροελεγκτή, όχι ολόκληρη τη συσκευή) μνήμη flash 1 megabit (128 kilobyte) με διασύνδεση SPI
  • θήκη για 4 στοιχεία ΑΑΑ.

Από το όνομα του μικροελεγκτή είναι ξεκάθαρο ότι ανήκει στην οικογένεια AVR, πράγμα που σημαίνει ότι η συμβατότητα της συσκευής με Arduino είναι κάτι παραπάνω από ασήμαντο έργο...

Από τις ειδήσεις και μετά Hackaday ο συγγραφέας ανακάλυψε τι είναι έχουν ήδη κάνει (ο ίδιος σύνδεσμος σας λέει τι να συνδέσετε πού), έχοντας την ευκαιρία να τρέξετε παιχνίδια για το Arduboy:


Αλλά ο συγγραφέας ενδιαφέρεται περισσότερο για την ευκαιρία να μην παίξει στη συσκευή, αλλά να μελετήσει:

  • μνήμη flash με σειριακή διεπαφή SPI
  • bootloaders για AVR
  • πρότυπο 802.15.4

Ο συγγραφέας ξεκίνησε γράφοντας βιβλιοθήκη (GPL v3), το οποίο σας επιτρέπει να αρχικοποιήσετε την οθόνη, να εξάγετε κείμενο και ορθογώνια και να αποκτήσετε πρόσβαση στη μνήμη flash SPI. Στη συνέχεια άρχισε να σκέφτεται ιδέες για πρακτική χρήση της συσκευής: ένα τερματικό τσέπης συμβατό με VT-100, παιχνίδια για πολλούς παίκτες. Έχοντας ξαναχτίσει τρεις συσκευές, αποφάσισε να τους «διδάξει» να λαμβάνουν σκίτσα «over the air». Τι θα ήταν όχι μόνο ενδιαφέρον, αλλά και πολύ βολικό: η θήκη της συσκευής είναι δύσκολο να ανοίξει κάθε φορά και κάτω από το κάλυμμα της θήκης της μπαταρίας υπάρχουν μόνο τρύπες που σας επιτρέπουν να συνδέσετε έναν προγραμματιστή JTAG στην πλακέτα.

Γράψτε ένα πρόγραμμα εκκίνησης OTA για το ATmega128RFA1 (ως μέρος της συσκευής Smart Response XE)

Αυτό αρκεί για να ανεβάσετε τον bootloader του Arduino, αλλά όχι το σκίτσο - η σειριακή θύρα δεν είναι συνδεδεμένη εκεί, επομένως δεν μπορείτε να κάνετε χωρίς να ανοίξετε τη θήκη. Επίσης, οι γραμμές TX0 και RX0 της πρώτης σειριακής θύρας συνδυάζονται με τις γραμμές ψηφοφορίας της μήτρας του πληκτρολογίου, δηλαδή αυτές που μετρούν τα πλήκτρα λειτουργιών στα πλάγια της οθόνης. Αλλά τι μπορείτε να κάνετε - ο συγγραφέας δημιούργησε αυτό:

Γράψτε ένα πρόγραμμα εκκίνησης OTA για το ATmega128RFA1 (ως μέρος της συσκευής Smart Response XE)

Έφερε τις γραμμές JTAG εκεί και τώρα δεν χρειάζεται να ανοίξετε τη θήκη της μπαταρίας. Και για να μπορούν να ανεβαίνουν σκίτσα, συνέδεσα και τις δύο σειριακές θύρες στον ίδιο σύνδεσμο, προσθέτοντας επίσης διακόπτη, γιατί με τις μπαταρίες τοποθετημένες, είναι φυσικά αδύνατο να απενεργοποιηθεί η συσκευή με οποιονδήποτε άλλο τρόπο.

Χρειάστηκε αρκετός χρόνος για να δουλέψετε με ένα κολλητήρι, ένα βοηθητικό μαχαίρι και ένα πιστόλι κόλλας. Γενικά, η μεταφόρτωση σκίτσων "over the air" είναι πολύ πιο βολική· πρέπει επειγόντως να εφεύρουμε κάτι για αυτό.

Το Arduino IDE χρησιμοποιεί το πρόγραμμα για να ανεβάσει σκίτσα αβκντίδ. Αλληλεπιδρά με τον μικροελεγκτή χρησιμοποιώντας το πρωτόκολλο STK500, το οποίο σας επιτρέπει να μεταφέρετε αρχεία και προς τις δύο κατευθύνσεις. Είναι ελάχιστα συμβατό με κανάλια όπου είναι πιθανές μεταβλητές καθυστερήσεις, παραμόρφωση και απώλεια δεδομένων. Αν κάτι ξεκολλήσει ή θροίσει στο σειριακό κανάλι, μπορείς να τρελαθείς να ψάχνεις την αιτία. Κάποτε ο συγγραφέας υπέφερε για μισή μέρα μέχρι που συνειδητοποίησε ότι το πρόβλημα ήταν ένα κακό καλώδιο, καθώς και ένας ιδιότροπος μετατροπέας διασύνδεσης CP2102. Ακόμη και ένας μικροελεγκτής με ενσωματωμένο μετατροπέα διασύνδεσης, για παράδειγμα, ATmega32u4, μπορεί μερικές φορές να λειτουργήσει έτσι. Κάθε χρήστης του Arduino έχει παρατηρήσει ότι τα σφάλματα κατά τη μεταφόρτωση σκίτσων δεν είναι τόσο σπάνια. Μερικές φορές η εγγραφή πηγαίνει καλά, αλλά κατά τη διάρκεια μιας δοκιμής ανάγνωσης εντοπίζεται ένα σφάλμα. Αυτό δεν σημαίνει ότι υπήρξε σφάλμα κατά τη γραφή - υπήρξε αποτυχία κατά την ανάγνωση. Τώρα φανταστείτε ότι όταν εργάζεστε "over the air" θα συμβεί το ίδιο, αλλά πολύ πιο συχνά.

Αφού δοκίμασε διάφορους τρόπους για να ξεπεράσει αυτό το πρόβλημα, ο συγγραφέας κατέληξε στο εξής. Η συσκευή διαθέτει μνήμη flash 128 KB με διασύνδεση SPI - λαμβάνουμε δεδομένα μέσω των καλωδίων (θυμηθείτε ότι ο συγγραφέας έχει ήδη μία συσκευή με υποδοχή στο πλάι), χρησιμοποιούμε αυτήν τη μνήμη ως buffer και στέλνουμε τα δεδομένα μέσω του ασύρματου κανάλι σε άλλη συσκευή. Γεια σας από το Cybiko.

Μετά την εγγραφή του κώδικα για εργασία με το ραδιοφωνικό κανάλι, καθώς και της γραμματοσειράς, ο φορτωτής έγινε μεγαλύτερος από 4 kilobyte. Επομένως, η τιμή HFUSE έπρεπε να αλλάξει από 0xDA σε 0xD8. Τώρα ο bootloader μπορεί να έχει μήκος έως και 8 kilobyte και η αρχική διεύθυνση είναι τώρα 0x1E000. Αυτό αντικατοπτρίζεται στο Makefile, αλλά θα πρέπει επίσης να λαμβάνεται υπόψη κατά τη συμπλήρωση φορτωτής εκκίνησης μέσω avrdude.

Ο πομποδέκτης 802.15.4 στο ATmega128RFA1 έχει σχεδιαστεί αρχικά για να λειτουργεί χρησιμοποιώντας το πρωτόκολλο ZigBee, το οποίο είναι αρκετά περίπλοκο, έτσι ο συγγραφέας αποφάσισε να μεταδώσει απλώς πακέτα. Αυτό υλοποιείται σε υλικό στο ATmega128RFA1, επομένως απαιτείται μικρός κώδικας. Επίσης, για λόγους απλότητας, ο συγγραφέας αποφάσισε να χρησιμοποιήσει ένα σταθερό κανάλι, χωρίς να σας επιτρέπει να το επιλέξετε ούτε χειροκίνητα. Το πρότυπο 802.15.4 υποστηρίζει 16 κανάλια με αριθμούς από το 11 έως το 26. Έχουν πολύ κόσμο, μερικά επικαλύπτουν επίσης κανάλια WiFi (το κόκκινο είναι τα κανάλια ZigBee, το μπλε, το πράσινο και το κίτρινο είναι το WiFi).

Γράψτε ένα πρόγραμμα εκκίνησης OTA για το ATmega128RFA1 (ως μέρος της συσκευής Smart Response XE)

Αποδείχθηκε ότι τα κανάλια 15 και 26 είναι λιγότερο επιρρεπή σε παρεμβολές από WiFi. Ο συγγραφέας επέλεξε το δεύτερο από αυτά. Αποποίηση ευθύνης: ο μεταφραστής δεν γνωρίζει εάν επιτρέπεται να απλοποιήσει το ZigBee με αυτόν τον τρόπο. Μήπως θα έπρεπε να κάνουμε λίγο παραπάνω προγραμματισμό και να τον εφαρμόσουμε πλήρως;

Στην πρώτη συσκευή, είναι απαραίτητο να εφαρμοστεί μια μηχανή πεπερασμένης κατάστασης που μεταδίδει δεδομένα μέσω του πρωτοκόλλου STK500. Ως επί το πλείστον, τα μηνύματα που μεταδίδονται και λαμβάνονται είναι αυτάρκη, αλλά ορισμένα συνδέονται με αυτά που πέρασαν από το κανάλι νωρίτερα. Δίνεται περιγραφή του διαλόγου εδώ.

Ένα σημαντικό στοιχείο αυτού του διαλόγου είναι η μετάδοση πακέτων που προορίζονται να εγγραφούν στη μνήμη flash της συσκευής προορισμού. Για απλούς μικροελεγκτές της οικογένειας AVR, το μέγεθος σελίδας είναι 128 byte, αλλά για το ATmega128RFA1 είναι 256. Και για τη μνήμη flash που συνδέεται μέσω του πρωτοκόλλου SPI, είναι το ίδιο. Το πρόγραμμα στην πρώτη συσκευή, όταν ανεβάζει ένα σκίτσο, δεν το μεταφέρει αμέσως στη δεύτερη, αλλά το γράφει σε αυτή τη μνήμη. Όταν το Arduino IDE ελέγχει την ορθότητα της καταχώρησης, αποστέλλεται ό,τι γράφτηκε εκεί. Τώρα πρέπει να μεταδώσουμε τα ληφθέντα δεδομένα μέσω ραδιοφωνικού καναλιού στη δεύτερη συσκευή. Ταυτόχρονα, η εναλλαγή από τη λήψη σε μετάδοση και επιστροφή συμβαίνει αρκετά συχνά. Το πρωτόκολλο STK500 αδιαφορεί για τις καθυστερήσεις, αλλά δεν ανέχεται την απώλεια δεδομένων (περίεργο, αλλά ειπώθηκε παραπάνω ότι οι καθυστερήσεις επηρεάζουν και τη μεταφορά δεδομένων). Και οι απώλειες κατά την ασύρματη μετάδοση είναι αναπόφευκτες. Το ATmega128RFA1 έχει ενσωματωμένη εφαρμογή υλικού επαναλαμβανόμενων αιτημάτων όταν υπάρχουν αμφιβολίες για την ορθότητα της μεταφοράς, αλλά ο συγγραφέας αποφάσισε να εφαρμόσει το ίδιο σε λογισμικό. Ανέπτυξε ένα πρωτόκολλο στο οποίο ρέουν πολύ περισσότερα δεδομένα με έναν τρόπο από τον άλλο.

Δεν είναι τέλειο, αλλά λειτουργεί. Η σελίδα των 256 byte χωρίζεται σε τέσσερα τμήματα, καθένα από τα οποία μεταδίδεται μέσω του αέρα ως πακέτο. Ένα πακέτο μπορεί να χωρέσει έως και 125 byte δεδομένων συν ένα byte για το μήκος και δύο byte για το CRC. Έτσι, θραύσματα μήκους 64 byte μαζί με αριθμούς σελίδων και τμημάτων (από το 0 έως το 3) τοποθετούνται εκεί. Η συσκευή λήψης έχει μια μεταβλητή που της επιτρέπει να παρακολουθεί πόσα τμήματα έχουν ληφθεί και όταν φτάσουν και τα τέσσερα, η συσκευή αποστολής λαμβάνει επιβεβαίωση ότι έχει ληφθεί ολόκληρη η σελίδα. Καμία επιβεβαίωση (το CRC δεν ταιριάζει) - στείλτε ξανά ολόκληρη τη σελίδα. Η ταχύτητα είναι ακόμη μεγαλύτερη από ό,τι κατά τη μετάδοση μέσω καλωδίου. Βλέπω:


Αλλά γενικά, θα ήταν απαραίτητο να παρέχεται ένας βολικός τρόπος σύνδεσης του καλωδίου στις συσκευές για τη μεταφόρτωση σκίτσων και μέσω αυτού. Για παράδειγμα, τοποθετήστε μέσα σε έναν τέτοιο μετατροπέα διασύνδεσης στο CP2102, όπως στη φωτογραφία, και κολλήστε τον στην πλακέτα ώστε να μπορεί να αντέξει τη δύναμη κατά τη σύνδεση και την αποσύνδεση του καλωδίου Micro USB.

Γράψτε ένα πρόγραμμα εκκίνησης OTA για το ATmega128RFA1 (ως μέρος της συσκευής Smart Response XE)

Διαθέτει επίσης σταθεροποιητή 3,3 volt (και πώς να τον χρησιμοποιήσετε σε συσκευή με τροφοδοτικό 6 volt - αν έχει μόνο τον ίδιο σταθεροποιητή και μπορείτε να προσθέσετε δύο διόδους για να επιλέξετε αυτόματα ποια από αυτές θα τροφοδοτήσει τη συσκευή) . Και οι τρεις λυχνίες LED πρέπει να αποκολληθούν από την πλακέτα μετατροπέα διασύνδεσης, διαφορετικά θα φορτώσουν επιπλέον τις μπαταρίες όταν τις λειτουργούν και επίσης θα παρεμποδίσουν την τηλεπαραλαβή του πληκτρολογίου και θα λειτουργήσουν με μνήμη flash με διασύνδεση SPI.

Η επιδίωξη ενός στόχου αποδείχθηκε ακόμη πιο ενδιαφέρουσα από την επίτευξή του (και δεν χρειάζεται αυτό το αστείο για το λεωφορείο). Ο συγγραφέας έμαθε πολλά για τους φορτωτές εκκίνησης AVR, τη μνήμη flash SPI, το πρωτόκολλο STK500 και το πρότυπο 802.15.4.

Όλος ο άλλος κώδικας εκτός από τη βιβλιοθήκη που περιγράφεται παραπάνω είναι − εδώ, και είναι επίσης υπό την έκδοση GPL v3. Twitter του συγγραφέα - εδώ.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο