<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ech-01</id>
		<title>troyesGEII - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ech-01"/>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Sp%C3%A9cial:Contributions/Ech-01"/>
		<updated>2026-05-13T02:40:01Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.1</generator>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11561</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11561"/>
				<updated>2019-06-11T07:31:00Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11560 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11560</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11560"/>
				<updated>2019-06-11T07:30:46Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11559</id>
		<title>Cours:TPS 2103 tp mesureDeDistance</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11559"/>
				<updated>2019-06-11T07:29:42Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11558 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_mesureDeDistance_corr|{{Vert|&amp;lt;big&amp;gt;Les corrections sont en accès restreint&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoPinout.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Vert|&amp;lt;big&amp;gt;'''UNO sans arduino'''&amp;lt;/big&amp;gt; : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.}}&lt;br /&gt;
&lt;br /&gt;
{{Vert|Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.}}&lt;br /&gt;
&lt;br /&gt;
La programmation de la carte sera réalisée sur l'IDE {{Rouge|ECLIPSE}} et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|C'est parti !}}=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Usart atmega328.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :&lt;br /&gt;
*8 bits de données&lt;br /&gt;
*pas de parité&lt;br /&gt;
*1 bit de stop&lt;br /&gt;
*9600 bauds&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez :&lt;br /&gt;
*de la figure ci-contre&lt;br /&gt;
*[[media:atmega328p.pdf|de la documentation atmel, pages 190 et suivantes]]&lt;br /&gt;
&lt;br /&gt;
{{Question|En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle &amp;quot;alive&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void uart_putchar(char c)&lt;br /&gt;
{&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init()&lt;br /&gt;
{&lt;br /&gt;
  // a completer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     ....&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|HC-SR04}}=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez commencer par lire [[media:HCSR04.pdf|la documentation du module]].&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Trigger}}==&lt;br /&gt;
On souhaite faire une nouvelle mesure toutes les 100ms.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Fichier:AVRMega328 Timer1.png|thumb|500px|Documentation simple du Timer 1 (16 bits)]] || [[File:AVRMega328_Timer1_Comparaison.png|thumb|500px|center|La comparaison avec le Timer 1 (16 bits)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms}}&lt;br /&gt;
*Attention à bien&lt;br /&gt;
**autoriser l'interruption de comparaison : TIMSK1|=1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
**autoriser globalement les interruptions : sei()&lt;br /&gt;
**la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)&lt;br /&gt;
*Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Un oscilloscope sera nécessaire pour vérifier la forme du signal&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Echo}}==&lt;br /&gt;
&lt;br /&gt;
Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.&lt;br /&gt;
&lt;br /&gt;
Donc .... un autre timer ! Ce sera le timer2.&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir une précision au cm près :&lt;br /&gt;
&lt;br /&gt;
sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement}}&lt;br /&gt;
&lt;br /&gt;
On utilisera la broche INT0 pour le signal echo.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui :}}&lt;br /&gt;
*lance le timer1&lt;br /&gt;
*répète&lt;br /&gt;
**attendre que echo=1&lt;br /&gt;
**lancer timer2&lt;br /&gt;
**attendre que echo=0&lt;br /&gt;
**arrêter timer2&lt;br /&gt;
**envoie la distance sur la liaison série&lt;br /&gt;
**remettre la distance à 0&lt;br /&gt;
**remettre le timer à 0&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Visualisation de la distance}}=&lt;br /&gt;
&lt;br /&gt;
Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 !&lt;br /&gt;
[[File:TiemposServo.svg|TiemposServo]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Test du servo}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix}}&lt;br /&gt;
*la fréquence de MLI a assez peu d'importance&lt;br /&gt;
*on souhaite juste un déplacement du servomoteur entre 2 positions&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Couplage avec mesure de distance}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason}}&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=rTM5gZxBPmY Vidéo Youtube expliquant ce que l'on cherche à faire]&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11558</id>
		<title>Cours:TPS 2103 tp mesureDeDistance</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11558"/>
				<updated>2019-06-11T07:29:29Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_mesureDeDistance_corr|{{Vert|&amp;lt;big&amp;gt;Les corrections sont en accès restreint&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoPinout.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Vert|&amp;lt;big&amp;gt;'''UNO sans arduino'''&amp;lt;/big&amp;gt; : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.}}&lt;br /&gt;
&lt;br /&gt;
{{Vert|Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.}}&lt;br /&gt;
&lt;br /&gt;
La programmation de la carte sera réalisée sur l'IDE {{Rouge|ECLIPSE}} et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|C'est parti !}}=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Usart atmega328.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :&lt;br /&gt;
*8 bits de données&lt;br /&gt;
*pas de parité&lt;br /&gt;
*1 bit de stop&lt;br /&gt;
*9600 bauds&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez :&lt;br /&gt;
*de la figure ci-contre&lt;br /&gt;
*[[media:atmega328p.pdf|de la documentation atmel, pages 190 et suivantes]]&lt;br /&gt;
&lt;br /&gt;
{{Question|En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle &amp;quot;alive&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void uart_putchar(char c)&lt;br /&gt;
{&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init()&lt;br /&gt;
{&lt;br /&gt;
  // a completer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     ....&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|HC-SR04}}=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez commencer par lire [[media:HCSR04.pdf|la documentation du module]].&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Trigger}}==&lt;br /&gt;
On souhaite faire une nouvelle mesure toutes les 100ms.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Fichier:AVRMega328 Timer1.png|thumb|500px|Documentation simple du Timer 1 (16 bits)]] || [[File:AVRMega328_Timer1_Comparaison.png|thumb|500px|center|La comparaison avec le Timer 1 (16 bits)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms}}&lt;br /&gt;
*Attention à bien&lt;br /&gt;
**autoriser l'interruption de comparaison : TIMSK1|=1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
**autoriser globalement les interruptions : sei()&lt;br /&gt;
**la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)&lt;br /&gt;
*Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Un oscilloscope sera nécessaire pour vérifier la forme du signal&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Echo}}==&lt;br /&gt;
&lt;br /&gt;
Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.&lt;br /&gt;
&lt;br /&gt;
Donc .... un autre timer ! Ce sera le timer2.&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir une précision au cm près :&lt;br /&gt;
&lt;br /&gt;
sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement}}&lt;br /&gt;
&lt;br /&gt;
On utilisera la broche INT0 pour le signal echo.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui :}}&lt;br /&gt;
*lance le timer1&lt;br /&gt;
*répète&lt;br /&gt;
**attendre que echo=1&lt;br /&gt;
**lancer timer2&lt;br /&gt;
**attendre que echo=0&lt;br /&gt;
**arrêter timer2&lt;br /&gt;
**envoie la distance sur la liaison série&lt;br /&gt;
**remettre la distance à 0&lt;br /&gt;
**remettre le timer à 0&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Visualisation de la distance}}=&lt;br /&gt;
&lt;br /&gt;
Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 !&lt;br /&gt;
[[File:TiemposServo.svg|TiemposServo]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Test du servo}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix}}&lt;br /&gt;
*la fréquence de MLI a assez peu d'importance&lt;br /&gt;
*on souhaite juste un déplacement du servomoteur entre 2 positions&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Couplage avec mesure de distance}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason}}&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=rTM5gZxBPmY Vidéo Youtube expliquant ce que l'on cherche à faire]&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11556</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11556"/>
				<updated>2019-06-11T07:21:06Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11555 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11555</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11555"/>
				<updated>2019-06-11T07:20:50Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11554</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11554"/>
				<updated>2019-06-11T06:58:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11553 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11553</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11553"/>
				<updated>2019-06-11T06:57:51Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11551</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11551"/>
				<updated>2019-06-11T06:47:08Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11550 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11550</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11550"/>
				<updated>2019-06-11T06:46:49Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11549</id>
		<title>Cours:TPS 2103 tp mesureDeDistance</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11549"/>
				<updated>2019-06-11T06:42:00Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11548 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_mesureDeDistance_corr|{{Vert|&amp;lt;big&amp;gt;Les corrections sont en accès restreint&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoPinout.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Vert|&amp;lt;big&amp;gt;'''UNO sans arduino'''&amp;lt;/big&amp;gt; : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.}}&lt;br /&gt;
&lt;br /&gt;
{{Vert|Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.}}&lt;br /&gt;
&lt;br /&gt;
La programmation de la carte sera réalisée sur l'IDE {{Rouge|ECLIPSE}} et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|C'est parti !}}=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Usart atmega328.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :&lt;br /&gt;
*8 bits de données&lt;br /&gt;
*pas de parité&lt;br /&gt;
*1 bit de stop&lt;br /&gt;
*9600 bauds&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez :&lt;br /&gt;
*de la figure ci-contre&lt;br /&gt;
*[[media:atmega328p.pdf|de la documentation atmel, pages 190 et suivantes]]&lt;br /&gt;
&lt;br /&gt;
{{Question|En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle &amp;quot;alive&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void uart_putchar(char c)&lt;br /&gt;
{&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init()&lt;br /&gt;
{&lt;br /&gt;
  // a completer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     ....&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|HC-SR04}}=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez commencer par lire [[media:HCSR04.pdf|la documentation du module]].&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Trigger}}==&lt;br /&gt;
On souhaite faire une nouvelle mesure toutes les 100ms.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Fichier:AVRMega328 Timer1.png|thumb|500px|Documentation simple du Timer 1 (16 bits)]] || [[File:AVRMega328_Timer1_Comparaison.png|thumb|500px|center|La comparaison avec le Timer 1 (16 bits)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms}}&lt;br /&gt;
*Attention à bien&lt;br /&gt;
**autoriser l'interruption de comparaison : TIMSK1|=1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
**autoriser globalement les interruptions : sei()&lt;br /&gt;
**la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)&lt;br /&gt;
*Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Un oscilloscope sera nécessaire pour vérifier la forme du signal&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Echo}}==&lt;br /&gt;
&lt;br /&gt;
Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.&lt;br /&gt;
&lt;br /&gt;
Donc .... un autre timer ! Ce sera le timer2.&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir une précision au cm près :&lt;br /&gt;
&lt;br /&gt;
sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement}}&lt;br /&gt;
&lt;br /&gt;
On utilisera la broche INT0 pour le signal echo.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui :}}&lt;br /&gt;
*lance le timer1&lt;br /&gt;
*répète&lt;br /&gt;
**attendre que echo=1&lt;br /&gt;
**lancer timer2&lt;br /&gt;
**attendre que echo=0&lt;br /&gt;
**arrêter timer2&lt;br /&gt;
**envoie la distance sur la liaison série&lt;br /&gt;
**remettre la distance à 0&lt;br /&gt;
**remettre le timer à 0&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Visualisation de la distance}}=&lt;br /&gt;
&lt;br /&gt;
Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 !&lt;br /&gt;
[[File:TiemposServo.svg|TiemposServo]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Test du servo}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix}}&lt;br /&gt;
*la fréquence de MLI a assez peu d'importance&lt;br /&gt;
*on souhaite juste un déplacement du servomoteur entre 2 positions&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Couplage avec mesure de distance}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason}}&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=rTM5gZxBPmY Vidéo Youtube expliquant ce que l'on cherche à faire]&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11548</id>
		<title>Cours:TPS 2103 tp mesureDeDistance</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11548"/>
				<updated>2019-06-11T06:41:47Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_mesureDeDistance_corr|{{Vert|&amp;lt;big&amp;gt;Les corrections sont en accès restreint&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoPinout.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Vert|&amp;lt;big&amp;gt;'''UNO sans arduino'''&amp;lt;/big&amp;gt; : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.}}&lt;br /&gt;
&lt;br /&gt;
{{Vert|Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.}}&lt;br /&gt;
&lt;br /&gt;
La programmation de la carte sera réalisée sur l'IDE {{Rouge|ECLIPSE}} et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|C'est parti !}}=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Usart atmega328.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :&lt;br /&gt;
*8 bits de données&lt;br /&gt;
*pas de parité&lt;br /&gt;
*1 bit de stop&lt;br /&gt;
*9600 bauds&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez :&lt;br /&gt;
*de la figure ci-contre&lt;br /&gt;
*[[media:atmega328p.pdf|de la documentation atmel, pages 190 et suivantes]]&lt;br /&gt;
&lt;br /&gt;
{{Question|En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle &amp;quot;alive&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void uart_putchar(char c)&lt;br /&gt;
{&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init()&lt;br /&gt;
{&lt;br /&gt;
  // a completer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     ....&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|HC-SR04}}=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez commencer par lire [[media:HCSR04.pdf|la documentation du module]].&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Trigger}}==&lt;br /&gt;
On souhaite faire une nouvelle mesure toutes les 100ms.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Fichier:AVRMega328 Timer1.png|thumb|500px|Documentation simple du Timer 1 (16 bits)]] || [[File:AVRMega328_Timer1_Comparaison.png|thumb|500px|center|La comparaison avec le Timer 1 (16 bits)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms}}&lt;br /&gt;
*Attention à bien&lt;br /&gt;
**autoriser l'interruption de comparaison : TIMSK1|=1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
**autoriser globalement les interruptions : sei()&lt;br /&gt;
**la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)&lt;br /&gt;
*Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Un oscilloscope sera nécessaire pour vérifier la forme du signal&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Echo}}==&lt;br /&gt;
&lt;br /&gt;
Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.&lt;br /&gt;
&lt;br /&gt;
Donc .... un autre timer ! Ce sera le timer2.&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir une précision au cm près :&lt;br /&gt;
&lt;br /&gt;
sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement}}&lt;br /&gt;
&lt;br /&gt;
On utilisera la broche INT0 pour le signal echo.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui :}}&lt;br /&gt;
*lance le timer1&lt;br /&gt;
*répète&lt;br /&gt;
**attendre que echo=1&lt;br /&gt;
**lancer timer2&lt;br /&gt;
**attendre que echo=0&lt;br /&gt;
**arrêter timer2&lt;br /&gt;
**envoie la distance sur la liaison série&lt;br /&gt;
**remettre la distance à 0&lt;br /&gt;
**remettre le timer à 0&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Visualisation de la distance}}=&lt;br /&gt;
&lt;br /&gt;
Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 !&lt;br /&gt;
[[File:TiemposServo.svg|TiemposServo]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Test du servo}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix}}&lt;br /&gt;
*la fréquence de MLI a assez peu d'importance&lt;br /&gt;
*on souhaite juste un déplacement du servomoteur entre 2 positions&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Couplage avec mesure de distance}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason}}&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=rTM5gZxBPmY Vidéo Youtube expliquant ce que l'on cherche à faire]&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11547</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11547"/>
				<updated>2019-06-11T06:16:45Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11546 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11546</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11546"/>
				<updated>2019-06-11T06:16:24Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles_corr&amp;diff=11545</id>
		<title>Cours:TPS 2103 tp evitementObstacles corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles_corr&amp;diff=11545"/>
				<updated>2019-06-11T06:16:03Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11544 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * miniQ1.c&lt;br /&gt;
 *&lt;br /&gt;
 *  Created on: 25 mai 2016&lt;br /&gt;
 *      Author: moutou01&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#undef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define FORW 1&lt;br /&gt;
