Wir schreiben einen OTA-Bootloader für ATmega128RFA1 (als Teil des Smart Response XE-Geräts).

Wir schreiben einen OTA-Bootloader für ATmega128RFA1 (als Teil des Smart Response XE-Geräts).

Alles begann damit, dass der Autor ein interessantes Gerät auf dem Sekundärmarkt kaufte – Smart Response XE (Kurzbeschreibung). Es ist für Schulen gedacht: Jeder Schüler der Klasse erhält ein Gerät ähnlich einem elektronischen Notizbuch oder einem Übersetzer aus den Neunzigerjahren, der Lehrer stellt eine Frage, und die Schüler tippen die Antworten auf den Tastaturen der Geräte ein, die über a empfangen werden Funkkanal (802.15.4) an einen Empfänger, der an den PC des Lehrers angeschlossen ist.

Diese Geräte wurden vor einigen Jahren eingestellt, und was Schulen für jeweils 100 bis 200 US-Dollar gekauft haben, ist jetzt bei eBay für 10 US-Dollar oder weniger erhältlich. Die dortige Hardware eignet sich sehr gut für geekige Experimente:

  • Tastatur mit 60 Tasten
  • Anzeige mit einer Auflösung von 384×136, 2 Bit pro Pixel – ähnlich wie BC, CGA, aber 4 nicht Farben, sondern Helligkeitsabstufungen
  • Mikrocontroller ATmega128RFA1 (128 kB Flash-Speicher, 4 kB ROM, 16 kB RAM, 802.15.4 Transceiver)
  • Externer (bezogen auf den Mikrocontroller, nicht das gesamte Gerät) 1 Megabit (128 Kilobyte) Flash-Speicher mit SPI-Schnittstelle
  • Fach für 4 AAA-Elemente.

Aus dem Namen des Mikrocontrollers geht hervor, dass er zur AVR-Familie gehört, was bedeutet, dass es eine mehr als triviale Aufgabe ist, das Gerät Arduino-kompatibel zu machen ...

Von den Nachrichten an Hackaday Der Autor hat herausgefunden, was es ist bereits erledigt (Derselbe Link sagt Ihnen, was Sie wo verbinden müssen), mit der Möglichkeit, Spiele für Arduboy auszuführen:


Aber dem Autor geht es mehr um die Möglichkeit, nicht auf dem Gerät zu spielen, sondern zu lernen:

  • Flash-Speicher mit serieller SPI-Schnittstelle
  • Bootloader für AVR
  • Standard 802.15.4

Der Autor begann mit dem Schreiben Bibliothek (GPL v3), mit dem Sie die Anzeige initialisieren, Text und Rechtecke ausgeben und auf den SPI-Flash-Speicher zugreifen können. Dann begann er, Ideen für den praktischen Einsatz des Geräts zu entwickeln: ein VT-100-kompatibles Taschenterminal, Multiplayer-Spiele. Nachdem er drei Geräte umgebaut hatte, beschloss er, ihnen beizubringen, Skizzen „über Funk“ zu empfangen. Was nicht nur interessant, sondern auch sehr praktisch wäre: Das Gehäuse des Geräts lässt sich jedes Mal nur schwer öffnen, und unter der Batteriefachabdeckung befinden sich lediglich Löcher, durch die man einen JTAG-Programmierer an die Platine anschließen kann.

Wir schreiben einen OTA-Bootloader für ATmega128RFA1 (als Teil des Smart Response XE-Geräts).

Dies reicht aus, um den Arduino-Bootloader hochzuladen, nicht jedoch die Skizze – der serielle Port ist dort nicht angeschlossen, sodass Sie immer noch nicht darauf verzichten können, das Gehäuse zu öffnen. Außerdem werden die TX0- und RX0-Leitungen des ersten seriellen Ports mit den Abfrageleitungen der Tastaturmatrix kombiniert, nämlich denen, die die Funktionstasten an den Seiten des Displays abfragen. Aber was kann man tun – der Autor hat Folgendes gebaut:

Wir schreiben einen OTA-Bootloader für ATmega128RFA1 (als Teil des Smart Response XE-Geräts).

Er hat die JTAG-Leitungen dorthin gebracht, und jetzt muss das Batteriefach nicht mehr geöffnet werden. Und damit Skizzen hochgeladen werden konnten, habe ich beide seriellen Schnittstellen an denselben Anschluss angeschlossen und zusätzlich einen Schalter hinzugefügt, da es bei eingelegten Batterien physikalisch unmöglich ist, das Gerät auf andere Weise auszuschalten.

