<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://projets-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Achaouni</id>
	<title>projets-se.plil.fr - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://projets-se.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Achaouni"/>
	<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Achaouni"/>
	<updated>2026-05-15T20:42:08Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3150</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3150"/>
		<updated>2024-01-18T16:42:03Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Conclusion &amp;amp; Axes d'amélioration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Programmation de l'ordonnanceur. ===&lt;br /&gt;
Après qu'on a testé notre shield, on a commencé a implementer les fonctionnalités de l'ordonnanceur. L'ordonnanceur qu'on a implémenté utilise un algorithme Round-Robine avec un quantum de 20 ms. Le principe l'ordonnateur est basé sur le déclenchement d'une interruption chaque 20 ms sur le timer1 de l'ATMEGA328 Pl'ATMEGA328p. Pour une fréquence d'horloge de 16 Mhz16mhz et un quantum de 20 ms on peut calculer la valeur à mettre dans le registre OCR1A du timer1 pour générer des interruptions chaque 20 ms. La relation est donnée par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;Nombre de Ticks = \frac{FrequenceCPU*Delay}{Prescalar} - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On choisit un diviseur de fréquence de 1024, pour générer les interruptions chaque 20 ms on aura besoin d'avoir un nombre de Ticks de 313.&lt;br /&gt;
&lt;br /&gt;
L'implementation est donnée par :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define PRESCALER	1024&lt;br /&gt;
#define NB_TICK		313&lt;br /&gt;
void Timer(){&lt;br /&gt;
    TCCR1A=0;&lt;br /&gt;
    TCCR1B=(0&amp;lt;&amp;lt;WGM12);&lt;br /&gt;
    #if (PRESCALER==1024)&lt;br /&gt;
        /* Pour avoir un diviseur de fréquence de 1024*/&lt;br /&gt;
        TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    #endif&lt;br /&gt;
    OCR1A=NB_TICK;&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
    /*&lt;br /&gt;
        Le registre d'interruption du compteur/temporisateur 1 TIMSK1,&lt;br /&gt;
        est configuré pour permettre l'interruption lorsqu'une correspondance est &lt;br /&gt;
        trouvée avec la valeur de comparaison dans OCR1A.&lt;br /&gt;
    */&lt;br /&gt;
    TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multitasking. ===&lt;br /&gt;
Pour tester notre ordonnanceur, on a essayé d'implementer deux à trois taches différentes. Une tache clignote une LED (LED D3) du Sheild et une autre tache qui permettra de piloter un afficheur 7 segments avec SPI. La fonction tache qui permet de piloter l'afficheur est :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/* Definition de la methode de la tache Afficheur 7 segemnt pour afficher &lt;br /&gt;
    les données sur l'afficheur 7 segement.&lt;br /&gt;
*/&lt;br /&gt;
void afficher_7SEG(){&lt;br /&gt;
    SPI_On(ChipSeelect5);&lt;br /&gt;
    SendRecieveSPI(0x76);&lt;br /&gt;
    SPI_Off(ChipSeelect5);&lt;br /&gt;
    while (1){&lt;br /&gt;
        SPI_On(ChipSeelect5);&lt;br /&gt;
        for(int j=0; j&amp;lt;9999;j++){&lt;br /&gt;
            SendRecieveSPI((j/1000)%10);&lt;br /&gt;
            SendRecieveSPI((j/100)%10);&lt;br /&gt;
            SendRecieveSPI((j/10)%10);&lt;br /&gt;
            SendRecieveSPI(j%10);&lt;br /&gt;
            wait(50)&lt;br /&gt;
        }      &lt;br /&gt;
        SPI_Off(ChipSeelect5);&lt;br /&gt;
        wait(50);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La video demonstration:&lt;br /&gt;
[[Fichier:Video demonstration Afficheur 7 Segment SPI.mp4|vignette|centré|Afficheur 7 segment avec SPI.]]&lt;br /&gt;
&lt;br /&gt;
=== Gestion des Ressources partagées. ===&lt;br /&gt;
Vu que les deux taches qui gerent l'afficheur 7 segments et la carte clavier vont utilisées une ressource partagée (SPI) il sera nécessaire d'utiliser un mécanisme de gestion des ressources partagées comme un semaphore. Cette dernière permet de gérer les conflits des taches qui utilisent la même ressource. La tache qui prend la ressource appelle une fonction P(Semaphore) qui verrouille la ressource pour qu'aucune autre tache ne puisse l'apprend, lorsque la tache termine avec la ressource elle libere la ressource pour que les autres taches puissent exécuter leurs sections critiques. Le code qui permet d'implementer ce mécanisme est donnée ci-dessus :&lt;br /&gt;
&lt;br /&gt;
La fonction de verrouillage de ressource P(Semaphor) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void P(int s) {&lt;br /&gt;
    // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
    int *p = get_pointer(s);&lt;br /&gt;
    // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
    if (p == NULL) return;&lt;br /&gt;
    // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
    cli();&lt;br /&gt;
    // Vérifie si le sémaphore est déjà pris&lt;br /&gt;
    if (*p == 1) {&lt;br /&gt;
        // Met la tâche courante en attente du sémaphore s&lt;br /&gt;
        task_current-&amp;gt;etat = (WAIT_SEMAPHORE | STATE_SLEEP);&lt;br /&gt;
        task_current-&amp;gt;time = s;&lt;br /&gt;
        // Appelle la routine d'interruption Timer1 pour déclencher le changement de contexte&lt;br /&gt;
        TIMER1_COMPA_vect();&lt;br /&gt;
    }&lt;br /&gt;
    // Réactive les interruptions&lt;br /&gt;
    sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La fonction de verrouillage de ressource V(Semaphore) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void V(int s) {&lt;br /&gt;
  // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
  int *p = get_pointer(s);&lt;br /&gt;
  // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
  if (p == NULL) return;&lt;br /&gt;
  // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
  cli();&lt;br /&gt;
  // Libère la ressource associée au sémaphore&lt;br /&gt;
  *p = 0;&lt;br /&gt;
  // Initialise un pointeur vers la structure de tâche&lt;br /&gt;
  Task *t = (Task *)tasks;&lt;br /&gt;
  // Parcourt la liste des tâches&lt;br /&gt;
  while (t-&amp;gt;fct != NULL) {&lt;br /&gt;
    // Vérifie si la tâche est en attente du sémaphore s&lt;br /&gt;
    if (t-&amp;gt;etat == (WAIT_SEMAPHORE | STATE_SLEEP) &amp;amp;&amp;amp; t-&amp;gt;time == s) {&lt;br /&gt;
      // Change l'état de la tâche en exécution&lt;br /&gt;
      t-&amp;gt;etat = STATE_RUN;&lt;br /&gt;
      // Libère la ressource associée au sémaphore&lt;br /&gt;
      *p = 1;&lt;br /&gt;
      // Sort de la boucle.&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    // Passe à la tâche suivante&lt;br /&gt;
    t++;&lt;br /&gt;
  }&lt;br /&gt;
  // Réactive les interruptions&lt;br /&gt;
  sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour le code du sémaphore on a s'inspirer du projet des SE promo 2015.&lt;br /&gt;
&lt;br /&gt;
lien : [https://wiki-ima.plil.fr/mediawiki//index.php/Malette_Arduino_%C3%A9ducative_I Malette Arduino éducative I.]&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui convertit le layout en s'appuyant sur la bibliothèque LUFA [https://fourwalledcubicle.com/files/LUFA/Doc/151115/html/group___group___u_s_b_class_h_i_d_common.html LUFA Library]&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo à coté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois la communication MOSI établie, on a préparé une primitive &amp;lt;code&amp;gt;send_buffer_to_master&amp;lt;/code&amp;gt; qui s'occupe de l'envoi des touches stockées dans le buffer (stockage réalisé par la fonction &amp;lt;code&amp;gt;addKeyToBuffer&amp;lt;/code&amp;gt; ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void send_buffer_to_master(struct KeyboardBuffer *keysBuffer) {&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x01) {&lt;br /&gt;
      receivedByte = 0x02;&lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; keysBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         keysBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cette fonction sera appelée par la suite dans une interruption &amp;lt;code&amp;gt;ISR(SPI_STC_vect)&amp;lt;/code&amp;gt; pour alerter la carte mère qu'il existe des touches dans le tampon en lui demandant de lui accorder &amp;quot;la permission&amp;quot; pour lui envoyer les touches appuyées.&lt;br /&gt;
&lt;br /&gt;
Par la suite, on s'est assuré que l'envoi des données est bien réalisé en clignotant une LED à chaque envoi d'un octet (pour la carte mère) et à sa réception (pour la carte fille), voir la démonstration ci-dessous.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Demo2 SPI.mp4|centré|vignette|Démo SPI (2)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Primitive au niveau de la carte mère ===&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui prend en paramètres la ligne de selection SPI de notre clavier et le tampon des touches , et qui gére le réception et le stockage des touches dans le buffer&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Conclusion &amp;amp; Axes d'amélioration''' =&lt;br /&gt;
Ce type de projets a été une première expérience dans notre cas, le travail et le contenu du projet était bien enrichissant et nous a permis d'acquérir de nouvelles compétences, que ça soit du côté électronique (Conception, routage PCB, soudage, test...) ou du côté informatique (Programmation bas niveau, contrôle de version...). Certes, on a rencontré des difficultés techniques tout au long de cette période, certaines tâches étaient plus complexes pour nous, mais cela nous a pas empêché d'avancer sur le projet.&lt;br /&gt;
&lt;br /&gt;
Pour bien s'organiser, nous avons définit des tâches pour chacun d'entre nous pour avancer en parallèle, jusqu'au moment où on avait rencontré un problème de communication SPI (sens MISO), en effet on avait remarqué que cette dernière ne s'établie jamais, on a alors revérifier le soudage, le code, les pins des connecteurs HE10 en les visualisant avec l'oscilloscope, mais le problème n'était pas clair ce qui nous a fait perdu pas mal de temps.&lt;br /&gt;
&lt;br /&gt;
Dans l'ensemble, nous sommes contents du résultat de notre travail mais pas assez satisfait, certains objectifs été atteignables. En effet, nous aurions pu améliorer la méthodologie d'organisation de travail au début pour gagner du temps, nous aurions aimé tester le pico-ordinateur en entier, mais cela n'a pas été possible à cause de l'état d'avancement du groupe. En somme, c'était intéressant de rencontrer ce type de problèmes afin de mieux anticiper et de renforcer nos compétences pour les futurs projets.&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/GROUPE11_CARTE_CLAVIER git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3132</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3132"/>
		<updated>2024-01-18T16:20:32Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Primitive au niveau de la carte mère */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Programmation de l'ordonnanceur. ===&lt;br /&gt;
Après qu'on a testé notre shield, on a commencé a implementer les fonctionnalités de l'ordonnanceur. L'ordonnanceur qu'on a implémenté utilise un algorithme Round-Robine avec un quantum de 20 ms. Le principe l'ordonnateur est basé sur le déclenchement d'une interruption chaque 20 ms sur le timer1 de l'ATMEGA328 Pl'ATMEGA328p. Pour une fréquence d'horloge de 16 Mhz16mhz et un quantum de 20 ms on peut calculer la valeur à mettre dans le registre OCR1A du timer1 pour générer des interruptions chaque 20 ms. La relation est donnée par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;Nombre de Ticks = \frac{FrequenceCPU*Delay}{Prescalar} - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On choisit un diviseur de fréquence de 1024, pour générer les interruptions chaque 20 ms on aura besoin d'avoir un nombre de Ticks de 313.&lt;br /&gt;
&lt;br /&gt;
L'implementation est donnée par :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define PRESCALER	1024&lt;br /&gt;
#define NB_TICK		313&lt;br /&gt;
void Timer(){&lt;br /&gt;
    TCCR1A=0;&lt;br /&gt;
    TCCR1B=(0&amp;lt;&amp;lt;WGM12);&lt;br /&gt;
    #if (PRESCALER==1024)&lt;br /&gt;
        /* Pour avoir un diviseur de fréquence de 1024*/&lt;br /&gt;
        TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    #endif&lt;br /&gt;
    OCR1A=NB_TICK;&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
    /*&lt;br /&gt;
        Le registre d'interruption du compteur/temporisateur 1 TIMSK1,&lt;br /&gt;
        est configuré pour permettre l'interruption lorsqu'une correspondance est &lt;br /&gt;
        trouvée avec la valeur de comparaison dans OCR1A.&lt;br /&gt;
    */&lt;br /&gt;
    TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multitasking. ===&lt;br /&gt;
Pour tester notre ordonnanceur, on a essayé d'implementer deux à trois taches différentes. Une tache clignote une LED (LED D3) du Sheild et une autre tache qui permettra de piloter un afficheur 7 segments avec SPI. La fonction tache qui permet de piloter l'afficheur est :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/* Definition de la methode de la tache Afficheur 7 segemnt pour afficher &lt;br /&gt;
    les données sur l'afficheur 7 segement.&lt;br /&gt;
*/&lt;br /&gt;
void afficher_7SEG(){&lt;br /&gt;
    SPI_On(ChipSeelect5);&lt;br /&gt;
    SendRecieveSPI(0x76);&lt;br /&gt;
    SPI_Off(ChipSeelect5);&lt;br /&gt;
    while (1){&lt;br /&gt;
        SPI_On(ChipSeelect5);&lt;br /&gt;
        for(int j=0; j&amp;lt;9999;j++){&lt;br /&gt;
            SendRecieveSPI((j/1000)%10);&lt;br /&gt;
            SendRecieveSPI((j/100)%10);&lt;br /&gt;
            SendRecieveSPI((j/10)%10);&lt;br /&gt;
            SendRecieveSPI(j%10);&lt;br /&gt;
            wait(50)&lt;br /&gt;
        }      &lt;br /&gt;
        SPI_Off(ChipSeelect5);&lt;br /&gt;
        wait(50);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La video demonstration:&lt;br /&gt;
[[Fichier:Video demonstration Afficheur 7 Segment SPI.mp4|vignette|centré|Afficheur 7 segment avec SPI.]]&lt;br /&gt;
&lt;br /&gt;
=== Gestion des Ressources partagées. ===&lt;br /&gt;
Vu que les deux taches qui gerent l'afficheur 7 segments et la carte clavier vont utilisées une ressource partagée (SPI) il sera nécessaire d'utiliser un mécanisme de gestion des ressources partagées comme un semaphore. Cette dernière permet de gérer les conflits des taches qui utilisent la même ressource. La tache qui prend la ressource appelle une fonction P(Semaphore) qui verrouille la ressource pour qu'aucune autre tache ne puisse l'apprend, lorsque la tache termine avec la ressource elle libere la ressource pour que les autres taches puissent exécuter leurs sections critiques. Le code qui permet d'implementer ce mécanisme est donnée ci-dessus :&lt;br /&gt;
&lt;br /&gt;
La fonction de verrouillage de ressource P(Semaphor) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void P(int s) {&lt;br /&gt;
    // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
    int *p = get_pointer(s);&lt;br /&gt;
    // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
    if (p == NULL) return;&lt;br /&gt;
    // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
    cli();&lt;br /&gt;
    // Vérifie si le sémaphore est déjà pris&lt;br /&gt;
    if (*p == 1) {&lt;br /&gt;
        // Met la tâche courante en attente du sémaphore s&lt;br /&gt;
        task_current-&amp;gt;etat = (WAIT_SEMAPHORE | STATE_SLEEP);&lt;br /&gt;
        task_current-&amp;gt;time = s;&lt;br /&gt;
        // Appelle la routine d'interruption Timer1 pour déclencher le changement de contexte&lt;br /&gt;
        TIMER1_COMPA_vect();&lt;br /&gt;
    }&lt;br /&gt;
    // Réactive les interruptions&lt;br /&gt;
    sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La fonction de verrouillage de ressource V(Semaphore) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void V(int s) {&lt;br /&gt;
  // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
  int *p = get_pointer(s);&lt;br /&gt;
  // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
  if (p == NULL) return;&lt;br /&gt;
  // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
  cli();&lt;br /&gt;
  // Libère la ressource associée au sémaphore&lt;br /&gt;
  *p = 0;&lt;br /&gt;
  // Initialise un pointeur vers la structure de tâche&lt;br /&gt;
  Task *t = (Task *)tasks;&lt;br /&gt;
  // Parcourt la liste des tâches&lt;br /&gt;
  while (t-&amp;gt;fct != NULL) {&lt;br /&gt;
    // Vérifie si la tâche est en attente du sémaphore s&lt;br /&gt;
    if (t-&amp;gt;etat == (WAIT_SEMAPHORE | STATE_SLEEP) &amp;amp;&amp;amp; t-&amp;gt;time == s) {&lt;br /&gt;
      // Change l'état de la tâche en exécution&lt;br /&gt;
      t-&amp;gt;etat = STATE_RUN;&lt;br /&gt;
      // Libère la ressource associée au sémaphore&lt;br /&gt;
      *p = 1;&lt;br /&gt;
      // Sort de la boucle.&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    // Passe à la tâche suivante&lt;br /&gt;
    t++;&lt;br /&gt;
  }&lt;br /&gt;
  // Réactive les interruptions&lt;br /&gt;
  sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour le code du sémaphore on a s'inspirer du projet des SE promo 2015.&lt;br /&gt;
&lt;br /&gt;
lien : [https://wiki-ima.plil.fr/mediawiki//index.php/Malette_Arduino_%C3%A9ducative_I Malette Arduino éducative I.]&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui convertit le layout en s'appuyant sur la bibliothèque LUFA [https://fourwalledcubicle.com/files/LUFA/Doc/151115/html/group___group___u_s_b_class_h_i_d_common.html LUFA Library]&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo à coté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois la communication MOSI établie, on a préparé une primitive &amp;lt;code&amp;gt;send_buffer_to_master&amp;lt;/code&amp;gt; qui s'occupe de l'envoi des touches stockées dans le buffer (stockage réalisé par la fonction &amp;lt;code&amp;gt;addKeyToBuffer&amp;lt;/code&amp;gt; ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void send_buffer_to_master(struct KeyboardBuffer *keysBuffer) {&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x01) {&lt;br /&gt;
      receivedByte = 0x02;&lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; keysBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         keysBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cette fonction sera appelée par la suite dans une interruption &amp;lt;code&amp;gt;ISR(SPI_STC_vect)&amp;lt;/code&amp;gt; pour alerter la carte mère qu'il existe des touches dans le tampon en lui demandant de lui accorder &amp;quot;la permission&amp;quot; pour lui envoyer les touches appuyées.&lt;br /&gt;
&lt;br /&gt;
Par la suite, on s'est assuré que l'envoi des données est bien réalisé en clignotant une LED à chaque envoi d'un octet (pour la carte mère) et à sa réception (pour la carte fille), voir la démonstration ci-dessous.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Demo2 SPI.mp4|centré|vignette|Démo SPI (2)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Primitive au niveau de la carte mère ===&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui prend en paramètres la ligne de selection SPI de notre clavier et le tampon des touches , et qui gére le réception et le stockage des touches dans le buffer&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Conclusion &amp;amp; Axes d'amélioration''' =&lt;br /&gt;
Ce type de projets a été une première expérience dans notre cas, le travail et le contenu du projet était bien enrichissant et nous a permis d'acquérir de nouvelles compétences, que ça soit du côté électronique (Conception, routage PCB, soudage, test...) ou du côté informatique (Programmation bas niveau, contrôle de version...). Certes, on a rencontré des difficultés techniques tout au long de cette période, certaines tâches étaient plus complexes pour nous, mais cela nous a pas empêché d'avancer sur le projet.&lt;br /&gt;
&lt;br /&gt;
Pour bien s'organiser, nous avons définit des tâches pour chacun d'entre nous pour avancer en parallèle, jusqu'au moment où on avait rencontré un problème de communication SPI (sens MISO), en effet on avait remarqué que cette dernière ne s'établie jamais, on a alors revérifier le soudage, le code, les pins des connecteurs HE10 en les visualisant avec l'oscilloscope, mais le problème n'était pas clair ce qui nous a fait perdu pas mal de temps.&lt;br /&gt;
&lt;br /&gt;
Dans l'ensemble, nous sommes contents du résultat de notre travail mais pas assez satisfait, certains objectifs été atteignables. En effet, nous aurions pu améliorer la méthodologie d'organisation de travail au début pour gagner du temps, nous aurions aimé tester le pico-ordinateur en entier. Mais c'était intéressant de rencontrer ce type de problèmes afin de renforcer nos compétences pour les futurs projets.&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/GROUPE11_CARTE_CLAVIER git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3128</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3128"/>
		<updated>2024-01-18T16:17:47Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Tests et Réalisations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Programmation de l'ordonnanceur. ===&lt;br /&gt;
Après qu'on a testé notre shield, on a commencé a implementer les fonctionnalités de l'ordonnanceur. L'ordonnanceur qu'on a implémenté utilise un algorithme Round-Robine avec un quantum de 20 ms. Le principe l'ordonnateur est basé sur le déclenchement d'une interruption chaque 20 ms sur le timer1 de l'ATMEGA328 Pl'ATMEGA328p. Pour une fréquence d'horloge de 16 Mhz16mhz et un quantum de 20 ms on peut calculer la valeur à mettre dans le registre OCR1A du timer1 pour générer des interruptions chaque 20 ms. La relation est donnée par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;Nombre de Ticks = \frac{FrequenceCPU*Delay}{Prescalar} - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On choisit un diviseur de fréquence de 1024, pour générer les interruptions chaque 20 ms on aura besoin d'avoir un nombre de Ticks de 313.&lt;br /&gt;
&lt;br /&gt;
L'implementation est donnée par :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define PRESCALER	1024&lt;br /&gt;
#define NB_TICK		313&lt;br /&gt;
void Timer(){&lt;br /&gt;
    TCCR1A=0;&lt;br /&gt;
    TCCR1B=(0&amp;lt;&amp;lt;WGM12);&lt;br /&gt;
    #if (PRESCALER==1024)&lt;br /&gt;
        /* Pour avoir un diviseur de fréquence de 1024*/&lt;br /&gt;
        TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    #endif&lt;br /&gt;
    OCR1A=NB_TICK;&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
    /*&lt;br /&gt;
        Le registre d'interruption du compteur/temporisateur 1 TIMSK1,&lt;br /&gt;
        est configuré pour permettre l'interruption lorsqu'une correspondance est &lt;br /&gt;
        trouvée avec la valeur de comparaison dans OCR1A.&lt;br /&gt;
    */&lt;br /&gt;
    TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multitasking. ===&lt;br /&gt;
Pour tester notre ordonnanceur, on a essayé d'implementer deux à trois taches différentes. Une tache clignote une LED (LED D3) du Sheild et une autre tache qui permettra de piloter un afficheur 7 segments avec SPI. La fonction tache qui permet de piloter l'afficheur est :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/* Definition de la methode de la tache Afficheur 7 segemnt pour afficher &lt;br /&gt;
    les données sur l'afficheur 7 segement.&lt;br /&gt;
*/&lt;br /&gt;
void afficher_7SEG(){&lt;br /&gt;
    SPI_On(ChipSeelect5);&lt;br /&gt;
    SendRecieveSPI(0x76);&lt;br /&gt;
    SPI_Off(ChipSeelect5);&lt;br /&gt;
    while (1){&lt;br /&gt;
        SPI_On(ChipSeelect5);&lt;br /&gt;
        for(int j=0; j&amp;lt;9999;j++){&lt;br /&gt;
            SendRecieveSPI((j/1000)%10);&lt;br /&gt;
            SendRecieveSPI((j/100)%10);&lt;br /&gt;
            SendRecieveSPI((j/10)%10);&lt;br /&gt;
            SendRecieveSPI(j%10);&lt;br /&gt;
            wait(50)&lt;br /&gt;
        }      &lt;br /&gt;
        SPI_Off(ChipSeelect5);&lt;br /&gt;
        wait(50);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La video demonstration:&lt;br /&gt;
[[Fichier:Video demonstration Afficheur 7 Segment SPI.mp4|vignette|centré|Afficheur 7 segment avec SPI.]]&lt;br /&gt;
&lt;br /&gt;
=== Gestion des Ressources partagées. ===&lt;br /&gt;
Vu que les deux taches qui gerent l'afficheur 7 segments et la carte clavier vont utilisées une ressource partagée (SPI) il sera nécessaire d'utiliser un mécanisme de gestion des ressources partagées comme un semaphore. Cette dernière permet de gérer les conflits des taches qui utilisent la même ressource. La tache qui prend la ressource appelle une fonction P(Semaphore) qui verrouille la ressource pour qu'aucune autre tache ne puisse l'apprend, lorsque la tache termine avec la ressource elle libere la ressource pour que les autres taches puissent exécuter leurs sections critiques. Le code qui permet d'implementer ce mécanisme est donnée ci-dessus :&lt;br /&gt;
&lt;br /&gt;
La fonction de verrouillage de ressource P(Semaphor) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void P(int s) {&lt;br /&gt;
    // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
    int *p = get_pointer(s);&lt;br /&gt;
    // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
    if (p == NULL) return;&lt;br /&gt;
    // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
    cli();&lt;br /&gt;
    // Vérifie si le sémaphore est déjà pris&lt;br /&gt;
    if (*p == 1) {&lt;br /&gt;
        // Met la tâche courante en attente du sémaphore s&lt;br /&gt;
        task_current-&amp;gt;etat = (WAIT_SEMAPHORE | STATE_SLEEP);&lt;br /&gt;
        task_current-&amp;gt;time = s;&lt;br /&gt;
        // Appelle la routine d'interruption Timer1 pour déclencher le changement de contexte&lt;br /&gt;
        TIMER1_COMPA_vect();&lt;br /&gt;
    }&lt;br /&gt;
    // Réactive les interruptions&lt;br /&gt;
    sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La fonction de verrouillage de ressource V(Semaphore) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void V(int s) {&lt;br /&gt;
  // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
  int *p = get_pointer(s);&lt;br /&gt;
  // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
  if (p == NULL) return;&lt;br /&gt;
  // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
  cli();&lt;br /&gt;
  // Libère la ressource associée au sémaphore&lt;br /&gt;
  *p = 0;&lt;br /&gt;
  // Initialise un pointeur vers la structure de tâche&lt;br /&gt;
  Task *t = (Task *)tasks;&lt;br /&gt;
  // Parcourt la liste des tâches&lt;br /&gt;
  while (t-&amp;gt;fct != NULL) {&lt;br /&gt;
    // Vérifie si la tâche est en attente du sémaphore s&lt;br /&gt;
    if (t-&amp;gt;etat == (WAIT_SEMAPHORE | STATE_SLEEP) &amp;amp;&amp;amp; t-&amp;gt;time == s) {&lt;br /&gt;
      // Change l'état de la tâche en exécution&lt;br /&gt;
      t-&amp;gt;etat = STATE_RUN;&lt;br /&gt;
      // Libère la ressource associée au sémaphore&lt;br /&gt;
      *p = 1;&lt;br /&gt;
      // Sort de la boucle.&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    // Passe à la tâche suivante&lt;br /&gt;
    t++;&lt;br /&gt;
  }&lt;br /&gt;
  // Réactive les interruptions&lt;br /&gt;
  sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour le code du sémaphore on a s'inspirer du projet des SE promo 2015.&lt;br /&gt;
&lt;br /&gt;
lien : [https://wiki-ima.plil.fr/mediawiki//index.php/Malette_Arduino_%C3%A9ducative_I Malette Arduino éducative I.]&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo à coté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois la communication MOSI établie, on a préparé une primitive &amp;lt;code&amp;gt;send_buffer_to_master&amp;lt;/code&amp;gt; qui s'occupe de l'envoi des touches stockées dans le buffer (stockage réalisé par la fonction &amp;lt;code&amp;gt;addKeyToBuffer&amp;lt;/code&amp;gt; ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void send_buffer_to_master(struct KeyboardBuffer *keysBuffer) {&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x01) {&lt;br /&gt;
      receivedByte = 0x02;&lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; keysBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         keysBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cette fonction sera appelée par la suite dans une interruption &amp;lt;code&amp;gt;ISR(SPI_STC_vect)&amp;lt;/code&amp;gt; pour alerter la carte mère qu'il existe des touches dans le tampon en lui demandant de lui accorder &amp;quot;la permission&amp;quot; pour lui envoyer les touches appuyées.&lt;br /&gt;
&lt;br /&gt;
Par la suite, on s'est assuré que l'envoi des données est bien réalisé en clignotant une LED à chaque envoi d'un octet (pour la carte mère) et à sa réception (pour la carte fille), voir la démonstration ci-dessous. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Demo2 SPI.mp4|centré|vignette|Démo SPI (2)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Primitive au niveau de la carte mère ===&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui prend en paramètres la ligne de selection SPI de notre clavier et le tampon des touches , et qui gére le réception et le stockage des touches dans le buffer&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Conclusion &amp;amp; Axes d'amélioration''' =&lt;br /&gt;
Ce type de projets a été une première expérience dans notre cas, le travail et le contenu du projet était bien enrichissant et nous a permis d'acquérir de nouvelles compétences, que ça soit du côté électronique (Conception, routage PCB, soudage, test...) ou du côté informatique (Programmation bas niveau, contrôle de version...). Certes, on a rencontré des difficultés techniques tout au long de cette période, certaines tâches étaient plus complexes pour nous, mais cela nous a pas empêché d'avancer sur le projet.&lt;br /&gt;
&lt;br /&gt;
Pour bien s'organiser, nous avons définit des tâches pour chacun d'entre nous pour avancer en parallèle, jusqu'au moment où on avait rencontré un problème de communication SPI (sens MISO), en effet on avait remarqué que cette dernière ne s'établie jamais, on a alors revérifier le soudage, le code, les pins des connecteurs HE10 en les visualisant avec l'oscilloscope, mais le problème n'était pas clair ce qui nous a fait perdu pas mal de temps.&lt;br /&gt;
&lt;br /&gt;
Dans l'ensemble, nous sommes contents du résultat de notre travail mais pas assez satisfait, certains objectifs été atteignables. En effet, nous aurions pu améliorer la méthodologie d'organisation de travail au début pour gagner du temps, nous aurions aimé tester le pico-ordinateur en entier. Mais c'était intéressant de rencontrer ce type de problèmes afin de renforcer nos compétences pour les futurs projets.&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/PICO_GROUPE11 git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Demo2_SPI.mp4&amp;diff=3126</id>
		<title>Fichier:Demo2 SPI.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Demo2_SPI.mp4&amp;diff=3126"/>
		<updated>2024-01-18T16:17:11Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Demo2 SPI&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3021</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3021"/>
		<updated>2024-01-18T09:00:44Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Conclusion &amp;amp; Axes d'amélioration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Programmation de l'ordonnanceur. ===&lt;br /&gt;
Après qu'on a testé notre shield, on a commencé a implementer les fonctionnalités de l'ordonnanceur. L'ordonnanceur qu'on a implémenté utilise un algorithme Round-Robine avec un quantum de 20 ms. Le principe l'ordonnateur est basé sur le déclenchement d'une interruption chaque 20 ms sur le timer1 de l'ATMEGA328 Pl'ATMEGA328p. Pour une fréquence d'horloge de 16 Mhz16mhz et un quantum de 20 ms on peut calculer la valeur à mettre dans le registre OCR1A du timer1 pour générer des interruptions chaque 20 ms. La relation est donnée par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;Nombre de Ticks = \frac{FrequenceCPU*Delay}{Prescalar} - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On choisit un diviseur de fréquence de 1024, pour générer les interruptions chaque 20 ms on aura besoin d'avoir un nombre de Ticks de 313.&lt;br /&gt;
&lt;br /&gt;
L'implementation est donnée par :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define PRESCALER	1024&lt;br /&gt;
#define NB_TICK		313&lt;br /&gt;
void Timer(){&lt;br /&gt;
    TCCR1A=0;&lt;br /&gt;
    TCCR1B=(0&amp;lt;&amp;lt;WGM12);&lt;br /&gt;
    #if (PRESCALER==1024)&lt;br /&gt;
        /* Pour avoir un diviseur de fréquence de 1024*/&lt;br /&gt;
        TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    #endif&lt;br /&gt;
    OCR1A=NB_TICK;&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
    /*&lt;br /&gt;
        Le registre d'interruption du compteur/temporisateur 1 TIMSK1,&lt;br /&gt;
        est configuré pour permettre l'interruption lorsqu'une correspondance est &lt;br /&gt;
        trouvée avec la valeur de comparaison dans OCR1A.&lt;br /&gt;
    */&lt;br /&gt;
    TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multitasking. ===&lt;br /&gt;
Pour tester notre ordonnanceur, on a essayé d'implementer deux à trois taches différentes. Une tache clignote une LED (LED D3) du Sheild et une autre tache qui permettra de piloter un afficheur 7 segments avec SPI. La fonction tache qui permet de piloter l'afficheur est :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/* Definition de la methode de la tache Afficheur 7 segemnt pour afficher &lt;br /&gt;
    les données sur l'afficheur 7 segement.&lt;br /&gt;
*/&lt;br /&gt;
void afficher_7SEG(){&lt;br /&gt;
    SPI_On(ChipSeelect5);&lt;br /&gt;
    SendRecieveSPI(0x76);&lt;br /&gt;
    SPI_Off(ChipSeelect5);&lt;br /&gt;
    while (1){&lt;br /&gt;
        SPI_On(ChipSeelect5);&lt;br /&gt;
        for(int j=0; j&amp;lt;9999;j++){&lt;br /&gt;
            SendRecieveSPI((j/1000)%10);&lt;br /&gt;
            SendRecieveSPI((j/100)%10);&lt;br /&gt;
            SendRecieveSPI((j/10)%10);&lt;br /&gt;
            SendRecieveSPI(j%10);&lt;br /&gt;
            wait(50)&lt;br /&gt;
        }      &lt;br /&gt;
        SPI_Off(ChipSeelect5);&lt;br /&gt;
        wait(50);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La video demonstration:&lt;br /&gt;
[[Fichier:Video demonstration Afficheur 7 Segment SPI.mp4|vignette|centré|Afficheur 7 segment avec SPI.]]&lt;br /&gt;
&lt;br /&gt;
=== Gestion des Ressources partagées. ===&lt;br /&gt;
Vu que les deux taches qui gerent l'afficheur 7 segments et la carte clavier vont utilisées une ressource partagée (SPI) il sera nécessaire d'utiliser un mécanisme de gestion des ressources partagées comme un semaphore. Cette dernière permet de gérer les conflits des taches qui utilisent la même ressource. La tache qui prend la ressource appelle une fonction P(Semaphore) qui verrouille la ressource pour qu'aucune autre tache ne puisse l'apprend, lorsque la tache termine avec la ressource elle libere la ressource pour que les autres taches puissent exécuter leurs sections critiques. Le code qui permet d'implementer ce mécanisme est donnée ci-dessus :&lt;br /&gt;
&lt;br /&gt;
La fonction de verrouillage de ressource P(Semaphor) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void P(int s) {&lt;br /&gt;
    // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
    int *p = get_pointer(s);&lt;br /&gt;
    // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
    if (p == NULL) return;&lt;br /&gt;
    // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
    cli();&lt;br /&gt;
    // Vérifie si le sémaphore est déjà pris&lt;br /&gt;
    if (*p == 1) {&lt;br /&gt;
        // Met la tâche courante en attente du sémaphore s&lt;br /&gt;
        task_current-&amp;gt;etat = (WAIT_SEMAPHORE | STATE_SLEEP);&lt;br /&gt;
        task_current-&amp;gt;time = s;&lt;br /&gt;
        // Appelle la routine d'interruption Timer1 pour déclencher le changement de contexte&lt;br /&gt;
        TIMER1_COMPA_vect();&lt;br /&gt;
    }&lt;br /&gt;
    // Réactive les interruptions&lt;br /&gt;
    sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La fonction de verrouillage de ressource V(Semaphore) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void V(int s) {&lt;br /&gt;
  // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
  int *p = get_pointer(s);&lt;br /&gt;
  // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
  if (p == NULL) return;&lt;br /&gt;
  // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
  cli();&lt;br /&gt;
  // Libère la ressource associée au sémaphore&lt;br /&gt;
  *p = 0;&lt;br /&gt;
  // Initialise un pointeur vers la structure de tâche&lt;br /&gt;
  Task *t = (Task *)tasks;&lt;br /&gt;
  // Parcourt la liste des tâches&lt;br /&gt;
  while (t-&amp;gt;fct != NULL) {&lt;br /&gt;
    // Vérifie si la tâche est en attente du sémaphore s&lt;br /&gt;
    if (t-&amp;gt;etat == (WAIT_SEMAPHORE | STATE_SLEEP) &amp;amp;&amp;amp; t-&amp;gt;time == s) {&lt;br /&gt;
      // Change l'état de la tâche en exécution&lt;br /&gt;
      t-&amp;gt;etat = STATE_RUN;&lt;br /&gt;
      // Libère la ressource associée au sémaphore&lt;br /&gt;
      *p = 1;&lt;br /&gt;
      // Sort de la boucle.&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    // Passe à la tâche suivante&lt;br /&gt;
    t++;&lt;br /&gt;
  }&lt;br /&gt;
  // Réactive les interruptions&lt;br /&gt;
  sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour le code du sémaphore on a s'inspirer du projet des SE promo 2015.&lt;br /&gt;
&lt;br /&gt;
lien : [https://wiki-ima.plil.fr/mediawiki//index.php/Malette_Arduino_%C3%A9ducative_I Malette Arduino éducative I.]&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo à coté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois la communication MOSI établie, on a préparé une primitive &amp;lt;code&amp;gt;send_buffer_to_master&amp;lt;/code&amp;gt; qui s'occupe de l'envoi des touches stockées dans le buffer (stockage réalisé par la fonction &amp;lt;code&amp;gt;addKeyToBuffer&amp;lt;/code&amp;gt; ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void send_buffer_to_master(struct KeyboardBuffer *keysBuffer) {&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x01) {&lt;br /&gt;
      receivedByte = 0x02;&lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; keysBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         keysBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cette fonction sera appelée par la suite dans une interruption &amp;lt;code&amp;gt;ISR(SPI_STC_vect)&amp;lt;/code&amp;gt; pour alerter la carte mère qu'il existe des touches dans le tampon en lui demandant de lui accorder &amp;quot;la permission&amp;quot; pour lui envoyer les touches appuyées.&lt;br /&gt;
&lt;br /&gt;
=== Primitive au niveau de la carte mère ===&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui prend en paramètres la ligne de selection SPI de notre clavier et le tampon des touches , et qui gére le réception et le stockage des touches dans le buffer&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Conclusion &amp;amp; Axes d'amélioration''' =&lt;br /&gt;
Ce type de projets a été une première expérience dans notre cas, le travail et le contenu du projet était bien enrichissant et nous a permis d'acquérir de nouvelles compétences, que ça soit du côté électronique (Conception, routage PCB, soudage, test...) ou du côté informatique (Programmation bas niveau, contrôle de version...). Certes, on a rencontré des difficultés techniques tout au long de cette période, certaines tâches étaient plus complexes pour nous, mais cela nous a pas empêché d'avancer sur le projet.&lt;br /&gt;
&lt;br /&gt;
Pour bien s'organiser, nous avons définit des tâches pour chacun d'entre nous pour avancer en parallèle, jusqu'au moment où on avait rencontré un problème de communication SPI (sens MISO), en effet on avait remarqué que cette dernière ne s'établie jamais, on a alors revérifier le soudage, le code, les pins des connecteurs HE10 en les visualisant avec l'oscilloscope, mais le problème n'était pas clair ce qui nous a fait perdu pas mal de temps.&lt;br /&gt;
&lt;br /&gt;
Dans l'ensemble, nous sommes contents du résultat de notre travail mais pas assez satisfait, certains objectifs été atteignables. En effet, nous aurions pu améliorer la méthodologie d'organisation de travail au début pour gagner du temps, nous aurions aimé tester le pico-ordinateur en entier. Mais c'était intéressant de rencontrer ce type de problèmes afin de renforcer nos compétences pour les futurs projets.&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/PICO_GROUPE11 git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3017</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3017"/>
		<updated>2024-01-18T08:20:49Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Conclusion &amp;amp; Axes d'amélioration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Programmation de l'ordonnanceur. ===&lt;br /&gt;
Après qu'on a testé notre shield, on a commencé a implementer les fonctionnalités de l'ordonnanceur. L'ordonnanceur qu'on a implémenté utilise un algorithme Round-Robine avec un quantum de 20 ms. Le principe l'ordonnateur est basé sur le déclenchement d'une interruption chaque 20 ms sur le timer1 de l'ATMEGA328 Pl'ATMEGA328p. Pour une fréquence d'horloge de 16 Mhz16mhz et un quantum de 20 ms on peut calculer la valeur à mettre dans le registre OCR1A du timer1 pour générer des interruptions chaque 20 ms. La relation est donnée par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;Nombre de Ticks = \frac{FrequenceCPU*Delay}{Prescalar} - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On choisit un diviseur de fréquence de 1024, pour générer les interruptions chaque 20 ms on aura besoin d'avoir un nombre de Ticks de 313.&lt;br /&gt;
&lt;br /&gt;
L'implementation est donnée par :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define PRESCALER	1024&lt;br /&gt;
#define NB_TICK		313&lt;br /&gt;
void Timer(){&lt;br /&gt;
    TCCR1A=0;&lt;br /&gt;
    TCCR1B=(0&amp;lt;&amp;lt;WGM12);&lt;br /&gt;
    #if (PRESCALER==1024)&lt;br /&gt;
        /* Pour avoir un diviseur de fréquence de 1024*/&lt;br /&gt;
        TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    #endif&lt;br /&gt;
    OCR1A=NB_TICK;&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
    /*&lt;br /&gt;
        Le registre d'interruption du compteur/temporisateur 1 TIMSK1,&lt;br /&gt;
        est configuré pour permettre l'interruption lorsqu'une correspondance est &lt;br /&gt;
        trouvée avec la valeur de comparaison dans OCR1A.&lt;br /&gt;
    */&lt;br /&gt;
    TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multitasking. ===&lt;br /&gt;
Pour tester notre ordonnanceur, on a essayé d'implementer deux à trois taches différentes. Une tache clignote une LED (LED D3) du Sheild et une autre tache qui permettra de piloter un afficheur 7 segments avec SPI. La fonction tache qui permet de piloter l'afficheur est :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/* Definition de la methode de la tache Afficheur 7 segemnt pour afficher &lt;br /&gt;
    les données sur l'afficheur 7 segement.&lt;br /&gt;
*/&lt;br /&gt;
void afficher_7SEG(){&lt;br /&gt;
    SPI_On(ChipSeelect5);&lt;br /&gt;
    SendRecieveSPI(0x76);&lt;br /&gt;
    SPI_Off(ChipSeelect5);&lt;br /&gt;
    while (1){&lt;br /&gt;
        SPI_On(ChipSeelect5);&lt;br /&gt;
        for(int j=0; j&amp;lt;9999;j++){&lt;br /&gt;
            SendRecieveSPI((j/1000)%10);&lt;br /&gt;
            SendRecieveSPI((j/100)%10);&lt;br /&gt;
            SendRecieveSPI((j/10)%10);&lt;br /&gt;
            SendRecieveSPI(j%10);&lt;br /&gt;
            wait(50)&lt;br /&gt;
        }      &lt;br /&gt;
        SPI_Off(ChipSeelect5);&lt;br /&gt;
        wait(50);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La video demonstration:&lt;br /&gt;
[[Fichier:Video demonstration Afficheur 7 Segment SPI.mp4|vignette|centré|Afficheur 7 segment avec SPI.]]&lt;br /&gt;
&lt;br /&gt;
=== Gestion des Ressources partagées. ===&lt;br /&gt;
Vu que les deux taches qui gerent l'afficheur 7 segments et la carte clavier vont utilisées une ressource partagée (SPI) il sera nécessaire d'utiliser un mécanisme de gestion des ressources partagées comme un semaphore. Cette dernière permet de gérer les conflits des taches qui utilisent la même ressource. La tache qui prend la ressource appelle une fonction P(Semaphore) qui verrouille la ressource pour qu'aucune autre tache ne puisse l'apprend, lorsque la tache termine avec la ressource elle libere la ressource pour que les autres taches puissent exécuter leurs sections critiques. Le code qui permet d'implementer ce mécanisme est donnée ci-dessus :&lt;br /&gt;
&lt;br /&gt;
La fonction de verrouillage de ressource P(Semaphor) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void P(int s) {&lt;br /&gt;
    // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
    int *p = get_pointer(s);&lt;br /&gt;
    // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
    if (p == NULL) return;&lt;br /&gt;
    // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
    cli();&lt;br /&gt;
    // Vérifie si le sémaphore est déjà pris&lt;br /&gt;
    if (*p == 1) {&lt;br /&gt;
        // Met la tâche courante en attente du sémaphore s&lt;br /&gt;
        task_current-&amp;gt;etat = (WAIT_SEMAPHORE | STATE_SLEEP);&lt;br /&gt;
        task_current-&amp;gt;time = s;&lt;br /&gt;
        // Appelle la routine d'interruption Timer1 pour déclencher le changement de contexte&lt;br /&gt;
        TIMER1_COMPA_vect();&lt;br /&gt;
    }&lt;br /&gt;
    // Réactive les interruptions&lt;br /&gt;
    sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La fonction de verrouillage de ressource V(Semaphore) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void V(int s) {&lt;br /&gt;
  // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
  int *p = get_pointer(s);&lt;br /&gt;
  // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
  if (p == NULL) return;&lt;br /&gt;
  // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
  cli();&lt;br /&gt;
  // Libère la ressource associée au sémaphore&lt;br /&gt;
  *p = 0;&lt;br /&gt;
  // Initialise un pointeur vers la structure de tâche&lt;br /&gt;
  Task *t = (Task *)tasks;&lt;br /&gt;
  // Parcourt la liste des tâches&lt;br /&gt;
  while (t-&amp;gt;fct != NULL) {&lt;br /&gt;
    // Vérifie si la tâche est en attente du sémaphore s&lt;br /&gt;
    if (t-&amp;gt;etat == (WAIT_SEMAPHORE | STATE_SLEEP) &amp;amp;&amp;amp; t-&amp;gt;time == s) {&lt;br /&gt;
      // Change l'état de la tâche en exécution&lt;br /&gt;
      t-&amp;gt;etat = STATE_RUN;&lt;br /&gt;
      // Libère la ressource associée au sémaphore&lt;br /&gt;
      *p = 1;&lt;br /&gt;
      // Sort de la boucle.&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    // Passe à la tâche suivante&lt;br /&gt;
    t++;&lt;br /&gt;
  }&lt;br /&gt;
  // Réactive les interruptions&lt;br /&gt;
  sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour le code du sémaphore on a s'inspirer du projet des SE promo 2015.&lt;br /&gt;
&lt;br /&gt;
lien : [https://wiki-ima.plil.fr/mediawiki//index.php/Malette_Arduino_%C3%A9ducative_I Malette Arduino éducative I.]&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo à coté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois la communication MOSI établie, on a préparé une primitive &amp;lt;code&amp;gt;send_buffer_to_master&amp;lt;/code&amp;gt; qui s'occupe de l'envoi des touches stockées dans le buffer (stockage réalisé par la fonction &amp;lt;code&amp;gt;addKeyToBuffer&amp;lt;/code&amp;gt; ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void send_buffer_to_master(struct KeyboardBuffer *keysBuffer) {&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x01) {&lt;br /&gt;
      receivedByte = 0x02;&lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; keysBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         keysBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cette fonction sera appelée par la suite dans une interruption &amp;lt;code&amp;gt;ISR(SPI_STC_vect)&amp;lt;/code&amp;gt; pour alerter la carte mère qu'il existe des touches dans le tampon en lui demandant de lui accorder &amp;quot;la permission&amp;quot; pour lui envoyer les touches appuyées.&lt;br /&gt;
&lt;br /&gt;
=== Primitive au niveau de la carte mère ===&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui prend en paramètres la ligne de selection SPI de notre clavier et le tampon des touches , et qui gére le réception et le stockage des touches dans le buffer&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Conclusion &amp;amp; Axes d'amélioration''' =&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/PICO_GROUPE11 git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3014</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3014"/>
		<updated>2024-01-18T08:17:59Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Tests et Réalisations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Programmation de l'ordonnanceur. ===&lt;br /&gt;
Après qu'on a testé notre shield, on a commencé a implementer les fonctionnalités de l'ordonnanceur. L'ordonnanceur qu'on a implémenté utilise un algorithme Round-Robine avec un quantum de 20 ms. Le principe l'ordonnateur est basé sur le déclenchement d'une interruption chaque 20 ms sur le timer1 de l'ATMEGA328 Pl'ATMEGA328p. Pour une fréquence d'horloge de 16 Mhz16mhz et un quantum de 20 ms on peut calculer la valeur à mettre dans le registre OCR1A du timer1 pour générer des interruptions chaque 20 ms. La relation est donnée par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;Nombre de Ticks = \frac{FrequenceCPU*Delay}{Prescalar} - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On choisit un diviseur de fréquence de 1024, pour générer les interruptions chaque 20 ms on aura besoin d'avoir un nombre de Ticks de 313.&lt;br /&gt;
&lt;br /&gt;
L'implementation est donnée par :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define PRESCALER	1024&lt;br /&gt;
#define NB_TICK		313&lt;br /&gt;
void Timer(){&lt;br /&gt;
    TCCR1A=0;&lt;br /&gt;
    TCCR1B=(0&amp;lt;&amp;lt;WGM12);&lt;br /&gt;
    #if (PRESCALER==1024)&lt;br /&gt;
        /* Pour avoir un diviseur de fréquence de 1024*/&lt;br /&gt;
        TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    #endif&lt;br /&gt;
    OCR1A=NB_TICK;&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
    /*&lt;br /&gt;
        Le registre d'interruption du compteur/temporisateur 1 TIMSK1,&lt;br /&gt;
        est configuré pour permettre l'interruption lorsqu'une correspondance est &lt;br /&gt;
        trouvée avec la valeur de comparaison dans OCR1A.&lt;br /&gt;
    */&lt;br /&gt;
    TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multitasking. ===&lt;br /&gt;
Pour tester notre ordonnanceur, on a essayé d'implementer deux à trois taches différentes. Une tache clignote une LED (LED D3) du Sheild et une autre tache qui permettra de piloter un afficheur 7 segments avec SPI. La fonction tache qui permet de piloter l'afficheur est :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/* Definition de la methode de la tache Afficheur 7 segemnt pour afficher &lt;br /&gt;
    les données sur l'afficheur 7 segement.&lt;br /&gt;
*/&lt;br /&gt;
void afficher_7SEG(){&lt;br /&gt;
    SPI_On(ChipSeelect5);&lt;br /&gt;
    SendRecieveSPI(0x76);&lt;br /&gt;
    SPI_Off(ChipSeelect5);&lt;br /&gt;
    while (1){&lt;br /&gt;
        SPI_On(ChipSeelect5);&lt;br /&gt;
        for(int j=0; j&amp;lt;9999;j++){&lt;br /&gt;
            SendRecieveSPI((j/1000)%10);&lt;br /&gt;
            SendRecieveSPI((j/100)%10);&lt;br /&gt;
            SendRecieveSPI((j/10)%10);&lt;br /&gt;
            SendRecieveSPI(j%10);&lt;br /&gt;
            wait(50)&lt;br /&gt;
        }      &lt;br /&gt;
        SPI_Off(ChipSeelect5);&lt;br /&gt;
        wait(50);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La video demonstration:&lt;br /&gt;
[[Fichier:Video demonstration Afficheur 7 Segment SPI.mp4|vignette|centré|Afficheur 7 segment avec SPI.]]&lt;br /&gt;
&lt;br /&gt;
=== Gestion des Ressources partagées. ===&lt;br /&gt;
Vu que les deux taches qui gerent l'afficheur 7 segments et la carte clavier vont utilisées une ressource partagée (SPI) il sera nécessaire d'utiliser un mécanisme de gestion des ressources partagées comme un semaphore. Cette dernière permet de gérer les conflits des taches qui utilisent la même ressource. La tache qui prend la ressource appelle une fonction P(Semaphore) qui verrouille la ressource pour qu'aucune autre tache ne puisse l'apprend, lorsque la tache termine avec la ressource elle libere la ressource pour que les autres taches puissent exécuter leurs sections critiques. Le code qui permet d'implementer ce mécanisme est donnée ci-dessus :&lt;br /&gt;
&lt;br /&gt;
La fonction de verrouillage de ressource P(Semaphor) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void P(int s) {&lt;br /&gt;
    // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
    int *p = get_pointer(s);&lt;br /&gt;
    // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
    if (p == NULL) return;&lt;br /&gt;
    // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
    cli();&lt;br /&gt;
    // Vérifie si le sémaphore est déjà pris&lt;br /&gt;
    if (*p == 1) {&lt;br /&gt;
        // Met la tâche courante en attente du sémaphore s&lt;br /&gt;
        task_current-&amp;gt;etat = (WAIT_SEMAPHORE | STATE_SLEEP);&lt;br /&gt;
        task_current-&amp;gt;time = s;&lt;br /&gt;
        // Appelle la routine d'interruption Timer1 pour déclencher le changement de contexte&lt;br /&gt;
        TIMER1_COMPA_vect();&lt;br /&gt;
    }&lt;br /&gt;
    // Réactive les interruptions&lt;br /&gt;
    sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La fonction de verrouillage de ressource V(Semaphore) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void V(int s) {&lt;br /&gt;
  // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
  int *p = get_pointer(s);&lt;br /&gt;
  // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
  if (p == NULL) return;&lt;br /&gt;
  // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
  cli();&lt;br /&gt;
  // Libère la ressource associée au sémaphore&lt;br /&gt;
  *p = 0;&lt;br /&gt;
  // Initialise un pointeur vers la structure de tâche&lt;br /&gt;
  Task *t = (Task *)tasks;&lt;br /&gt;
  // Parcourt la liste des tâches&lt;br /&gt;
  while (t-&amp;gt;fct != NULL) {&lt;br /&gt;
    // Vérifie si la tâche est en attente du sémaphore s&lt;br /&gt;
    if (t-&amp;gt;etat == (WAIT_SEMAPHORE | STATE_SLEEP) &amp;amp;&amp;amp; t-&amp;gt;time == s) {&lt;br /&gt;
      // Change l'état de la tâche en exécution&lt;br /&gt;
      t-&amp;gt;etat = STATE_RUN;&lt;br /&gt;
      // Libère la ressource associée au sémaphore&lt;br /&gt;
      *p = 1;&lt;br /&gt;
      // Sort de la boucle.&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    // Passe à la tâche suivante&lt;br /&gt;
    t++;&lt;br /&gt;
  }&lt;br /&gt;
  // Réactive les interruptions&lt;br /&gt;
  sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour le code du sémaphore on a s'inspirer du projet des SE promo 2015.&lt;br /&gt;
&lt;br /&gt;
lien : [https://wiki-ima.plil.fr/mediawiki//index.php/Malette_Arduino_%C3%A9ducative_I Malette Arduino éducative I.]&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo à coté.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois la communication MOSI établie, on a préparé une primitive &amp;lt;code&amp;gt;send_buffer_to_master&amp;lt;/code&amp;gt; qui s'occupe de l'envoi des touches stockées dans le buffer (stockage réalisé par la fonction &amp;lt;code&amp;gt;addKeyToBuffer&amp;lt;/code&amp;gt; ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void send_buffer_to_master(struct KeyboardBuffer *keysBuffer) {&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x01) {&lt;br /&gt;
      receivedByte = 0x02;&lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; keysBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         keysBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cette fonction sera appelée par la suite dans une interruption &amp;lt;code&amp;gt;ISR(SPI_STC_vect)&amp;lt;/code&amp;gt; pour alerter la carte mère qu'il existe des touches dans le tampon en lui demandant de lui accorder &amp;quot;la permission&amp;quot; pour lui envoyer les touches appuyées.&lt;br /&gt;
&lt;br /&gt;
=== Primitive au niveau de la carte mère ===&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui prend en paramètres la ligne de selection SPI de notre clavier et le tampon des touches , et qui gére le réception et le stockage des touches dans le buffer&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Conclusion &amp;amp; Axes d'amélioration''' =&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/PICO_GROUPE11 git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3012</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=3012"/>
		<updated>2024-01-18T07:38:02Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Tests et Réalisations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Programmation de l'ordonnanceur. ===&lt;br /&gt;
Après qu'on a testé notre shield, on a commencé a implementer les fonctionnalités de l'ordonnanceur. L'ordonnanceur qu'on a implémenté utilise un algorithme Round-Robine avec un quantum de 20 ms. Le principe l'ordonnateur est basé sur le déclenchement d'une interruption chaque 20 ms sur le timer1 de l'ATMEGA328 Pl'ATMEGA328p. Pour une fréquence d'horloge de 16 Mhz16mhz et un quantum de 20 ms on peut calculer la valeur à mettre dans le registre OCR1A du timer1 pour générer des interruptions chaque 20 ms. La relation est donnée par :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math display=&amp;quot;block&amp;quot;&amp;gt;Nombre de Ticks = \frac{FrequenceCPU*Delay}{Prescalar} - 1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On choisit un diviseur de fréquence de 1024, pour générer les interruptions chaque 20 ms on aura besoin d'avoir un nombre de Ticks de 313.&lt;br /&gt;
&lt;br /&gt;
L'implementation est donnée par :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define PRESCALER	1024&lt;br /&gt;
#define NB_TICK		313&lt;br /&gt;
void Timer(){&lt;br /&gt;
    TCCR1A=0;&lt;br /&gt;
    TCCR1B=(0&amp;lt;&amp;lt;WGM12);&lt;br /&gt;
    #if (PRESCALER==1024)&lt;br /&gt;
        /* Pour avoir un diviseur de fréquence de 1024*/&lt;br /&gt;
        TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
    #endif&lt;br /&gt;
    OCR1A=NB_TICK;&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
    /*&lt;br /&gt;
        Le registre d'interruption du compteur/temporisateur 1 TIMSK1,&lt;br /&gt;
        est configuré pour permettre l'interruption lorsqu'une correspondance est &lt;br /&gt;
        trouvée avec la valeur de comparaison dans OCR1A.&lt;br /&gt;
    */&lt;br /&gt;
    TIMSK1=(1&amp;lt;&amp;lt;OCIE1A);   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Multitasking. ===&lt;br /&gt;
Pour tester notre ordonnanceur, on a essayé d'implementer deux à trois taches différentes. Une tache clignote une LED (LED D3) du Sheild et une autre tache qui permettra de piloter un afficheur 7 segments avec SPI. La fonction tache qui permet de piloter l'afficheur est :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/* Definition de la methode de la tache Afficheur 7 segemnt pour afficher &lt;br /&gt;
    les données sur l'afficheur 7 segement.&lt;br /&gt;
*/&lt;br /&gt;
void afficher_7SEG(){&lt;br /&gt;
    SPI_On(ChipSeelect5);&lt;br /&gt;
    SendRecieveSPI(0x76);&lt;br /&gt;
    SPI_Off(ChipSeelect5);&lt;br /&gt;
    while (1){&lt;br /&gt;
        SPI_On(ChipSeelect5);&lt;br /&gt;
        for(int j=0; j&amp;lt;9999;j++){&lt;br /&gt;
            SendRecieveSPI((j/1000)%10);&lt;br /&gt;
            SendRecieveSPI((j/100)%10);&lt;br /&gt;
            SendRecieveSPI((j/10)%10);&lt;br /&gt;
            SendRecieveSPI(j%10);&lt;br /&gt;
            wait(50)&lt;br /&gt;
        }      &lt;br /&gt;
        SPI_Off(ChipSeelect5);&lt;br /&gt;
        wait(50);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La video demonstration:&lt;br /&gt;
[[Fichier:Video demonstration Afficheur 7 Segment SPI.mp4|vignette|centré|Afficheur 7 segment avec SPI.]]&lt;br /&gt;
&lt;br /&gt;
=== Gestion des Ressources partagées. ===&lt;br /&gt;
Vu que les deux taches qui gerent l'afficheur 7 segments et la carte clavier vont utilisées une ressource partagée (SPI) il sera nécessaire d'utiliser un mécanisme de gestion des ressources partagées comme un semaphore. Cette dernière permet de gérer les conflits des taches qui utilisent la même ressource. La tache qui prend la ressource appelle une fonction P(Semaphore) qui verrouille la ressource pour qu'aucune autre tache ne puisse l'apprend, lorsque la tache termine avec la ressource elle libere la ressource pour que les autres taches puissent exécuter leurs sections critiques. Le code qui permet d'implementer ce mécanisme est donnée ci-dessus :&lt;br /&gt;
&lt;br /&gt;
La fonction de verrouillage de ressource P(Semaphor) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void P(int s) {&lt;br /&gt;
    // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
    int *p = get_pointer(s);&lt;br /&gt;
    // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
    if (p == NULL) return;&lt;br /&gt;
    // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
    cli();&lt;br /&gt;
    // Vérifie si le sémaphore est déjà pris&lt;br /&gt;
    if (*p == 1) {&lt;br /&gt;
        // Met la tâche courante en attente du sémaphore s&lt;br /&gt;
        task_current-&amp;gt;etat = (WAIT_SEMAPHORE | STATE_SLEEP);&lt;br /&gt;
        task_current-&amp;gt;time = s;&lt;br /&gt;
        // Appelle la routine d'interruption Timer1 pour déclencher le changement de contexte&lt;br /&gt;
        TIMER1_COMPA_vect();&lt;br /&gt;
    }&lt;br /&gt;
    // Réactive les interruptions&lt;br /&gt;
    sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La fonction de verrouillage de ressource V(Semaphore) :&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void V(int s) {&lt;br /&gt;
  // Obtient un pointeur vers la variable de sémaphore&lt;br /&gt;
  int *p = get_pointer(s);&lt;br /&gt;
  // Retourne si le pointeur est NULL (erreur)&lt;br /&gt;
  if (p == NULL) return;&lt;br /&gt;
  // Désactive les interruptions pour éviter les interférences.&lt;br /&gt;
  cli();&lt;br /&gt;
  // Libère la ressource associée au sémaphore&lt;br /&gt;
  *p = 0;&lt;br /&gt;
  // Initialise un pointeur vers la structure de tâche&lt;br /&gt;
  Task *t = (Task *)tasks;&lt;br /&gt;
  // Parcourt la liste des tâches&lt;br /&gt;
  while (t-&amp;gt;fct != NULL) {&lt;br /&gt;
    // Vérifie si la tâche est en attente du sémaphore s&lt;br /&gt;
    if (t-&amp;gt;etat == (WAIT_SEMAPHORE | STATE_SLEEP) &amp;amp;&amp;amp; t-&amp;gt;time == s) {&lt;br /&gt;
      // Change l'état de la tâche en exécution&lt;br /&gt;
      t-&amp;gt;etat = STATE_RUN;&lt;br /&gt;
      // Libère la ressource associée au sémaphore&lt;br /&gt;
      *p = 1;&lt;br /&gt;
      // Sort de la boucle.&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
    // Passe à la tâche suivante&lt;br /&gt;
    t++;&lt;br /&gt;
  }&lt;br /&gt;
  // Réactive les interruptions&lt;br /&gt;
  sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour le code du sémaphore on a s'inspirer du projet des SE promo 2015.&lt;br /&gt;
&lt;br /&gt;
lien : [https://wiki-ima.plil.fr/mediawiki//index.php/Malette_Arduino_%C3%A9ducative_I Malette Arduino éducative I.]&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
Une fois la communication MOSI établie, on a préparé une primitive qui s'occupe de l'envoi des touches stockées dans le buffer en s'appuyant sur la fonction &amp;lt;code&amp;gt;addKeyToBuffer&amp;lt;/code&amp;gt; [...]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gére le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Conclusion &amp;amp; Axes d'amélioration''' =&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/PICO_GROUPE11 git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2892</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2892"/>
		<updated>2024-01-17T09:50:46Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Conclusion &amp;amp; Axes d'amélioration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gére le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Conclusion &amp;amp; Axes d'amélioration''' =&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/Pico_SE4_11.git git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2891</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2891"/>
		<updated>2024-01-17T09:50:14Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Liens utiles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gére le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Conclusion &amp;amp; Axes d'amélioration =&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/Pico_SE4_11.git git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2890</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2890"/>
		<updated>2024-01-17T09:46:42Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Conception de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a décidé de travailler avec deux ports USB, &amp;lt;code&amp;gt;USB A&amp;lt;/code&amp;gt; femelle pour la connexion du clavier et &amp;lt;code&amp;gt;USB-Mini&amp;lt;/code&amp;gt; mâle pour la programmation de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gére le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/Pico_SE4_11.git git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2889</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2889"/>
		<updated>2024-01-17T09:42:00Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Tests et Réalisations ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gére le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/Pico_SE4_11.git git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2888</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2888"/>
		<updated>2024-01-17T09:40:24Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
&lt;br /&gt;
=== Principe de fonctionnement ===&lt;br /&gt;
[[Fichier:SPI.png|vignette|Communication SPI]]&lt;br /&gt;
Le protocole SPI (Serial Peripheral Interface) est une méthode de communication série synchrone utilisée pour transférer des données entre un dispositif maître (carte mère) et un ou plusieurs dispositif(s) esclave(s) (carte fille).&lt;br /&gt;
&lt;br /&gt;
Le maître ATMega328p contrôle le processus en initiant la communication, générant l'horloge de 16MHz, et activant/désactivant la ligne SS/CS selon le périphérique esclave visé (carte clavier ou carte d'affichage). Les données seront transférées en paquets de 8 bits (un octet).&lt;br /&gt;
&lt;br /&gt;
=== Réalisation ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gére le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Liens utiles''' =&lt;br /&gt;
Git repository pour nos codes sources : [https://archives.plil.fr/belhasna/Pico_SE4_11.git git]&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SPI.png&amp;diff=2887</id>
		<title>Fichier:SPI.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SPI.png&amp;diff=2887"/>
		<updated>2024-01-17T09:33:47Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SPI&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2886</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2886"/>
		<updated>2024-01-17T09:23:54Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte et gestion du clavier ==&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmation en SPI - Envoi et réception des données ==&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gére le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
Git repository pour nos codes sources : https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2754</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2754"/>
		<updated>2024-01-16T08:33:14Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI ''0x00''.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec ''0x01'' lorsqu'elle détecte ''0x00'' pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande ''0x01'' est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gére le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
Git repository pour nos codes sources : https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2753</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2753"/>
		<updated>2024-01-16T08:28:14Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Carte fille FPGA programmée par VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gère le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2564</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2564"/>
		<updated>2023-12-21T08:56:23Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* SPI - Envoi et réception des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive &amp;lt;code&amp;gt;spi_receive_buffer&amp;lt;/code&amp;gt; (à implanter dans la carte mère) qui gère le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2562</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2562"/>
		<updated>2023-12-21T08:48:04Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Test avec des LEDs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier en phase de soudage|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Démo fonctionnement LEDs|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé une primitive spi_receive_buffer (à implanter dans la carte mère) qui gère le réception et le stockage des touches :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void spi_receive_buffer(uint8_t lineSelect, struct KeyboardBuffer *saveBuffer) {&lt;br /&gt;
   /* Transmission du 0x01 = &amp;quot;(Carte mère): Je suis prêt à recevoir les données&amp;quot; */&lt;br /&gt;
   SPDR = lineSelect;&lt;br /&gt;
   /* Attente de la réponse */&lt;br /&gt;
   while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
   /* Recevoir la réponse de la carte fille et vérifier si c'est 0x02 = &amp;quot;(Carte fille): Je suis prêt à envoyer les données&amp;quot; */&lt;br /&gt;
   uint8_t receivedByte = SPDR;&lt;br /&gt;
   if (receivedByte == 0x02) {&lt;br /&gt;
      while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF))); // Attendre la réception de la taille&lt;br /&gt;
      saveBuffer-&amp;gt;count = SPDR; // Stockage de la taille dans le tampon&lt;br /&gt;
&lt;br /&gt;
      /* Reception des touches une par une */ &lt;br /&gt;
      for (uint8_t i = 0; i &amp;lt; saveBuffer-&amp;gt;count; i++) {&lt;br /&gt;
         // Attendre la réception de la touche&lt;br /&gt;
         while (!(SPSR &amp;amp; (1 &amp;lt;&amp;lt; SPIF)));&lt;br /&gt;
&lt;br /&gt;
         // Stockage touche par touche dans le buffer&lt;br /&gt;
         saveBuffer-&amp;gt;keys[i] = SPDR;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2533</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2533"/>
		<updated>2023-12-20T16:04:26Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Carte fille FPGA programmée par VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
=== Test Ordonnanceur ===&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2532</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2532"/>
		<updated>2023-12-20T16:02:08Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Lecture carte SD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2531</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2531"/>
		<updated>2023-12-20T16:01:43Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Lecture carte SD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test avec des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2526</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2526"/>
		<updated>2023-12-17T09:34:21Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Gestion du clavier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention adoptée (code ASCII), est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2525</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2525"/>
		<updated>2023-12-17T09:31:24Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque &amp;lt;code&amp;gt;LUFA&amp;lt;/code&amp;gt; comme hôte USB avec l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt; pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master &amp;lt;code&amp;gt;ATMega328p&amp;lt;/code&amp;gt; -&amp;gt; Réception Slave &amp;lt;code&amp;gt;AT90USB647&amp;lt;/code&amp;gt;, voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2480</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2480"/>
		<updated>2023-12-14T09:47:19Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* SPI - Envoi et réception des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
Pour un premier essai, on a testé et de-bugué l'envoi SPI dans un seul sens Envoi depuis Master (ATMega328p) -&amp;gt; Réception Slave (AT90USB647), voir la démonstration dans la vidéo ci-dessous :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Démo SPI MasterSlave.mp4|vignette|Démo SPI (Master-&amp;gt;Slave)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:D%C3%A9mo_SPI_MasterSlave.mp4&amp;diff=2479</id>
		<title>Fichier:Démo SPI MasterSlave.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:D%C3%A9mo_SPI_MasterSlave.mp4&amp;diff=2479"/>
		<updated>2023-12-14T09:46:56Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Démo SPI Master&amp;gt;Slave&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2464</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2464"/>
		<updated>2023-12-11T15:37:11Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4_11.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2440</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2440"/>
		<updated>2023-12-11T13:44:07Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* SPI - Envoi et réception des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption pour chaque touche appuyée. On a donc décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d interruption (&amp;lt;=&amp;gt;PCINT4)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement d'envoi des données (nombre de touches + les touches), sauf que l'envoi ne sera effectué que si une requête SPI de code commande 0x01 est reçue [...]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2434</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2434"/>
		<updated>2023-12-11T11:20:19Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* SPI - Envoi des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption. On a décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d'interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d'interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d'interruption&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi et réception des données ===&lt;br /&gt;
Dans un premier temps, la carte mère doit identifier le clavier, elle envoie donc des commandes SPI 0x00.&lt;br /&gt;
&lt;br /&gt;
La carte fille répond alors avec 0x1 lorsqu'elle détecte 0x00 pour dire à la carte mère &amp;quot;Hey, C'est moi le clavier !&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lorsque cette identification est réalisée, on commence le traitement de l'envoi des données (nombre de touches + les touches) [...]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2432</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2432"/>
		<updated>2023-12-11T11:07:00Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* SPI - Envoi des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
/* Verifier si une touche a été appuyée */&lt;br /&gt;
	if (KeyCode)&lt;br /&gt;
	{&lt;br /&gt;
		char PressedKey = 0;&lt;br /&gt;
		if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
		}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '0';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = ' ';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\n';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_TAB)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = '\t';&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_DELETE)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0x7f;&lt;br /&gt;
		}&lt;br /&gt;
		else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 'M'; // ';' en qwerty -&amp;gt; 'M' en azerty&lt;br /&gt;
		}&lt;br /&gt;
		else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1))&lt;br /&gt;
		{&lt;br /&gt;
			PressedKey = 0xff;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		/* Stockage de la touche appuyée dans le buffer */&lt;br /&gt;
		addKeyToBuffer(keyBuffer, PressedKey);&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]Avant d'envoyer les données à la carte mère, il faut d'abord les stocker dans un buffer et savoir combien de touches sont présentes dedans, tout en activant la ligne d'interruption. On a décidé de travailler avec une structure qui permet cela :&amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
struct KeyboardBuffer {&lt;br /&gt;
    char keys[30];  // Tableau pour stocker les touches&lt;br /&gt;
    uint8_t count;  // Nombre de touches dans le tampon&lt;br /&gt;
    uint8_t interruptFlag;  // Drapeau d'interruption&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Fonction pour ajouter une touche au tampon et activer le drapeau d'interruption */&lt;br /&gt;
void addKeyToBuffer(struct KeyboardBuffer *buffer, char key) {&lt;br /&gt;
    if (buffer-&amp;gt;count &amp;lt; sizeof(buffer-&amp;gt;keys)) {&lt;br /&gt;
        buffer-&amp;gt;keys[buffer-&amp;gt;count++] = key;&lt;br /&gt;
        buffer-&amp;gt;interruptFlag = 1;  // Activer le drapeau d'interruption&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi des données ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2310</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2310"/>
		<updated>2023-12-07T11:13:51Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Gestion du clavier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
void KeyboardHost_Task(void){&lt;br /&gt;
	if (USB_HostState != HOST_STATE_Configured)&lt;br /&gt;
	  return;&lt;br /&gt;
&lt;br /&gt;
	/* Select keyboard data pipe */&lt;br /&gt;
	Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);&lt;br /&gt;
&lt;br /&gt;
	/* Unfreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Unfreeze();&lt;br /&gt;
&lt;br /&gt;
	/* Check to see if a packet has been received */&lt;br /&gt;
	if (!(Pipe_IsINReceived())){&lt;br /&gt;
		/* Refreeze HID data IN pipe */&lt;br /&gt;
		Pipe_Freeze();&lt;br /&gt;
&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Ensure pipe contains data before trying to read from it */&lt;br /&gt;
	if (Pipe_IsReadWriteAllowed()){&lt;br /&gt;
		USB_KeyboardReport_Data_t KeyboardReport;&lt;br /&gt;
&lt;br /&gt;
		/* Read in keyboard report data */&lt;br /&gt;
		Pipe_Read_Stream_LE(&amp;amp;KeyboardReport, sizeof(KeyboardReport), NULL);&lt;br /&gt;
		uint8_t KeyCode = KeyboardReport.KeyCode[0];&lt;br /&gt;
&lt;br /&gt;
		/* Check if a key has been pressed */&lt;br /&gt;
		if (KeyCode){&lt;br /&gt;
			char PressedKey = 0;&lt;br /&gt;
			//keyBuffer[bufferCount++] = KeyCode;&lt;br /&gt;
			// Activer l'interruption si ce n'est pas déjà fait et le tampon n'est pas vide&lt;br /&gt;
			/*if(bufferCount==1){&lt;br /&gt;
				// Activer l'interruption externe INT0 pour la broche PB4&lt;br /&gt;
				EIMSK |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
			}*/&lt;br /&gt;
			// Retrieve pressed key character if alphanumeric.&lt;br /&gt;
			if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
				/* Stocker la touche dans le tompon des touches */&lt;br /&gt;
				/* Envoyer la touche avec SPI vers le ATMEGA328P */&lt;br /&gt;
				if(SendPressedKey(PressedKey)==0){&lt;br /&gt;
					ToggleLEDs(PC0,100);&lt;br /&gt;
				}&lt;br /&gt;
				/* Toggle status LED to indicate keypress */&lt;br /&gt;
				&lt;br /&gt;
			}else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp; (KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
				ToggleLEDs(PC1,100);&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS){&lt;br /&gt;
				PressedKey = '0';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_SPACE){&lt;br /&gt;
				PressedKey = ' ';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_ENTER){&lt;br /&gt;
				PressedKey = '\n';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	/* Clear the IN endpoint, ready for next data packet */&lt;br /&gt;
	Pipe_ClearIN();&lt;br /&gt;
&lt;br /&gt;
	/* Refreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Freeze();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]&lt;br /&gt;
&lt;br /&gt;
=== SPI - Envoi des données ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2309</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2309"/>
		<updated>2023-12-07T11:12:53Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
=== Gestion du clavier ===&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
void KeyboardHost_Task(void){&lt;br /&gt;
	if (USB_HostState != HOST_STATE_Configured)&lt;br /&gt;
	  return;&lt;br /&gt;
&lt;br /&gt;
	/* Select keyboard data pipe */&lt;br /&gt;
	Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);&lt;br /&gt;
&lt;br /&gt;
	/* Unfreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Unfreeze();&lt;br /&gt;
&lt;br /&gt;
	/* Check to see if a packet has been received */&lt;br /&gt;
	if (!(Pipe_IsINReceived())){&lt;br /&gt;
		/* Refreeze HID data IN pipe */&lt;br /&gt;
		Pipe_Freeze();&lt;br /&gt;
&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Ensure pipe contains data before trying to read from it */&lt;br /&gt;
	if (Pipe_IsReadWriteAllowed()){&lt;br /&gt;
		USB_KeyboardReport_Data_t KeyboardReport;&lt;br /&gt;
&lt;br /&gt;
		/* Read in keyboard report data */&lt;br /&gt;
		Pipe_Read_Stream_LE(&amp;amp;KeyboardReport, sizeof(KeyboardReport), NULL);&lt;br /&gt;
		uint8_t KeyCode = KeyboardReport.KeyCode[0];&lt;br /&gt;
&lt;br /&gt;
		/* Check if a key has been pressed */&lt;br /&gt;
		if (KeyCode){&lt;br /&gt;
			char PressedKey = 0;&lt;br /&gt;
			//keyBuffer[bufferCount++] = KeyCode;&lt;br /&gt;
			// Activer l'interruption si ce n'est pas déjà fait et le tampon n'est pas vide&lt;br /&gt;
			/*if(bufferCount==1){&lt;br /&gt;
				// Activer l'interruption externe INT0 pour la broche PB4&lt;br /&gt;
				EIMSK |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
			}*/&lt;br /&gt;
			// Retrieve pressed key character if alphanumeric.&lt;br /&gt;
			if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
				/* Stocker la touche dans le tompon des touches */&lt;br /&gt;
				/* Envoyer la touche avec SPI vers le ATMEGA328P */&lt;br /&gt;
				if(SendPressedKey(PressedKey)==0){&lt;br /&gt;
					ToggleLEDs(PC0,100);&lt;br /&gt;
				}&lt;br /&gt;
				/* Toggle status LED to indicate keypress */&lt;br /&gt;
				&lt;br /&gt;
			}else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp; (KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
				ToggleLEDs(PC1,100);&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS){&lt;br /&gt;
				PressedKey = '0';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_SPACE){&lt;br /&gt;
				PressedKey = ' ';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_ENTER){&lt;br /&gt;
				PressedKey = '\n';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	/* Clear the IN endpoint, ready for next data packet */&lt;br /&gt;
	Pipe_ClearIN();&lt;br /&gt;
&lt;br /&gt;
	/* Refreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Freeze();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2299</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2299"/>
		<updated>2023-12-07T10:14:06Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot; lang=&amp;quot;abap&amp;quot;&amp;gt;&lt;br /&gt;
void KeyboardHost_Task(void){&lt;br /&gt;
	if (USB_HostState != HOST_STATE_Configured)&lt;br /&gt;
	  return;&lt;br /&gt;
&lt;br /&gt;
	/* Select keyboard data pipe */&lt;br /&gt;
	Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);&lt;br /&gt;
&lt;br /&gt;
	/* Unfreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Unfreeze();&lt;br /&gt;
&lt;br /&gt;
	/* Check to see if a packet has been received */&lt;br /&gt;
	if (!(Pipe_IsINReceived())){&lt;br /&gt;
		/* Refreeze HID data IN pipe */&lt;br /&gt;
		Pipe_Freeze();&lt;br /&gt;
&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Ensure pipe contains data before trying to read from it */&lt;br /&gt;
	if (Pipe_IsReadWriteAllowed()){&lt;br /&gt;
		USB_KeyboardReport_Data_t KeyboardReport;&lt;br /&gt;
&lt;br /&gt;
		/* Read in keyboard report data */&lt;br /&gt;
		Pipe_Read_Stream_LE(&amp;amp;KeyboardReport, sizeof(KeyboardReport), NULL);&lt;br /&gt;
		uint8_t KeyCode = KeyboardReport.KeyCode[0];&lt;br /&gt;
&lt;br /&gt;
		/* Check if a key has been pressed */&lt;br /&gt;
		if (KeyCode){&lt;br /&gt;
			char PressedKey = 0;&lt;br /&gt;
			//keyBuffer[bufferCount++] = KeyCode;&lt;br /&gt;
			// Activer l'interruption si ce n'est pas déjà fait et le tampon n'est pas vide&lt;br /&gt;
			/*if(bufferCount==1){&lt;br /&gt;
				// Activer l'interruption externe INT0 pour la broche PB4&lt;br /&gt;
				EIMSK |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
			}*/&lt;br /&gt;
			// Retrieve pressed key character if alphanumeric.&lt;br /&gt;
			if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
				/* Stocker la touche dans le tompon des touches */&lt;br /&gt;
				/* Envoyer la touche avec SPI vers le ATMEGA328P */&lt;br /&gt;
				if(SendPressedKey(PressedKey)==0){&lt;br /&gt;
					ToggleLEDs(PC0,100);&lt;br /&gt;
				}&lt;br /&gt;
				/* Toggle status LED to indicate keypress */&lt;br /&gt;
				&lt;br /&gt;
			}else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp; (KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
				ToggleLEDs(PC1,100);&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS){&lt;br /&gt;
				PressedKey = '0';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_SPACE){&lt;br /&gt;
				PressedKey = ' ';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_ENTER){&lt;br /&gt;
				PressedKey = '\n';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	/* Clear the IN endpoint, ready for next data packet */&lt;br /&gt;
	Pipe_ClearIN();&lt;br /&gt;
&lt;br /&gt;
	/* Refreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Freeze();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2295</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2295"/>
		<updated>2023-12-07T10:08:46Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void KeyboardHost_Task(void){&lt;br /&gt;
	if (USB_HostState != HOST_STATE_Configured)&lt;br /&gt;
	  return;&lt;br /&gt;
&lt;br /&gt;
	/* Select keyboard data pipe */&lt;br /&gt;
	Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);&lt;br /&gt;
&lt;br /&gt;
	/* Unfreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Unfreeze();&lt;br /&gt;
&lt;br /&gt;
	/* Check to see if a packet has been received */&lt;br /&gt;
	if (!(Pipe_IsINReceived())){&lt;br /&gt;
		/* Refreeze HID data IN pipe */&lt;br /&gt;
		Pipe_Freeze();&lt;br /&gt;
&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Ensure pipe contains data before trying to read from it */&lt;br /&gt;
	if (Pipe_IsReadWriteAllowed()){&lt;br /&gt;
		USB_KeyboardReport_Data_t KeyboardReport;&lt;br /&gt;
&lt;br /&gt;
		/* Read in keyboard report data */&lt;br /&gt;
		Pipe_Read_Stream_LE(&amp;amp;KeyboardReport, sizeof(KeyboardReport), NULL);&lt;br /&gt;
		uint8_t KeyCode = KeyboardReport.KeyCode[0];&lt;br /&gt;
&lt;br /&gt;
		/* Check if a key has been pressed */&lt;br /&gt;
		if (KeyCode){&lt;br /&gt;
			char PressedKey = 0;&lt;br /&gt;
			//keyBuffer[bufferCount++] = KeyCode;&lt;br /&gt;
			// Activer l'interruption si ce n'est pas déjà fait et le tampon n'est pas vide&lt;br /&gt;
			/*if(bufferCount==1){&lt;br /&gt;
				// Activer l'interruption externe INT0 pour la broche PB4&lt;br /&gt;
				EIMSK |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
			}*/&lt;br /&gt;
			// Retrieve pressed key character if alphanumeric.&lt;br /&gt;
			if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
				/* Stocker la touche dans le tompon des touches */&lt;br /&gt;
				/* Envoyer la touche avec SPI vers le ATMEGA328P */&lt;br /&gt;
				if(SendPressedKey(PressedKey)==0){&lt;br /&gt;
					ToggleLEDs(PC0,100);&lt;br /&gt;
				}&lt;br /&gt;
				/* Toggle status LED to indicate keypress */&lt;br /&gt;
				&lt;br /&gt;
			}else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp; (KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
				ToggleLEDs(PC1,100);&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS){&lt;br /&gt;
				PressedKey = '0';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_SPACE){&lt;br /&gt;
				PressedKey = ' ';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_ENTER){&lt;br /&gt;
				PressedKey = '\n';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	/* Clear the IN endpoint, ready for next data packet */&lt;br /&gt;
	Pipe_ClearIN();&lt;br /&gt;
&lt;br /&gt;
	/* Refreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Freeze();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2293</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2293"/>
		<updated>2023-12-07T10:07:51Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Rendus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void KeyboardHost_Task(void){&lt;br /&gt;
	if (USB_HostState != HOST_STATE_Configured)&lt;br /&gt;
	  return;&lt;br /&gt;
&lt;br /&gt;
	/* Select keyboard data pipe */&lt;br /&gt;
	Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);&lt;br /&gt;
&lt;br /&gt;
	/* Unfreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Unfreeze();&lt;br /&gt;
&lt;br /&gt;
	/* Check to see if a packet has been received */&lt;br /&gt;
	if (!(Pipe_IsINReceived())){&lt;br /&gt;
		/* Refreeze HID data IN pipe */&lt;br /&gt;
		Pipe_Freeze();&lt;br /&gt;
&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Ensure pipe contains data before trying to read from it */&lt;br /&gt;
	if (Pipe_IsReadWriteAllowed()){&lt;br /&gt;
		USB_KeyboardReport_Data_t KeyboardReport;&lt;br /&gt;
&lt;br /&gt;
		/* Read in keyboard report data */&lt;br /&gt;
		Pipe_Read_Stream_LE(&amp;amp;KeyboardReport, sizeof(KeyboardReport), NULL);&lt;br /&gt;
		uint8_t KeyCode = KeyboardReport.KeyCode[0];&lt;br /&gt;
&lt;br /&gt;
		/* Check if a key has been pressed */&lt;br /&gt;
		if (KeyCode){&lt;br /&gt;
			char PressedKey = 0;&lt;br /&gt;
			//keyBuffer[bufferCount++] = KeyCode;&lt;br /&gt;
			// Activer l'interruption si ce n'est pas déjà fait et le tampon n'est pas vide&lt;br /&gt;
			/*if(bufferCount==1){&lt;br /&gt;
				// Activer l'interruption externe INT0 pour la broche PB4&lt;br /&gt;
				EIMSK |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
			}*/&lt;br /&gt;
			// Retrieve pressed key character if alphanumeric.&lt;br /&gt;
			if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
				/* Stocker la touche dans le tompon des touches */&lt;br /&gt;
				/* Envoyer la touche avec SPI vers le ATMEGA328P */&lt;br /&gt;
				if(SendPressedKey(PressedKey)==0){&lt;br /&gt;
					ToggleLEDs(PC0,100);&lt;br /&gt;
				}&lt;br /&gt;
				/* Toggle status LED to indicate keypress */&lt;br /&gt;
				&lt;br /&gt;
			}else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp; (KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
				ToggleLEDs(PC1,100);&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS){&lt;br /&gt;
				PressedKey = '0';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_SPACE){&lt;br /&gt;
				PressedKey = ' ';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_ENTER){&lt;br /&gt;
				PressedKey = '\n';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	/* Clear the IN endpoint, ready for next data packet */&lt;br /&gt;
	Pipe_ClearIN();&lt;br /&gt;
&lt;br /&gt;
	/* Refreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Freeze();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2291</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2291"/>
		<updated>2023-12-07T10:07:29Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void KeyboardHost_Task(void){&lt;br /&gt;
	if (USB_HostState != HOST_STATE_Configured)&lt;br /&gt;
	  return;&lt;br /&gt;
&lt;br /&gt;
	/* Select keyboard data pipe */&lt;br /&gt;
	Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);&lt;br /&gt;
&lt;br /&gt;
	/* Unfreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Unfreeze();&lt;br /&gt;
&lt;br /&gt;
	/* Check to see if a packet has been received */&lt;br /&gt;
	if (!(Pipe_IsINReceived())){&lt;br /&gt;
		/* Refreeze HID data IN pipe */&lt;br /&gt;
		Pipe_Freeze();&lt;br /&gt;
&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Ensure pipe contains data before trying to read from it */&lt;br /&gt;
	if (Pipe_IsReadWriteAllowed()){&lt;br /&gt;
		USB_KeyboardReport_Data_t KeyboardReport;&lt;br /&gt;
&lt;br /&gt;
		/* Read in keyboard report data */&lt;br /&gt;
		Pipe_Read_Stream_LE(&amp;amp;KeyboardReport, sizeof(KeyboardReport), NULL);&lt;br /&gt;
		uint8_t KeyCode = KeyboardReport.KeyCode[0];&lt;br /&gt;
&lt;br /&gt;
		/* Check if a key has been pressed */&lt;br /&gt;
		if (KeyCode){&lt;br /&gt;
			char PressedKey = 0;&lt;br /&gt;
			//keyBuffer[bufferCount++] = KeyCode;&lt;br /&gt;
			// Activer l'interruption si ce n'est pas déjà fait et le tampon n'est pas vide&lt;br /&gt;
			/*if(bufferCount==1){&lt;br /&gt;
				// Activer l'interruption externe INT0 pour la broche PB4&lt;br /&gt;
				EIMSK |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
			}*/&lt;br /&gt;
			// Retrieve pressed key character if alphanumeric.&lt;br /&gt;
			if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
				/* Stocker la touche dans le tompon des touches */&lt;br /&gt;
				/* Envoyer la touche avec SPI vers le ATMEGA328P */&lt;br /&gt;
				if(SendPressedKey(PressedKey)==0){&lt;br /&gt;
					ToggleLEDs(PC0,100);&lt;br /&gt;
				}&lt;br /&gt;
				/* Toggle status LED to indicate keypress */&lt;br /&gt;
				&lt;br /&gt;
			}else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp; (KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
				ToggleLEDs(PC1,100);&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS){&lt;br /&gt;
				PressedKey = '0';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_SPACE){&lt;br /&gt;
				PressedKey = ' ';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_ENTER){&lt;br /&gt;
				PressedKey = '\n';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	/* Clear the IN endpoint, ready for next data packet */&lt;br /&gt;
	Pipe_ClearIN();&lt;br /&gt;
&lt;br /&gt;
	/* Refreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Freeze();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|vignette|Démo clavier]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2290</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2290"/>
		<updated>2023-12-07T10:06:15Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (vous trouvez le code source et la démonstration de cette partie ci-dessous).&lt;br /&gt;
&lt;br /&gt;
A bien noter que la convention de ce code, est pour un clavier de type QWERTY. On développera par la suite une primitive qui gére la conversion QWERTY -&amp;gt; AZERTY.&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
void KeyboardHost_Task(void){&lt;br /&gt;
	if (USB_HostState != HOST_STATE_Configured)&lt;br /&gt;
	  return;&lt;br /&gt;
&lt;br /&gt;
	/* Select keyboard data pipe */&lt;br /&gt;
	Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);&lt;br /&gt;
&lt;br /&gt;
	/* Unfreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Unfreeze();&lt;br /&gt;
&lt;br /&gt;
	/* Check to see if a packet has been received */&lt;br /&gt;
	if (!(Pipe_IsINReceived())){&lt;br /&gt;
		/* Refreeze HID data IN pipe */&lt;br /&gt;
		Pipe_Freeze();&lt;br /&gt;
&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Ensure pipe contains data before trying to read from it */&lt;br /&gt;
	if (Pipe_IsReadWriteAllowed()){&lt;br /&gt;
		USB_KeyboardReport_Data_t KeyboardReport;&lt;br /&gt;
&lt;br /&gt;
		/* Read in keyboard report data */&lt;br /&gt;
		Pipe_Read_Stream_LE(&amp;amp;KeyboardReport, sizeof(KeyboardReport), NULL);&lt;br /&gt;
		uint8_t KeyCode = KeyboardReport.KeyCode[0];&lt;br /&gt;
&lt;br /&gt;
		/* Check if a key has been pressed */&lt;br /&gt;
		if (KeyCode){&lt;br /&gt;
			char PressedKey = 0;&lt;br /&gt;
			//keyBuffer[bufferCount++] = KeyCode;&lt;br /&gt;
			// Activer l'interruption si ce n'est pas déjà fait et le tampon n'est pas vide&lt;br /&gt;
			/*if(bufferCount==1){&lt;br /&gt;
				// Activer l'interruption externe INT0 pour la broche PB4&lt;br /&gt;
				EIMSK |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
			}*/&lt;br /&gt;
			// Retrieve pressed key character if alphanumeric.&lt;br /&gt;
			if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
				/* Stocker la touche dans le tompon des touches */&lt;br /&gt;
				/* Envoyer la touche avec SPI vers le ATMEGA328P */&lt;br /&gt;
				if(SendPressedKey(PressedKey)==0){&lt;br /&gt;
					ToggleLEDs(PC0,100);&lt;br /&gt;
				}&lt;br /&gt;
				/* Toggle status LED to indicate keypress */&lt;br /&gt;
				&lt;br /&gt;
			}else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp; (KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)){&lt;br /&gt;
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
				ToggleLEDs(PC1,100);&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS){&lt;br /&gt;
				PressedKey = '0';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_SPACE){&lt;br /&gt;
				PressedKey = ' ';&lt;br /&gt;
			}else if (KeyCode == HID_KEYBOARD_SC_ENTER){&lt;br /&gt;
				PressedKey = '\n';&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	/* Clear the IN endpoint, ready for next data packet */&lt;br /&gt;
	Pipe_ClearIN();&lt;br /&gt;
&lt;br /&gt;
	/* Refreeze keyboard data pipe */&lt;br /&gt;
	Pipe_Freeze();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Démo clavier.mp4|centré|vignette|Démo clavier]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:D%C3%A9mo_clavier.mp4&amp;diff=2289</id>
		<title>Fichier:Démo clavier.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:D%C3%A9mo_clavier.mp4&amp;diff=2289"/>
		<updated>2023-12-07T10:05:33Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Démonstration clavier&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2285</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2285"/>
		<updated>2023-12-07T09:53:28Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
On a utilisé la bibliothèque LUFA comme hôte USB avec l'utilitaire dfu-programmer pour pouvoir programmer AT90USB647.&lt;br /&gt;
&lt;br /&gt;
Pour la partie gestion du clavier USB, on s'est appuyé sur la démonstration KeyboardHost présente dans la bibliothèque LUFA.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps, on a commencé par débuguer les appuis des touches sur le clavier de telle façon à basculer l'état de la LED D4 (jaune) quand une lettre est appuyée ([a-z]), et basculer l'état de la LED D3 (bleue) si un chiffre est appuyé ([0-9]) (voir la vidéo ci-dessous pour la démonstration):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2284</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2284"/>
		<updated>2023-12-07T09:37:02Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Carte fille clavier &amp;quot;USB&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
&lt;br /&gt;
== Conception de la carte ==&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
&lt;br /&gt;
== Programmation de la carte ==&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2027</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2027"/>
		<updated>2023-11-07T12:57:39Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
Pour une première étape on a essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela on a commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). on a choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2026</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=2026"/>
		<updated>2023-11-07T12:55:59Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo démonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
Pour une première étape j'ai essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela j'ai commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). J'ai choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a créé le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|Schéma de la carte fille (Clavier USB)|vignette|645x645px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|Schéma PCB de la carte fille (après routage)|vignette|650x650px]]&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1999</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1999"/>
		<updated>2023-11-06T10:53:25Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Test des LEDs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo demonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &lt;br /&gt;
&lt;br /&gt;
Après, on a implémenté le code suivant dans une carte Arduino pour revérifier le clignotement des LEDs (1s on / 1s off) : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
Pour une première étape j'ai essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela j'ai commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). J'ai choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a crée le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|cadre|Schéma de la carte fille (Clavier USB)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|cadre|Schéma PCB de la carte fille (après routage)]]&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1931</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1931"/>
		<updated>2023-11-06T09:52:35Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : /* Carte fille clavier &amp;quot;USB&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|406x406px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|386x386px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|380x380px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
[[Fichier:Video demonstration Test des LEDs.mov|vignette|Vidéo demonstration fonctionnement LEDs.|0x0px]]&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD et on a vérifié le bon fonctionnement de lecture et écriture pour la carte SD avec les commandes : &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
// Pour tester la carte SD en écriture.&lt;br /&gt;
make upload&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
Pour une première étape j'ai essayé d'avoir une idée sur le microcontrôleur utilisé (AT90USB647), pour cela j'ai commencé par lire la [https://ww1.microchip.com/downloads/en/DeviceDoc/doc7593.pdf fiche technique] du microcontrôleur en annexes (Rendus). J'ai choisi deux portes USB, une porte USB A femelle pour le clavier et une porte USB-Mini mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On a crée le schéma de la carte fille dans kiCAD :&lt;br /&gt;
[[Fichier:Schéma de la carte clavier sous kiCAD.png|centré|cadre|Schéma de la carte fille (Clavier USB)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après avoir bien vérifier le schéma, on a commencé à importer les footprints de chaque composant (en utilisant la bibliothéque SparkFun pour USB A-S femelle) pour se lancer à la réalisation de schéma PCB de la carte.&lt;br /&gt;
[[Fichier:SchematicPCB.png|alt=schematicPCB|centré|cadre|Schéma PCB de la carte fille (après routage)]]&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SchematicPCB.png&amp;diff=1929</id>
		<title>Fichier:SchematicPCB.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SchematicPCB.png&amp;diff=1929"/>
		<updated>2023-11-06T09:50:26Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schéma PCB de la carte fille (après routage)&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_de_la_carte_clavier_sous_kiCAD.png&amp;diff=1922</id>
		<title>Fichier:Schéma de la carte clavier sous kiCAD.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Sch%C3%A9ma_de_la_carte_clavier_sous_kiCAD.png&amp;diff=1922"/>
		<updated>2023-11-06T09:38:45Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schéma de la carte&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1681</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1681"/>
		<updated>2023-09-22T19:05:05Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|326x326px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|324x324px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
[[Fichier:Carte mère prototype.jpg|centré|vignette|386x386px|Carte mère prototype]]&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD &lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1680</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1680"/>
		<updated>2023-09-22T19:00:56Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|303x303px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|305x305px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
&lt;br /&gt;
= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD &lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_m%C3%A8re_prototype.jpg&amp;diff=1679</id>
		<title>Fichier:Carte mère prototype.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_m%C3%A8re_prototype.jpg&amp;diff=1679"/>
		<updated>2023-09-22T18:58:17Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Carte mère prototype&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1669</id>
		<title>SE4Binome2023-11</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-11&amp;diff=1669"/>
		<updated>2023-09-22T09:45:35Z</updated>

		<summary type="html">&lt;p&gt;Achaouni : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Fichier:Shield-soudage.png|alt=Shield de prototypage|vignette|Bouclier après soudure|303x303px]]&lt;br /&gt;
[[Fichier:Shield&amp;amp;Arduino.jpg|vignette|Carte mère prototype|303x303px]]&lt;br /&gt;
[[Fichier:Câbles pour les connecteurs HE-10.jpg|vignette|305x305px|Câbles pour les connecteurs HE-10]]&lt;br /&gt;
&lt;br /&gt;
= '''Ordonnanceur (OS)''' =&lt;br /&gt;
&lt;br /&gt;
=== SOUDURE SHIELD. ===&lt;br /&gt;
Dans la première séance on a commencé à souder le Shield qui servira comme une carte-mère de prototypage pour les cartes filles qu'on va réaliser au cours de ce module. Premièrement on a fait le soudage du lecteur de la carte SD et les résistances 3.3 k Ohm, 680 Ohm et les LEDs pour tester le bon fonctionnement du Shield après.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on a passé à la 2ème partie de soudage : Le bouclier avec la carte Arduino. L'objectif sera de pouvoir tester régulièrement notre carte fille (Clavier &amp;quot;USB&amp;quot;) en se servant de le carte mère prototype (Shield + Arduino).&lt;br /&gt;
&lt;br /&gt;
Pour la séance prochaine on continue sur le soudage du Shield et on va tester son fonctionnement et la lecture de la carte de masse SD.&lt;br /&gt;
&lt;br /&gt;
=== Test des LEDs ===&lt;br /&gt;
Dans la deuxième séance on a finalisé la soudure du SHIELD avec les différents composantes (LEDs,  résistances , Lecteur carte SD, les PINs et les connecteurs HE-10). &lt;br /&gt;
&lt;br /&gt;
On a testé le fonctionnement des LEDs avec un ampèremètre . &amp;lt;syntaxhighlight lang=&amp;quot;abap&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;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;
void setup() {&lt;br /&gt;
    // Configuration des PINs 1,4,7 connectés au LEDs comme des OUTPUT.&lt;br /&gt;
    DDRB |= (1 &amp;lt;&amp;lt; DDB1);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD4);&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; DDD7);&lt;br /&gt;
    // Configuration des PINs analogique A0, A3.&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC0);&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; DDC3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
    // Mettre les PINs à l'état HIGH.&lt;br /&gt;
    PORTB |= (1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD |= (1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC |= (1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000); // Delay de 1000 milliseconds&lt;br /&gt;
    // Basculement d'état des LEDs&lt;br /&gt;
    PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTB1);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD4);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTD7);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC0);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; PORTC3);&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
        setup();&lt;br /&gt;
        while(1){&lt;br /&gt;
            loop();&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;
===  Lecture carte SD ===&lt;br /&gt;
Dans la troisième séance, on a travaillé sur le code pour vérifier le bon fonctionnement des LEDs.&lt;br /&gt;
&lt;br /&gt;
Après on a passé au test de la carte SD &lt;br /&gt;
&lt;br /&gt;
= '''Carte fille FPGA programmée par VHDL''' =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Carte fille clavier &amp;quot;USB&amp;quot;''' =&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
= '''Rendus''' =&lt;br /&gt;
On a même commencé à créer notre repository pour mettre nos fichiers source pour l’ordonnanceur et les cartes filles à réaliser. https://archives.plil.fr/belhasna/Pico_SE4.git&lt;/div&gt;</summary>
		<author><name>Achaouni</name></author>
	</entry>
</feed>