<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wiki-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dgrari</id>
	<title>wiki-se.plil.fr - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dgrari"/>
	<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Dgrari"/>
	<updated>2026-08-08T03:15:34Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12984</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12984"/>
		<updated>2026-04-14T19:34:31Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 9- Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
#define CTC1   WGM12 &lt;br /&gt;
&lt;br /&gt;
//Variable globale &lt;br /&gt;
char nombre[4]={'0', '0','0','0'};&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_minuteur(int diviseur,long periode){&lt;br /&gt;
TCCR1A=0;               &lt;br /&gt;
TCCR1B=(1&amp;lt;&amp;lt;CTC1);       &lt;br /&gt;
switch(diviseur){&lt;br /&gt;
  case    8: TCCR1B |= (1&amp;lt;&amp;lt;CS11); break;&lt;br /&gt;
  case   64: TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
  case  256: TCCR1B |= (1&amp;lt;&amp;lt;CS12); break;&lt;br /&gt;
  case 1024: TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
 }&lt;br /&gt;
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas&lt;br /&gt;
TCNT1=0;                &lt;br /&gt;
TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);    &lt;br /&gt;
}&lt;br /&gt;
 // ISR&lt;br /&gt;
ISR(TIMER1_COMPA_vect){  &lt;br /&gt;
  // on part du dernier chiffre &lt;br /&gt;
  nombre[3]++;&lt;br /&gt;
&lt;br /&gt;
  for (int i=3; i&amp;gt;=0; i--){&lt;br /&gt;
    if (nombre[i]&amp;gt;'9'){&lt;br /&gt;
      nombre[i]='0';&lt;br /&gt;
      if(i&amp;gt;0){&lt;br /&gt;
        nombre[i-1]++;&lt;br /&gt;
      }else{&lt;br /&gt;
        // si on dépasse 9999, on revient à 0000&lt;br /&gt;
        nombre[0]='0';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
&lt;br /&gt;
  init_minuteur(1024,1000); //1s&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
&lt;br /&gt;
    //Multiplexage: affichage des 4 digits &lt;br /&gt;
    for (int i=0; i&amp;lt;4; i++){&lt;br /&gt;
      affiche_chiffre(i,nombre[i]);&lt;br /&gt;
      _delay_ms(2);// temps court pour éviter le clignotement &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 8- Résultats et tests===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
* Le compteur s’incrémente correctement chaque seconde&lt;br /&gt;
* Les chiffres s’affichent correctement sur les 4 positions&lt;br /&gt;
* Le passage de 9999 à 0000 fonctionne correctement&lt;br /&gt;
* L’affichage est stable grâce au multiplexage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 9- Conclusion ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Ce travail a permis de comprendre :&lt;br /&gt;
&lt;br /&gt;
* le fonctionnement du registre à décalage 74HC595&lt;br /&gt;
* la communication série (bit à bit)&lt;br /&gt;
* l’utilisation des timers et des interruptions&lt;br /&gt;
* la technique du multiplexage&lt;br /&gt;
&lt;br /&gt;
Le programme réalise un compteur fiable de 0000 à 9999 avec affichage dynamique.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
vidéoEC2.mp4|Démonstration du système&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12983</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12983"/>
		<updated>2026-04-14T19:33:32Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 9- Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
#define CTC1   WGM12 &lt;br /&gt;
&lt;br /&gt;
//Variable globale &lt;br /&gt;
char nombre[4]={'0', '0','0','0'};&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_minuteur(int diviseur,long periode){&lt;br /&gt;
TCCR1A=0;               &lt;br /&gt;
TCCR1B=(1&amp;lt;&amp;lt;CTC1);       &lt;br /&gt;
switch(diviseur){&lt;br /&gt;
  case    8: TCCR1B |= (1&amp;lt;&amp;lt;CS11); break;&lt;br /&gt;
  case   64: TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
  case  256: TCCR1B |= (1&amp;lt;&amp;lt;CS12); break;&lt;br /&gt;
  case 1024: TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
 }&lt;br /&gt;
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas&lt;br /&gt;
TCNT1=0;                &lt;br /&gt;
TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);    &lt;br /&gt;
}&lt;br /&gt;
 // ISR&lt;br /&gt;
ISR(TIMER1_COMPA_vect){  &lt;br /&gt;
  // on part du dernier chiffre &lt;br /&gt;
  nombre[3]++;&lt;br /&gt;
&lt;br /&gt;
  for (int i=3; i&amp;gt;=0; i--){&lt;br /&gt;
    if (nombre[i]&amp;gt;'9'){&lt;br /&gt;
      nombre[i]='0';&lt;br /&gt;
      if(i&amp;gt;0){&lt;br /&gt;
        nombre[i-1]++;&lt;br /&gt;
      }else{&lt;br /&gt;
        // si on dépasse 9999, on revient à 0000&lt;br /&gt;
        nombre[0]='0';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
&lt;br /&gt;
  init_minuteur(1024,1000); //1s&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
&lt;br /&gt;
    //Multiplexage: affichage des 4 digits &lt;br /&gt;
    for (int i=0; i&amp;lt;4; i++){&lt;br /&gt;
      affiche_chiffre(i,nombre[i]);&lt;br /&gt;
      _delay_ms(2);// temps court pour éviter le clignotement &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 8- Résultats et tests===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
* Le compteur s’incrémente correctement chaque seconde&lt;br /&gt;
* Les chiffres s’affichent correctement sur les 4 positions&lt;br /&gt;
* Le passage de 9999 à 0000 fonctionne correctement&lt;br /&gt;
* L’affichage est stable grâce au multiplexage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 9- Conclusion ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Ce travail a permis de comprendre :&lt;br /&gt;
&lt;br /&gt;
* le fonctionnement du registre à décalage 74HC595&lt;br /&gt;
* la communication série (bit à bit)&lt;br /&gt;
* l’utilisation des timers et des interruptions&lt;br /&gt;
* la technique du multiplexage&lt;br /&gt;
&lt;br /&gt;
Le programme réalise un compteur fiable de 0000 à 9999 avec affichage dynamique.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
vidéoEC2.mp4|Description 1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12982</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12982"/>
		<updated>2026-04-14T19:31:37Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 9- Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
#define CTC1   WGM12 &lt;br /&gt;
&lt;br /&gt;
//Variable globale &lt;br /&gt;
char nombre[4]={'0', '0','0','0'};&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_minuteur(int diviseur,long periode){&lt;br /&gt;
TCCR1A=0;               &lt;br /&gt;
TCCR1B=(1&amp;lt;&amp;lt;CTC1);       &lt;br /&gt;
switch(diviseur){&lt;br /&gt;
  case    8: TCCR1B |= (1&amp;lt;&amp;lt;CS11); break;&lt;br /&gt;
  case   64: TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
  case  256: TCCR1B |= (1&amp;lt;&amp;lt;CS12); break;&lt;br /&gt;
  case 1024: TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
 }&lt;br /&gt;
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas&lt;br /&gt;
TCNT1=0;                &lt;br /&gt;
TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);    &lt;br /&gt;
}&lt;br /&gt;
 // ISR&lt;br /&gt;
ISR(TIMER1_COMPA_vect){  &lt;br /&gt;
  // on part du dernier chiffre &lt;br /&gt;
  nombre[3]++;&lt;br /&gt;
&lt;br /&gt;
  for (int i=3; i&amp;gt;=0; i--){&lt;br /&gt;
    if (nombre[i]&amp;gt;'9'){&lt;br /&gt;
      nombre[i]='0';&lt;br /&gt;
      if(i&amp;gt;0){&lt;br /&gt;
        nombre[i-1]++;&lt;br /&gt;
      }else{&lt;br /&gt;
        // si on dépasse 9999, on revient à 0000&lt;br /&gt;
        nombre[0]='0';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
&lt;br /&gt;
  init_minuteur(1024,1000); //1s&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
&lt;br /&gt;
    //Multiplexage: affichage des 4 digits &lt;br /&gt;
    for (int i=0; i&amp;lt;4; i++){&lt;br /&gt;
      affiche_chiffre(i,nombre[i]);&lt;br /&gt;
      _delay_ms(2);// temps court pour éviter le clignotement &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 8- Résultats et tests===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
* Le compteur s’incrémente correctement chaque seconde&lt;br /&gt;
* Les chiffres s’affichent correctement sur les 4 positions&lt;br /&gt;
* Le passage de 9999 à 0000 fonctionne correctement&lt;br /&gt;
* L’affichage est stable grâce au multiplexage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 9- Conclusion ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Ce travail a permis de comprendre :&lt;br /&gt;
&lt;br /&gt;
* le fonctionnement du registre à décalage 74HC595&lt;br /&gt;
* la communication série (bit à bit)&lt;br /&gt;
* l’utilisation des timers et des interruptions&lt;br /&gt;
* la technique du multiplexage&lt;br /&gt;
&lt;br /&gt;
Le programme réalise un compteur fiable de 0000 à 9999 avec affichage dynamique.&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Vid%C3%A9oEC2.mp4&amp;diff=12981</id>
		<title>Fichier:VidéoEC2.mp4</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Vid%C3%A9oEC2.mp4&amp;diff=12981"/>
		<updated>2026-04-14T19:28:43Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12980</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12980"/>
		<updated>2026-04-14T19:28:07Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 9- Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
#define CTC1   WGM12 &lt;br /&gt;
&lt;br /&gt;
//Variable globale &lt;br /&gt;
char nombre[4]={'0', '0','0','0'};&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_minuteur(int diviseur,long periode){&lt;br /&gt;
TCCR1A=0;               &lt;br /&gt;
TCCR1B=(1&amp;lt;&amp;lt;CTC1);       &lt;br /&gt;
switch(diviseur){&lt;br /&gt;
  case    8: TCCR1B |= (1&amp;lt;&amp;lt;CS11); break;&lt;br /&gt;
  case   64: TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
  case  256: TCCR1B |= (1&amp;lt;&amp;lt;CS12); break;&lt;br /&gt;
  case 1024: TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
 }&lt;br /&gt;
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas&lt;br /&gt;
TCNT1=0;                &lt;br /&gt;
TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);    &lt;br /&gt;
}&lt;br /&gt;
 // ISR&lt;br /&gt;
ISR(TIMER1_COMPA_vect){  &lt;br /&gt;
  // on part du dernier chiffre &lt;br /&gt;
  nombre[3]++;&lt;br /&gt;
&lt;br /&gt;
  for (int i=3; i&amp;gt;=0; i--){&lt;br /&gt;
    if (nombre[i]&amp;gt;'9'){&lt;br /&gt;
      nombre[i]='0';&lt;br /&gt;
      if(i&amp;gt;0){&lt;br /&gt;
        nombre[i-1]++;&lt;br /&gt;
      }else{&lt;br /&gt;
        // si on dépasse 9999, on revient à 0000&lt;br /&gt;
        nombre[0]='0';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
&lt;br /&gt;
  init_minuteur(1024,1000); //1s&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
&lt;br /&gt;
    //Multiplexage: affichage des 4 digits &lt;br /&gt;
    for (int i=0; i&amp;lt;4; i++){&lt;br /&gt;
      affiche_chiffre(i,nombre[i]);&lt;br /&gt;
      _delay_ms(2);// temps court pour éviter le clignotement &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 8- Résultats et tests===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
* Le compteur s’incrémente correctement chaque seconde&lt;br /&gt;
* Les chiffres s’affichent correctement sur les 4 positions&lt;br /&gt;
* Le passage de 9999 à 0000 fonctionne correctement&lt;br /&gt;
* L’affichage est stable grâce au multiplexage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 9- Conclusion ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Ce travail a permis de comprendre :&lt;br /&gt;
&lt;br /&gt;
* le fonctionnement du registre à décalage 74HC595&lt;br /&gt;
* la communication série (bit à bit)&lt;br /&gt;
* l’utilisation des timers et des interruptions&lt;br /&gt;
* la technique du multiplexage&lt;br /&gt;
&lt;br /&gt;
Le programme réalise un compteur fiable de 0000 à 9999 avec affichage dynamique.&lt;br /&gt;
&lt;br /&gt;
[[File:vidéoEC2.mp4|thumb|Démonstration du compteur sur afficheur 7 segments]]&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12979</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12979"/>
		<updated>2026-04-14T19:08:10Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 8- Résultats et tests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
#define CTC1   WGM12 &lt;br /&gt;
&lt;br /&gt;
//Variable globale &lt;br /&gt;
char nombre[4]={'0', '0','0','0'};&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_minuteur(int diviseur,long periode){&lt;br /&gt;
TCCR1A=0;               &lt;br /&gt;
TCCR1B=(1&amp;lt;&amp;lt;CTC1);       &lt;br /&gt;
switch(diviseur){&lt;br /&gt;
  case    8: TCCR1B |= (1&amp;lt;&amp;lt;CS11); break;&lt;br /&gt;
  case   64: TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
  case  256: TCCR1B |= (1&amp;lt;&amp;lt;CS12); break;&lt;br /&gt;
  case 1024: TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
 }&lt;br /&gt;
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas&lt;br /&gt;
TCNT1=0;                &lt;br /&gt;
TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);    &lt;br /&gt;
}&lt;br /&gt;
 // ISR&lt;br /&gt;
ISR(TIMER1_COMPA_vect){  &lt;br /&gt;
  // on part du dernier chiffre &lt;br /&gt;
  nombre[3]++;&lt;br /&gt;
&lt;br /&gt;
  for (int i=3; i&amp;gt;=0; i--){&lt;br /&gt;
    if (nombre[i]&amp;gt;'9'){&lt;br /&gt;
      nombre[i]='0';&lt;br /&gt;
      if(i&amp;gt;0){&lt;br /&gt;
        nombre[i-1]++;&lt;br /&gt;
      }else{&lt;br /&gt;
        // si on dépasse 9999, on revient à 0000&lt;br /&gt;
        nombre[0]='0';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
&lt;br /&gt;
  init_minuteur(1024,1000); //1s&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
&lt;br /&gt;
    //Multiplexage: affichage des 4 digits &lt;br /&gt;
    for (int i=0; i&amp;lt;4; i++){&lt;br /&gt;
      affiche_chiffre(i,nombre[i]);&lt;br /&gt;
      _delay_ms(2);// temps court pour éviter le clignotement &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 8- Résultats et tests===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
* Le compteur s’incrémente correctement chaque seconde&lt;br /&gt;
* Les chiffres s’affichent correctement sur les 4 positions&lt;br /&gt;
* Le passage de 9999 à 0000 fonctionne correctement&lt;br /&gt;
* L’affichage est stable grâce au multiplexage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 9- Conclusion ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Ce travail a permis de comprendre :&lt;br /&gt;
&lt;br /&gt;
* le fonctionnement du registre à décalage 74HC595&lt;br /&gt;
* la communication série (bit à bit)&lt;br /&gt;
* l’utilisation des timers et des interruptions&lt;br /&gt;
* la technique du multiplexage&lt;br /&gt;
&lt;br /&gt;
Le programme réalise un compteur fiable de 0000 à 9999 avec affichage dynamique.&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12978</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12978"/>
		<updated>2026-04-14T19:07:17Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 7- Code source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
#define CTC1   WGM12 &lt;br /&gt;
&lt;br /&gt;
//Variable globale &lt;br /&gt;
char nombre[4]={'0', '0','0','0'};&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_minuteur(int diviseur,long periode){&lt;br /&gt;
TCCR1A=0;               &lt;br /&gt;
TCCR1B=(1&amp;lt;&amp;lt;CTC1);       &lt;br /&gt;
switch(diviseur){&lt;br /&gt;
  case    8: TCCR1B |= (1&amp;lt;&amp;lt;CS11); break;&lt;br /&gt;
  case   64: TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
  case  256: TCCR1B |= (1&amp;lt;&amp;lt;CS12); break;&lt;br /&gt;
  case 1024: TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
 }&lt;br /&gt;
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas&lt;br /&gt;
TCNT1=0;                &lt;br /&gt;
TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);    &lt;br /&gt;
}&lt;br /&gt;
 // ISR&lt;br /&gt;
ISR(TIMER1_COMPA_vect){  &lt;br /&gt;
  // on part du dernier chiffre &lt;br /&gt;
  nombre[3]++;&lt;br /&gt;
&lt;br /&gt;
  for (int i=3; i&amp;gt;=0; i--){&lt;br /&gt;
    if (nombre[i]&amp;gt;'9'){&lt;br /&gt;
      nombre[i]='0';&lt;br /&gt;
      if(i&amp;gt;0){&lt;br /&gt;
        nombre[i-1]++;&lt;br /&gt;
      }else{&lt;br /&gt;
        // si on dépasse 9999, on revient à 0000&lt;br /&gt;
        nombre[0]='0';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
&lt;br /&gt;
  init_minuteur(1024,1000); //1s&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
&lt;br /&gt;
    //Multiplexage: affichage des 4 digits &lt;br /&gt;
    for (int i=0; i&amp;lt;4; i++){&lt;br /&gt;
      affiche_chiffre(i,nombre[i]);&lt;br /&gt;
      _delay_ms(2);// temps court pour éviter le clignotement &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 8- Résultats et tests===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12977</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12977"/>
		<updated>2026-04-14T19:05:11Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 7- Code source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
#define CTC1   WGM12 &lt;br /&gt;
&lt;br /&gt;
//Variable globale &lt;br /&gt;
char nombre[4]={'0', '0','0','0'};&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_minuteur(int diviseur,long periode){&lt;br /&gt;
TCCR1A=0;               &lt;br /&gt;
TCCR1B=(1&amp;lt;&amp;lt;CTC1);       &lt;br /&gt;
switch(diviseur){&lt;br /&gt;
  case    8: TCCR1B |= (1&amp;lt;&amp;lt;CS11); break;&lt;br /&gt;
  case   64: TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
  case  256: TCCR1B |= (1&amp;lt;&amp;lt;CS12); break;&lt;br /&gt;
  case 1024: TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
 }&lt;br /&gt;
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas&lt;br /&gt;
TCNT1=0;                &lt;br /&gt;
TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);    &lt;br /&gt;
}&lt;br /&gt;
 // ISR&lt;br /&gt;
ISR(TIMER1_COMPA_vect){  &lt;br /&gt;
  // on part du dernier chiffre &lt;br /&gt;
  nombre[3]++;&lt;br /&gt;
&lt;br /&gt;
  for (int i=3; i&amp;gt;=0; i--){&lt;br /&gt;
    if (nombre[i]&amp;gt;'9'){&lt;br /&gt;
      nombre[i]='0';&lt;br /&gt;
      if(i&amp;gt;0){&lt;br /&gt;
        nombre[i-1]++;&lt;br /&gt;
      }else{&lt;br /&gt;
        // si on dépasse 9999, on revient à 0000&lt;br /&gt;
        nombre[0]='0';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
&lt;br /&gt;
  init_minuteur(1024,1000); //1s&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
&lt;br /&gt;
    //Multiplexage: affichage des 4 digits &lt;br /&gt;
    for (int i=0; i&amp;lt;4; i++){&lt;br /&gt;
      affiche_chiffre(i,nombre[i]);&lt;br /&gt;
      _delay_ms(2);// temps court pour éviter le clignotement &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12976</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12976"/>
		<updated>2026-04-14T19:04:33Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 7- Code source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
#define CTC1   WGM12 &lt;br /&gt;
&lt;br /&gt;
//Variable globale &lt;br /&gt;
char nombre[4]={'0', '0','0','0'};&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void init_minuteur(int diviseur,long periode){&lt;br /&gt;
TCCR1A=0;               &lt;br /&gt;
TCCR1B=(1&amp;lt;&amp;lt;CTC1);       &lt;br /&gt;
switch(diviseur){&lt;br /&gt;
  case    8: TCCR1B |= (1&amp;lt;&amp;lt;CS11); break;&lt;br /&gt;
  case   64: TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
  case  256: TCCR1B |= (1&amp;lt;&amp;lt;CS12); break;&lt;br /&gt;
  case 1024: TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10); break;&lt;br /&gt;
 }&lt;br /&gt;
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas&lt;br /&gt;
TCNT1=0;                &lt;br /&gt;
TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);    &lt;br /&gt;
}&lt;br /&gt;
 // ISR&lt;br /&gt;
ISR(TIMER1_COMPA_vect){  &lt;br /&gt;
  // on part du dernier chiffre &lt;br /&gt;
  nombre[3]++;&lt;br /&gt;
&lt;br /&gt;
  for (int i=3; i&amp;gt;=0; i--){&lt;br /&gt;
    if (nombre[i]&amp;gt;'9'){&lt;br /&gt;
      nombre[i]='0';&lt;br /&gt;
      if(i&amp;gt;0){&lt;br /&gt;
        nombre[i-1]++;&lt;br /&gt;
      }else{&lt;br /&gt;
        // si on dépasse 9999, on revient à 0000&lt;br /&gt;
        nombre[0]='0';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
&lt;br /&gt;
  init_minuteur(1024,1000); //1s&lt;br /&gt;
  sei();&lt;br /&gt;
&lt;br /&gt;
  while(1){&lt;br /&gt;
&lt;br /&gt;
    //Multiplexage: affichage des 4 digits &lt;br /&gt;
    for (int i=0; i&amp;lt;4; i++){&lt;br /&gt;
      affiche_chiffre(i,nombre[i]);&lt;br /&gt;
      _delay_ms(2);// temps court pour éviter le clignotement &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12975</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12975"/>
		<updated>2026-04-14T19:03:49Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 3- Code source */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12974</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12974"/>
		<updated>2026-04-14T19:03:28Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 5- Interruption (ISR) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 6- Multiplexage ===&lt;br /&gt;
'''&lt;br /&gt;
L'affichage des 4 chiffres est réalisé par multiplexage :&lt;br /&gt;
&lt;br /&gt;
* Les chiffres sont affichés un par un très vite &lt;br /&gt;
* Une boucle affiche successivement chaque position : &lt;br /&gt;
** affiche_chiffre(i,nombre[i])&lt;br /&gt;
&lt;br /&gt;
* un délai de 2ms est utilisé pour éviter le clignotement rapide &lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 7- Code source  ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12973</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12973"/>
		<updated>2026-04-14T18:58:54Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 4- Gestion du temps ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12972</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12972"/>
		<updated>2026-04-14T18:57:58Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 4- Gestion du temps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
'''=== 4- Gestion du temps  ==='''&lt;br /&gt;
&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&lt;br /&gt;
Une Interruption toutes les 1 seconde&lt;br /&gt;
'''&lt;br /&gt;
=== 5- Interruption (ISR) ===&lt;br /&gt;
'''&lt;br /&gt;
L’interruption TIMER1_COMPA_vect permet d’incrémenter le nombre affiché.&lt;br /&gt;
&lt;br /&gt;
* Le deriner chiffre est incrémenté &lt;br /&gt;
* si le chiffre dépasse '9'&lt;br /&gt;
* il revient à '0'&lt;br /&gt;
* le chiffre suivant est incrémenté (retenue)&lt;br /&gt;
&lt;br /&gt;
* Si 9999 est atteint :&lt;br /&gt;
  * retour à 0000&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12971</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12971"/>
		<updated>2026-04-14T18:54:06Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 4- Gestion du temps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 4- Gestion du temps  ===&lt;br /&gt;
'''&lt;br /&gt;
Pour optimiser le comptage, un timer est utilisé.&lt;br /&gt;
&lt;br /&gt;
* La fonction init_minuteur est fournie dans le cours.&lt;br /&gt;
* Le timer est configuré en mode CTC&lt;br /&gt;
* un diviseur est utilisé pour ajuster la vitesse&lt;br /&gt;
* Une interruption est générée à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Dans ce programme:&lt;br /&gt;
* Diviseur = 1024&lt;br /&gt;
* Période = 1000ms&lt;br /&gt;
&amp;lt;br&amp;gt; Une Interruption toutes les 1 seconde&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12970</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12970"/>
		<updated>2026-04-14T18:50:25Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 4- Gestion du temps  ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12969</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12969"/>
		<updated>2026-04-14T18:49:51Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
=== Objectifs ===&lt;br /&gt;
&lt;br /&gt;
Le but de ce devoir surveillé est de réaliser un programme en langage C sur microcontrôleur AVR permettant de piloter un afficheur 7 segments à l’aide d’un registre à décalage.&lt;br /&gt;
&lt;br /&gt;
Les objectifs sont les suivants :&lt;br /&gt;
&lt;br /&gt;
* Utiliser la fonction init_minuteur fournie dans le cours pour configurer un timer.&lt;br /&gt;
* Écrire une version améliorée de la fonction shift_set appelée affiche_chiffre :&lt;br /&gt;
** la fonction initialise les registres à décalage lors du premier appel&lt;br /&gt;
** elle affiche un seul chiffre à la fois sur l’afficheur 7 segments&lt;br /&gt;
** le premier paramètre indique la position (de 0 à 3)&lt;br /&gt;
** le second paramètre correspond au code ASCII du caractère à afficher (de '0' à '9' et de 'A' à 'F')&lt;br /&gt;
&lt;br /&gt;
* Mettre en place un programme affichant les nombres de 0 à 9999 :&lt;br /&gt;
** incrémentation chaque seconde&lt;br /&gt;
** retour à 0000 après 9999&lt;br /&gt;
&lt;br /&gt;
* Utiliser une variable globale char nombre[4] contenant les valeurs ASCII des chiffres&lt;br /&gt;
&lt;br /&gt;
* Écrire une routine d’interruption (ISR) pour gérer l’incrémentation&lt;br /&gt;
&lt;br /&gt;
* Mettre en œuvre le multiplexage pour afficher les 4 chiffres&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
'''&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 4- Gestion du temps  ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12968</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12968"/>
		<updated>2026-04-14T18:47:35Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* 4- Gestion du temps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 4- Gestion du temps  ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12967</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12967"/>
		<updated>2026-04-14T18:46:29Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 4- Gestion du temps  ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12966</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12966"/>
		<updated>2026-04-14T18:41:42Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Ressources et Documentation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;br /&gt;
&lt;br /&gt;
* Documentation du composant 74HC595&lt;br /&gt;
* Cours et TP sur les registres à décalage&lt;br /&gt;
* Documentation AVR (ports et registres)&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12924</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12924"/>
		<updated>2026-04-13T19:42:09Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12923</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12923"/>
		<updated>2026-04-13T19:41:06Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
EC2.jpg|Description 1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:EC2.jpg&amp;diff=12922</id>
		<title>Fichier:EC2.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:EC2.jpg&amp;diff=12922"/>
		<updated>2026-04-13T19:40:57Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;projer&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12921</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12921"/>
		<updated>2026-04-13T19:36:26Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:EC2.jpg|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
EC2.jpg|Description 1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12920</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12920"/>
		<updated>2026-04-13T19:33:20Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
EC2.jpg|Description 1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12919</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12919"/>
		<updated>2026-04-13T19:28:48Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
EC2.JPG|Description 1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12918</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12918"/>
		<updated>2026-04-13T19:22:05Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
EC2.jpg|Description 1&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12913</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12913"/>
		<updated>2026-04-13T01:22:45Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
 - Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12912</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12912"/>
		<updated>2026-04-13T01:15:03Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 3- Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12911</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12911"/>
		<updated>2026-04-13T01:14:38Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== Code source ===&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12910</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12910"/>
		<updated>2026-04-13T01:11:56Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12909</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12909"/>
		<updated>2026-04-13T01:06:41Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 -si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ressources et Documentation ==&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12908</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12908"/>
		<updated>2026-04-13T00:51:33Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 -si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  // calcul de motif &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN); //Latch Low &lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN); // clock Low&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN); // Clock High&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN); // Latch High&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){ &lt;br /&gt;
// test / afficher sur la deuxième position&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12907</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12907"/>
		<updated>2026-04-13T00:47:41Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 -si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SFTSER_PIN PB0&lt;br /&gt;
#define SFTCLK_PIN PD7&lt;br /&gt;
#define SFTLTC_PIN PD4&lt;br /&gt;
&lt;br /&gt;
static const unsigned char digits[]={&lt;br /&gt;
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void affiche_chiffre(int position, char ascii){&lt;br /&gt;
  static int initialisation = 0;&lt;br /&gt;
  if (!initialisation){&lt;br /&gt;
    DDRB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;SFTCLK_PIN) | (1&amp;lt;&amp;lt;SFTLTC_PIN) ;&lt;br /&gt;
    initialisation = 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  unsigned char motif = 0xFF;&lt;br /&gt;
  if(ascii &amp;gt;= '0' &amp;amp;&amp;amp; ascii &amp;lt;= '9'){&lt;br /&gt;
    motif = digits[ascii - '0'];&lt;br /&gt;
  }else if (ascii &amp;gt;= 'A' &amp;amp;&amp;amp; ascii &amp;lt;= 'F'){&lt;br /&gt;
    motif = digits[ascii - 'A' + 10];&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  unsigned char pos_mask = (1&amp;lt;&amp;lt;position);&lt;br /&gt;
  unsigned char tab[2]={motif, pos_mask};&lt;br /&gt;
&lt;br /&gt;
  PORTD &amp;amp;= ~(1&amp;lt;&amp;lt; SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
  for(int i= 0; i&amp;lt;2 ; i++){&lt;br /&gt;
    unsigned char b = tab[i];&lt;br /&gt;
    for (int j=7; j&amp;gt;=0;j--){&lt;br /&gt;
      PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
&lt;br /&gt;
      if (b &amp;amp; (1&amp;lt;&amp;lt;j)) {&lt;br /&gt;
        PORTB |= (1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }else{&lt;br /&gt;
        PORTB &amp;amp;= ~(1&amp;lt;&amp;lt;SFTSER_PIN);&lt;br /&gt;
      }&lt;br /&gt;
      PORTD |=(1&amp;lt;&amp;lt;SFTCLK_PIN);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  PORTD |=(1&amp;lt;&amp;lt;SFTLTC_PIN);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main(void){&lt;br /&gt;
  while(1){&lt;br /&gt;
    affiche_chiffre(2, 'C');&lt;br /&gt;
    _delay_ms(5);&lt;br /&gt;
  }&lt;br /&gt;
  return 0; &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12906</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12906"/>
		<updated>2026-04-13T00:44:57Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
 - PB0 pour les données (SER)&lt;br /&gt;
 - PD7 pour l'horloge (CLK)&lt;br /&gt;
 - PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
 - si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
 -si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12905</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12905"/>
		<updated>2026-04-13T00:44:16Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;br /&gt;
&lt;br /&gt;
Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''&lt;br /&gt;
=== 1- Principe de Fonctionnement ===&lt;br /&gt;
'''&lt;br /&gt;
Le système utilise un registre à décalage pour envoyer les données à l'afficheur.&lt;br /&gt;
Trois signaux sont utilisés :&lt;br /&gt;
* SER (serial)&lt;br /&gt;
* CLK (clock)&lt;br /&gt;
* LTC (Latch) &lt;br /&gt;
Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).&lt;br /&gt;
'''&lt;br /&gt;
=== 2- Description du programme ===&lt;br /&gt;
'''&lt;br /&gt;
* Le programme configue les broches utilisées comme sorties :&lt;br /&gt;
- PB0 pour les données (SER)&lt;br /&gt;
- PD7 pour l'horloge (CLK)&lt;br /&gt;
- PD4 pour la validation (LTC)&lt;br /&gt;
* Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.&lt;br /&gt;
&lt;br /&gt;
* La fontion affiche_chiffre permet d'afficher un caractère à une position &lt;br /&gt;
- si le caractère est entre '0' et '9' on utilise directement l'index correspond.&lt;br /&gt;
-si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )&lt;br /&gt;
Cela permet de convertir la lettre en index dans le tableau .&lt;br /&gt;
&lt;br /&gt;
* LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .&lt;br /&gt;
&lt;br /&gt;
* Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .&lt;br /&gt;
&lt;br /&gt;
* une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .&lt;br /&gt;
&lt;br /&gt;
* Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:PhotoProjet1.jpg&amp;diff=12904</id>
		<title>Fichier:PhotoProjet1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:PhotoProjet1.jpg&amp;diff=12904"/>
		<updated>2026-04-13T00:04:16Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : Page blanchie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12903</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12903"/>
		<updated>2026-04-13T00:01:42Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Documents Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:PhotoProjet1.jpg|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12902</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12902"/>
		<updated>2026-04-12T23:57:57Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12901</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12901"/>
		<updated>2026-04-12T23:55:18Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Etat d'avancement : L'envoi des données en série fonctionne. Le caractère A s'affiche correctement sur le premier digit (digit 0 ).La prochaine étape sera d'intégrer le minuteur pour gérer le défilement du compteur . &lt;br /&gt;
&lt;br /&gt;
'''Photo de Test d'affichage du caractère A sur le digit 0 : &lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12900</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12900"/>
		<updated>2026-04-12T23:52:55Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Etat d'avancement : L'envoi des données en série fonctionne. Le caractère A s'affiche correctement sur le premier digit (digit 0 ).La prochaine étape sera d'intégrer le minuteur pour gérer le défilement du compteur . &lt;br /&gt;
&lt;br /&gt;
'''Photo de Test d'affichage du caractère A sur le digit 0 : &lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
photoProjet1.jpg&lt;br /&gt;
PhotopProjet2.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12797</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12797"/>
		<updated>2026-03-07T21:21:49Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;            &lt;br /&gt;
partie1.png         &lt;br /&gt;
&amp;lt;/gallery&amp;gt;          &lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
partie2.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Etat d'avancement : L'envoi des données en série fonctionne. Le caractère A s'affiche correctement sur le premier digit (digit 0 ).La prochaine étape sera d'intégrer le minuteur pour gérer le défilement du compteur . &lt;br /&gt;
&lt;br /&gt;
'''Photo de Test d'affichage du caractère A sur le digit 0 : &lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
photoProjet1.jpg&lt;br /&gt;
PhotopProjet2.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12796</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12796"/>
		<updated>2026-03-07T21:19:09Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;            &lt;br /&gt;
partie1.png         &lt;br /&gt;
&amp;lt;/gallery&amp;gt;          &lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
partie2.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Etat d'avancement : L'envoi des données en série fonctionne. Le caractère A s'affiche correctement sur le premier digit (digit 0 ).La prochaine étape sera d'intégrer le minuteur pour gérer le défilement du compteur . &lt;br /&gt;
&lt;br /&gt;
'''Photo de Test d'affichage du caractère A sur le digit 0 : &lt;br /&gt;
'''&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
photoProjet1.jpg&lt;br /&gt;
photoprojet2.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:PhotopProjet2.jpg&amp;diff=12795</id>
		<title>Fichier:PhotopProjet2.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:PhotopProjet2.jpg&amp;diff=12795"/>
		<updated>2026-03-07T21:16:07Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;i&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:PhotoProjet1.jpg&amp;diff=12794</id>
		<title>Fichier:PhotoProjet1.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:PhotoProjet1.jpg&amp;diff=12794"/>
		<updated>2026-03-07T21:15:47Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ph&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12793</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12793"/>
		<updated>2026-03-07T21:02:41Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;            &lt;br /&gt;
partie1.png         &lt;br /&gt;
&amp;lt;/gallery&amp;gt;          &lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
partie2.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12792</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12792"/>
		<updated>2026-03-07T21:02:21Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;            &amp;lt;gallery&amp;gt;     &lt;br /&gt;
partie1.png         partie2.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;           &amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12791</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12791"/>
		<updated>2026-03-07T21:01:21Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
partie1.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
partie2.png&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
[[Fichier:Partie2.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12790</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12790"/>
		<updated>2026-03-07T21:00:48Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
partie1.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
[[Fichier:Partie2.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Partie2.png&amp;diff=12789</id>
		<title>Fichier:Partie2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=Fichier:Partie2.png&amp;diff=12789"/>
		<updated>2026-03-07T21:00:40Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;code&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
	<entry>
		<id>https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12788</id>
		<title>SE3 2025/2026 EC2</title>
		<link rel="alternate" type="text/html" href="https://wiki-se.plil.fr/mediawiki/index.php?title=SE3_2025/2026_EC2&amp;diff=12788"/>
		<updated>2026-03-07T20:58:40Z</updated>

		<summary type="html">&lt;p&gt;Dgrari : /* Travail réalisé */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectifs =&lt;br /&gt;
&lt;br /&gt;
Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :&lt;br /&gt;
&lt;br /&gt;
* vous disposez de la fonction &amp;lt;code&amp;gt;init_minuteur&amp;lt;/code&amp;gt; du cours ;&lt;br /&gt;
* vous devez déjà écrire une version améliorée de la fonction &amp;lt;code&amp;gt;shift_set&amp;lt;/code&amp;gt; donnée en cours/TP :&lt;br /&gt;
** la version améliorée doit s'appeller &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt;,&lt;br /&gt;
** cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,&lt;br /&gt;
** à chaque appel, &amp;lt;code&amp;gt;affiche_chiffre&amp;lt;/code&amp;gt; n'affiche &amp;lt;b&amp;gt;qu'un seul&amp;lt;/b&amp;gt; chiffre hexadécimal sur l'afficheur 7 segments,&lt;br /&gt;
** le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),&lt;br /&gt;
** le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;&lt;br /&gt;
* vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :&lt;br /&gt;
** il vous est imposé d'utiliser une variable globale &amp;lt;code&amp;gt;char nombre[4];&amp;lt;/code&amp;gt; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,&lt;br /&gt;
** écrivez d'abord la fonction principale &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,&lt;br /&gt;
** donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans &amp;lt;code&amp;gt;nombre&amp;lt;/code&amp;gt; (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).&lt;br /&gt;
&lt;br /&gt;
= Matériel nécessaire =&lt;br /&gt;
&lt;br /&gt;
* Arduino Uno avec câble USB ;&lt;br /&gt;
* bouclier multi-fonctions.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Partie1|vignette]]&lt;br /&gt;
[[Fichier:Partie1.png|vignette]]&lt;br /&gt;
= Travail réalisé =&lt;br /&gt;
&lt;br /&gt;
 Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.&lt;br /&gt;
&lt;br /&gt;
'''Modifications apportées à shift_set :'''&lt;br /&gt;
&lt;br /&gt;
 1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .&lt;br /&gt;
 2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).&lt;br /&gt;
 3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .&lt;br /&gt;
&lt;br /&gt;
'''Code réalisé :'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
partie1.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Documents Rendus =&lt;/div&gt;</summary>
		<author><name>Dgrari</name></author>
	</entry>
</feed>