Outils pour utilisateurs

Outils du site


start:arduino:ports

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
start:arduino:ports [2020/12/01 12:07] gerardadminstart:arduino:ports [2023/01/27 16:08] (Version actuelle) – modification externe 127.0.0.1
Ligne 1: Ligne 1:
 ======== Programmation des Ports sur Arduino ======== ======== Programmation des Ports sur Arduino ========
 +
 +
 +{{ :start:arduino:capture_du_2020-12-01_16-07-59.jpg?direct&300 |}}
  
 [[https://eskimon.fr/tuto-arduino-904-les-ports| La doc sur les Ports du Blog Eskimon ]] [[https://eskimon.fr/tuto-arduino-904-les-ports| La doc sur les Ports du Blog Eskimon ]]
  
  
-==== La Doc de réference Arduino ====+===== La Doc de référence Arduino =====
  
-Registres de port+===Registres de port===
  
 Les registres de port permettent une manipulation de niveau inférieur et plus rapide des broches d'E / S du microcontrôleur sur une carte Arduino. Les puces utilisées sur la carte Arduino (les ATmega8 et ATmega168 ) ont trois ports: Les registres de port permettent une manipulation de niveau inférieur et plus rapide des broches d'E / S du microcontrôleur sur une carte Arduino. Les puces utilisées sur la carte Arduino (les ATmega8 et ATmega168 ) ont trois ports:
Ligne 65: Ligne 68:
 De manière générale, faire ce genre de chose n'est pas une bonne idée. Pourquoi pas? Voici quelques raisons: De manière générale, faire ce genre de chose n'est pas une bonne idée. Pourquoi pas? Voici quelques raisons:
  
-    Le code est beaucoup plus difficile à déboguer et à maintenir, et il est beaucoup plus difficile à comprendre pour les autres. Le processeur ne prend que quelques microsecondes pour exécuter le code, mais cela peut vous prendre des heures pour comprendre pourquoi cela ne fonctionne pas correctement et le réparer! Votre temps est précieux, non? Mais le temps de l'ordinateur est très bon marché, mesuré par le coût de l'électricité que vous l'alimentez. Il est généralement préférable d'écrire du code de la manière la plus évidente. +Le code est beaucoup plus difficile à déboguer et à maintenir, et il est beaucoup plus difficile à comprendre pour les autres. Le processeur ne prend que quelques microsecondes pour exécuter le code, mais cela peut vous prendre des heures pour comprendre pourquoi cela ne fonctionne pas correctement et le réparer! Votre temps est précieux, non? Mais le temps de l'ordinateur est très bon marché, mesuré par le coût de l'électricité que vous l'alimentez. Il est généralement préférable d'écrire du code de la manière la plus évidente. 
-    Le code est moins portable. Si vous utilisez digitalRead () et digitalWrite (), il est beaucoup plus facile d'écrire du code qui fonctionnera sur tous les microcontrôleurs Atmel, alors que les registres de contrôle et de port peuvent être différents sur chaque type de microcontrôleur. + 
-    Il est beaucoup plus facile de provoquer des dysfonctionnements involontaires avec un accès direct au port. Remarquez comment la ligne DDRD = B11111110; ci-dessus mentionne qu'il doit laisser la broche 0 comme broche d'entrée. La broche 0 est la ligne de réception (RX) sur le port série. Il serait très facile de provoquer accidentellement l'arrêt de votre port série en changeant la broche 0 en une broche de sortie! Maintenant, ce serait très déroutant lorsque vous êtes soudainement incapable de recevoir des données série, n'est-ce pas? +Le code est moins portable. Si vous utilisez digitalRead () et digitalWrite (), il est beaucoup plus facile d'écrire du code qui fonctionnera sur tous les microcontrôleurs Atmel, alors que les registres de contrôle et de port peuvent être différents sur chaque type de microcontrôleur. 
 + 
 +Il est beaucoup plus facile de provoquer des dysfonctionnements involontaires avec un accès direct au port. Remarquez comment la ligne DDRD = B11111110; ci-dessus mentionne qu'il doit laisser la broche 0 comme broche d'entrée. La broche 0 est la ligne de réception (RX) sur le port série. Il serait très facile de provoquer accidentellement l'arrêt de votre port série en changeant la broche 0 en une broche de sortie! Maintenant, ce serait très déroutant lorsque vous êtes soudainement incapable de recevoir des données série, n'est-ce pas? 
  
 Alors vous vous dites peut-être, génial, pourquoi aurais-je envie d'utiliser ce truc alors? Voici quelques-uns des aspects positifs de l'accès direct au port: Alors vous vous dites peut-être, génial, pourquoi aurais-je envie d'utiliser ce truc alors? Voici quelques-uns des aspects positifs de l'accès direct au port:
  
-    Vous devrez peut-être pouvoir activer et désactiver les broches très rapidement, c'est-à-dire en quelques fractions de microseconde. Si vous regardez le code source dans lib / cibles / arduino / câblage.c, vous verrez que digitalRead () et digitalWrite () sont chacun environ une douzaine de lignes de code, qui sont compilées en quelques instructions machine. Chaque instruction machine nécessite un cycle d'horloge à 16 MHz, ce qui peut s'additionner dans les applications sensibles au temps. L'accès direct au port peut faire le même travail en beaucoup moins de cycles d'horloge. +Vous devrez peut-être pouvoir activer et désactiver les broches très rapidement, c'est-à-dire en quelques fractions de microseconde. Si vous regardez le code source dans lib / cibles / arduino / câblage.c, vous verrez que digitalRead () et digitalWrite () sont chacun environ une douzaine de lignes de code, qui sont compilées en quelques instructions machine. Chaque instruction machine nécessite un cycle d'horloge à 16 MHz, ce qui peut s'additionner dans les applications sensibles au temps. L'accès direct au port peut faire le même travail en beaucoup moins de cycles d'horloge. 
-    Parfois, vous devrez peut-être définir plusieurs broches de sortie exactement en même temps. Appel digitalWrite (10, HIGH); suivi de digitalWrite (11, HIGH); fera passer la broche 10 à l'état HAUT plusieurs microsecondes avant la broche 11, ce qui peut perturber certains circuits numériques externes sensibles au temps que vous avez connectés. Vous pouvez également régler les deux broches à un niveau élevé exactement au même moment en utilisant PORTB | = B1100; + 
-    Si vous manquez de mémoire programme, vous pouvez utiliser ces astuces pour réduire la taille de votre code. Il faut beaucoup moins d'octets de code compilé pour écrire simultanément un tas de broches matérielles simultanément via les registres de port que d'utiliser une boucle for pour définir chaque broche séparément. Dans certains cas, cela peut faire la différence entre l'adaptation de votre programme dans la mémoire flash ou non! +Parfois, vous devrez peut-être définir plusieurs broches de sortie exactement en même temps. Appel digitalWrite (10, HIGH); suivi de digitalWrite (11, HIGH); fera passer la broche 10 à l'état HAUT plusieurs microsecondes avant la broche 11, ce qui peut perturber certains circuits numériques externes sensibles au temps que vous avez connectés. Vous pouvez également régler les deux broches à un niveau élevé exactement au même moment en utilisant PORTB | = B1100; 
 + 
 +Si vous manquez de mémoire programme, vous pouvez utiliser ces astuces pour réduire la taille de votre code. Il faut beaucoup moins d'octets de code compilé pour écrire simultanément un tas de broches matérielles simultanément via les registres de port que d'utiliser une boucle for pour définir chaque broche séparément. Dans certains cas, cela peut faire la différence entre l'adaptation de votre programme dans la mémoire flash ou non!  
 + 
 + 
 +===== Exemple de programme Arduino UNO pour faire clignoter 2 LEDS ===== 
 + 
 +2 LEDS branchées sur les broches:  LED1 = - sur 2 et cmd+ sur 3 , LED2 = - sur 6 cmd+ sur 7 
 + 
 +<code c ports_Leds.ino> 
 + 
 +void setup() { 
 +     
 +    // On positionne en sortie OUTPUT   ( 1 ) les broches 2 à 7  sur les bits 2 à 7 ,  
 +    // On part de la droite vers la gauche pour lire les n° des bits donc des broches. 
 +    DDRD = B11111110; // ATTENTION le bit 0 = 0 et le bit 1 = 1 sinon pas de liaison série ....!!! 
 +    // Le B majuscule en début de séquence indique un nombre Binaire 
 +
 + 
 +void loop(){ 
 + 
 +   // on met du 5 volts ou à 1 ( HIGH) les broches 3 et 7 on allume les 2 LEDS 
 +   PORTD = B10001000; // toujours  0 sur les bits 0 et 1 ==> liaison série...   
 +   delay(1000); // on attend 1s  
 +   PORTD = B00000000; // On eteind les 2 LEDS 
 +   delay(1000); // attente 1s 
 +    
 +
 + 
 +</code> 
 + 
 +=== Autres Methodes === 
 + 
 +    *bitRead(x, n);  bitRead() permet de lire l'état d'un bit dans un nombre entier. 
 +    *bitWrite(x, n, b); bitWrite() permet d'écrire l'état d'un bit dans un nombre entier.  
 +    *bitSet(x, n);  bitSet() permet de mettre un bit à "1" dans un nombre entier.  
 +    *bitClear(x, n); bitClear() permet de mettre un bit à "0" dans un nombre entier.  
 +    *bit(n);bit() permet de retourner la valeur numérique correspondant au poids d'un bit : 
 + 
 +    *https://www.carnetdumaker.net/articles/quelques-fonctions-bien-pratiques-du-framework-arduino/
/home/chanteri/www/fablab37110/data/attic/start/arduino/ports.1606820843.txt.gz · Dernière modification : 2023/01/27 16:08 (modification externe)