Todo comezou coa compra do autor dun dispositivo interesante no mercado secundario: Smart Response XE (
Estes dispositivos foron descontinuados hai varios anos, e o que as escolas compraron por $ 100- $ 200 cada unha aparece agora en eBay por $ 10 ou menos. O hardware alí é moi axeitado para experimentos geek:
- Teclado de 60 teclas
- pantalla cunha resolución de 384 × 136, 2 bits por píxel - similar a BC, CGA, pero 4 non cores, senón gradacións de brillo
- microcontrolador ATmega128RFA1 (128 kB de memoria flash, 4 kB de ROM, 16 kB de RAM, transceptor 802.15.4)
- externa (en relación ao microcontrolador, non ao dispositivo completo) memoria flash de 1 megabit (128 kilobytes) con interface SPI
- compartimento para 4 elementos AAA.
Polo nome do microcontrolador despréndese que pertence á familia AVR, o que significa que facer que o dispositivo sexa compatible con Arduino é unha tarefa máis que trivial...
A partir das noticias
Pero o autor está máis interesado na oportunidade de non xogar no dispositivo, senón de estudar:
- memoria flash con interface serial SPI
- cargadores de arranque para AVR
- norma 802.15.4
O autor comezou escribindo
Isto é suficiente para cargar o cargador de arranque de Arduino, pero non o bosquexo: o porto serie non está conectado alí, polo que aínda non podes prescindir de abrir o caso. Ademais, as liñas TX0 e RX0 do primeiro porto serie combínanse coas liñas de sondeo da matriz do teclado, é dicir, aquelas que consultan as teclas de función dos lados da pantalla. Pero que podes facer: o autor construíu isto:
Trouxo alí as liñas JTAG e agora non hai que abrir o compartimento da batería. E para que se puidesen subir bocetos, conectei os dous portos serie ao mesmo conector, engadindo tamén un interruptor, xa que coas baterías instaladas é fisicamente imposible apagar o dispositivo doutro xeito.
Levou bastante tempo traballar cun soldador, unha navalla e unha pistola de pegamento. En xeral, cargar bosquexos "polo aire" é moito máis conveniente; necesitamos urxentemente inventar algo para iso.
Arduino IDE usa o programa para cargar bosquexos
Despois de probar diferentes formas de superar este problema, o autor presentou o seguinte. O dispositivo ten unha memoria flash de 128 KB cunha interface SPI: recibimos datos polos cables (lembre que o autor xa ten un dispositivo cun conector lateral), usa esta memoria como búfer e enviamos os datos pola radio. canle a outro dispositivo. Saúdos de Cybiko.
Despois de escribir o código para traballar coa canle de radio, así como o tipo de letra, o cargador pasou a ter máis de 4 kilobytes. Polo tanto, o valor HFUSE tivo que cambiarse de 0xDA a 0xD8. Agora o cargador de arranque pode ter ata 8 kilobytes de lonxitude e o enderezo de inicio agora é 0x1E000. Isto reflíctese no Makefile, pero tamén se debe telo en conta ao encher
O transceptor 802.15.4 do ATmega128RFA1 foi deseñado orixinalmente para funcionar mediante o protocolo
Resultou que as canles 15 e 26 son as menos susceptibles a interferencias da WiFi.O autor escolleu a segunda delas. Descargo de responsabilidade: o tradutor non sabe se está permitido simplificar ZigBee deste xeito. Quizais deberíamos facer un pouco máis de programación e implementala completamente?
No primeiro dispositivo, é necesario implementar unha máquina de estados finitos que transmita datos a través do protocolo STK500. Na súa maior parte, as mensaxes transmitidas e recibidas son autosuficientes, pero algunhas están vinculadas ás que pasaron pola canle antes. Ofrécese descrición do diálogo
Un compoñente importante deste diálogo é a transmisión de paquetes destinados a ser escritos na memoria flash do dispositivo de destino. Para microcontroladores simples da familia AVR, o tamaño da páxina é de 128 bytes, pero para o ATmega128RFA1 é de 256. E para a memoria flash que está conectada a través do protocolo SPI, é o mesmo. O programa do primeiro dispositivo, ao cargar un bosquexo, non o transfire inmediatamente ao segundo, senón que o escribe nesta memoria. Cando o IDE de Arduino comproba a corrección da entrada, envíaselle o que alí estaba escrito. Agora necesitamos transmitir os datos recibidos a través da canle de radio ao segundo dispositivo. Ao mesmo tempo, o cambio de recepción a transmisión e de volta ocorre con bastante frecuencia. O protocolo STK500 é indiferente aos atrasos, pero non tolera a perda de datos (estraño, pero dicíase anteriormente que os atrasos tamén afectan á transferencia de datos). E as perdas durante a transmisión sen fíos son inevitables. O ATmega128RFA1 ten unha implementación de hardware incorporada de solicitudes repetidas cando hai dúbidas sobre a corrección da transferencia, pero o autor decidiu implementar o mesmo no software. Desenvolveu un protocolo no que flúen moito máis datos dun xeito que doutro.
Non é perfecto, pero funciona. A páxina de 256 bytes está dividida en catro segmentos, cada un dos cales se transmite polo aire como un paquete. Un paquete pode conter ata 125 bytes de datos máis un byte de lonxitude e dous bytes de CRC. Polo tanto, colócanse alí fragmentos de 64 bytes xunto cos números de páxina e segmento (de 0 a 3). O dispositivo receptor ten unha variable que lle permite rastrexar cantos segmentos se recibiron e, cando chegan os catro, o dispositivo emisor recibe a confirmación de que se recibiu toda a páxina. Sen confirmación (CRC non coincide) - reenvíe a páxina enteira. A velocidade é aínda maior que cando se transmite por cable. Ver:
Pero, en xeral, sería necesario proporcionar un xeito cómodo de conectar o cable aos dispositivos para cargar bosquexos e a través del. Por exemplo, colócase dentro dun conversor de interface deste tipo no CP2102, como na foto, e pégueo ao taboleiro para que poida soportar a forza ao conectar e desconectar o cable Micro USB.
Tamén ten un estabilizador de 3,3 voltios (e como usalo nun dispositivo cunha fonte de alimentación de 6 voltios - se só ten o mesmo estabilizador, e pode engadir dous díodos para seleccionar automaticamente cal deles alimentará o dispositivo) . Os tres LED deben estar dessoldados da tarxeta do conversor da interface, se non, cargarán adicionalmente as baterías ao operar neles, e tamén interferirán coa consulta do teclado e funcionarán coa memoria flash cunha interface SPI.
Perseguir un obxectivo resultou aínda máis interesante que conseguilo (e non fai falta esa broma sobre o autobús). O autor aprendeu moito sobre os cargadores de arranque AVR, a memoria flash SPI, o protocolo STK500 e o estándar 802.15.4.
Todo o outro código ademais da biblioteca descrita anteriormente é −
Fonte: www.habr.com