jeudi 7 mai 2015

ATTiny13 blink

Le but est de faire clignoter une LED avec un nombre réduit de composants, un environnement réduit et un programme simple... Dans ce cas-ci, le développement a lieu sur Ubuntu 14.04 mais cela devrait pouvoir se faire sur n'importe quel Linux, Windows,...

Arduino, c'est magique. Un peu trop magique... C'est quand même mieux de savoir ce que l'on fait et de s'approcher de la réalité des choses. Et donc, par exemple, d'utiliser un programmeur ISP (qui utilise un bus SPI...) pour programmer l'AVR directement plutôt que de passer par le bootloader installé dans l'Arduino. Au niveau du prix, quand on veut le faire soi-même, cela revient à peu près au même. Un clone de USBasp revient au même prix qu'une interface USB-série, quelque chose comme 2 euros. En plus, on n'est plus limité à l'ATMega368 (ou 168), on peut utiliser toute la gamme AVR, comme ici avec l'ATTiny13. On peut aussi se servir d'un Arduino comme programmateur avec ArduinoISP.



Il y a donc quelques fils à connecter : le 5 (ou 3?) volts (VCC), la terre (GND), les trois fils du SPI (MOSI, MISO, CLK) et le 'chip select' (c.-à-d. /RESET).

Le programme pour faire clignoter une LED, sans utiliser l'API Arduino (mais avr-libc), se réduit à
#include <avr/io.h>
#include <util/delay.h>

int main(void)
    {
    DDRB  |= _BV(PB3);
 
    for (;;)
        {
        _delay_ms(200);
        PORTB ^= _BV(PB3);
        }
    }
On programme le port3 en sortie et on joue sur le bit data correspondant pour faire clignoter la LED. (Notons que le compilateur va se plaindre que F_CPU n'est pas défini dans delay.h (il prend alors la valeur par défaut, 1 MHz); on pourrait ajouter un #define F_CPU 1000000UL avant l'include ou passer F_CPU au compilateur dans le Makefile)

Le Makefile, sans bell ni whistle, comprend 3 étapes : compiler avec avr-gcc, transformer le binaire obtenu en fichier texte (iHEX) et le téléverser avec avrdude. (On utilise les paquets gcc-avr, binutils-avr, avr-libc, avrdude; la plupart sont déjà requis par le paquet arduino)

blink.elf: blink.c
        avr-gcc  -std=c99 -Wall -Os -mmcu=attiny13 -o blink.elf blink.c

blink.hex: blink.elf
        avr-objcopy -j .text -j .data -O ihex blink.elf blink.hex

flash: blink.hex
        avrdude -c usbasp-clone -p t13 -U flash:w:blink.hex

Pour peu que l'ont ait créé un /etc/udev/rules.d/99-USBasp.rules avec

SUBSYSTEM=="usb", ATTR{product}=="USBasp", ATTR{idProduct}=="05dc", ATTRS{idVendor}=="16c0", MODE="0666"

dedans, on peut simplement faire
$ make flash
et obtenir une LED qui clignote sur PB3.



Une fois enlevé le cordon ombilical de programmation, il ne reste que l'alimentation, le microcontrôleur, une résistance de 10K entre /RESET et VCC, un condensateur de 100nF entre VCC et GND et une 'blinkenlight' entre PB3 et GND (dans ce cas-ci une LED et une résistance de 1K (c'est beaucoup mais selon AVR Programming, comme ça cela fonctionne aussi avec 12 volts).