Cours:TDs 2103 : Différence entre versions
m (→Indication) |
m (→Exercice 1) |
||
Ligne 31 : | Ligne 31 : | ||
==Exercice 1== | ==Exercice 1== | ||
− | + | ===Question 1 === | |
+ | Le site : [http://www.piclist.com/techref/language/ccpp/convertbase.htm convert base] vous propose un algorithme de division par 10 que voici : | ||
<source lang=C> | <source lang=C> | ||
unsigned int A; | unsigned int A; | ||
Ligne 41 : | Ligne 42 : | ||
</source> | </source> | ||
Sans chercher à comprendre l'algorithme de division, on vous demande de le transformer en une fonction unsigned int div10(unsigned int A); | Sans chercher à comprendre l'algorithme de division, on vous demande de le transformer en une fonction unsigned int div10(unsigned int A); | ||
− | ===Indication=== | + | ====Indication==== |
<source lang=c> | <source lang=c> | ||
unsigned int div10(unsigned int A){ | unsigned int div10(unsigned int A){ | ||
Ligne 47 : | Ligne 48 : | ||
} | } | ||
</source> | </source> | ||
− | + | Ne pas chercher à réaliser un test pour le moment mais réaliser une compilation pour retirer les fautes de syntaxe. | |
+ | ===Question 2=== | ||
+ | Les LEDs du shield maison sont couplées à un arduino UNO. Écrire un sous-programme capable d'afficher un nombre sur 8 bits sur les LEDs. Réaliser un programme de test. | ||
− | ===Indication=== | + | ====Indication==== |
Voici ce que l'on demande de faire : | Voici ce que l'on demande de faire : | ||
<source lang="c"> | <source lang="c"> | ||
Ligne 58 : | Ligne 61 : | ||
</source> | </source> | ||
− | + | ===Question 3=== | |
+ | Écrire un programme complet qui mesure le temps d'exécution du sous programme de division par 10 avec le timer 0, puis modifier le programme pour qu'il puisse comparer avec une division par 10 normale. On pourra utiliser un front montant sur le bouton A pour choisir le type de division réalisé. | ||
+ | ====Indication==== | ||
+ | La mise au point peut être longue pour choisir correctement le nombre de boucles de calculs nécessaires pour avoir une affichage correct sur 8 bits. | ||
+ | ===Question 4=== | ||
+ | Modifier le programme de la question 3 pour qu'au lieu d'afficher sur des LEDs, l'affichage se fasse par la liaison série. On prendra soin d'afficher en même temps le type d'algorithme utilisé en même temps que la durée. On pourra améliorer l'affichage en affichant la durée en ms. |
Version du 6 octobre 2014 à 10:01
Nous allons mettre dans cette série de TDs un ensemble de travaux réalisés en groupes de TD mais en salle informatique.
Sommaire
Initiation au timer 0
Notre objectif est de reprendre un exercice de TD et de le réaliser de manière plus complète.
Rappel de la documentation du timer 0
La documentation officielle du timer 0 fait 10 pages. Nous utilisons quant à nous une série de dessins résumant le fonctionnement de certaines parties.
Voici un premier dessin :
Rappel de la documentation du shield utilisé
Puisque nous allons utiliser les LEDs pour afficher une valeur binaire sur 8 bits, voici la documentation correspondante :
Numéro | f5 | f4 | f3 | f2 | f1 | f0 | p1 | p0 |
---|---|---|---|---|---|---|---|---|
Couleur | r | o | v | r | o | v | v | r |
Arduino Pin | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 |
Port Arduino UNO | PB5 | PB4 | PB3 | PB2 | PB1 | PB0 | PD7 | PD6 |
Port Arduino LEONARDO | PC7 | PD6 | PB7 | PB6 | PB5 | PB4 | PE6 | PD7 |
Seule la ligne correspondant à l'Arduino UNO nous intéresse dans la suite.
Exercice 1
Question 1
Le site : convert base vous propose un algorithme de division par 10 que voici :
unsigned int A;
unsigned int Q; /* the quotient */
Q = ((A >> 1) + A) >> 1; /* Q = A*0.11 */
Q = ((Q >> 4) + Q) ; /* Q = A*0.110011 */
Q = ((Q >> 8) + Q) >> 3; /* Q = A*0.00011001100110011 */
/* either Q = A/10 or Q+1 = A/10 for all A < 534,890 */
Sans chercher à comprendre l'algorithme de division, on vous demande de le transformer en une fonction unsigned int div10(unsigned int A);
Indication
unsigned int div10(unsigned int A){
// a compléter ICI : ceci a été réalisé en TD !!!
}
Ne pas chercher à réaliser un test pour le moment mais réaliser une compilation pour retirer les fautes de syntaxe.
Question 2
Les LEDs du shield maison sont couplées à un arduino UNO. Écrire un sous-programme capable d'afficher un nombre sur 8 bits sur les LEDs. Réaliser un programme de test.
Indication
Voici ce que l'on demande de faire :
void afficheLeds(unsigned char ch){
// A compléter ici. On n'utilisera que des décalages
//et des masques pour réaliser cette fonction
}
Question 3
Écrire un programme complet qui mesure le temps d'exécution du sous programme de division par 10 avec le timer 0, puis modifier le programme pour qu'il puisse comparer avec une division par 10 normale. On pourra utiliser un front montant sur le bouton A pour choisir le type de division réalisé.
Indication
La mise au point peut être longue pour choisir correctement le nombre de boucles de calculs nécessaires pour avoir une affichage correct sur 8 bits.
Question 4
Modifier le programme de la question 3 pour qu'au lieu d'afficher sur des LEDs, l'affichage se fasse par la liaison série. On prendra soin d'afficher en même temps le type d'algorithme utilisé en même temps que la durée. On pourra améliorer l'affichage en affichant la durée en ms.