Modifications

Sauter à la navigation Sauter à la recherche
5 857 octets supprimés ,  20 février 2016 à 16:18
Contenu remplacé par « {{MicroPython-Hack-Prepare-NAV}} {{MicroPython-Hack-button-core}} {{MicroPython-Hack-Bouton-TRAILER}} »
Ligne 1 : Ligne 1 :  
{{MicroPython-Hack-Prepare-NAV}}
 
{{MicroPython-Hack-Prepare-NAV}}
   −
== Introduction ==
+
{{MicroPython-Hack-button-core}}
{{bloc-etroit|text=Le pyboard dispose de 2 petits boutons, libellés USR et RST. Le bouton RST (''reset'') est un bouton de réinitialisation matérieln, s'il est prssé alors la carte pyboard redémarre entièrement (équivalent d'une mise hors tension suivit d'une remise sous tension).
  −
 
  −
Le bouton USR (''user'', soit utilisateur) est un bouton destiné à votre usage personnel. Il est contrôlé par l'intermédiaire de l'objet {{fname|Switch}}. Ecrivez le code suivant pour créer un objet Switch:
  −
 
  −
<nowiki>>>> sw = pyb.Switch()</nowiki>
  −
 
  −
Souvenez-vous qu'il faut taper {{fname|import pyb}} si vous obteniez une erreur vous informant que le nom {{fname|pyb}} n'existe pas.
  −
 
  −
Grâce à l'objet ''switch'' vous pouvez obtenir le statut du bouton:
  −
 
  −
<nowiki>>>> sw()
  −
False</nowiki>
  −
 
  −
Qui affiche {{fname|False}} si le bouton n'est pas pressé ou {{fname|True}} si le bouton est pressé. Essayez de maintenir le bouton enfoncé pendant l'exécution de la commande ci-dessus.
  −
}}
  −
 
  −
== Callback bouton ==
  −
=== Qu'est-ce qu'un callback? ===
  −
{{bloc-etroit|text=En informatique, une fonction de rappel (callback en anglais) ou fonction de post-traitement est une fonction qui est passée en argument à une autre fonction. Cette dernière peut alors faire usage de cette fonction de rappel comme de n'importe quelle autre fonction, alors qu'elle ne la connaît pas par avance.<small><br />Source: [http://fr.wikipedia.org/wiki/Fonction_de_rappel Fonction de rappel sur Wikipedia]</small>
  −
}}
  −
=== L'objet switch ===
  −
{{bloc-etroit|text='''switch''' est un terme anglais signifiant "''bouton''" ou "''interrupteur''".
  −
 
  −
Nous disions donc que le '''switch''' est un objet vraiment très simple mais il dispose également d'une fonctionnalité avancée: la fonction {{fname|sw.callback()}}. La fonction callback permet de mettre en place quelque-chose à exécuter lorsque le bouton est pressé (et utilise une interruption). Le mieux, c'est de partir de l'exemple ci-dessus pour comprendre comment les interruptions fonctionnent.
  −
 
  −
Essayez d'exécuter le code suivant sur l'invite de commande:
  −
 
  −
<nowiki>>>> sw.callback(lambda:print('bouton enfonce!'))</nowiki>
  −
 
  −
Qui informe le bouton qu'il doit imprimer un message 'bouton enfonce!' à chaque fois que le bouton est enfoncé. Faites un essai: pressez le bouton USR et regardez le message qui apparait sur la sortie de votre PC.
  −
 
  −
Notez que cet affichage interrompera tout ce que vous tapez. <font color="red">Ceci est un exemple de routine d'interruption qui s'exécute de façon asynchrone</font>.
  −
 
  −
Un autre exemple à essayer:
  −
 
  −
<nowiki>>>> sw.callback(lambda:pyb.LED(1).toggle())</nowiki>
  −
 
  −
Dans cet exemple, le callback inverse (''toggle'') l'état de la LED rouge à chaque fois que le bouton est pressé. Et cela fonctionnera aussi pendant qu'un autre code s'exécute.
  −
 
  −
{{traduction}}
  −
 
  −
Pour désactiver le ''callback'' du bouton, il suffit de passer {{fname|None}} comme fonction ''callback'':
  −
 
  −
<nowiki>>>> sw.callback(None)</nowiki>
  −
 
  −
Vous pouvez passer n'importe quelle fonction (qui prend 0 arguments) en tant que fonction callback pour le switch. Ci-dessus, nous utilisons la fonctionnalité {{fname|lambda}} (expression lambda) de Python, cela permet de créer une fonction anonyme (sans nom) à la volée. Mais vous pourriez également faire ceci:
  −
 
  −
<nowiki>>>> def f():
  −
...  pyb.LED(1).toggle()
  −
...
  −
>>> sw.callback(f)</nowiki>
  −
 
  −
Ce bout de code crée une fonction appelée {{fname|f}} et l'utilise somme fonction callback pour le switch. Vous pouvez utiliser cette methode lorsque le code de la fonction de rappel est plus compliqué que ce que autorise les expressions {{fname|lambda}}.
  −
 
  −
{{ambox|text=Les fonctions callback ne peuvent pas allouer de la mémoire!}}
  −
 
  −
Une fonction callback ne peut pas allouer de la mémoire ***** that your callback functions must not allocate any memory (for example they cannot create a tuple or list). Callback functions should be relatively simple. If you need to make a list, make it beforehand and store it in a global variable (or make it local and close over it). If you need to do a long, complicated calculation, then use the callback to set a flag which some other code then responds to.
  −
}}
  −
 
  −
== Les interruptions: détails techniques ==
  −
Let’s step through the details of what is happening with the switch callback. When you register a function with {{fname|sw.callback()}}, the switch sets up an external interrupt trigger (falling edge) on the pin that the switch is connected to. This means that the microcontroller will listen on the pin for any changes, and the following will occur:
  −
 
  −
# When the switch is pressed a change occurs on the pin (the pin goes from low to high), and the microcontroller registers this change.
  −
# The microcontroller finishes executing the current machine instruction, stops execution, and saves its current state (pushes the registers on the stack). This has the effect of pausing any code, for example your running Python script.
  −
# The microcontroller starts executing the special interrupt handler associated with the switch’s external trigger. This interrupt handler get the function that you registered with sw.callback() and executes it.
  −
# Your callback function is executed until it finishes, returning control to the switch interrupt handler.
  −
# The switch interrupt handler returns, and the microcontroller is notified that the interrupt has been dealt with.
  −
# The microcontroller restores the state that it saved in step 2.
  −
# Execution continues of the code that was running at the beginning. Apart from the pause, this code does not notice that it was interrupted.
  −
 
  −
The above sequence of events gets a bit more complicated when multiple interrupts occur at the same time. In that case, the interrupt with the highest priority goes first, then the others in order of their priority. The switch interrupt is set at the lowest priority.
      
{{MicroPython-Hack-Bouton-TRAILER}}
 
{{MicroPython-Hack-Bouton-TRAILER}}
29 836

modifications

Menu de navigation