Programmer un atmel avec AVR Studio



Prerequis

  • Un programmateur pour atmel. tuto ici
  • AVR-GCC, make, avrdude installés sur la machine
  • AVR Studio : Télécharger
  • Savoir compiler en C

Pourquoi ?

Si vous achetez un atmel, qui ne coute qu'environ 3€, vous pouvez le programmer aussi bien qu'un arduino, et c'est plus facile à integrer dans un montage
Bien qu'il soit possible de transformer l'atmel en arduino pour pouvoir directement s'en servir avec la lib arduino,
C'est plus interessant de savoir directement travailler la puce au corps ;)
Comme nous avons déjà des arduinos, et que nous voulons garder la possibilité de coder sur l'arduino pour ensuite l'utiliser sur des puces atmel, nous avons crée une library avec toute les fonctions de base et nous n'utilisons plus les fonctions arduino.


Comment ?

Voici les étapes pour configurer un projet dans AVR Studio:
Choix du compilateur

Choix de la puce à programmer

Rajout de notre librarie (ici, le source)

Rajout de notre librarie (ici, le header)

Code de base d'un projet qui contient notre librairie


Programmation

Le principe general d'appel d'un port est le suivant:
Chaque patte de l'atmel fait parti d'un adressage 8 bits, donc 8 pattes sont regroupées en 1 port, par exemple DDRA pour le port A
Chaque port possède un registre d'entrée et un registre de sortie, en entrée c'est PINA, en sortie PORTA.
Il faut enfin sa position sur le port (de 0 à 8).
Comment trouver toute ces infos ? grâce au datasheet qui a du vous être fourni avec votre atmel ou trouvable sur le site d'atmel.
Exemple de datasheet pour un atmega16: datasheet

PinMode

Il fau d'abord initialiser le port de donnée (voir schema) METTRE SCHEMA ICI
DDRB = 0xFF;

DigitalRead

PORTB = 0xff; // Force le port a 1
DDRB = 0; // indique que le portB est en entrée (adapter le masque selon vos i/o)
valeur = PINB; // Lecture du portB
if((valeur & mask) == 0) // Recuperation de la valeur du pin grace a un & entre le masque et le port

DigitalWrite

PORTB &= ~(1<<PB0); // 1
PORTB |= 1<<PB0; // 0

AnalogWrite

TCCR0|=(1<<WGM00)|(1<<WGM01)|(1<<COM01)|(1<<CS00);
DDRB|=(1<<PB3);
OCR0=INT entre 0 et 255;

Delay

_delay_ms(INT); // delay en millisecondes
_delay_us( INT ); // delay en microsecondes

Conclusion

Grace a l'utilisation de la puce usb de l'arduino, on est capable de programmer des atmel sans cout supplementaire, il ne reste plus qu'a faire des circuits qui utilisent ces atmels ;)
Au boulot! :D