====== AVR GCC - AVR-LIBC ====== ===== Commentaire ===== //Commentaire /*Commentaire*/ Sur plusieurs lignes : /* Commentaire sur plusieures lignes */ ===== Structure d'un programme ===== #include // Librairie utilisée par le programme int main (void) // Fonction principale { DDRB = 0xFF; //Met le port B en sortie PORTB = 0xFF; //Met le port B à l'état haut return 1; //Valeur de retour de la fonction } ===== Entrées Sorties ===== DDRx Impose la direction des ports.\\ DDRA=0xF0 ; les bits 0 à 3 du portA sont configurés en entrée et de 4 à 7 en sortie. PORTx Impose l’état logique des bits sur le port.\\ PORTA=0xF0 ; les bits 0 à 3 du portA passent à l’état bas et de 4 à 7 à l’état haut. PINx récupère l’état du port x.\\ z=PINA La valeur du port A est mise dans la variable z. [[winavr:Les entrées sorties|Voir l'exemple : Utiliser les entrées sorties]] ===== Temporisation ===== La librairie delay permet de créer des tempos facilement grâce à une boucle programme.\\ **Avantage** : Très facile à utiliser\\ **Inconvénient** : Pendant la tempo, le micro est bloqué dans sa boucle et ne peut rien faire d’autre. A Rajouter dans le programme pour utiliser les fonctions : #define F_CPU 1000000UL // 1 MHz #include void _delay_us (double __us) //double __us détermine le nombre de microsecondes void _delay_ms (double __ms) //double __ms détermine le nombre de millisecondes [[winavr:Temporisation avec delay.h|Voir l'exemple : Temporisation avec delay.h (Chenillard)]] ===== Les types de variables ===== ^ Type courant ^ Taille en bits ^ Valeur ^ | char | 8 | -128 à 127 | | unsigned char | 8 | 0 à 255 | | signed char | 8 | -128 à 127 | | int | 16 | -32768 à 32767 | | unsigned int | 16 | 0 à 65535 | | long int | 32 | -2147483648 à 2147483647 | | unsigned long int | 32 | 0 à 4294967295 | | float | 32 | 3.402e-38 à 3.402e38 | | double | 32 | 1.7e-308 à 1.7e308 | ==== stdint.h ==== L'intérêt de cette librairie est de pouvoir indiquer clairement la taille de la variable que l'on souhaite. === Librairie utilisée === #include ^ Variable stdint ^ équivalent ^ taille en bit ^ | int8_t | signed char | 8 | | uint8_t | unsigned char | 8 | | int16_t | signed int | 16 | | uint16_t | unsigned int | 16 | | int32_t | signed long int | 32 | | uint32_t | unsigned long int | 32 | | int64_t | signed long long int | 64 | | uint64_t | unsigned long long int | 64 | Quand vous utilisez une variable qui aura **au moins** une taille de //x_bit// vous pouvez déclarer votre variable en :\\ * **int_least**//x_bit//**_t** : Si vous souhaitez optimiser la taille prise par la variable. Utilisé pour les structures de données\\ * **int_fast**//x_bit//**_t** : Si vous souhaitez optimiser la vitesse. Utilisé pour les variables locales\\ ===== Les constantes ===== ==== Déclaration ==== #define PI 3.1415926 ==== Types ==== Décimales: pas de préfixe ex: 255 Hexadécimales: préfixe 0x ex: 0x0F Entieres non-signées : suffixe U ex:1000U Entieres longues : suffixe L ex: 99L Entieres non-signées et longues : suffixe UL ex: 99UL Caractères : entre apostrophes (') ex: 'a' ===== EEPROM ===== ==== Librairie utilisée ==== #include ==== Fonctions ==== eeprom_is_ready() Retourne 1 si l'EEPROM est prête sinon 0 Il est conseillé de désactiver les interruptions pendant les phases de lecture et d'écriture. uint8_t eeprom_read_byte (const uint8_t * addr) Lit un octet (8bits) à l'adresse //addr// void eeprom_write_byte (uint8_t * addr, uint8_t value) Ecrit un octet (8bits) //value// à l'adresse //addr// uint16_t eeprom_read_word (const uint16_t * addr) Lit un mot (16bits) à l'adresse //addr// void eeprom_write_word (uint16_t * addr, uint16_t value) Ecrit un mot (16bits) //value// à l'adresse //addr// [[winavr:L'EEPROM|Voir l'exemple : Utiliser l'EEPROM]] ===== Timer ===== ===== USART ===== ===== Interruption ===== ==== Librairie utilisée ==== #include ==== Fonctions ==== La fonction ISR() est executé lors de l'activation de l'interruption _vect_ ISR(_vect_) { // Votre code à exécuter lors de l'interruption } //_vect_// doit être remplacé par le nom attribué au vecteur d'interruption qui vous interresse. Les interruptions (bit I de SREG) sont désactivées lors de l'appel de la fonction ISR puis réactivés une fois la fonction exécutée. //Pour ceux qui utilisaient une ancienne version d'AVRlibC, SIGNAL et INTERRUPT sont maintenant remplacés par ISR et ne doivent plus être utilisés.// === Liste des vecteurs d'interruption === Voir [[http://download.savannah.gnu.org/releases/avr-libc/avr-libc-user-manual-1.4.4.pdf|Manuel d'AVR-LIBC v1.4.4]], chapitre //: Interrupts// page 127 ==== Interruption externe ==== [[winavr:Interruption externe|Voir l'exemple : Utiliser les Interruptions externes]] ===== Optimisez votre programme ===== ==== Code ==== === Variables === * Utilisez un type de variable approprié à son contenu. Ayez, par exemple, le reflexe registre 8bits -> variable sur 8bit -> type unsigned char ou uint8_t * Utilisez le plus souvent possible des variables non signées. Les multiplications et divisions par des puissances de 2 se font par un simple décalage à gauche ou à droite. * N'initialisez vos variables que si elles sont différentes de 0. * Déclarez vos variables globales avec le prefix //static// ==== Compilation ==== * Utilisez la directive de compilation -Os qui permettra de générer un code plus petit et donc plus rapide. ===== Documentation indispensable ===== * [[http://download.savannah.gnu.org/releases/avr-libc/avr-libc-user-manual-2.0.0.pdf.bz2|Manuel d'AVR-LIBC v2.0.0]]