| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| fr:examples:digi:led [2010/03/08 13:19] – sdeniaud | fr:examples:digi:led [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| ====== Diode électroluminescente ====== | ====== Diode électroluminescente ====== |
| |
| //Connaissances nécessaires: [HW] [[en:hardware:homelab:controller]], [HW] [[en:hardware:homelab:digi]], [ELC] [[en:electronics:led_resistor]], [AVR] [[en:avr:registers]], [AVR] [[en:avr:io]], [LIB] [[en:software:homelab:library:pin]]// | //Necessary knowledge: [HW] [[en:hardware:homelab:controller]], [HW] [[en:hardware:homelab:digi]], [ELC] [[en:electronics:led_resistor]], [AVR] [[en:avr:registers]], [AVR] [[en:avr:io]], [LIB] [[en:software:homelab:library:pin]]// |
| | |
| | //Connaissances nécessaires: [HW] [[fr:hardware:homelab:controller]], [HW] [[fr:hardware:homelab:digi]], [ELC] [[fr:electronics:led_resistor]], [AVR] [[fr:avr:registers]], [AVR] [[fr:avr:io]], [LIB] [[fr:software:homelab:library:pin]]// |
| |
| ===== Théorie ===== | ===== Théorie ===== |
| |
| [{{ :examples:digi:led:led_picture.jpg?150|LED avec pattes de 5 mm }}] | [{{ :examples:digi:led:led_picture.jpg?150|LED avec pattes de 5 mm }}] |
| |
| La diode électroluminescente est un semi-conducteur qui émet de la lumière lorsqu’on lui applique une tension. L’acronyme pour diode électroluminescente est DEL (LED en Anglais). Il existe différentes combinaisons de couleurs de diodes et les diodes peuvent émettre une lumière blanche. Tout comme une diode classique, la LED a deux contacts – une anode et une cathode. Schématiquement, l’anode est marquée d’un “+” et la cathode d’un “-“. | La diode électroluminescente est un semi-conducteur qui émet de la lumière lorsqu’on lui applique une tension. L’acronyme pour diode électroluminescente est DEL (LED en Anglais). Il existe différentes combinaisons de couleurs de diodes et les diodes peuvent émettre une lumière blanche. Tout comme une diode classique, la LED a deux contacts – une anode et une cathode. Schématiquement, l’anode est marquée d’un “+” et la cathode d’un “-“. |
| [{{ :examples:digi:led:led_pin_markings.png?200|Polarité des pattes et LEDs pour SMD}}] | [{{ :examples:digi:led:led_pin_markings.png?200|Polarité des pattes et LEDs pour SMD}}] |
| |
| ===== Homelab : entrainement 1 ===== | ===== Homelab : pratique 1 ===== |
| |
| Le module de contrôle du //Home laboratory// contient une seule LED rouge, dont l’anode est connectée à une résistance d’alimentation de puissance à +5V et la cathode est connectée à ATmega128 à la barrette numéro PB7. Afin d’allumer et d’éteindre cette LED, la sortie PB7 doit être définie et doit être configurée une fois en haut et une fois en bas. Cela signifie que si la barrette est définie en position haute, la LED s’éteint et si elle est configurée en position basse la LED s’allume. Fondamentalement il serait possible de connecter la LED de manière à ce que l’anode soit reliée à la barrette du microcontrôleur et la cathode soit reliée à la terre (qui fait le même effet qu’une résistance) – dans ce cas lorsque la barrette est en position haute la LED s’allume et vice et versa. | Le module de contrôle du //HomeLab// contient une seule LED rouge, dont l’anode est connectée via une résistance à l’alimentation de puissance à +5V et la cathode est connectée à la broche numéro PB7 de l'ATmega128. Afin d’allumer et d’éteindre cette LED, PB7 doit être définie comme une sortie et doit être respectivement configurée au niveau haut et bas. Cela signifie que si la broche est définie au niveau haut, la LED s’éteint et si elle est définie au niveau bas la LED s’allume. Fondamentalement il serait possible de connecter la LED de manière à ce que l’anode soit reliée à la broche du micro-contrôleur et la cathode soit reliée à la terre (qui joue le même rôle qu’une résistance) – dans ce cas lorsque la broche est définie au niveau haut, la LED s’allume et vice et versa. |
| |
| Tous les exercices pratiques pour le //home lab//, y compris l’utilisation de la LED, sont basés sur la librairie des barrettes du laboratoire. Cette librairie contient les types de données des barrettes, dont les adresses des registres liées aux barrettes ainsi que le bitmask des barrettes. Si pour créer une barrette de type variable dans le programme et ensuite l’initialiser en utilisant la fonction macro PIN, la barrette peut être utilisée librement avec cette variable (pin) dans n’importe quel programme sans qu’il soit nécessaire d’utiliser les déclarations. | Tous les exercices pour le //HomeLab//, y compris l’utilisation de la LED, reposent sur la bibliothèque des broches du //HomeLab//. Cette bibliothèque contient les types de données des broches, dont les adresses des registres liées aux broches ainsi que le masque de bits des broches. Si pour créer une variable de type broche dans le programme et ensuite l’initialiser en utilisant la fonction macro PIN, la broche peut être utilisée librement avec cette variable (pin) dans tout le programme sans qu’il soit nécessaire d’utiliser les registres. |
| Ci-dessous deux programmes d’instanciation, qui réalisent exactement la même fonction, sauf que l’un est créé sur la base de la librairie //Home Lab//, alors que l’autre ne l’est pas. | Ci-dessous deux exemples de programme réalisent exactement la même chose, sauf que l’un est créé sur la base de la bibliothèque //HomeLab//, alors que l’autre ne l’est pas. |
| |
| <code c> | <code c> |
| </code> | </code> |
| |
| Le premier exemple utilise la librairie concernant les barrettes (//pin.h file//). Tout d’abord une barrette de type variable dénommée //debug_led// est définie dans le programme, elle contient les informations à propos de la barrette LED. Dans le programme principal cette barrette est configurée en tant que sortie en utilisant la fonction //pin_setup_output// puis la barrette est configurée en position basse grâce à la fonction //pin_clear//. Ceci à pour effet que le LED rougeoie. Dans le second exemple les variables ne sont pas utilisées, la configuration de la sortie LED et l’allumage est réalisée en changeant la direction du bus de la barrette B et les valeurs de sortie du registre. Le lecteur qui en connaît un peu plus sur les notifications AVR, tel que dans les exercices précédents il n’est pas nécessaire de donner la commande afin d’allumer la LED, puisque la valeur de sortie par défaut est 0, ceci dit toutes les étapes sont respectées. | Le premier exemple utilise la bibliothèque concernant les broches (fichier ''pin.h''). Tout d’abord une variable de type broche nommée ''debug_led'' est définie dans le programme, elle contient les informations à propos de la broche ,LED. Dans le programme principal cette broche est configurée en tant que sortie en utilisant la fonction ''pin_setup_output''. Ensuite la broche est configurée en position basse grâce à la fonction ''pin_clear''. Ceci à pour effet que la LED rougeoie. Dans le second exemple les variables ne sont pas utilisées, la configuration de la sortie LED et l’allumage est réalisée en changeant les valeurs de direction des données du port B et des registres de sortie. Pour le lecteur qui en connaît un peu plus sur les notices AVR, tel que dans les exercices précédents, il n’est pas nécessaire de donner la commande afin d’allumer la LED, puisque la valeur de sortie par défaut de l'AVR est 0, ceci dit toutes les étapes sont respectées. |
| |
| Quelle est la différence entre utiliser la librairie et les enregistrements ? La différence est le confort – la librairie est plus facile, parce qu’il n’est pas nécessaire de connaître le nom des registres et leurs effets par cœur. Le bénéfice le plus important de la librairie est l’adaptabilité. En utilisant les registres il est nécessaire de changer les noms et bitmask des registres tout au long du programme a chaque changement de barrette. En utilisant la librairie, cela peut être fait qu’une seule fois au début du programme lors de l’initialisation de la variable de la barrette. L’utilisation des registres n’a pas d’avantage significatif – l’utilisation des barrettes est direct n’est pas réalisé à travers la mémoire du programme et des fonctions nécessitant du temps. Cependant, les nouvelles versions des compilateurs AVR-GCC sont tellement évolués qu’ils transforment les fonctions de la librairie en commandes directes identiques à celles utilisées en manipulant les registres comme si cela était fait dans le programme. Il est nécessaire de préciser que la capacité de transformation des compilateurs est une force seulement quand on a affaire à des variables constantes, et non pas pour les variables qui évoluent pendant le travail. | Quelle est la différence entre utiliser la bibliothèque et les registres ? La différence est le confort – la bibliothèque est plus facile, parce qu’il n’est pas nécessaire de connaître le nom des registres et leurs effets par cœur. Le bénéfice le plus important de la bibliothèque est l’adaptabilité. En utilisant les registres, il est nécessaire de changer les noms des registres et les masques de bit tout au long du programme afin de changer de broche. En utilisant la bibliothèque, cela peut être fait uniquement au début du programme où la variable de broche est initialisée. L’utilisation des registres n’a pas d’avantage significatif – l’utilisation des broches est directe et n’est pas réalisée à l'aide de la mémoire du programme et de fonctions nécessitant du temps. Cependant, les nouvelles versions des compilateurs AVR-GCC sont tellement évoluées qu’ils transforment les fonctions de la bibliothèque en commandes directes identiques à celles utilisées en manipulant les registres comme si cela était fait directement dans le programme. Il est nécessaire de préciser que les compilateurs peuvent optimiser le code uniquement quand ils traitent de variables simples constantes, et non pas de variables qui évoluent pendant le travail ou de listes. |
| |
| ===== Homelab : entrainement 2 ===== | Le code suivant est une bibliothèque pour le fonctionnement partielle de broche. Son objectif est d'expliquer les procédures pour les variables de broche. Il est d'un abord difficile pour les débutants car il utilise des pointeurs en langage C qui ne sont pas traités ici. Cependant, de l'information sur les pointeurs peut être facilement trouvées dans des livres ou sur Internet. |
| |
| En plus du module de contrôle, les LEDs sont aussi localisées sur la carte entrée-sortie digitale. Elles sont électriquement reliées de la même manière que les LEDs du module, cela signifie que la cathode est reliée à la barrette AVR. La LED rouge est connectée à la barrette numéro PC5, la jaune en PC4 et la verte en PC3. Notre librairie Home Lab basée sur le programme modèle suivant : | |
| | <code c> |
| | // Macro constant for defining register pointer |
| | #define _REG_PTR_ volatile uint8_t * |
| | |
| | // |
| | // Pin data type |
| | // |
| | typedef struct pin |
| | { |
| | _REG_PTR_ ddr; |
| | _REG_PTR_ port; |
| | _REG_PTR_ pin; |
| | uint8_t mask; |
| | } |
| | pin; |
| | |
| | // |
| | // Macro function for pin variable initializing |
| | // |
| | #define PIN(port_char, bit_index) \ |
| | { \ |
| | (_REG_PTR_)&DDR ## port_char, \ |
| | (_REG_PTR_)&PORT ## port_char, \ |
| | (_REG_PTR_)&PIN ## port_char, \ |
| | bit_mask(bit_index) \ |
| | } |
| | |
| | // |
| | // Configuring pin as output |
| | // |
| | inline void pin_setup_output(pin pin) |
| | { |
| | bitmask_set(*pin.ddr, pin.mask); |
| | } |
| | |
| | // |
| | // Setting pin high |
| | // |
| | inline void pin_set(pin pin) |
| | { |
| | bitmask_set(*pin.port, pin.mask); |
| | } |
| | |
| | // |
| | // Setting pin low |
| | // |
| | inline void pin_clear(pin pin) |
| | { |
| | bitmask_clear(*pin.port, pin.mask); |
| | } |
| | </code> |
| | |
| | |
| | ===== Homelab : pratique 2 ===== |
| | |
| | En plus du module de contrôle, les LEDs sont aussi situées sur la carte entrée-sortie numérique. Elles sont connectées électriquement de la même manière que les LEDs du module de contrôle. Cela signifie que la cathode est reliée à la broche AVR. La LED rouge est connectée à la broche numéro PC5, la jaune en PC4 et la verte en PC3. L'exemple de programme basé sur la bibliothèque //HomeLab// ressemble à celui-ci : |
| |
| <code c> | <code c> |
| } | } |
| </code> | </code> |
| |
| ===== ARM-CAN practice ===== | |
| |
| :!: To-do | |
| |