Die Arbeit mit einem Lötkolben, einem Universalmesser und einer Klebepistole dauerte ziemlich lange. Im Allgemeinen ist das Hochladen von Skizzen „over the air“ viel bequemer, dafür müssen wir dringend etwas erfinden.

Arduino IDE nutzt das Programm zum Hochladen von Skizzen avrdude. Es interagiert über das Protokoll mit dem Mikrocontroller STK500, mit dem Sie Dateien in beide Richtungen übertragen können. Es ist schlecht kompatibel mit Kanälen, bei denen variable Verzögerungen, Verzerrungen und Datenverluste möglich sind. Wenn sich etwas löst oder im seriellen Kanal raschelt, kann man auf der Suche nach der Ursache wahnsinnig werden. Einmal litt der Autor einen halben Tag, bis ihm klar wurde, dass das Problem ein schlechtes Kabel sowie ein kapriziöser CP2102-Schnittstellenkonverter war. Sogar ein Mikrocontroller mit integriertem Schnittstellenkonverter, zum Beispiel ATmega32u4, kann sich manchmal so verhalten. Dass Fehler beim Hochladen von Skizzen gar nicht so selten sind, ist jedem Arduino-Nutzer aufgefallen. Manchmal läuft die Aufnahme gut, aber bei einer Testlesung wird ein Fehler festgestellt. Dies bedeutet nicht, dass beim Schreiben ein Fehler aufgetreten ist – beim Lesen ist ein Fehler aufgetreten. Stellen Sie sich nun vor, dass bei der Arbeit „über Funk“ das Gleiche passieren würde, allerdings viel häufiger.

Nachdem der Autor verschiedene Möglichkeiten zur Lösung dieses Problems ausprobiert hatte, kam er zu Folgendem. Das Gerät verfügt über einen 128-KB-Flash-Speicher mit SPI-Schnittstelle. Wir empfangen Daten über Kabel (denken Sie daran, dass der Autor bereits ein Gerät mit seitlichem Anschluss hat), verwenden diesen Speicher als Puffer und senden die Daten über Funk Kanal an ein anderes Gerät weiterleiten. Hallo von Cybiko.

Nach dem Schreiben des Codes für die Arbeit mit dem Funkkanal und der Schriftart wurde der Loader länger als 4 Kilobyte. Daher musste der HFUSE-Wert von 0xDA auf 0xD8 geändert werden. Jetzt kann der Bootloader bis zu 8 Kilobyte lang sein und die Startadresse ist jetzt 0x1E000. Dies spiegelt sich im Makefile wider, sollte aber auch beim Befüllen berücksichtigt werden Bootloader über avrdude.

Der 802.15.4-Transceiver im ATmega128RFA1 ist ursprünglich für den Betrieb mit diesem Protokoll konzipiert ZigBee, was ziemlich kompliziert ist, daher hat der Autor beschlossen, stattdessen nur Pakete zu übertragen. Dies ist im ATmega128RFA1 in Hardware implementiert, sodass nur wenig Code erforderlich ist. Der Einfachheit halber hat sich der Autor außerdem für die Verwendung eines festen Kanals entschieden, sodass Sie ihn nicht einmal manuell auswählen können. Der 802.15.4-Standard unterstützt 16 Kanäle mit Nummern von 11 bis 26. Sie sind ziemlich überfüllt, einige überschneiden sich auch mit WLAN-Kanälen (Rot sind ZigBee-Kanäle, Blau, Grün und Gelb sind WLAN).

Wir schreiben einen OTA-Bootloader für ATmega128RFA1 (als Teil des Smart Response XE-Geräts).

Es stellte sich heraus, dass die Kanäle 15 und 26 am wenigsten anfällig für Störungen durch WLAN sind. Der Autor wählte den zweiten von ihnen. Haftungsausschluss: Der Übersetzer weiß nicht, ob es erlaubt ist, ZigBee auf diese Weise zu vereinfachen. Vielleicht sollten wir etwas mehr programmieren und es komplett umsetzen?

Auf dem ersten Gerät muss eine Finite-State-Maschine implementiert werden, die Daten über das STK500-Protokoll überträgt. Die gesendeten und empfangenen Nachrichten sind größtenteils autark, einige sind jedoch an diejenigen gebunden, die zuvor über den Kanal gesendet wurden. Es wird eine Beschreibung des Dialogs gegeben hier.

