Arduino AT328p-pu et UsbAsp en C

Bonjour,

 

Je me suis demandé comment programmer directement un microcontroleur Atmel sans avoir à passer par Arduino et son bootloader. J’ai travaillé sur un AT328p-pu (vraiment celui qui se trouve sur un arduino)

Je me suis donc acheté sur ebay une petite clé usb asp pour rien avec frais de port offert. Autant dire qu’ils sont quand même balaise pour faire de l’électronique aussi peu chère…

Cette clé usb est basée sur http://www.fischl.de/usbasp/ où vous retrouverez le schéma de cablage.

En plus de cette clé vous aurez besoin de:

1x  ATMEGA328P-PU

1x  Crystal  16 MHz

2x 22pF

2x  10Kohm 1% 1/4W resistor (one for reset, one for input switch)

1x  300ohm 1% 1/4W resistor (limitation of current of LED)

1x  LED

1x  L7805CV   (+5Vdc regulator) pour l’alimentation en 5v

2x  100uF (Filter capacitor) pour l’alimentation en 5V

 

Au passage voici le pinout du microcontroleur

Pour la connection attention c’est compliqué… le MISO au MISO, le MOSI au MOSI, 5V au 5v, le GND au GND et le /RST au /RST…

 

Donc ensuite, sur votre ordinateur, sur votre os linux préféré, ici, archlinux (mais sa doit être similaire sur d’autres distributions)

Installez les applications qui vont bien

pacman -S avr-gcc avr-binutils avr-gdb avr-libc avrdude

Pour faciliter la suite vous pouvez installer « sudo »

pacman -S sudo

vous devrez modifier le fichier /etc/sudoers en décommentant %wheel ALL=(ALL) ALL

Voilà après ce sera plus simple. Donc ensuite, on va essayer avec un programme super simple blink de la led 13.

 

Voilà un exemple de code « blink.c »

#include <avr/io.h>
#include <util/delay.h>

enum {
 BLINK_DELAY_MS = 1000,
};

int main (void)
{
 /* set pin 5 of PORTB for output*/
 DDRB |= _BV(DDB5);

 while(1) {
  /* set pin 5 high to turn led on */
  PORTB |= _BV(PORTB5);
  _delay_ms(BLINK_DELAY_MS);

  /* set pin 5 low to turn led off */
  PORTB &= ~_BV(PORTB5);
  _delay_ms(BLINK_DELAY_MS);
 }

 return 0;
}

 

Pour compiler:

avr-gcc -mmcu=atmega328p -Wall -Os -o blink.elf blink.c

Ensuite:

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

Pour uploader:

avrdude -p m328p -c usbasp -e -U flash:w:blink.hex

Voici quelques commandes supplémentaires pour le fun:
pour dumper la flash

avrdude  -c usbasp -p m328p -U flash:r:blinkdump.hex:i

pour dumper l’eeprom:

avrdude  -c usbasp -p m328p -U eeprom:r:eedump.hex:i

lire les fusibles:

avrdude  -c usbasp -p m328p -U lfuse:r:-:h -U hfuse:r:-:h

Au passage un lien pour calculer les fusibles

http://www.engbedded.com/fusecalc/

 

Maintenant que le microcontroleur est programmé il faut vérifier si notre programme fonctionne.

Pour mettez en place un oscillateur et une led comme suit:

 

Puis il n’y a plus qu’à  alimenter votre microcontroleur +5v et GND. Et voilà!!!

 

Maintenant vous pouvez développer vos propres applications en C, dumper, uploader,…

 

So enjoy!