#define BACK 0&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t count=0,left=1;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
  count++;//on incrémente le compteur pour chaque impulsion reçue}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setPCINT0()&lt;br /&gt;
{&lt;br /&gt;
  PCICR = (1&amp;lt;&amp;lt;PCIE0);&lt;br /&gt;
  PCMSK0 = (1&amp;lt;&amp;lt;PCINT0);  //Autorisation de l'interruption INT0&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    PORTC ^= (1&amp;lt;&amp;lt;PC7);&lt;br /&gt;
  else&lt;br /&gt;
    PORTB ^= (1&amp;lt;&amp;lt;PB4);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initpwm() {&lt;br /&gt;
  DDRC |= (1&amp;lt;&amp;lt;PC6); // PC6 en sortie : moteur gauche&lt;br /&gt;
  DDRD |= (1&amp;lt;&amp;lt;PD7); // PD7 en sortie : moteur droit&lt;br /&gt;
  TCCR4B |= (1&amp;lt;&amp;lt;CS42)|(1&amp;lt;&amp;lt;CS41); // division par 64&lt;br /&gt;
  // moteur gauche&lt;br /&gt;
  TCCR4A |= (1&amp;lt;&amp;lt;COM4A0)|(1&amp;lt;&amp;lt;PWM4A); // PWM en et /OC4A&lt;br /&gt;
  TCCR4E |= (1&amp;lt;&amp;lt;OC4OE0); // 0C4OE0 pour /OC4A&lt;br /&gt;
  // moteur droit&lt;br /&gt;
  TCCR4C |= (1&amp;lt;&amp;lt;COM4D1)|(1&amp;lt;&amp;lt;PWM4D); // PWM en et OC4D&lt;br /&gt;
  TCCR4E |= (1&amp;lt;&amp;lt;OC4OE5); // 0C4OE5 pour OC4D&lt;br /&gt;
  // pendant qu'on y est on prépare tout pour pouvoir changer de sens&lt;br /&gt;
  DDRE |= (1&amp;lt;&amp;lt;PE6); // sens moteur droit;&lt;br /&gt;
  DDRD |= (1&amp;lt;&amp;lt;PD6); // sens moteur gauche&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Motor_Control(char MG_DIR,char MG_EN,char MD_DIR,char MD_EN) {&lt;br /&gt;
  // moteur gauche&lt;br /&gt;
  if(MG_DIR==FORW)//si vers l'avant&lt;br /&gt;
    PORTD &amp;amp;=~(1&amp;lt;&amp;lt;PD6);//IN2 passé à 0&lt;br /&gt;
  else&lt;br /&gt;
    PORTD |=(1&amp;lt;&amp;lt;PD6);//IN2 passé à 1&lt;br /&gt;
  OCR4A = 255-MG_EN; // rapport cyclique ou setVitesseG(MG_EN);&lt;br /&gt;
  // puis moteur droit&lt;br /&gt;
  if(MD_DIR==FORW)//si vers l'avant&lt;br /&gt;
    PORTE &amp;amp;=~(1&amp;lt;&amp;lt;PE6);//IN1 passé à 0&lt;br /&gt;
  else&lt;br /&gt;
    PORTE |=(1&amp;lt;&amp;lt;PE6);//IN1 passé à 1&lt;br /&gt;
  OCR4D = MD_EN; // rapport cyclique ou setVitesseD(MD_EN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setTIMER0_interrupt_ctc() {&lt;br /&gt;
  // mode CTC (010)&lt;br /&gt;
  TCCR0B &amp;amp;= ~((1&amp;lt;&amp;lt;WGM02)|(WGM00));&lt;br /&gt;
  TCCR0A |= (1&amp;lt;&amp;lt;WGM01);&lt;br /&gt;
    //prediviseur par 1&lt;br /&gt;
  TCCR0B |= (1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  // maxi CTC&lt;br /&gt;
  OCR0A = 210;&lt;br /&gt;
  //Autorisation interruption comparaison&lt;br /&gt;
  TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main() {&lt;br /&gt;
  uint16_t can8;&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  initpwm();&lt;br /&gt;
  //initCAN8();&lt;br /&gt;
  setPCINT0();&lt;br /&gt;
  setTIMER0_interrupt_ctc();&lt;br /&gt;
  sei();&lt;br /&gt;
  Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
  while(1){&lt;br /&gt;
    left = 1;&lt;br /&gt;
    count = 0;&lt;br /&gt;
    for (uint8_t i=0;i&amp;lt;20;i++) {&lt;br /&gt;
        _delay_us(300);&lt;br /&gt;
        // on coupe l'émission en bloquant interruptions&lt;br /&gt;
        TIMSK0 &amp;amp;= ~(1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
        _delay_us(600);&lt;br /&gt;
        // on rememt l'émission en autorisant les interruptions&lt;br /&gt;
        TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
    }// for&lt;br /&gt;
    if (count &amp;gt; 20) {&lt;br /&gt;
       Motor_Control(BACK,0,BACK,0);&lt;br /&gt;
       _delay_ms(1);&lt;br /&gt;
       Motor_Control(BACK,75,BACK,75);&lt;br /&gt;
       _delay_ms(400);&lt;br /&gt;
       Motor_Control(FORW,0,BACK,0);&lt;br /&gt;
       _delay_ms(1);&lt;br /&gt;
       Motor_Control(FORW,75,BACK,75);&lt;br /&gt;
       _delay_ms(200);&lt;br /&gt;
     }&lt;br /&gt;
     Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
     left = 0;&lt;br /&gt;
     count = 0;&lt;br /&gt;
     for (uint8_t i=0;i&amp;lt;20;i++) {&lt;br /&gt;
        _delay_us(300);&lt;br /&gt;
        // on coupe l'émission en bloquant interruptions&lt;br /&gt;
        TIMSK0 &amp;amp;= ~(1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
        _delay_us(600);&lt;br /&gt;
        // on rememt l'émission en autorisant les interruptions&lt;br /&gt;
        TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
     }// for&lt;br /&gt;
     if (count &amp;gt; 20) {&lt;br /&gt;
        Motor_Control(BACK,0,BACK,0);&lt;br /&gt;
        _delay_ms(1);&lt;br /&gt;
        Motor_Control(BACK,75,BACK,75);&lt;br /&gt;
        _delay_ms(400);&lt;br /&gt;
        Motor_Control(BACK,0,FORW,0);&lt;br /&gt;
        _delay_ms(1);&lt;br /&gt;
        Motor_Control(BACK,75,FORW,75);&lt;br /&gt;
        _delay_ms(200);&lt;br /&gt;
     }&lt;br /&gt;
     Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles_corr&amp;diff=11544</id>
		<title>Cours:TPS 2103 tp evitementObstacles corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles_corr&amp;diff=11544"/>
				<updated>2019-06-11T06:15:24Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * miniQ1.c&lt;br /&gt;
 *&lt;br /&gt;
 *  Created on: 25 mai 2016&lt;br /&gt;
 *      Author: moutou01&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#undef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define FORW 1&lt;br /&gt;
#define BACK 0&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t count=0,left=1;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
  count++;//on incrémente le compteur pour chaque impulsion reçue}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setPCINT0()&lt;br /&gt;
{&lt;br /&gt;
  PCICR = (1&amp;lt;&amp;lt;PCIE0);&lt;br /&gt;
  PCMSK0 = (1&amp;lt;&amp;lt;PCINT0);  //Autorisation de l'interruption INT0&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    PORTC ^= (1&amp;lt;&amp;lt;PC7);&lt;br /&gt;
  else&lt;br /&gt;
    PORTB ^= (1&amp;lt;&amp;lt;PB4);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initpwm() {&lt;br /&gt;
  DDRC |= (1&amp;lt;&amp;lt;PC6); // PC6 en sortie : moteur gauche&lt;br /&gt;
  DDRD |= (1&amp;lt;&amp;lt;PD7); // PD7 en sortie : moteur droit&lt;br /&gt;
  TCCR4B |= (1&amp;lt;&amp;lt;CS42)|(1&amp;lt;&amp;lt;CS41); // division par 64&lt;br /&gt;
  // moteur gauche&lt;br /&gt;
  TCCR4A |= (1&amp;lt;&amp;lt;COM4A0)|(1&amp;lt;&amp;lt;PWM4A); // PWM en et /OC4A&lt;br /&gt;
  TCCR4E |= (1&amp;lt;&amp;lt;OC4OE0); // 0C4OE0 pour /OC4A&lt;br /&gt;
  // moteur droit&lt;br /&gt;
  TCCR4C |= (1&amp;lt;&amp;lt;COM4D1)|(1&amp;lt;&amp;lt;PWM4D); // PWM en et OC4D&lt;br /&gt;
  TCCR4E |= (1&amp;lt;&amp;lt;OC4OE5); // 0C4OE5 pour OC4D&lt;br /&gt;
  // pendant qu'on y est on prépare tout pour pouvoir changer de sens&lt;br /&gt;
  DDRE |= (1&amp;lt;&amp;lt;PE6); // sens moteur droit;&lt;br /&gt;
  DDRD |= (1&amp;lt;&amp;lt;PD6); // sens moteur gauche&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Motor_Control(char MG_DIR,char MG_EN,char MD_DIR,char MD_EN) {&lt;br /&gt;
  // moteur gauche&lt;br /&gt;
  if(MG_DIR==FORW)//si vers l'avant&lt;br /&gt;
    PORTD &amp;amp;=~(1&amp;lt;&amp;lt;PD6);//IN2 passé à 0&lt;br /&gt;
  else&lt;br /&gt;
    PORTD |=(1&amp;lt;&amp;lt;PD6);//IN2 passé à 1&lt;br /&gt;
  OCR4A = 255-MG_EN; // rapport cyclique ou setVitesseG(MG_EN);&lt;br /&gt;
  // puis moteur droit&lt;br /&gt;
  if(MD_DIR==FORW)//si vers l'avant&lt;br /&gt;
    PORTE &amp;amp;=~(1&amp;lt;&amp;lt;PE6);//IN1 passé à 0&lt;br /&gt;
  else&lt;br /&gt;
    PORTE |=(1&amp;lt;&amp;lt;PE6);//IN1 passé à 1&lt;br /&gt;
  OCR4D = MD_EN; // rapport cyclique ou setVitesseD(MD_EN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setTIMER0_interrupt_ctc() {&lt;br /&gt;
  // mode CTC (010)&lt;br /&gt;
  TCCR0B &amp;amp;= ~((1&amp;lt;&amp;lt;WGM02)|(WGM00));&lt;br /&gt;
  TCCR0A |= (1&amp;lt;&amp;lt;WGM01);&lt;br /&gt;
    //prediviseur par 1&lt;br /&gt;
  TCCR0B |= (1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  // maxi CTC&lt;br /&gt;
  OCR0A = 210;&lt;br /&gt;
  //Autorisation interruption comparaison&lt;br /&gt;
  TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main() {&lt;br /&gt;
  uint16_t can8;&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  initpwm();&lt;br /&gt;
  //initCAN8();&lt;br /&gt;
  setPCINT0();&lt;br /&gt;
  setTIMER0_interrupt_ctc();&lt;br /&gt;
  sei();&lt;br /&gt;
  Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
  while(1){&lt;br /&gt;
    left = 1;&lt;br /&gt;
    count = 0;&lt;br /&gt;
    for (uint8_t i=0;i&amp;lt;20;i++) {&lt;br /&gt;
        _delay_us(300);&lt;br /&gt;
        // on coupe l'émission en bloquant interruptions&lt;br /&gt;
        TIMSK0 &amp;amp;= ~(1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
        _delay_us(600);&lt;br /&gt;
        // on rememt l'émission en autorisant les interruptions&lt;br /&gt;
        TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
    }// for&lt;br /&gt;
    if (count &amp;gt; 20) {&lt;br /&gt;
       Motor_Control(BACK,0,BACK,0);&lt;br /&gt;
       _delay_ms(1);&lt;br /&gt;
       Motor_Control(BACK,75,BACK,75);&lt;br /&gt;
       _delay_ms(400);&lt;br /&gt;
       Motor_Control(FORW,0,BACK,0);&lt;br /&gt;
       _delay_ms(1);&lt;br /&gt;
       Motor_Control(FORW,75,BACK,75);&lt;br /&gt;
       _delay_ms(200);&lt;br /&gt;
     }&lt;br /&gt;
     Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
     left = 0;&lt;br /&gt;
     count = 0;&lt;br /&gt;
     for (uint8_t i=0;i&amp;lt;20;i++) {&lt;br /&gt;
        _delay_us(300);&lt;br /&gt;
        // on coupe l'émission en bloquant interruptions&lt;br /&gt;
        TIMSK0 &amp;amp;= ~(1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
        _delay_us(600);&lt;br /&gt;
        // on rememt l'émission en autorisant les interruptions&lt;br /&gt;
        TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
     }// for&lt;br /&gt;
     if (count &amp;gt; 20) {&lt;br /&gt;
        Motor_Control(BACK,0,BACK,0);&lt;br /&gt;
        _delay_ms(1);&lt;br /&gt;
        Motor_Control(BACK,75,BACK,75);&lt;br /&gt;
        _delay_ms(400);&lt;br /&gt;
        Motor_Control(BACK,0,FORW,0);&lt;br /&gt;
        _delay_ms(1);&lt;br /&gt;
        Motor_Control(BACK,75,FORW,75);&lt;br /&gt;
        _delay_ms(200);&lt;br /&gt;
     }&lt;br /&gt;
     Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles_corr&amp;diff=11543</id>
		<title>Cours:TPS 2103 tp evitementObstacles corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles_corr&amp;diff=11543"/>
				<updated>2019-06-11T06:15:10Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11542 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * miniQ1.c&lt;br /&gt;
 *&lt;br /&gt;
 *  Created on: 25 mai 2016&lt;br /&gt;
 *      Author: moutou01&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#undef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define FORW 1&lt;br /&gt;
#define BACK 0&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t count=0,left=1;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
  count++;//on incrémente le compteur pour chaque impulsion reçue}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setPCINT0()&lt;br /&gt;
{&lt;br /&gt;
  PCICR = (1&amp;lt;&amp;lt;PCIE0);&lt;br /&gt;
  PCMSK0 = (1&amp;lt;&amp;lt;PCINT0);  //Autorisation de l'interruption INT0&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    PORTC ^= (1&amp;lt;&amp;lt;PC7);&lt;br /&gt;
  else&lt;br /&gt;
    PORTB ^= (1&amp;lt;&amp;lt;PB4);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initpwm() {&lt;br /&gt;
  DDRC |= (1&amp;lt;&amp;lt;PC6); // PC6 en sortie : moteur gauche&lt;br /&gt;
  DDRD |= (1&amp;lt;&amp;lt;PD7); // PD7 en sortie : moteur droit&lt;br /&gt;
  TCCR4B |= (1&amp;lt;&amp;lt;CS42)|(1&amp;lt;&amp;lt;CS41); // division par 64&lt;br /&gt;
  // moteur gauche&lt;br /&gt;
  TCCR4A |= (1&amp;lt;&amp;lt;COM4A0)|(1&amp;lt;&amp;lt;PWM4A); // PWM en et /OC4A&lt;br /&gt;
  TCCR4E |= (1&amp;lt;&amp;lt;OC4OE0); // 0C4OE0 pour /OC4A&lt;br /&gt;
  // moteur droit&lt;br /&gt;
  TCCR4C |= (1&amp;lt;&amp;lt;COM4D1)|(1&amp;lt;&amp;lt;PWM4D); // PWM en et OC4D&lt;br /&gt;
  TCCR4E |= (1&amp;lt;&amp;lt;OC4OE5); // 0C4OE5 pour OC4D&lt;br /&gt;
  // pendant qu'on y est on prépare tout pour pouvoir changer de sens&lt;br /&gt;
  DDRE |= (1&amp;lt;&amp;lt;PE6); // sens moteur droit;&lt;br /&gt;
  DDRD |= (1&amp;lt;&amp;lt;PD6); // sens moteur gauche&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Motor_Control(char MG_DIR,char MG_EN,char MD_DIR,char MD_EN) {&lt;br /&gt;
  // moteur gauche&lt;br /&gt;
  if(MG_DIR==FORW)//si vers l'avant&lt;br /&gt;
    PORTD &amp;amp;=~(1&amp;lt;&amp;lt;PD6);//IN2 passé à 0&lt;br /&gt;
  else&lt;br /&gt;
    PORTD |=(1&amp;lt;&amp;lt;PD6);//IN2 passé à 1&lt;br /&gt;
  OCR4A = 255-MG_EN; // rapport cyclique ou setVitesseG(MG_EN);&lt;br /&gt;
  // puis moteur droit&lt;br /&gt;
  if(MD_DIR==FORW)//si vers l'avant&lt;br /&gt;
    PORTE &amp;amp;=~(1&amp;lt;&amp;lt;PE6);//IN1 passé à 0&lt;br /&gt;
  else&lt;br /&gt;
    PORTE |=(1&amp;lt;&amp;lt;PE6);//IN1 passé à 1&lt;br /&gt;
  OCR4D = MD_EN; // rapport cyclique ou setVitesseD(MD_EN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setTIMER0_interrupt_ctc() {&lt;br /&gt;
  // mode CTC (010)&lt;br /&gt;
  TCCR0B &amp;amp;= ~((1&amp;lt;&amp;lt;WGM02)|(WGM00));&lt;br /&gt;
  TCCR0A |= (1&amp;lt;&amp;lt;WGM01);&lt;br /&gt;
    //prediviseur par 1&lt;br /&gt;
  TCCR0B |= (1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  // maxi CTC&lt;br /&gt;
  OCR0A = 210;&lt;br /&gt;
  //Autorisation interruption comparaison&lt;br /&gt;
  TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main() {&lt;br /&gt;
  uint16_t can8;&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  initpwm();&lt;br /&gt;
  //initCAN8();&lt;br /&gt;
  setPCINT0();&lt;br /&gt;
  setTIMER0_interrupt_ctc();&lt;br /&gt;
  sei();&lt;br /&gt;
  Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
  while(1){&lt;br /&gt;
    left = 1;&lt;br /&gt;
    count = 0;&lt;br /&gt;
    for (uint8_t i=0;i&amp;lt;20;i++) {&lt;br /&gt;
        _delay_us(300);&lt;br /&gt;
        // on coupe l'émission en bloquant interruptions&lt;br /&gt;
        TIMSK0 &amp;amp;= ~(1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
        _delay_us(600);&lt;br /&gt;
        // on rememt l'émission en autorisant les interruptions&lt;br /&gt;
        TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
    }// for&lt;br /&gt;
    if (count &amp;gt; 20) {&lt;br /&gt;
       Motor_Control(BACK,0,BACK,0);&lt;br /&gt;
       _delay_ms(1);&lt;br /&gt;
       Motor_Control(BACK,75,BACK,75);&lt;br /&gt;
       _delay_ms(400);&lt;br /&gt;
       Motor_Control(FORW,0,BACK,0);&lt;br /&gt;
       _delay_ms(1);&lt;br /&gt;
       Motor_Control(FORW,75,BACK,75);&lt;br /&gt;
       _delay_ms(200);&lt;br /&gt;
     }&lt;br /&gt;
     Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
     left = 0;&lt;br /&gt;
     count = 0;&lt;br /&gt;
     for (uint8_t i=0;i&amp;lt;20;i++) {&lt;br /&gt;
        _delay_us(300);&lt;br /&gt;
        // on coupe l'émission en bloquant interruptions&lt;br /&gt;
        TIMSK0 &amp;amp;= ~(1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
        _delay_us(600);&lt;br /&gt;
        // on rememt l'émission en autorisant les interruptions&lt;br /&gt;
        TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
     }// for&lt;br /&gt;
     if (count &amp;gt; 20) {&lt;br /&gt;
        Motor_Control(BACK,0,BACK,0);&lt;br /&gt;
        _delay_ms(1);&lt;br /&gt;
        Motor_Control(BACK,75,BACK,75);&lt;br /&gt;
        _delay_ms(400);&lt;br /&gt;
        Motor_Control(BACK,0,FORW,0);&lt;br /&gt;
        _delay_ms(1);&lt;br /&gt;
        Motor_Control(BACK,75,FORW,75);&lt;br /&gt;
        _delay_ms(200);&lt;br /&gt;
     }&lt;br /&gt;
     Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles_corr&amp;diff=11542</id>
		<title>Cours:TPS 2103 tp evitementObstacles corr</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles_corr&amp;diff=11542"/>
				<updated>2019-06-11T06:14:44Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * miniQ1.c&lt;br /&gt;
 *&lt;br /&gt;
 *  Created on: 25 mai 2016&lt;br /&gt;
 *      Author: moutou01&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#undef F_CPU&lt;br /&gt;
#define F_CPU 16000000UL&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define FORW 1&lt;br /&gt;
#define BACK 0&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t count=0,left=1;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
  count++;//on incrémente le compteur pour chaque impulsion reçue}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setPCINT0()&lt;br /&gt;
{&lt;br /&gt;
  PCICR = (1&amp;lt;&amp;lt;PCIE0);&lt;br /&gt;
  PCMSK0 = (1&amp;lt;&amp;lt;PCINT0);  //Autorisation de l'interruption INT0&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    PORTC ^= (1&amp;lt;&amp;lt;PC7);&lt;br /&gt;
  else&lt;br /&gt;
    PORTB ^= (1&amp;lt;&amp;lt;PB4);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void initpwm() {&lt;br /&gt;
  DDRC |= (1&amp;lt;&amp;lt;PC6); // PC6 en sortie : moteur gauche&lt;br /&gt;
  DDRD |= (1&amp;lt;&amp;lt;PD7); // PD7 en sortie : moteur droit&lt;br /&gt;
  TCCR4B |= (1&amp;lt;&amp;lt;CS42)|(1&amp;lt;&amp;lt;CS41); // division par 64&lt;br /&gt;
  // moteur gauche&lt;br /&gt;
  TCCR4A |= (1&amp;lt;&amp;lt;COM4A0)|(1&amp;lt;&amp;lt;PWM4A); // PWM en et /OC4A&lt;br /&gt;
  TCCR4E |= (1&amp;lt;&amp;lt;OC4OE0); // 0C4OE0 pour /OC4A&lt;br /&gt;
  // moteur droit&lt;br /&gt;
  TCCR4C |= (1&amp;lt;&amp;lt;COM4D1)|(1&amp;lt;&amp;lt;PWM4D); // PWM en et OC4D&lt;br /&gt;
  TCCR4E |= (1&amp;lt;&amp;lt;OC4OE5); // 0C4OE5 pour OC4D&lt;br /&gt;
  // pendant qu'on y est on prépare tout pour pouvoir changer de sens&lt;br /&gt;
  DDRE |= (1&amp;lt;&amp;lt;PE6); // sens moteur droit;&lt;br /&gt;
  DDRD |= (1&amp;lt;&amp;lt;PD6); // sens moteur gauche&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Motor_Control(char MG_DIR,char MG_EN,char MD_DIR,char MD_EN) {&lt;br /&gt;
  // moteur gauche&lt;br /&gt;
  if(MG_DIR==FORW)//si vers l'avant&lt;br /&gt;
    PORTD &amp;amp;=~(1&amp;lt;&amp;lt;PD6);//IN2 passé à 0&lt;br /&gt;
  else&lt;br /&gt;
    PORTD |=(1&amp;lt;&amp;lt;PD6);//IN2 passé à 1&lt;br /&gt;
  OCR4A = 255-MG_EN; // rapport cyclique ou setVitesseG(MG_EN);&lt;br /&gt;
  // puis moteur droit&lt;br /&gt;
  if(MD_DIR==FORW)//si vers l'avant&lt;br /&gt;
    PORTE &amp;amp;=~(1&amp;lt;&amp;lt;PE6);//IN1 passé à 0&lt;br /&gt;
  else&lt;br /&gt;
    PORTE |=(1&amp;lt;&amp;lt;PE6);//IN1 passé à 1&lt;br /&gt;
  OCR4D = MD_EN; // rapport cyclique ou setVitesseD(MD_EN);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setTIMER0_interrupt_ctc() {&lt;br /&gt;
  // mode CTC (010)&lt;br /&gt;
  TCCR0B &amp;amp;= ~((1&amp;lt;&amp;lt;WGM02)|(WGM00));&lt;br /&gt;
  TCCR0A |= (1&amp;lt;&amp;lt;WGM01);&lt;br /&gt;
    //prediviseur par 1&lt;br /&gt;
  TCCR0B |= (1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  // maxi CTC&lt;br /&gt;
  OCR0A = 210;&lt;br /&gt;
  //Autorisation interruption comparaison&lt;br /&gt;
  TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
main() {&lt;br /&gt;
  uint16_t can8;&lt;br /&gt;
  // put your setup code here, to run once:&lt;br /&gt;
  initpwm();&lt;br /&gt;
  //initCAN8();&lt;br /&gt;
  setPCINT0();&lt;br /&gt;
  setTIMER0_interrupt_ctc();&lt;br /&gt;
  sei();&lt;br /&gt;
  Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
  while(1){&lt;br /&gt;
    left = 1;&lt;br /&gt;
    count = 0;&lt;br /&gt;
    for (uint8_t i=0;i&amp;lt;20;i++) {&lt;br /&gt;
        _delay_us(300);&lt;br /&gt;
        // on coupe l'émission en bloquant interruptions&lt;br /&gt;
        TIMSK0 &amp;amp;= ~(1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
        _delay_us(600);&lt;br /&gt;
        // on rememt l'émission en autorisant les interruptions&lt;br /&gt;
        TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
    }// for&lt;br /&gt;
    if (count &amp;gt; 20) {&lt;br /&gt;
       Motor_Control(BACK,0,BACK,0);&lt;br /&gt;
       _delay_ms(1);&lt;br /&gt;
       Motor_Control(BACK,75,BACK,75);&lt;br /&gt;
       _delay_ms(400);&lt;br /&gt;
       Motor_Control(FORW,0,BACK,0);&lt;br /&gt;
       _delay_ms(1);&lt;br /&gt;
       Motor_Control(FORW,75,BACK,75);&lt;br /&gt;
       _delay_ms(200);&lt;br /&gt;
     }&lt;br /&gt;
     Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
     left = 0;&lt;br /&gt;
     count = 0;&lt;br /&gt;
     for (uint8_t i=0;i&amp;lt;20;i++) {&lt;br /&gt;
        _delay_us(300);&lt;br /&gt;
        // on coupe l'émission en bloquant interruptions&lt;br /&gt;
        TIMSK0 &amp;amp;= ~(1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
        _delay_us(600);&lt;br /&gt;
        // on rememt l'émission en autorisant les interruptions&lt;br /&gt;
        TIMSK0 |= (1&amp;lt;&amp;lt;OCIE0A);&lt;br /&gt;
     }// for&lt;br /&gt;
     if (count &amp;gt; 20) {&lt;br /&gt;
        Motor_Control(BACK,0,BACK,0);&lt;br /&gt;
        _delay_ms(1);&lt;br /&gt;
        Motor_Control(BACK,75,BACK,75);&lt;br /&gt;
        _delay_ms(400);&lt;br /&gt;
        Motor_Control(BACK,0,FORW,0);&lt;br /&gt;
        _delay_ms(1);&lt;br /&gt;
        Motor_Control(BACK,75,FORW,75);&lt;br /&gt;
        _delay_ms(200);&lt;br /&gt;
     }&lt;br /&gt;
     Motor_Control(FORW,75,FORW,75);//avanti&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire&amp;diff=11541</id>
		<title>Cours:TPS 2103 tp jeuDeMemoire</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire&amp;diff=11541"/>
				<updated>2019-06-11T06:14:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_jeuDeMemoire_corrige|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! Alimenter les programmateurs en 3.3V !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! pour utiliser les boutons !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! Mettre en 5v pour reprogrammer !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Principe de programmation et fusible}}=&lt;br /&gt;
&lt;br /&gt;
Le µcontrôleur utilisé est un attiny10, cadencé à 1MHz.&lt;br /&gt;
&lt;br /&gt;
Il convient de modifier les fusibles du µcontrôleur (configuration du composant : type d'horloge, mode de programmation, verrouillage ...)&lt;br /&gt;
&lt;br /&gt;
{{Todo|La valeur du fusible doit être : 0xFE}}&lt;br /&gt;
*soit graphiquement dans eclipse&lt;br /&gt;
*soit en ligne de commande&lt;br /&gt;
 avrdude -c avrisp2 -P usb -p t10 -U fuse:w:0xFE:m&lt;br /&gt;
&lt;br /&gt;
{{Rouge|Remarques :}} Une bonne base de programme est donné ci-dessous.&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//           +====+&lt;br /&gt;
//  PWMA/PB0 |*   | PB3 (RESET)&lt;br /&gt;
//       GND |    | Vcc&lt;br /&gt;
//  PWMB/PB1 |    | PB2 (CLKO)&lt;br /&gt;
//           +====+&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Explorons les sorties}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Schéma électrique}}==&lt;br /&gt;
&lt;br /&gt;
Les schémas suivants vous permettent :&lt;br /&gt;
*de comprendre sur quel état logique les leds s'allument&lt;br /&gt;
*de trouver la liste des sorties&lt;br /&gt;
*d'associer chaque led avec un numéro de patte&lt;br /&gt;
&lt;br /&gt;
[[Fichier:simonsay.png]]&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:ATTINY10-pinout.jpg]]&lt;br /&gt;
||&lt;br /&gt;
Le tableau donne la correspondance entre patte de sortie du µcontrôleur et position de(s) led(s) sur le dé :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| PB0 || haut || droite&lt;br /&gt;
|-&lt;br /&gt;
| PB1 || haut || gauche&lt;br /&gt;
|-&lt;br /&gt;
| PB2 || bas || gauche&lt;br /&gt;
|-&lt;br /&gt;
| PB3 || bas || droite&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Commandez les sorties}}==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, on demande à avoir le même état sur toutes les leds (allumées ou éteintes).&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui change l'état de toutes les leds toutes les secondes.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|générons une séquence}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'afficher une séquence sur les leds (led0 puis led3 puis led0 ....), on utilisera un tableau.&lt;br /&gt;
&lt;br /&gt;
Plus le niveau atteint sera élevé, plus la séquence sera longue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define niveauMax 10&lt;br /&gt;
unsigned char sequence [niveauMax]= {1,3,1,3,2,0...};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Utiliser ce tableau pour allumer successivement les leds dans l'ordre indiqué.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|motif gagné}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite générer une séquence particulière lorsque le joueur gagne :&lt;br /&gt;
&lt;br /&gt;
les leds s'allument successivement en &amp;quot;tournant&amp;quot; en rond (on fera plusieurs &amp;quot;tours&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
{{Question|Implémenter la fonction gagne, dont le prototype est donné ci-dessous :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
inline void gagne () __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void gagne()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|motif perdu}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite générer une séquence particulière lorsque le joueur perd :&lt;br /&gt;
&lt;br /&gt;
les leds s'allument toutes puis s'éteignent plusieurs fois.&lt;br /&gt;
&lt;br /&gt;
{{Question|Implémenter la fonction perdu, dont le prototype est donné ci-dessous :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
inline void perdu () __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void perdu()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Et l'entrée ?!}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Vous constaterez sur le schéma électrique que les broches du µcontrôleur sont partagées entre bouton et led.&lt;br /&gt;
&lt;br /&gt;
Il faudra donc modifier la valeur du registre DDRB lorsque l'on souhaitera observer l'état des boutons.&lt;br /&gt;
&lt;br /&gt;
On rappelle le rôle du registre PORTx suivant la valeur de DDRx :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! état d'un bit de DDRx !! rôle du bit de PORTx !! bit de PORTx à '0' !! bit de PORTx à '1'&lt;br /&gt;
|-&lt;br /&gt;
| '0' || Activer/Désactiver la résistance de PULL-UP || pas de PULL-UP || PULL-UP&lt;br /&gt;
|-&lt;br /&gt;
| '1' || Modifier l'état de la sortie || sortie à '0' || sortie à '1'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|Ici, pour que le bouton fonctionne correctement, il ne doit pas y avoir de résistance de PULL-UP activée.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Utilisons les boutons}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite dans un premier temps juste vérifier que les boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui attend qu'un bouton soit appuyé et alors affiche le motif &amp;quot;gagné&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarques :'''&lt;br /&gt;
*il est possible que certains boutons ne fonctionnent pas très bien sur le support de programmation !&lt;br /&gt;
*on attendra le relâchement de tous les boutons avant de recommencer.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Associons bouton et led}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif étant de reproduire la séquence générée sur les leds, il convient de regarder lequel des boutons est appuyé.&lt;br /&gt;
&lt;br /&gt;
Une variable bp devra correspondre au numéro du bouton appuyé. Il convient sans doute d'utiliser un &amp;quot;switch case&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{Question|Utiliser cette variable ch, et faire clignoter la led associée au bouton sur lequel on appuie.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Jeu de mémoire}}=&lt;br /&gt;
&lt;br /&gt;
Toutes les briques ou presque sont en place. Il ne manque qu'un peu d'aléatoire que nous ajouterons par la suite.&lt;br /&gt;
&lt;br /&gt;
Réexpliquons le principe du jeu :&lt;br /&gt;
*on affiche une séquence aléatoire dont la longueur correspond au niveau&lt;br /&gt;
**une seule led si niveau 1&lt;br /&gt;
**séquence de 2 leds pour le niveau 2&lt;br /&gt;
**séquence de 10 leds pour le niveau 10&lt;br /&gt;
*le joueur doit reproduire la séquence&lt;br /&gt;
*s'il gagne on augmente le niveau&lt;br /&gt;
*s'il perd on recommence au niveau 1&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond à ce cahier des charges}}&lt;br /&gt;
&lt;br /&gt;
'''Remarques'''&lt;br /&gt;
*attention, des boutons peuvent fonctionner difficilement sur le support&lt;br /&gt;
*il faut attendre quelques (30 par ex) ms après appui/relâchement des boutons pour éviter les rebonds (plusieurs appuis)&lt;br /&gt;
&lt;br /&gt;
L'algorithme suivant peut vous aider à écrire votre programme :&lt;br /&gt;
*broches en sortie&lt;br /&gt;
*répéter tout le temps&lt;br /&gt;
**répéter de 0 à niveau&lt;br /&gt;
***allumer la led en fonction du tableau de séquence&lt;br /&gt;
***attendre 500ms&lt;br /&gt;
**broches en entrée pas de pull-up&lt;br /&gt;
**variable sequenceOk à 1&lt;br /&gt;
**répéter de 0 à niveau&lt;br /&gt;
***attendre pas de bouton&lt;br /&gt;
***attendre qques ms&lt;br /&gt;
***attendre appui&lt;br /&gt;
***attendre qques ms&lt;br /&gt;
***trouver valeur de bp&lt;br /&gt;
***si mauvaise touche &lt;br /&gt;
****variable sequenceOk à 0&lt;br /&gt;
**broches en sortie&lt;br /&gt;
**si sequenceOk&lt;br /&gt;
***afficher gagner&lt;br /&gt;
***incrementer niveau&lt;br /&gt;
**sinon&lt;br /&gt;
***afficher perdu&lt;br /&gt;
***mettre niveau à 0&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Un peu de hasard}}=&lt;br /&gt;
&lt;br /&gt;
Il suffit maintenant de choisir de façon aléatoire le numéro de la led au lieu d'avoir une valeur prédéfinie.&lt;br /&gt;
&lt;br /&gt;
On utilisera pour cela le timer, qu'il suffira de démarrer et ensuite de lire sa valeur (avec un modulo !).&lt;br /&gt;
&lt;br /&gt;
Pour information, le TIMER0 est un timer 8 bits.&lt;br /&gt;
&lt;br /&gt;
Le tableau donne les valeurs et modes de comptage suivant l'état des bits CS0(0/1/2) du registre {{Rouge|TCCR0B}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! CS02 !! CS01 !! CS00 !! Mode !! Fréquence de comptage&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || Arrêt || Sans objet&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 1 || recopie de l'horloge || Fcpt = Fq&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 0 || %8 || Fcpt=Fq/8&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || %64 || Fcpt=Fq/64&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || %256 || Fcpt=Fq/256&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || %1024 || Fcpt=Fq/1024&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || Externe || Comptage sur front montant&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 1 || Externe || Comptage sur front descendant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
L'algorithme précédent est modifié de la sorte :&lt;br /&gt;
*lire la valeur du timer (TCNT0)&lt;br /&gt;
*écrire la valeur dans le tableau de séquence&lt;br /&gt;
*afficher la led correspondante&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications à votre programme}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Terminé ?}}=&lt;br /&gt;
&lt;br /&gt;
Parfait, vous avez un jeu qui fonctionne. Ne reste plus qu'à limiter la consommation lorsque l'on n'utilise plus le jeu.&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez des fonctions disponibles [http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html dans le fichier {{Rouge|avr/sleep.h}}] pour passer en économie d'énergie.&lt;br /&gt;
&lt;br /&gt;
Les différents modes sont détaillés [[media:Attiny10.pdf|Attiny10.pdf]] dans la partie 7. Le tableau donne la correspondance entre le mode de consommation et la valeur à utiliser dans les fonctions du fichier {{Rouge|avr/sleep.h}}.&lt;br /&gt;
&lt;br /&gt;
{{Cours:tabSleepMode}}&lt;br /&gt;
&lt;br /&gt;
Vous configurerez l'interruption associée au bouton poussoir, ce qui permettra de sortir du mode faible consommation. Pour gérer cette interruption, vous regarderez [[media:Attiny10.pdf|la documentation, parties 9.2 et 9.3]]. &lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Indication 1&amp;lt;/u&amp;gt;''' : Cette interruption '''INT0''' est utilisable pour les quatre modes  SLEEP_MODE_IDLE, SLEEP_MODE_ADC, SLEEP_MODE_STANDBY et  SLEEP_MODE_PWR_DOWN. Mais elle ne fonctionne que sur un changement de niveau pour les trois derniers modes ! Ne cherchez donc pas à détecter un front.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Indication 2&amp;lt;/u&amp;gt;''' : Le passage en mode économie d'énergie se fait à l'aide de deux instructions :&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
set_sleep_mode(SLEEP_MODE_IDLE); // sleep mode is set here&lt;br /&gt;
sleep_mode(); // le programme s'arrête&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Compléter votre programme pour placer votre µcontrôleur dans un mode d'économie d'énergie le plus élevé (plus faible consommation) possible.}}&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire_corrige&amp;diff=11540</id>
		<title>Cours:TPS 2103 tp jeuDeMemoire corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire_corrige&amp;diff=11540"/>
				<updated>2019-06-11T06:13:51Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11539 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_jeuDeMemoire|{{Vert|&amp;lt;big&amp;gt;'''Énoncé de TP'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|pas d'aléatoire}}=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//           +====+&lt;br /&gt;
//  PWMA/PB0 |*   | PB3 (RESET)&lt;br /&gt;
//       GND |    | Vcc&lt;br /&gt;
//  PWMB/PB1 |    | PB2 (CLKO)&lt;br /&gt;
//           +====+&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define niveauMax 10&lt;br /&gt;
unsigned char sequence [niveauMax]= {1,2,0,2,0,1,2,0,1,0};&lt;br /&gt;
&lt;br /&gt;
inline void gagne () __attribute__((always_inline));&lt;br /&gt;
inline void perdu () __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void gagne()&lt;br /&gt;
{&lt;br /&gt;
	for (uint8_t j=0;j&amp;lt;5;j++)&lt;br /&gt;
		for (uint8_t i=0;i&amp;lt;4;i++)&lt;br /&gt;
		{&lt;br /&gt;
			PORTB = ~(1&amp;lt;&amp;lt;i);&lt;br /&gt;
			_delay_ms(60);&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
void perdu()&lt;br /&gt;
{&lt;br /&gt;
	for (uint8_t j=0;j&amp;lt;10;j++)&lt;br /&gt;
	{&lt;br /&gt;
		PORTB ^= 0x0F;&lt;br /&gt;
		_delay_ms(60);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i=0,bp,niveau=1,seqOk=1;&lt;br /&gt;
  DDRB |= 0x0F;&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
	  for (i=0;i&amp;lt;niveau;i++)&lt;br /&gt;
	  {&lt;br /&gt;
		  PORTB = ~ (1&amp;lt;&amp;lt;sequence[i]);&lt;br /&gt;
		  _delay_ms(500);&lt;br /&gt;
	  }&lt;br /&gt;
	  DDRB=0;&lt;br /&gt;
	  PORTB=0;&lt;br /&gt;
	  seqOk=1;&lt;br /&gt;
	  for (i=0;i&amp;lt;niveau;i++)&lt;br /&gt;
	  {&lt;br /&gt;
		  while(PINB!=0x0F);&lt;br /&gt;
		  _delay_ms(30);&lt;br /&gt;
		  while(PINB==0x0F);&lt;br /&gt;
		  _delay_ms(30);&lt;br /&gt;
		  switch (PINB)&lt;br /&gt;
		  {&lt;br /&gt;
		  case 0b00001110 : bp=0;break;&lt;br /&gt;
		  case 0b00001101 : bp=1;break;&lt;br /&gt;
		  case 0b00001011 : bp=2;break;&lt;br /&gt;
		  case 0b00000111 : bp=3;break;&lt;br /&gt;
		  default : bp=4;break;&lt;br /&gt;
		  }&lt;br /&gt;
		  if (bp!=sequence[i]) seqOk=0;&lt;br /&gt;
	  }&lt;br /&gt;
	  DDRB=0x0F;&lt;br /&gt;
	  if (seqOk==1) {gagne();niveau++;}&lt;br /&gt;
	  else			{perdu();niveau=1;}&lt;br /&gt;
	  PORTB=0x0F;&lt;br /&gt;
	  _delay_ms(500);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire_corrige&amp;diff=11539</id>
		<title>Cours:TPS 2103 tp jeuDeMemoire corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire_corrige&amp;diff=11539"/>
				<updated>2019-06-11T06:13:02Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_jeuDeMemoire|{{Vert|&amp;lt;big&amp;gt;'''Énoncé de TP'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|pas d'aléatoire}}=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//           +====+&lt;br /&gt;
//  PWMA/PB0 |*   | PB3 (RESET)&lt;br /&gt;
//       GND |    | Vcc&lt;br /&gt;
//  PWMB/PB1 |    | PB2 (CLKO)&lt;br /&gt;
//           +====+&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define niveauMax 10&lt;br /&gt;
unsigned char sequence [niveauMax]= {1,2,0,2,0,1,2,0,1,0};&lt;br /&gt;
&lt;br /&gt;
inline void gagne () __attribute__((always_inline));&lt;br /&gt;
inline void perdu () __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void gagne()&lt;br /&gt;
{&lt;br /&gt;
	for (uint8_t j=0;j&amp;lt;5;j++)&lt;br /&gt;
		for (uint8_t i=0;i&amp;lt;4;i++)&lt;br /&gt;
		{&lt;br /&gt;
			PORTB = ~(1&amp;lt;&amp;lt;i);&lt;br /&gt;
			_delay_ms(60);&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
void perdu()&lt;br /&gt;
{&lt;br /&gt;
	for (uint8_t j=0;j&amp;lt;10;j++)&lt;br /&gt;
	{&lt;br /&gt;
		PORTB ^= 0x0F;&lt;br /&gt;
		_delay_ms(60);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  uint8_t i=0,bp,niveau=1,seqOk=1;&lt;br /&gt;
  DDRB |= 0x0F;&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
	  for (i=0;i&amp;lt;niveau;i++)&lt;br /&gt;
	  {&lt;br /&gt;
		  PORTB = ~ (1&amp;lt;&amp;lt;sequence[i]);&lt;br /&gt;
		  _delay_ms(500);&lt;br /&gt;
	  }&lt;br /&gt;
	  DDRB=0;&lt;br /&gt;
	  PORTB=0;&lt;br /&gt;
	  seqOk=1;&lt;br /&gt;
	  for (i=0;i&amp;lt;niveau;i++)&lt;br /&gt;
	  {&lt;br /&gt;
		  while(PINB!=0x0F);&lt;br /&gt;
		  _delay_ms(30);&lt;br /&gt;
		  while(PINB==0x0F);&lt;br /&gt;
		  _delay_ms(30);&lt;br /&gt;
		  switch (PINB)&lt;br /&gt;
		  {&lt;br /&gt;
		  case 0b00001110 : bp=0;break;&lt;br /&gt;
		  case 0b00001101 : bp=1;break;&lt;br /&gt;
		  case 0b00001011 : bp=2;break;&lt;br /&gt;
		  case 0b00000111 : bp=3;break;&lt;br /&gt;
		  default : bp=4;break;&lt;br /&gt;
		  }&lt;br /&gt;
		  if (bp!=sequence[i]) seqOk=0;&lt;br /&gt;
	  }&lt;br /&gt;
	  DDRB=0x0F;&lt;br /&gt;
	  if (seqOk==1) {gagne();niveau++;}&lt;br /&gt;
	  else			{perdu();niveau=1;}&lt;br /&gt;
	  PORTB=0x0F;&lt;br /&gt;
	  _delay_ms(500);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11538</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11538"/>
				<updated>2019-06-11T06:05:14Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11535 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire&amp;diff=11537</id>
		<title>Cours:TPS 2103 tp jeuDeMemoire</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire&amp;diff=11537"/>
				<updated>2019-06-11T06:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11534 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_jeuDeMemoire_corrige|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! Alimenter les programmateurs en 3.3V !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! pour utiliser les boutons !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! Mettre en 5v pour reprogrammer !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Principe de programmation et fusible}}=&lt;br /&gt;
&lt;br /&gt;
Le µcontrôleur utilisé est un attiny10, cadencé à 1MHz.&lt;br /&gt;
&lt;br /&gt;
Il convient de modifier les fusibles du µcontrôleur (configuration du composant : type d'horloge, mode de programmation, verrouillage ...)&lt;br /&gt;
&lt;br /&gt;
{{Todo|La valeur du fusible doit être : 0xFE}}&lt;br /&gt;
*soit graphiquement dans eclipse&lt;br /&gt;
*soit en ligne de commande&lt;br /&gt;
 avrdude -c avrisp2 -P usb -p t10 -U fuse:w:0xFE:m&lt;br /&gt;
&lt;br /&gt;
{{Rouge|Remarques :}} Une bonne base de programme est donné ci-dessous.&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//           +====+&lt;br /&gt;
//  PWMA/PB0 |*   | PB3 (RESET)&lt;br /&gt;
//       GND |    | Vcc&lt;br /&gt;
//  PWMB/PB1 |    | PB2 (CLKO)&lt;br /&gt;
//           +====+&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Explorons les sorties}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Schéma électrique}}==&lt;br /&gt;
&lt;br /&gt;
Les schémas suivants vous permettent :&lt;br /&gt;
*de comprendre sur quel état logique les leds s'allument&lt;br /&gt;
*de trouver la liste des sorties&lt;br /&gt;
*d'associer chaque led avec un numéro de patte&lt;br /&gt;
&lt;br /&gt;
[[Fichier:simonsay.png]]&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:ATTINY10-pinout.jpg]]&lt;br /&gt;
||&lt;br /&gt;
Le tableau donne la correspondance entre patte de sortie du µcontrôleur et position de(s) led(s) sur le dé :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| PB0 || haut || droite&lt;br /&gt;
|-&lt;br /&gt;
| PB1 || haut || gauche&lt;br /&gt;
|-&lt;br /&gt;
| PB2 || bas || gauche&lt;br /&gt;
|-&lt;br /&gt;
| PB3 || bas || droite&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Commandez les sorties}}==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, on demande à avoir le même état sur toutes les leds (allumées ou éteintes).&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui change l'état de toutes les leds toutes les secondes.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|générons une séquence}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'afficher une séquence sur les leds (led0 puis led3 puis led0 ....), on utilisera un tableau.&lt;br /&gt;
&lt;br /&gt;
Plus le niveau atteint sera élevé, plus la séquence sera longue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define niveauMax 10&lt;br /&gt;
unsigned char sequence [niveauMax]= {1,3,1,3,2,0...};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Utiliser ce tableau pour allumer successivement les leds dans l'ordre indiqué.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|motif gagné}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite générer une séquence particulière lorsque le joueur gagne :&lt;br /&gt;
&lt;br /&gt;
les leds s'allument successivement en &amp;quot;tournant&amp;quot; en rond (on fera plusieurs &amp;quot;tours&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
{{Question|Implémenter la fonction gagne, dont le prototype est donné ci-dessous :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
inline void gagne () __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void gagne()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|motif perdu}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite générer une séquence particulière lorsque le joueur perd :&lt;br /&gt;
&lt;br /&gt;
les leds s'allument toutes puis s'éteignent plusieurs fois.&lt;br /&gt;
&lt;br /&gt;
{{Question|Implémenter la fonction perdu, dont le prototype est donné ci-dessous :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
inline void perdu () __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void perdu()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Et l'entrée ?!}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Vous constaterez sur le schéma électrique que les broches du µcontrôleur sont partagées entre bouton et led.&lt;br /&gt;
&lt;br /&gt;
Il faudra donc modifier la valeur du registre DDRB lorsque l'on souhaitera observer l'état des boutons.&lt;br /&gt;
&lt;br /&gt;
On rappelle le rôle du registre PORTx suivant la valeur de DDRx :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! état d'un bit de DDRx !! rôle du bit de PORTx !! bit de PORTx à '0' !! bit de PORTx à '1'&lt;br /&gt;
|-&lt;br /&gt;
| '0' || Activer/Désactiver la résistance de PULL-UP || pas de PULL-UP || PULL-UP&lt;br /&gt;
|-&lt;br /&gt;
| '1' || Modifier l'état de la sortie || sortie à '0' || sortie à '1'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|Ici, pour que le bouton fonctionne correctement, il ne doit pas y avoir de résistance de PULL-UP activée.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Utilisons les boutons}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite dans un premier temps juste vérifier que les boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui attend qu'un bouton soit appuyé et alors affiche le motif &amp;quot;gagné&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarques :'''&lt;br /&gt;
*il est possible que certains boutons ne fonctionnent pas très bien sur le support de programmation !&lt;br /&gt;
*on attendra le relâchement de tous les boutons avant de recommencer.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Associons bouton et led}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif étant de reproduire la séquence générée sur les leds, il convient de regarder lequel des boutons est appuyé.&lt;br /&gt;
&lt;br /&gt;
Une variable bp devra correspondre au numéro du bouton appuyé. Il convient sans doute d'utiliser un &amp;quot;switch case&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{Question|Utiliser cette variable ch, et faire clignoter la led associée au bouton sur lequel on appuie.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Jeu de mémoire}}=&lt;br /&gt;
&lt;br /&gt;
Toutes les briques ou presque sont en place. Il ne manque qu'un peu d'aléatoire que nous ajouterons par la suite.&lt;br /&gt;
&lt;br /&gt;
Réexpliquons le principe du jeu :&lt;br /&gt;
*on affiche une séquence aléatoire dont la longueur correspond au niveau&lt;br /&gt;
**une seule led si niveau 1&lt;br /&gt;
**séquence de 2 leds pour le niveau 2&lt;br /&gt;
**séquence de 10 leds pour le niveau 10&lt;br /&gt;
*le joueur doit reproduire la séquence&lt;br /&gt;
*s'il gagne on augmente le niveau&lt;br /&gt;
*s'il perd on recommence au niveau 1&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond à ce cahier des charges}}&lt;br /&gt;
&lt;br /&gt;
'''Remarques'''&lt;br /&gt;
*attention, des boutons peuvent fonctionner difficilement sur le support&lt;br /&gt;
*il faut attendre quelques (30 par ex) ms après appui/relâchement des boutons pour éviter les rebonds (plusieurs appuis)&lt;br /&gt;
&lt;br /&gt;
L'algorithme suivant peut vous aider à écrire votre programme :&lt;br /&gt;
*broches en sortie&lt;br /&gt;
*répéter tout le temps&lt;br /&gt;
**répéter de 0 à niveau&lt;br /&gt;
***allumer la led en fonction du tableau de séquence&lt;br /&gt;
***attendre 500ms&lt;br /&gt;
**broches en entrée pas de pull-up&lt;br /&gt;
**variable sequenceOk à 1&lt;br /&gt;
**répéter de 0 à niveau&lt;br /&gt;
***attendre pas de bouton&lt;br /&gt;
***attendre qques ms&lt;br /&gt;
***attendre appui&lt;br /&gt;
***attendre qques ms&lt;br /&gt;
***trouver valeur de bp&lt;br /&gt;
***si mauvaise touche &lt;br /&gt;
****variable sequenceOk à 0&lt;br /&gt;
**broches en sortie&lt;br /&gt;
**si sequenceOk&lt;br /&gt;
***afficher gagner&lt;br /&gt;
***incrementer niveau&lt;br /&gt;
**sinon&lt;br /&gt;
***afficher perdu&lt;br /&gt;
***mettre niveau à 0&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Un peu de hasard}}=&lt;br /&gt;
&lt;br /&gt;
Il suffit maintenant de choisir de façon aléatoire le numéro de la led au lieu d'avoir une valeur prédéfinie.&lt;br /&gt;
&lt;br /&gt;
On utilisera pour cela le timer, qu'il suffira de démarrer et ensuite de lire sa valeur (avec un modulo !).&lt;br /&gt;
&lt;br /&gt;
Pour information, le TIMER0 est un timer 8 bits.&lt;br /&gt;
&lt;br /&gt;
Le tableau donne les valeurs et modes de comptage suivant l'état des bits CS0(0/1/2) du registre {{Rouge|TCCR0B}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! CS02 !! CS01 !! CS00 !! Mode !! Fréquence de comptage&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || Arrêt || Sans objet&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 1 || recopie de l'horloge || Fcpt = Fq&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 0 || %8 || Fcpt=Fq/8&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || %64 || Fcpt=Fq/64&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || %256 || Fcpt=Fq/256&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || %1024 || Fcpt=Fq/1024&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || Externe || Comptage sur front montant&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 1 || Externe || Comptage sur front descendant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
L'algorithme précédent est modifié de la sorte :&lt;br /&gt;
*lire la valeur du timer (TCNT0)&lt;br /&gt;
*écrire la valeur dans le tableau de séquence&lt;br /&gt;
*afficher la led correspondante&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications à votre programme}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Terminé ?}}=&lt;br /&gt;
&lt;br /&gt;
Parfait, vous avez un jeu qui fonctionne. Ne reste plus qu'à limiter la consommation lorsque l'on n'utilise plus le jeu.&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez des fonctions disponibles [http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html dans le fichier {{Rouge|avr/sleep.h}}] pour passer en économie d'énergie.&lt;br /&gt;
&lt;br /&gt;
Les différents modes sont détaillés [[media:Attiny10.pdf|Attiny10.pdf]] dans la partie 7. Le tableau donne la correspondance entre le mode de consommation et la valeur à utiliser dans les fonctions du fichier {{Rouge|avr/sleep.h}}.&lt;br /&gt;
&lt;br /&gt;
{{Cours:tabSleepMode}}&lt;br /&gt;
&lt;br /&gt;
Vous configurerez l'interruption associée au bouton poussoir, ce qui permettra de sortir du mode faible consommation. Pour gérer cette interruption, vous regarderez [[media:Attiny10.pdf|la documentation, parties 9.2 et 9.3]]. &lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Indication 1&amp;lt;/u&amp;gt;''' : Cette interruption '''INT0''' est utilisable pour les quatre modes  SLEEP_MODE_IDLE, SLEEP_MODE_ADC, SLEEP_MODE_STANDBY et  SLEEP_MODE_PWR_DOWN. Mais elle ne fonctionne que sur un changement de niveau pour les trois derniers modes ! Ne cherchez donc pas à détecter un front.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Indication 2&amp;lt;/u&amp;gt;''' : Le passage en mode économie d'énergie se fait à l'aide de deux instructions :&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
set_sleep_mode(SLEEP_MODE_IDLE); // sleep mode is set here&lt;br /&gt;
sleep_mode(); // le programme s'arrête&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Compléter votre programme pour placer votre µcontrôleur dans un mode d'économie d'énergie le plus élevé (plus faible consommation) possible.}}&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11536</id>
		<title>Cours:TPS 2103 tp mesureDeDistance</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11536"/>
				<updated>2019-06-11T06:04:43Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11533 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_mesureDeDistance_corr|{{Vert|&amp;lt;big&amp;gt;Les corrections sont en accès restreint&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoPinout.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Vert|&amp;lt;big&amp;gt;'''UNO sans arduino'''&amp;lt;/big&amp;gt; : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.}}&lt;br /&gt;
&lt;br /&gt;
{{Vert|Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.}}&lt;br /&gt;
&lt;br /&gt;
La programmation de la carte sera réalisée sur l'IDE {{Rouge|ECLIPSE}} et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|C'est parti !}}=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Usart atmega328.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :&lt;br /&gt;
*8 bits de données&lt;br /&gt;
*pas de parité&lt;br /&gt;
*1 bit de stop&lt;br /&gt;
*9600 bauds&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez :&lt;br /&gt;
*de la figure ci-contre&lt;br /&gt;
*[[media:atmega328p.pdf|de la documentation atmel, pages 190 et suivantes]]&lt;br /&gt;
&lt;br /&gt;
{{Question|En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle &amp;quot;alive&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void uart_putchar(char c)&lt;br /&gt;
{&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init()&lt;br /&gt;
{&lt;br /&gt;
  // a completer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     ....&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|HC-SR04}}=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez commencer par lire [[media:HCSR04.pdf|la documentation du module]].&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Trigger}}==&lt;br /&gt;
On souhaite faire une nouvelle mesure toutes les 100ms.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Fichier:AVRMega328 Timer1.png|thumb|500px|Documentation simple du Timer 1 (16 bits)]] || [[File:AVRMega328_Timer1_Comparaison.png|thumb|500px|center|La comparaison avec le Timer 1 (16 bits)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms}}&lt;br /&gt;
*Attention à bien&lt;br /&gt;
**autoriser l'interruption de comparaison : TIMSK1|=1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
**autoriser globalement les interruptions : sei()&lt;br /&gt;
**la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)&lt;br /&gt;
*Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Un oscilloscope sera nécessaire pour vérifier la forme du signal&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Echo}}==&lt;br /&gt;
&lt;br /&gt;
Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.&lt;br /&gt;
&lt;br /&gt;
Donc .... un autre timer ! Ce sera le timer2.&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir une précision au cm près :&lt;br /&gt;
&lt;br /&gt;
sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement}}&lt;br /&gt;
&lt;br /&gt;
On utilisera la broche INT0 pour le signal echo.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui :}}&lt;br /&gt;
*lance le timer1&lt;br /&gt;
*répète&lt;br /&gt;
**attendre que echo=1&lt;br /&gt;
**lancer timer2&lt;br /&gt;
**attendre que echo=0&lt;br /&gt;
**arrêter timer2&lt;br /&gt;
**envoie la distance sur la liaison série&lt;br /&gt;
**remettre la distance à 0&lt;br /&gt;
**remettre le timer à 0&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Visualisation de la distance}}=&lt;br /&gt;
&lt;br /&gt;
Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 !&lt;br /&gt;
[[File:TiemposServo.svg|TiemposServo]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Test du servo}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix}}&lt;br /&gt;
*la fréquence de MLI a assez peu d'importance&lt;br /&gt;
*on souhaite juste un déplacement du servomoteur entre 2 positions&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Couplage avec mesure de distance}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason}}&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=rTM5gZxBPmY Vidéo Youtube expliquant ce que l'on cherche à faire]&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11535</id>
		<title>Cours:TPS 2103 tp evitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_evitementObstacles&amp;diff=11535"/>
				<updated>2019-06-11T06:02:19Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_evitementObstacles_corr|{{Vert|&amp;lt;big&amp;gt;'''Correction avec accès restreint'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion des moteurs}}=&lt;br /&gt;
Dans un précédent TP, vous avez travaillé avec des [[Cours:TPS_2103_tp_miniqv2#moteur_.21|Utilitaires de gestion des moteurs]].&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Pour information&amp;lt;/u&amp;gt;''' : &lt;br /&gt;
* la marche avant du moteur gauche se fait en mettant à 0 '''PD6''' tandis que la marche arrière consiste à mettre '''PD6''' à 1&lt;br /&gt;
* la marche avant du moteur droit se fait en mettant à 0 '''PE6''' tandis que la marche arrière consiste à mettre '''PE6''' à 1&lt;br /&gt;
* les deux bits ci-dessus sont déjà configurés en sortie dans &amp;quot;void initMoteur()&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{{Question|Montrer que vous êtes capable de faire une marche avant, de tourner sur place d'environ 90° et de partir en marche arrière.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Gestion de l'infrarouge frontale}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Sont présents sur le robot, un détecteur infrarouge et deux émetteurs dirigés respectivement vers la droite et vers la gauche. Ils permettent de savoir si le nombre d'impulsions reçu (par écho) peut laisser penser à la présence d'un obstacle. Le détecteur est relié à INT0/PB0 et peut donc être géré par une interruption qui ne fera que compter le nombre d'impulsions reçu. A noter que cette interruption est incapable, par elle-même de savoir qui a émis, la droite ou la gauche.&lt;br /&gt;
&lt;br /&gt;
L'idée générale est donc d'envoyer un train d'impulsions en émission et de compter ce que l'on reçoit.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Récepteur}}==&lt;br /&gt;
&lt;br /&gt;
Il convient de configurer l'interruption de changement d'état associé à la broche '''PB0/PCINT0'''.&lt;br /&gt;
&lt;br /&gt;
Afin de faciliter la recherche de documentation, cette broche est associée à l'interruption PCI0 et ne nom de l'interruption est {{Rouge|PCINT0_vect}}.&lt;br /&gt;
&lt;br /&gt;
On utilisera la led pour tester la bonne configuration de l'interruption ([[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|cf tp précédent]]).&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide [[media:atmega32u4.pdf|de la documentation atmel, pages 91]], faire en sorte que la led s'allume à chaque réception}}&lt;br /&gt;
*on utilisera la télécommande pour émettre un signal&lt;br /&gt;
*on peut allumer la led dans l'interruption&lt;br /&gt;
*l'éteindre au bout d'un certain temps dans la boucle principale&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include ....&lt;br /&gt;
volatile uint8_t flag=0;&lt;br /&gt;
&lt;br /&gt;
ISR(PCINT0_vect)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
  // configuration de l'interruption&lt;br /&gt;
&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ça marche .... on souhaite maintenant qu'un compteur s'incrémente à chaque interruption.&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications nécessaires}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Émetteur}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le robot dispose de 2 émetteurs infrarouges dont le tableau suivant donne les informations importantes :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Patte !! Timer&lt;br /&gt;
|-&lt;br /&gt;
| Droite || PB4 || ----&lt;br /&gt;
|-&lt;br /&gt;
| Gauche || PC7 || OC4A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Les deux émetteurs sont pilotés à 38 kHz. Si vous suivez, il va falloir de nouveau configurer un timer pour cela ! Le tableau ci-dessus pourrait laisser penser qu'il faut prendre le timer 4, mais on rappelle que l'on utilise déjà ce timer pour la MLI des moteurs. On décide de prendre le TIMER0. &lt;br /&gt;
&lt;br /&gt;
On rappelle que l'on aura besoin de code à travers une interruption pour basculer '''PB4''' et '''PC7''' puisqu'ils ne sont reliés à aucun '''OC0X'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|émetteurs et Timer0}}===&lt;br /&gt;
&lt;br /&gt;
[[File:AVR_Timer0_comp.png|thumb|250px|La comparaison avec le timer 0]]&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser le mode comparaison du timer0 afin d'obtenir une fréquence très précise d'émission de 38kHz.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir des valeurs de prédiviseur et de comparaison permettant d'obtenir une fréquence de comparaison de 76kHz}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter la configuration du timer a votre programme avec un sous-programme :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setTIMER0_interrupt_ctc()&lt;br /&gt;
{&lt;br /&gt;
  // set PB4 and PC7 as output&lt;br /&gt;
&lt;br /&gt;
  // choix du prédiviseur&lt;br /&gt;
&lt;br /&gt;
  // mode remise à zéro sur comparaison (mode CTC = (010) contrairement à la figure !!!&lt;br /&gt;
&lt;br /&gt;
  // valeur de OCR0A&lt;br /&gt;
&lt;br /&gt;
  // autorisation de l'interruption de comparaison (bit OCIE0A du registre TIMSK0) &lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Ajouter l'interruption de comparaison associée a votre programme. N'oubliez pas que cette interruption doit émettre soit du côté droit soit du côté gauche. Il faudra donc lui associer une variable globale &amp;quot;volatile uint8_t left;&amp;quot; qui conditionnera si l'émission se fait à droite ou à gauche. Par exemple :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile uint8_t left=0;&lt;br /&gt;
ISR(TIMER0_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  if (left)&lt;br /&gt;
    // émettre à gauche&lt;br /&gt;
  else&lt;br /&gt;
   //.....?????&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
A ce point, il faut bien comprendre ce que l'on est capable de faire :&lt;br /&gt;
* un sei() dans le programme principal déclenchera automatiquement une émission à droite ou à gauche (suivant la valeur de la variable &amp;quot;left&amp;quot;).&lt;br /&gt;
* par conséquent l'interruption &amp;quot;ISR(PCINT0_vect)&amp;quot; comptera toujours les éventuels échos.&lt;br /&gt;
* si vous voulez arrêter d'émettre il vous faudra soit réaliser un cli() (déconseillé) soit désactiver l'interruption ISR(TIMER0_COMPA_vect) avec le bit '''OCIE0A''' du registre '''TIMSK0'''.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Émission droite/gauche}}===&lt;br /&gt;
&lt;br /&gt;
Pour commencer on utilisera les primitives &amp;quot;_delay_us()&amp;quot; pour attendre quelques microsecondes.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 0&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur droit en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On doit faire la même chose avec l'émission à gauche.&lt;br /&gt;
&lt;br /&gt;
* left &amp;lt;- 1&lt;br /&gt;
* count &amp;lt;- 0&lt;br /&gt;
*Répéter 20 fois :&lt;br /&gt;
**Émettre pendant 300us sur l'émetteur gauche en autorisant l'interruption de comparaison&lt;br /&gt;
**Arrêter d'émettre : on coupe l'émission pendant 600 us &lt;br /&gt;
*Lire valeur du compteur de réception.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui : }}&lt;br /&gt;
*éteint la led lorsqu'il n'y a pas d'obstacles&lt;br /&gt;
*allume en vert si obstacle à droite&lt;br /&gt;
*allume en bleu si obstacle à gauche&lt;br /&gt;
*allume en rouge si obstacle à droite et à gauche&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' :&lt;br /&gt;
*Vous pouvez/devez utiliser [[Cours:TPS_2103_tp_miniqv2#D.C3.A9bogage|les fonctions disponibles pour la LED RGB]]&lt;br /&gt;
*Un seuil de 20 est satisfaisant pour la valeur de comptage lors de la présence d'un obstacle&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Évitement d'obstacles}}=&lt;br /&gt;
&lt;br /&gt;
Vous allez maintenant faire fonctionner en même temps le calcul des échos de la deuxième section avec la gestion des moteurs de la première section.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond au cahier des charges suivant :}}&lt;br /&gt;
&lt;br /&gt;
*Boucler&lt;br /&gt;
**le robot avance en ligne droite&lt;br /&gt;
**s'il y a un obstacle à droite (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la gauche&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;br /&gt;
**s'il y a un obstacle à gauche (count &amp;gt;20 par ex) alors&lt;br /&gt;
***reculer&lt;br /&gt;
***tourner sur place vers la droite&lt;br /&gt;
***reprendre la ligne droite en marche avant&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire&amp;diff=11534</id>
		<title>Cours:TPS 2103 tp jeuDeMemoire</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_jeuDeMemoire&amp;diff=11534"/>
				<updated>2019-06-11T06:02:10Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_jeuDeMemoire_corrige|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! Alimenter les programmateurs en 3.3V !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! pour utiliser les boutons !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!! Mettre en 5v pour reprogrammer !!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|&amp;lt;big&amp;gt;'''!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'''&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Principe de programmation et fusible}}=&lt;br /&gt;
&lt;br /&gt;
Le µcontrôleur utilisé est un attiny10, cadencé à 1MHz.&lt;br /&gt;
&lt;br /&gt;
Il convient de modifier les fusibles du µcontrôleur (configuration du composant : type d'horloge, mode de programmation, verrouillage ...)&lt;br /&gt;
&lt;br /&gt;
{{Todo|La valeur du fusible doit être : 0xFE}}&lt;br /&gt;
*soit graphiquement dans eclipse&lt;br /&gt;
*soit en ligne de commande&lt;br /&gt;
 avrdude -c avrisp2 -P usb -p t10 -U fuse:w:0xFE:m&lt;br /&gt;
&lt;br /&gt;
{{Rouge|Remarques :}} Une bonne base de programme est donné ci-dessous.&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
//           +====+&lt;br /&gt;
//  PWMA/PB0 |*   | PB3 (RESET)&lt;br /&gt;
//       GND |    | Vcc&lt;br /&gt;
//  PWMB/PB1 |    | PB2 (CLKO)&lt;br /&gt;
//           +====+&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Explorons les sorties}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Schéma électrique}}==&lt;br /&gt;
&lt;br /&gt;
Les schémas suivants vous permettent :&lt;br /&gt;
*de comprendre sur quel état logique les leds s'allument&lt;br /&gt;
*de trouver la liste des sorties&lt;br /&gt;
*d'associer chaque led avec un numéro de patte&lt;br /&gt;
&lt;br /&gt;
[[Fichier:simonsay.png]]&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:ATTINY10-pinout.jpg]]&lt;br /&gt;
||&lt;br /&gt;
Le tableau donne la correspondance entre patte de sortie du µcontrôleur et position de(s) led(s) sur le dé :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| PB0 || haut || droite&lt;br /&gt;
|-&lt;br /&gt;
| PB1 || haut || gauche&lt;br /&gt;
|-&lt;br /&gt;
| PB2 || bas || gauche&lt;br /&gt;
|-&lt;br /&gt;
| PB3 || bas || droite&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Commandez les sorties}}==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, on demande à avoir le même état sur toutes les leds (allumées ou éteintes).&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui change l'état de toutes les leds toutes les secondes.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|générons une séquence}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'afficher une séquence sur les leds (led0 puis led3 puis led0 ....), on utilisera un tableau.&lt;br /&gt;
&lt;br /&gt;
Plus le niveau atteint sera élevé, plus la séquence sera longue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define niveauMax 10&lt;br /&gt;
unsigned char sequence [niveauMax]= {1,3,1,3,2,0...};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Utiliser ce tableau pour allumer successivement les leds dans l'ordre indiqué.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|motif gagné}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite générer une séquence particulière lorsque le joueur gagne :&lt;br /&gt;
&lt;br /&gt;
les leds s'allument successivement en &amp;quot;tournant&amp;quot; en rond (on fera plusieurs &amp;quot;tours&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
{{Question|Implémenter la fonction gagne, dont le prototype est donné ci-dessous :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
inline void gagne () __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void gagne()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|motif perdu}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite générer une séquence particulière lorsque le joueur perd :&lt;br /&gt;
&lt;br /&gt;
les leds s'allument toutes puis s'éteignent plusieurs fois.&lt;br /&gt;
&lt;br /&gt;
{{Question|Implémenter la fonction perdu, dont le prototype est donné ci-dessous :}}&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
inline void perdu () __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void perdu()&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Et l'entrée ?!}}=&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Principe}}==&lt;br /&gt;
&lt;br /&gt;
Vous constaterez sur le schéma électrique que les broches du µcontrôleur sont partagées entre bouton et led.&lt;br /&gt;
&lt;br /&gt;
Il faudra donc modifier la valeur du registre DDRB lorsque l'on souhaitera observer l'état des boutons.&lt;br /&gt;
&lt;br /&gt;
On rappelle le rôle du registre PORTx suivant la valeur de DDRx :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! état d'un bit de DDRx !! rôle du bit de PORTx !! bit de PORTx à '0' !! bit de PORTx à '1'&lt;br /&gt;
|-&lt;br /&gt;
| '0' || Activer/Désactiver la résistance de PULL-UP || pas de PULL-UP || PULL-UP&lt;br /&gt;
|-&lt;br /&gt;
| '1' || Modifier l'état de la sortie || sortie à '0' || sortie à '1'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|Ici, pour que le bouton fonctionne correctement, il ne doit pas y avoir de résistance de PULL-UP activée.}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Utilisons les boutons}}==&lt;br /&gt;
&lt;br /&gt;
On souhaite dans un premier temps juste vérifier que les boutons fonctionnent.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui attend qu'un bouton soit appuyé et alors affiche le motif &amp;quot;gagné&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarques :'''&lt;br /&gt;
*il est possible que certains boutons ne fonctionnent pas très bien sur le support de programmation !&lt;br /&gt;
*on attendra le relâchement de tous les boutons avant de recommencer.&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Associons bouton et led}}==&lt;br /&gt;
&lt;br /&gt;
L'objectif étant de reproduire la séquence générée sur les leds, il convient de regarder lequel des boutons est appuyé.&lt;br /&gt;
&lt;br /&gt;
Une variable bp devra correspondre au numéro du bouton appuyé. Il convient sans doute d'utiliser un &amp;quot;switch case&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{{Question|Utiliser cette variable ch, et faire clignoter la led associée au bouton sur lequel on appuie.}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Jeu de mémoire}}=&lt;br /&gt;
&lt;br /&gt;
Toutes les briques ou presque sont en place. Il ne manque qu'un peu d'aléatoire que nous ajouterons par la suite.&lt;br /&gt;
&lt;br /&gt;
Réexpliquons le principe du jeu :&lt;br /&gt;
*on affiche une séquence aléatoire dont la longueur correspond au niveau&lt;br /&gt;
**une seule led si niveau 1&lt;br /&gt;
**séquence de 2 leds pour le niveau 2&lt;br /&gt;
**séquence de 10 leds pour le niveau 10&lt;br /&gt;
*le joueur doit reproduire la séquence&lt;br /&gt;
*s'il gagne on augmente le niveau&lt;br /&gt;
*s'il perd on recommence au niveau 1&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui répond à ce cahier des charges}}&lt;br /&gt;
&lt;br /&gt;
'''Remarques'''&lt;br /&gt;
*attention, des boutons peuvent fonctionner difficilement sur le support&lt;br /&gt;
*il faut attendre quelques (30 par ex) ms après appui/relâchement des boutons pour éviter les rebonds (plusieurs appuis)&lt;br /&gt;
&lt;br /&gt;
L'algorithme suivant peut vous aider à écrire votre programme :&lt;br /&gt;
*broches en sortie&lt;br /&gt;
*répéter tout le temps&lt;br /&gt;
**répéter de 0 à niveau&lt;br /&gt;
***allumer la led en fonction du tableau de séquence&lt;br /&gt;
***attendre 500ms&lt;br /&gt;
**broches en entrée pas de pull-up&lt;br /&gt;
**variable sequenceOk à 1&lt;br /&gt;
**répéter de 0 à niveau&lt;br /&gt;
***attendre pas de bouton&lt;br /&gt;
***attendre qques ms&lt;br /&gt;
***attendre appui&lt;br /&gt;
***attendre qques ms&lt;br /&gt;
***trouver valeur de bp&lt;br /&gt;
***si mauvaise touche &lt;br /&gt;
****variable sequenceOk à 0&lt;br /&gt;
**broches en sortie&lt;br /&gt;
**si sequenceOk&lt;br /&gt;
***afficher gagner&lt;br /&gt;
***incrementer niveau&lt;br /&gt;
**sinon&lt;br /&gt;
***afficher perdu&lt;br /&gt;
***mettre niveau à 0&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Un peu de hasard}}=&lt;br /&gt;
&lt;br /&gt;
Il suffit maintenant de choisir de façon aléatoire le numéro de la led au lieu d'avoir une valeur prédéfinie.&lt;br /&gt;
&lt;br /&gt;
On utilisera pour cela le timer, qu'il suffira de démarrer et ensuite de lire sa valeur (avec un modulo !).&lt;br /&gt;
&lt;br /&gt;
Pour information, le TIMER0 est un timer 8 bits.&lt;br /&gt;
&lt;br /&gt;
Le tableau donne les valeurs et modes de comptage suivant l'état des bits CS0(0/1/2) du registre {{Rouge|TCCR0B}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! CS02 !! CS01 !! CS00 !! Mode !! Fréquence de comptage&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 0 || Arrêt || Sans objet&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || 1 || recopie de l'horloge || Fcpt = Fq&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 0 || %8 || Fcpt=Fq/8&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || 1 || %64 || Fcpt=Fq/64&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 0 || %256 || Fcpt=Fq/256&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 || 1 || %1024 || Fcpt=Fq/1024&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 0 || Externe || Comptage sur front montant&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 1 || 1 || Externe || Comptage sur front descendant&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
L'algorithme précédent est modifié de la sorte :&lt;br /&gt;
*lire la valeur du timer (TCNT0)&lt;br /&gt;
*écrire la valeur dans le tableau de séquence&lt;br /&gt;
*afficher la led correspondante&lt;br /&gt;
&lt;br /&gt;
{{Question|Apporter les modifications à votre programme}}&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Terminé ?}}=&lt;br /&gt;
&lt;br /&gt;
Parfait, vous avez un jeu qui fonctionne. Ne reste plus qu'à limiter la consommation lorsque l'on n'utilise plus le jeu.&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez des fonctions disponibles [http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html dans le fichier {{Rouge|avr/sleep.h}}] pour passer en économie d'énergie.&lt;br /&gt;
&lt;br /&gt;
Les différents modes sont détaillés [[media:Attiny10.pdf|Attiny10.pdf]] dans la partie 7. Le tableau donne la correspondance entre le mode de consommation et la valeur à utiliser dans les fonctions du fichier {{Rouge|avr/sleep.h}}.&lt;br /&gt;
&lt;br /&gt;
{{Cours:tabSleepMode}}&lt;br /&gt;
&lt;br /&gt;
Vous configurerez l'interruption associée au bouton poussoir, ce qui permettra de sortir du mode faible consommation. Pour gérer cette interruption, vous regarderez [[media:Attiny10.pdf|la documentation, parties 9.2 et 9.3]]. &lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Indication 1&amp;lt;/u&amp;gt;''' : Cette interruption '''INT0''' est utilisable pour les quatre modes  SLEEP_MODE_IDLE, SLEEP_MODE_ADC, SLEEP_MODE_STANDBY et  SLEEP_MODE_PWR_DOWN. Mais elle ne fonctionne que sur un changement de niveau pour les trois derniers modes ! Ne cherchez donc pas à détecter un front.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Indication 2&amp;lt;/u&amp;gt;''' : Le passage en mode économie d'énergie se fait à l'aide de deux instructions :&lt;br /&gt;
&amp;lt;source lang=C&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
....&lt;br /&gt;
set_sleep_mode(SLEEP_MODE_IDLE); // sleep mode is set here&lt;br /&gt;
sleep_mode(); // le programme s'arrête&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Compléter votre programme pour placer votre µcontrôleur dans un mode d'économie d'énergie le plus élevé (plus faible consommation) possible.}}&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11533</id>
		<title>Cours:TPS 2103 tp mesureDeDistance</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11533"/>
				<updated>2019-06-11T06:02:00Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_mesureDeDistance_corr|{{Vert|&amp;lt;big&amp;gt;Les corrections sont en accès restreint&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoPinout.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Vert|&amp;lt;big&amp;gt;'''UNO sans arduino'''&amp;lt;/big&amp;gt; : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.}}&lt;br /&gt;
&lt;br /&gt;
{{Vert|Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.}}&lt;br /&gt;
&lt;br /&gt;
La programmation de la carte sera réalisée sur l'IDE {{Rouge|ECLIPSE}} et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|C'est parti !}}=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Usart atmega328.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :&lt;br /&gt;
*8 bits de données&lt;br /&gt;
*pas de parité&lt;br /&gt;
*1 bit de stop&lt;br /&gt;
*9600 bauds&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez :&lt;br /&gt;
*de la figure ci-contre&lt;br /&gt;
*[[media:atmega328p.pdf|de la documentation atmel, pages 190 et suivantes]]&lt;br /&gt;
&lt;br /&gt;
{{Question|En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle &amp;quot;alive&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void uart_putchar(char c)&lt;br /&gt;
{&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init()&lt;br /&gt;
{&lt;br /&gt;
  // a completer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     ....&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|HC-SR04}}=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez commencer par lire [[media:HCSR04.pdf|la documentation du module]].&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Trigger}}==&lt;br /&gt;
On souhaite faire une nouvelle mesure toutes les 100ms.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Fichier:AVRMega328 Timer1.png|thumb|500px|Documentation simple du Timer 1 (16 bits)]] || [[File:AVRMega328_Timer1_Comparaison.png|thumb|500px|center|La comparaison avec le Timer 1 (16 bits)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms}}&lt;br /&gt;
*Attention à bien&lt;br /&gt;
**autoriser l'interruption de comparaison : TIMSK1|=1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
**autoriser globalement les interruptions : sei()&lt;br /&gt;
**la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)&lt;br /&gt;
*Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Un oscilloscope sera nécessaire pour vérifier la forme du signal&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Echo}}==&lt;br /&gt;
&lt;br /&gt;
Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.&lt;br /&gt;
&lt;br /&gt;
Donc .... un autre timer ! Ce sera le timer2.&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir une précision au cm près :&lt;br /&gt;
&lt;br /&gt;
sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement}}&lt;br /&gt;
&lt;br /&gt;
On utilisera la broche INT0 pour le signal echo.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui :}}&lt;br /&gt;
*lance le timer1&lt;br /&gt;
*répète&lt;br /&gt;
**attendre que echo=1&lt;br /&gt;
**lancer timer2&lt;br /&gt;
**attendre que echo=0&lt;br /&gt;
**arrêter timer2&lt;br /&gt;
**envoie la distance sur la liaison série&lt;br /&gt;
**remettre la distance à 0&lt;br /&gt;
**remettre le timer à 0&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Visualisation de la distance}}=&lt;br /&gt;
&lt;br /&gt;
Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 !&lt;br /&gt;
[[File:TiemposServo.svg|TiemposServo]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Test du servo}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix}}&lt;br /&gt;
*la fréquence de MLI a assez peu d'importance&lt;br /&gt;
*on souhaite juste un déplacement du servomoteur entre 2 positions&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Couplage avec mesure de distance}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason}}&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=rTM5gZxBPmY Vidéo Youtube expliquant ce que l'on cherche à faire]&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11532</id>
		<title>Cours:TPS 2103 tp mesureDeDistance</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11532"/>
				<updated>2019-06-11T05:32:58Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : Annulation des modifications 11531 de Ech-01 (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_mesureDeDistance_corr|{{Vert|&amp;lt;big&amp;gt;Les corrections sont en accès restreint&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoPinout.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Vert|&amp;lt;big&amp;gt;'''UNO sans arduino'''&amp;lt;/big&amp;gt; : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.}}&lt;br /&gt;
&lt;br /&gt;
{{Vert|Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.}}&lt;br /&gt;
&lt;br /&gt;
La programmation de la carte sera réalisée sur l'IDE {{Rouge|ECLIPSE}} et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|C'est parti !}}=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Usart atmega328.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :&lt;br /&gt;
*8 bits de données&lt;br /&gt;
*pas de parité&lt;br /&gt;
*1 bit de stop&lt;br /&gt;
*9600 bauds&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez :&lt;br /&gt;
*de la figure ci-contre&lt;br /&gt;
*[[media:atmega328p.pdf|de la documentation atmel, pages 190 et suivantes]]&lt;br /&gt;
&lt;br /&gt;
{{Question|En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle &amp;quot;alive&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void uart_putchar(char c)&lt;br /&gt;
{&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init()&lt;br /&gt;
{&lt;br /&gt;
  // a completer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     ....&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|HC-SR04}}=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez commencer par lire [[media:HCSR04.pdf|la documentation du module]].&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Trigger}}==&lt;br /&gt;
On souhaite faire une nouvelle mesure toutes les 100ms.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Fichier:AVRMega328 Timer1.png|thumb|500px|Documentation simple du Timer 1 (16 bits)]] || [[File:AVRMega328_Timer1_Comparaison.png|thumb|500px|center|La comparaison avec le Timer 1 (16 bits)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms}}&lt;br /&gt;
*Attention à bien&lt;br /&gt;
**autoriser l'interruption de comparaison : TIMSK1|=1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
**autoriser globalement les interruptions : sei()&lt;br /&gt;
**la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)&lt;br /&gt;
*Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Un oscilloscope sera nécessaire pour vérifier la forme du signal&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Echo}}==&lt;br /&gt;
&lt;br /&gt;
Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.&lt;br /&gt;
&lt;br /&gt;
Donc .... un autre timer ! Ce sera le timer2.&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir une précision au cm près :&lt;br /&gt;
&lt;br /&gt;
sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement}}&lt;br /&gt;
&lt;br /&gt;
On utilisera la broche INT0 pour le signal echo.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui :}}&lt;br /&gt;
*lance le timer1&lt;br /&gt;
*répète&lt;br /&gt;
**attendre que echo=1&lt;br /&gt;
**lancer timer2&lt;br /&gt;
**attendre que echo=0&lt;br /&gt;
**arrêter timer2&lt;br /&gt;
**envoie la distance sur la liaison série&lt;br /&gt;
**remettre la distance à 0&lt;br /&gt;
**remettre le timer à 0&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Visualisation de la distance}}=&lt;br /&gt;
&lt;br /&gt;
Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 !&lt;br /&gt;
[[File:TiemposServo.svg|TiemposServo]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Test du servo}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix}}&lt;br /&gt;
*la fréquence de MLI a assez peu d'importance&lt;br /&gt;
*on souhaite juste un déplacement du servomoteur entre 2 positions&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Couplage avec mesure de distance}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason}}&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=rTM5gZxBPmY Vidéo Youtube expliquant ce que l'on cherche à faire]&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11531</id>
		<title>Cours:TPS 2103 tp mesureDeDistance</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_mesureDeDistance&amp;diff=11531"/>
				<updated>2019-06-11T05:31:17Z</updated>
		
		<summary type="html">&lt;p&gt;Ech-01 : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_mesureDeDistance_corr|{{Vert|&amp;lt;big&amp;gt;Les corrections sont en accès restreint&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoPinout.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Vert|&amp;lt;big&amp;gt;'''UNO sans arduino'''&amp;lt;/big&amp;gt; : par commodité, nous utiliserons une carte arduino UNO pour programmer un ATMEGA328p.}}&lt;br /&gt;
&lt;br /&gt;
{{Vert|Cependant, nous n'utiliserons ni la librairie arduino, ni le logiciel dédié.}}&lt;br /&gt;
&lt;br /&gt;
La programmation de la carte sera réalisée sur l'IDE {{Rouge|ECLIPSE}} et nous utiliserons la librairie avr-libc (avr/io.h, util/delay.h ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est ici de faire une mesure de distance et d'afficher cette mesure à l'aide d'un curseur qui sera positionné sur un servomoteur.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
={{Rouge|C'est parti !}}=&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Usart atmega328.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour simplifier débogage et mise au point, vous allez configurer la liaison série avec les caractéristiques suivantes :&lt;br /&gt;
*8 bits de données&lt;br /&gt;
*pas de parité&lt;br /&gt;
*1 bit de stop&lt;br /&gt;
*9600 bauds&lt;br /&gt;
&lt;br /&gt;
Vous vous servirez :&lt;br /&gt;
*de la figure ci-contre&lt;br /&gt;
*[[media:atmega328p.pdf|de la documentation atmel, pages 190 et suivantes]]&lt;br /&gt;
&lt;br /&gt;
{{Question|En utilisant les fonctions uart_putchar et uart_init, écrire un programme qui envoie en boucle &amp;quot;alive&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void uart_putchar(char c)&lt;br /&gt;
{&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */&lt;br /&gt;
    UDR0 = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void uart_init()&lt;br /&gt;
{&lt;br /&gt;
  // a completer&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ....&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     ....&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
={{Rouge|HC-SR04}}=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez commencer par lire [[media:HCSR04.pdf|la documentation du module]].&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Trigger}}==&lt;br /&gt;
On souhaite faire une nouvelle mesure toutes les 100ms.&lt;br /&gt;
&lt;br /&gt;
Pour effectuer cette action répétitive, il convient d'utiliser un timer. Ce sera le timer1.&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| [[Fichier:AVRMega328 Timer1.png|thumb|500px|Documentation simple du Timer 1 (16 bits)]] || [[File:AVRMega328_Timer1_Comparaison.png|thumb|500px|center|La comparaison avec le Timer 1 (16 bits)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez ce timer en mode CTC pour générer une interruption de comparaison toutes les 100ms}}&lt;br /&gt;
*Attention à bien&lt;br /&gt;
**autoriser l'interruption de comparaison : TIMSK1|=1&amp;lt;&amp;lt;OCIE1A&lt;br /&gt;
**autoriser globalement les interruptions : sei()&lt;br /&gt;
**la fonction d'interruption sera définie par : ISR(TIMER1_COMPA_vect)&lt;br /&gt;
*Utiliser la led de la carte arduino (PB5) pour vérifier le bon fonctionnement&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre interruption pour générer le signal Trigger en respectant la durée indiquée dans la datasheet}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Un oscilloscope sera nécessaire pour vérifier la forme du signal&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Echo}}==&lt;br /&gt;
&lt;br /&gt;
Bien, nous pouvons maintenant nous intéresser au signal echo, dont il vous faudra mesurer la durée.&lt;br /&gt;
&lt;br /&gt;
Donc .... un autre timer ! Ce sera le timer2.&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir une précision au cm près :&lt;br /&gt;
&lt;br /&gt;
sachant que t(uS)/58 = d(cm), chaque 58µs correspond donc à 1cm.&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurer ce timer pour qu'il déborde toutes les 58µs, et incrémente une variable distance à chaque interruption de débordement}}&lt;br /&gt;
&lt;br /&gt;
On utilisera la broche INT0 pour le signal echo.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui :}}&lt;br /&gt;
*lance le timer1&lt;br /&gt;
*répète&lt;br /&gt;
**attendre que echo=1&lt;br /&gt;
**lancer timer2&lt;br /&gt;
**attendre que echo=0&lt;br /&gt;
**arrêter timer2&lt;br /&gt;
**envoie la distance sur la liaison série&lt;br /&gt;
**remettre la distance à 0&lt;br /&gt;
**remettre le timer à 0&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Visualisation de la distance}}=&lt;br /&gt;
&lt;br /&gt;
Entre en jeu le servomoteur et sa mli .... et donc le dernier timer disponible : timer0 !&lt;br /&gt;
[[File:TiemposServo.svg|TiemposServo]]&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Test du servo}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Configurez le timer0 pour générer une MLI sur OCR0A ou OCR0B au choix}}&lt;br /&gt;
*la fréquence de MLI a assez peu d'importance&lt;br /&gt;
*on souhaite juste un déplacement du servomoteur entre 2 positions&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Couplage avec mesure de distance}}==&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que la position du servomoteur indique la distance mesurée par le capteur ultrason}}&lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/watch?v=rTM5gZxBPmY Vidéo Youtube expliquant ce que l'on cherche à faire]&lt;/div&gt;</summary>
		<author><name>Ech-01</name></author>	</entry>

	</feed>