Ein wichtiger Bestandteil dieses Dialogs ist die Übertragung von Paketen, die in den Flash-Speicher des Zielgeräts geschrieben werden sollen. Bei einfachen Mikrocontrollern der AVR-Familie beträgt die Seitengröße 128 Byte, beim ATmega128RFA1 sind es jedoch 256. Und beim Flash-Speicher, der über das SPI-Protokoll angebunden ist, ist es dasselbe. Das Programm im ersten Gerät überträgt beim Hochladen einer Skizze diese nicht sofort auf das zweite, sondern schreibt sie in diesen Speicher. Wenn die Arduino IDE die Richtigkeit des Eintrags überprüft, wird ihr übermittelt, was dort geschrieben wurde. Jetzt müssen wir die empfangenen Daten per Funk an das zweite Gerät übertragen. Gleichzeitig kommt es häufig zu einem Wechsel vom Empfangen zum Senden und zurück. Das STK500-Protokoll ist gegenüber Verzögerungen gleichgültig, toleriert jedoch keinen Datenverlust (seltsam, aber oben wurde gesagt, dass Verzögerungen auch die Datenübertragung beeinträchtigen). Und Verluste bei der drahtlosen Übertragung sind vorprogrammiert. Der ATmega128RFA1 verfügt über eine integrierte Hardware-Implementierung für wiederholte Anfragen, wenn Zweifel an der Richtigkeit der Übertragung bestehen. Der Autor hat sich jedoch entschieden, diese selbst in Software zu implementieren. Er entwickelte ein Protokoll, bei dem viel mehr Daten in die eine Richtung fließen als in die andere.

Es ist nicht perfekt, aber es funktioniert. Die 256-Byte-Seite ist in vier Segmente unterteilt, die jeweils als Paket über die Luft übertragen werden. Ein Paket kann bis zu 125 Byte Daten plus ein Byte für die Länge und zwei Byte für den CRC enthalten. Dort werden also 64 Byte lange Fragmente zusammen mit Seiten- und Segmentnummern (von 0 bis 3) abgelegt. Das empfangende Gerät verfügt über eine Variable, mit der es verfolgen kann, wie viele Segmente empfangen wurden. Wenn alle vier eintreffen, erhält das sendende Gerät eine Bestätigung, dass die gesamte Seite empfangen wurde. Keine Bestätigung (CRC stimmte nicht überein) – gesamte Seite erneut senden. Die Geschwindigkeit ist sogar höher als bei der Übertragung per Kabel. Sehen:


Im Allgemeinen wäre es jedoch notwendig, eine bequeme Möglichkeit bereitzustellen, das Kabel mit den Geräten zum Hochladen von Skizzen und darüber zu verbinden. Platzieren Sie beispielsweise einen solchen Schnittstellenkonverter wie auf dem Foto im Inneren des CP2102 und kleben Sie ihn so auf die Platine, dass er der Kraft beim An- und Abziehen des Micro-USB-Kabels standhält.

Wir schreiben einen OTA-Bootloader für ATmega128RFA1 (als Teil des Smart Response XE-Geräts).

Es verfügt außerdem über einen 3,3-Volt-Stabilisator (und wie man ihn in einem Gerät mit einer 6-Volt-Stromversorgung verwendet – wenn es nur über den gleichen Stabilisator verfügt und Sie zwei Dioden hinzufügen können, um automatisch auszuwählen, welche davon das Gerät mit Strom versorgt) . Alle drei LEDs müssen von der Schnittstellenkonverterplatine abgelötet werden, da sie sonst beim Betrieb zusätzlich die Batterien belasten, außerdem die Tastaturabfrage beeinträchtigen und mit Flash-Speichern mit SPI-Schnittstelle arbeiten.

Es stellte sich heraus, dass es noch interessanter war, ein Ziel zu verfolgen, als es zu erreichen (und diesen Witz über den Bus braucht es nicht). Der Autor hat viel über AVR-Bootloader, SPI-Flash-Speicher, das STK500-Protokoll und den 802.15.4-Standard gelernt.

Der gesamte andere Code zusätzlich zur oben beschriebenen Bibliothek ist − hier, und es steht auch unter GPL v3. Twitter des Autors - hier.

Source: habr.com

Kommentar hinzufügen