Alles begann damit, dass der Autor ein interessantes Gerät auf dem Sekundärmarkt kaufte – Smart Response XE (
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
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
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:
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
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
Der 802.15.4-Transceiver im ATmega128RFA1 ist ursprünglich für den Betrieb mit diesem Protokoll konzipiert
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
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.
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 −
Source: habr.com