lundi 6 juillet 2015

Digispark - ATTiny85

Digistump propose un petit gadget USB avec un AVR ATtiny85 directement relié au bus USB, le Digispark. Le micro-contrôleur se charge d'interpréter les signaux USB-1 (Étant OpenSource, on en trouve des clones).

Dans la même veine que l'article précédent, voici comment le programmer simplement.

Sur Ubuntu, il faut probablement les pré-requis suivants :
$ sudo apt-get install gcc-avr binutils-avr avr-libc
$ git clone https://github.com/micronucleus/micronucleus.git
$ ...
(en fait, je ne suis pas tout-à-fait sûr parce que j'ai aussi fait un 'apt-get install arduino'...)
Ensuite, le même petit programme 'C' :
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

int main(void)
    {
    DDRB  |= _BV(PB1);

    for (;;)
        {
        _delay_ms(1000);
        PORTB ^= _BV(PB1);
        }
    }
Il ne reste plus qu'à préparer le fichier .hex et le télécharger avec 'micronucleus' (micronucleus comporte deux parties : le firmware installé sur le chip en fin de FLASH (qui utilise V-USB) et la commande 'micronucleus' qui tourne sous Linux et utilise libusb).
$ avr-gcc  -mmcu=attiny85 -Os -o blink.elf blink.c
$ avr-objcopy -j .text -j .data -O ihex blink.elf blink.hex
$ micronucleus --run blink.hex
Il faut en fait lancer la commande 'micronucleus' puis introduire le bidule dans un port USB. Le flashage s'effectue et le programme commence à s'exécuter. La LED du Digispark (connectée à PB1) se met à clignoter (j'avais utilisé PB3 mais c'est probablement une mauvaise idée parce le port est utilisé pour communiquer sur l'USB). Notez que F_CPU est à 16 MHz. Cette vitesse est tirée de l'USB par le firmware micronucleus.

Le programme est compilé, par défaut, pour s'exécuter en début de FLASH. Le bootloader (firmware micronucleus) se situe en fin de FLASH; il s'exécute lors d'un 'power-on-reset', c'est lui qui flashe le programme au bon endroit et qui lui transfère l'exécution après cinq secondes. Il est conçu en sorte de ne pas s'écrire dessus, il n'y a donc aucun risque de 'briquer' le Digispark.

Maintenant, comment faire pour créer un firmware communiquant en USB? Soit partir de la documentation V-USB et/ou partir d'un firmware qui fonctionne comme Little Wire (ou une des nombreuses applications signalées sur le site de V-USB).