<?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=Handrian</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=Handrian"/>
	<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Handrian"/>
	<updated>2026-05-14T08:55:00Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3049</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3049"/>
		<updated>2024-01-18T10:53:07Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* La matrice Led */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions &amp;lt;code&amp;gt;spi_activer&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;spi_desactiver&amp;lt;/code&amp;gt; sont utilisées pour activer et désactiver les différents esclaves sur le bus SPI en manipulant les broches SS correspondantes. Cela permet de sélectionner le périphérique avec lequel le microcontrôleur va communiquer via le bus SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(int chip_s) {&lt;br /&gt;
    if (chip_s == SS_2 || chip_s == SS_3) {&lt;br /&gt;
        PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    } else if (chip_s == SS_5) {&lt;br /&gt;
        PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(int chip_s) {&lt;br /&gt;
    if (chip_s == SS_2 || chip_s == SS_3) {&lt;br /&gt;
        PORTD |= (1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    } else if (chip_s == SS_5) {&lt;br /&gt;
        PORTB |= (1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;La matrice Led&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Nous avons essayé l'affichage avec la matrice Led par le protocole SPI. On a inclut les représentations matricielles pour les chiffres de 0 à 9 et les lettres de l'alphabet de A à Z.&lt;br /&gt;
Nous avons écrit une fonction pour l'envoi de données à la matrice LED via le protocole SPI. Elle active le périphérique SPI, envoie la ligne et la valeur via SPI, puis désactive le périphérique.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void matrice_Byte(uint8_t row, uint8_t value) {&lt;br /&gt;
    // Activer le périphérique SPI correspondant à la matrice&lt;br /&gt;
    spi_activer(SS_2);&lt;br /&gt;
&lt;br /&gt;
    // Envoyer les données à la matrice via SPI&lt;br /&gt;
    spi_exch(row);&lt;br /&gt;
    spi_exch(value);&lt;br /&gt;
&lt;br /&gt;
    // Désactiver le périphérique SPI&lt;br /&gt;
    spi_desactiver(SS_2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage de caractère et le test :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//fonction pour la matrice&lt;br /&gt;
void display_on_matrix(void) {&lt;br /&gt;
    char l = caractere;&lt;br /&gt;
    int index = 0;&lt;br /&gt;
&lt;br /&gt;
    if (l &amp;gt;= '0' &amp;amp;&amp;amp; l &amp;lt;= '9')&lt;br /&gt;
        index = l - '0';&lt;br /&gt;
    else if (l &amp;gt;= 'a' &amp;amp;&amp;amp; l &amp;lt;= 'z')&lt;br /&gt;
        index = 10 + (l - 'a');&lt;br /&gt;
    else if (l &amp;gt;= 'A' &amp;amp;&amp;amp; l &amp;lt;= 'Z')&lt;br /&gt;
        index = 10 + (l - 'A');&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
        spi_activer(SS_2);&lt;br /&gt;
        spi_exch(0x76);&lt;br /&gt;
        _wait_ms(1);&lt;br /&gt;
        spi_desactiver(SS_2);&lt;br /&gt;
        if (index &amp;gt;= 0 &amp;amp;&amp;amp; index &amp;lt;= 9) {&lt;br /&gt;
            for (uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
                matrice_Byte(i + 1, numbers[index][i]);&lt;br /&gt;
            }&lt;br /&gt;
        } else if (index &amp;gt;= 10 &amp;amp;&amp;amp; index &amp;lt;= 35) {&lt;br /&gt;
            for (int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
                matrice_Byte(i + 1, letters[index - 10][i]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        spi_desactiver(SS_2);&lt;br /&gt;
        _wait_ms(500);&lt;br /&gt;
&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Malheureusement, malgré nos efforts, la fonction &amp;lt;code&amp;gt;display_on_matrix&amp;lt;/code&amp;gt; n'a pas réussi à produire l'affichage voulu sur la matrice LED. Malgré la mise en œuvre du protocole SPI et des déterminations d'index pour les caractères, l'effet clignotant souhaité n'a pas été observé.Faute de temps, nous avons décidé de recentrer nos efforts sur la carte LCD.&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
===Controleur VGA===&lt;br /&gt;
Un contrôleur VGA sert à générer des signaux de synchronisation horizontale (HS) et verticale (VS), ainsi que des signaux de couleur (r, g, b) pour un écran VGA. L’horloge d'entrée est à 100 MHz et génère une horloge de sortie à 65 MHz généré par le wizard (clk_wiz_0).&lt;br /&gt;
&lt;br /&gt;
Le code ci-dessous permet de générer des signaux VGA pour afficher des images colorées sur un écran VGA et un Basys3 &lt;br /&gt;
&lt;br /&gt;
* Génération des signaux HS et VS pour indiquer les périodes de synchronisation horizontale et verticale&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
process1 : process(clock_65Mhz)&lt;br /&gt;
begin&lt;br /&gt;
       if clock_65Mhz'event and clock_65Mhz = '1' then&lt;br /&gt;
            if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1048 and compteur_hori &amp;lt;1183 then&lt;br /&gt;
                    HS &amp;lt;= '0';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1183 and compteur_hori &amp;lt; 1343 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 else&lt;br /&gt;
                 HS &amp;lt;= '1';&lt;br /&gt;
                 compteur_hori &amp;lt;= 0;&lt;br /&gt;
                 compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                  end if;&lt;br /&gt;
             end if;&lt;br /&gt;
             if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                    VS &amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;= 774 and compteur_vert &amp;lt; 780 then&lt;br /&gt;
                    VS &amp;lt;= '0';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;=780 and compteur_vert &amp;lt; 805 then&lt;br /&gt;
                    VS &amp;lt;='1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                else&lt;br /&gt;
                    VS&amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= 0;&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
&lt;br /&gt;
               end if;&lt;br /&gt;
            end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Génération des Signaux de Couleur (r, g, b) en utilisant les boutons b1, b2 et b3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
if b1 = '1' then&lt;br /&gt;
		    --couleur rouge&lt;br /&gt;
                if compteur_hori &amp;gt; 300 and compteur_hori &amp;lt; 600 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 300 and compteur_vert &amp;lt; 600 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur verte&lt;br /&gt;
             if b2 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur bleue&lt;br /&gt;
             if b3 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
           end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controleur bus SPI===&lt;br /&gt;
Les dispositifs SPI communiquent en utilisant une architecture maître-esclave avec un seul maître.Un ou plusieurs dispositifs esclaves SPI sont pris en charge par la sélection d'esclaves individuels &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt;&lt;br /&gt;
Avant de démarrer une communication avec un esclave particulier, le maître active la ligne &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt; associée à cet esclave en la faisant passer de l'état haut à l'état bas.&lt;br /&gt;
Une fois que l'esclave est sélectionné, le maître peut commencer à envoyer des données sur la ligne '''MOSI''' et recevoir des données sur la ligne '''MISO'''.&lt;br /&gt;
[[Fichier:SPI un maitre-esclave.png|gauche|vignette|546x546px|Un maitre un esclave]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SPI plusieurs esclaves.png|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous devons illustrer une implémentation d'un émetteur SPI synchrone. Dans notre contexte, on gère la transmission séquentielle d'octets sur la ligne '''MOSI''', tout en signalant la fin de chaque transmission par le signal &amp;lt;code&amp;gt;'''complete'''&amp;lt;/code&amp;gt;. Lorsqu'il est déclenché par un front montant d'horloge, le code gère différents états, tels que l'état &amp;lt;code&amp;gt;'''IDLE'''&amp;lt;/code&amp;gt; où le système est en attente, et l'état &amp;lt;code&amp;gt;'''TRANSFER'''&amp;lt;/code&amp;gt; où les données sont envoyées bit par bit.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Voici le code pour tester chaque état &lt;br /&gt;
&lt;br /&gt;
* Etat IDLE&lt;br /&gt;
Dans l'état IDLE, le système est en attente d'une nouvelle transmission SPI, et la transition vers l'état de transfert est conditionnée par la détection d'un signal de démarrage. Lorsque ce signal est activé, l'état passe à TRANSFER, initialisant la communication en activant la sélection d'esclave et préparant la transmission des données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when IDLE =&amp;gt;&lt;br /&gt;
    if start = '1' then&lt;br /&gt;
        -- Début d'une nouvelle transmission&lt;br /&gt;
        state &amp;lt;= TRANSFER;&lt;br /&gt;
        ss &amp;lt;= '0';   -- Activer la sélection d'esclave&lt;br /&gt;
        bit_counter &amp;lt;= 7;   -- Initialiser le compteur de bits&lt;br /&gt;
        mosi &amp;lt;= data_buffer(7);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat TRANSFER&lt;br /&gt;
L'état TRANSFER gère la transmission séquentielle des bits sur la ligne MOSI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when TRANSFER =&amp;gt;&lt;br /&gt;
     if bit_counter &amp;gt; 0 then&lt;br /&gt;
     -- Transfert des bits&lt;br /&gt;
         bit_counter &amp;lt;= bit_counter - 1;&lt;br /&gt;
         mosi &amp;lt;= data_buffer(bit_counter);&lt;br /&gt;
     else&lt;br /&gt;
         -- Fin de la transmission&lt;br /&gt;
         state &amp;lt;= DONE;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat DONE&lt;br /&gt;
Dans l'état DONE, après la fin de la transmission SPI, le système désactive la sélection d'esclave et peut lire les données reçues sur la ligne MISO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when DONE =&amp;gt;&lt;br /&gt;
-- Désactiver la sélection d'esclave et générer une impulsion d'horloge&lt;br /&gt;
      ss &amp;lt;= '1';&lt;br /&gt;
      --sclk &amp;lt;= not sclk;&lt;br /&gt;
      complete &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
      -- Lecture des données reçues sur la ligne MISO&lt;br /&gt;
      data_in &amp;lt;= data_in (6 downto 0) &amp;amp; miso;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne automatique, faut vérifier la position de x, pour cela on a ajouté la condition suivante : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if (pos.current_x == NB_COL) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour déplacer le curseur sur l'écran LCD :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdMoveCursor(uint8_t row, uint8_t col) {&lt;br /&gt;
    if (row == 0) {&lt;br /&gt;
        // Pour la première ligne&lt;br /&gt;
        lcdWrite8bits(0x80 + col, 0); // Adresse de début pour la première ligne + colonne&lt;br /&gt;
    } else if (row == 1) {&lt;br /&gt;
        // Pour la deuxième ligne&lt;br /&gt;
        lcdWrite8bits(0xC0 + col, 0); // Adresse de début pour la deuxième ligne + colonne&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour effacer le contenu affiché sur un écran LCD. on a ajouté la fonction lcdClear qui envoie une commande à l'écran LCD pour effacer son contenu, puis introduit un délai de 2 millisecondes pour permettre à l'écran de s'effacer correctement avant de poursuivre l'exécution du programme.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdClear() {&lt;br /&gt;
    lcdWrite8bits(0x01, 0);&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération.  &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le bon fonctionnement de notre carte : &lt;br /&gt;
[[Fichier:Affichage.mp4|néant|vignette|Vidéo]]&lt;br /&gt;
le code source complet est dans le git. &lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté qu'il y'a une erreur sur la carte: le pin CS de l'Atmega est liée au PD6 alors qu'il doit être connecté au PB2. Donc on a du interchanger CS et B7 sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec monsieur Redon la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]Malheureusement on a pris beaucoup de temps pour constater l'erreur, donc on a perdu du temps en pensant que l'erreur était dans le code.&lt;br /&gt;
&lt;br /&gt;
==== Programmation du microcontrôleur de la carte LCD ====&lt;br /&gt;
Pour traiter les commandes reçues via l'interface SPI, on a ajouté la fonction commandes() :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void commandes(void)&lt;br /&gt;
{&lt;br /&gt;
    char cmd = SPDR; //spi_wait_cmd();&lt;br /&gt;
    char data = spi_wait_cmd();&lt;br /&gt;
    char tmp;&lt;br /&gt;
&lt;br /&gt;
    if(cmd == 0x00)&lt;br /&gt;
    {&lt;br /&gt;
        lcdPutc('o'); //test&lt;br /&gt;
        lcdPutc('k');&lt;br /&gt;
&lt;br /&gt;
        if(data == INFO)&lt;br /&gt;
        {&lt;br /&gt;
            tmp = data;&lt;br /&gt;
            if(tmp != 0xff)&lt;br /&gt;
            {&lt;br /&gt;
                lcdPutc(data);&lt;br /&gt;
            }&lt;br /&gt;
            else if(tmp==0x00)&lt;br /&gt;
            {&lt;br /&gt;
                SPDR = 0xA2; //Pour Affichage,  Envoi de la donnée 0xA2 via SPI si la donnée reçue est égale à 0x00&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(cmd == 0xff)&lt;br /&gt;
    {&lt;br /&gt;
        if(data == 0xff)&lt;br /&gt;
        {&lt;br /&gt;
            SPDR = 0x55; // Envoi de la donnée 0x55 via SPI si la commande est 0xff et la donnée reçue est 0xff&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Voici le main pour tester la communication entre le maitre (arduino) et notre écran LCD : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    spi_init();&lt;br /&gt;
    lcdInit();&lt;br /&gt;
    commandes();&lt;br /&gt;
    sei();&lt;br /&gt;
    while (1) {&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour gérer la réception des données via le port SPI et pour configurer l'écran comme Esclave : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void) {&lt;br /&gt;
    // Configuration des broches&lt;br /&gt;
    SPI_DDR = (1 &amp;lt;&amp;lt; SPI_MISO);       // MISO en sortie&lt;br /&gt;
    SS_DDR &amp;amp;= ~((1 &amp;lt;&amp;lt; SPI_SCK) | (1 &amp;lt;&amp;lt; SPI_SS));&lt;br /&gt;
    SS_DDR &amp;amp;= ~(1 &amp;lt;&amp;lt; SPI_MOSI);&lt;br /&gt;
&lt;br /&gt;
    // Configuration du registre de contrôle SPI&lt;br /&gt;
    SPCR = (1 &amp;lt;&amp;lt; SPE);&lt;br /&gt;
}&lt;br /&gt;
uint8_t spi_wait_cmd(void) // Communication sur le bus SPI&lt;br /&gt;
{&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
    return SPDR;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Programmation du maitre ====&lt;br /&gt;
Pour la configuration de la carte maitre, on a repris le code spi qu'on a utilisé pour l'ordonnancement avec quelque modification pour utiliser un seul connecteur HE10: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void)&lt;br /&gt;
{&lt;br /&gt;
    // Configurer la broche de sortie pour MOSI&lt;br /&gt;
    SPI_DDR |= (1 &amp;lt;&amp;lt; SPI_MOSI);&lt;br /&gt;
&lt;br /&gt;
    // Configurer la broche de sortie pour SCK&lt;br /&gt;
    SPI_DDR |= (1 &amp;lt;&amp;lt; SPI_SCK);&lt;br /&gt;
&lt;br /&gt;
    // Configurer la broche d'entrée pour MISO&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1 &amp;lt;&amp;lt; SPI_MISO);&lt;br /&gt;
&lt;br /&gt;
      DDRD |= (1&amp;lt;&amp;lt;SS_3);&lt;br /&gt;
      PORTD |= (1&amp;lt;&amp;lt;SS_3);&lt;br /&gt;
&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1)|(1&amp;lt;&amp;lt;SPR0);&lt;br /&gt;
}&lt;br /&gt;
uint8_t spi_exch(uint8_t output) // Communication sur le bus SPI&lt;br /&gt;
{&lt;br /&gt;
    SPDR = output;&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
    return SPDR;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3048</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3048"/>
		<updated>2024-01-18T10:48:20Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions &amp;lt;code&amp;gt;spi_activer&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;spi_desactiver&amp;lt;/code&amp;gt; sont utilisées pour activer et désactiver les différents esclaves sur le bus SPI en manipulant les broches SS correspondantes. Cela permet de sélectionner le périphérique avec lequel le microcontrôleur va communiquer via le bus SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(int chip_s) {&lt;br /&gt;
    if (chip_s == SS_2 || chip_s == SS_3) {&lt;br /&gt;
        PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    } else if (chip_s == SS_5) {&lt;br /&gt;
        PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(int chip_s) {&lt;br /&gt;
    if (chip_s == SS_2 || chip_s == SS_3) {&lt;br /&gt;
        PORTD |= (1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    } else if (chip_s == SS_5) {&lt;br /&gt;
        PORTB |= (1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;La matrice Led&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Nous avons essayé l'affichage avec la matrice Led par le protocole SPI. On a inclut les représentations matricielles pour les chiffres de 0 à 9 et les lettres de l'alphabet de A à Z.&lt;br /&gt;
Nous avons écrit une fonction pour l'envoi de données à la matrice LED via le protocole SPI. Elle active le périphérique SPI, envoie la ligne et la valeur via SPI, puis désactive le périphérique.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void matrice_Byte(uint8_t row, uint8_t value) {&lt;br /&gt;
    // Activer le périphérique SPI correspondant à la matrice&lt;br /&gt;
    spi_activer(SS_2);&lt;br /&gt;
&lt;br /&gt;
    // Envoyer les données à la matrice via SPI&lt;br /&gt;
    spi_exch(row);&lt;br /&gt;
    spi_exch(value);&lt;br /&gt;
&lt;br /&gt;
    // Désactiver le périphérique SPI&lt;br /&gt;
    spi_desactiver(SS_2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour l'affichage de caractère et le test :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//fonction pour la matrice&lt;br /&gt;
void display_on_matrix(void) {&lt;br /&gt;
    char l = caractere;&lt;br /&gt;
    int index = 0;&lt;br /&gt;
&lt;br /&gt;
    if (l &amp;gt;= '0' &amp;amp;&amp;amp; l &amp;lt;= '9')&lt;br /&gt;
        index = l - '0';&lt;br /&gt;
    else if (l &amp;gt;= 'a' &amp;amp;&amp;amp; l &amp;lt;= 'z')&lt;br /&gt;
        index = 10 + (l - 'a');&lt;br /&gt;
    else if (l &amp;gt;= 'A' &amp;amp;&amp;amp; l &amp;lt;= 'Z')&lt;br /&gt;
        index = 10 + (l - 'A');&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
        spi_activer(SS_2);&lt;br /&gt;
        spi_exch(0x76);&lt;br /&gt;
        _wait_ms(1);&lt;br /&gt;
        spi_desactiver(SS_2);&lt;br /&gt;
        if (index &amp;gt;= 0 &amp;amp;&amp;amp; index &amp;lt;= 9) {&lt;br /&gt;
            for (uint8_t i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
                matrice_Byte(i + 1, numbers[index][i]);&lt;br /&gt;
            }&lt;br /&gt;
        } else if (index &amp;gt;= 10 &amp;amp;&amp;amp; index &amp;lt;= 35) {&lt;br /&gt;
            for (int i = 0; i &amp;lt; 8; i++) {&lt;br /&gt;
                matrice_Byte(i + 1, letters[index - 10][i]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        spi_desactiver(SS_2);&lt;br /&gt;
        _wait_ms(500);&lt;br /&gt;
&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
===Controleur VGA===&lt;br /&gt;
Un contrôleur VGA sert à générer des signaux de synchronisation horizontale (HS) et verticale (VS), ainsi que des signaux de couleur (r, g, b) pour un écran VGA. L’horloge d'entrée est à 100 MHz et génère une horloge de sortie à 65 MHz généré par le wizard (clk_wiz_0).&lt;br /&gt;
&lt;br /&gt;
Le code ci-dessous permet de générer des signaux VGA pour afficher des images colorées sur un écran VGA et un Basys3 &lt;br /&gt;
&lt;br /&gt;
* Génération des signaux HS et VS pour indiquer les périodes de synchronisation horizontale et verticale&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
process1 : process(clock_65Mhz)&lt;br /&gt;
begin&lt;br /&gt;
       if clock_65Mhz'event and clock_65Mhz = '1' then&lt;br /&gt;
            if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1048 and compteur_hori &amp;lt;1183 then&lt;br /&gt;
                    HS &amp;lt;= '0';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1183 and compteur_hori &amp;lt; 1343 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 else&lt;br /&gt;
                 HS &amp;lt;= '1';&lt;br /&gt;
                 compteur_hori &amp;lt;= 0;&lt;br /&gt;
                 compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                  end if;&lt;br /&gt;
             end if;&lt;br /&gt;
             if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                    VS &amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;= 774 and compteur_vert &amp;lt; 780 then&lt;br /&gt;
                    VS &amp;lt;= '0';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;=780 and compteur_vert &amp;lt; 805 then&lt;br /&gt;
                    VS &amp;lt;='1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                else&lt;br /&gt;
                    VS&amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= 0;&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
&lt;br /&gt;
               end if;&lt;br /&gt;
            end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Génération des Signaux de Couleur (r, g, b) en utilisant les boutons b1, b2 et b3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
if b1 = '1' then&lt;br /&gt;
		    --couleur rouge&lt;br /&gt;
                if compteur_hori &amp;gt; 300 and compteur_hori &amp;lt; 600 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 300 and compteur_vert &amp;lt; 600 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur verte&lt;br /&gt;
             if b2 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur bleue&lt;br /&gt;
             if b3 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
           end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controleur bus SPI===&lt;br /&gt;
Les dispositifs SPI communiquent en utilisant une architecture maître-esclave avec un seul maître.Un ou plusieurs dispositifs esclaves SPI sont pris en charge par la sélection d'esclaves individuels &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt;&lt;br /&gt;
Avant de démarrer une communication avec un esclave particulier, le maître active la ligne &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt; associée à cet esclave en la faisant passer de l'état haut à l'état bas.&lt;br /&gt;
Une fois que l'esclave est sélectionné, le maître peut commencer à envoyer des données sur la ligne '''MOSI''' et recevoir des données sur la ligne '''MISO'''.&lt;br /&gt;
[[Fichier:SPI un maitre-esclave.png|gauche|vignette|546x546px|Un maitre un esclave]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SPI plusieurs esclaves.png|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous devons illustrer une implémentation d'un émetteur SPI synchrone. Dans notre contexte, on gère la transmission séquentielle d'octets sur la ligne '''MOSI''', tout en signalant la fin de chaque transmission par le signal &amp;lt;code&amp;gt;'''complete'''&amp;lt;/code&amp;gt;. Lorsqu'il est déclenché par un front montant d'horloge, le code gère différents états, tels que l'état &amp;lt;code&amp;gt;'''IDLE'''&amp;lt;/code&amp;gt; où le système est en attente, et l'état &amp;lt;code&amp;gt;'''TRANSFER'''&amp;lt;/code&amp;gt; où les données sont envoyées bit par bit.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Voici le code pour tester chaque état &lt;br /&gt;
&lt;br /&gt;
* Etat IDLE&lt;br /&gt;
Dans l'état IDLE, le système est en attente d'une nouvelle transmission SPI, et la transition vers l'état de transfert est conditionnée par la détection d'un signal de démarrage. Lorsque ce signal est activé, l'état passe à TRANSFER, initialisant la communication en activant la sélection d'esclave et préparant la transmission des données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when IDLE =&amp;gt;&lt;br /&gt;
    if start = '1' then&lt;br /&gt;
        -- Début d'une nouvelle transmission&lt;br /&gt;
        state &amp;lt;= TRANSFER;&lt;br /&gt;
        ss &amp;lt;= '0';   -- Activer la sélection d'esclave&lt;br /&gt;
        bit_counter &amp;lt;= 7;   -- Initialiser le compteur de bits&lt;br /&gt;
        mosi &amp;lt;= data_buffer(7);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat TRANSFER&lt;br /&gt;
L'état TRANSFER gère la transmission séquentielle des bits sur la ligne MOSI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when TRANSFER =&amp;gt;&lt;br /&gt;
     if bit_counter &amp;gt; 0 then&lt;br /&gt;
     -- Transfert des bits&lt;br /&gt;
         bit_counter &amp;lt;= bit_counter - 1;&lt;br /&gt;
         mosi &amp;lt;= data_buffer(bit_counter);&lt;br /&gt;
     else&lt;br /&gt;
         -- Fin de la transmission&lt;br /&gt;
         state &amp;lt;= DONE;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat DONE&lt;br /&gt;
Dans l'état DONE, après la fin de la transmission SPI, le système désactive la sélection d'esclave et peut lire les données reçues sur la ligne MISO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when DONE =&amp;gt;&lt;br /&gt;
-- Désactiver la sélection d'esclave et générer une impulsion d'horloge&lt;br /&gt;
      ss &amp;lt;= '1';&lt;br /&gt;
      --sclk &amp;lt;= not sclk;&lt;br /&gt;
      complete &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
      -- Lecture des données reçues sur la ligne MISO&lt;br /&gt;
      data_in &amp;lt;= data_in (6 downto 0) &amp;amp; miso;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne automatique, faut vérifier la position de x, pour cela on a ajouté la condition suivante : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if (pos.current_x == NB_COL) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour déplacer le curseur sur l'écran LCD :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdMoveCursor(uint8_t row, uint8_t col) {&lt;br /&gt;
    if (row == 0) {&lt;br /&gt;
        // Pour la première ligne&lt;br /&gt;
        lcdWrite8bits(0x80 + col, 0); // Adresse de début pour la première ligne + colonne&lt;br /&gt;
    } else if (row == 1) {&lt;br /&gt;
        // Pour la deuxième ligne&lt;br /&gt;
        lcdWrite8bits(0xC0 + col, 0); // Adresse de début pour la deuxième ligne + colonne&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour effacer le contenu affiché sur un écran LCD. on a ajouté la fonction lcdClear qui envoie une commande à l'écran LCD pour effacer son contenu, puis introduit un délai de 2 millisecondes pour permettre à l'écran de s'effacer correctement avant de poursuivre l'exécution du programme.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdClear() {&lt;br /&gt;
    lcdWrite8bits(0x01, 0);&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération.  &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le bon fonctionnement de notre carte : &lt;br /&gt;
[[Fichier:Affichage.mp4|néant|vignette|Vidéo]]&lt;br /&gt;
le code source complet est dans le git. &lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté qu'il y'a une erreur sur la carte: le pin CS de l'Atmega est liée au PD6 alors qu'il doit être connecté au PB2. Donc on a du interchanger CS et B7 sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec monsieur Redon la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]Malheureusement on a pris beaucoup de temps pour constater l'erreur, donc on a perdu du temps en pensant que l'erreur était dans le code.&lt;br /&gt;
&lt;br /&gt;
==== Programmation du microcontrôleur de la carte LCD ====&lt;br /&gt;
Pour traiter les commandes reçues via l'interface SPI, on a ajouté la fonction commandes() :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void commandes(void)&lt;br /&gt;
{&lt;br /&gt;
    char cmd = SPDR; //spi_wait_cmd();&lt;br /&gt;
    char data = spi_wait_cmd();&lt;br /&gt;
    char tmp;&lt;br /&gt;
&lt;br /&gt;
    if(cmd == 0x00)&lt;br /&gt;
    {&lt;br /&gt;
        lcdPutc('o'); //test&lt;br /&gt;
        lcdPutc('k');&lt;br /&gt;
&lt;br /&gt;
        if(data == INFO)&lt;br /&gt;
        {&lt;br /&gt;
            tmp = data;&lt;br /&gt;
            if(tmp != 0xff)&lt;br /&gt;
            {&lt;br /&gt;
                lcdPutc(data);&lt;br /&gt;
            }&lt;br /&gt;
            else if(tmp==0x00)&lt;br /&gt;
            {&lt;br /&gt;
                SPDR = 0xA2; //Pour Affichage,  Envoi de la donnée 0xA2 via SPI si la donnée reçue est égale à 0x00&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(cmd == 0xff)&lt;br /&gt;
    {&lt;br /&gt;
        if(data == 0xff)&lt;br /&gt;
        {&lt;br /&gt;
            SPDR = 0x55; // Envoi de la donnée 0x55 via SPI si la commande est 0xff et la donnée reçue est 0xff&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Voici le main pour tester la communication entre le maitre (arduino) et notre écran LCD : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    spi_init();&lt;br /&gt;
    lcdInit();&lt;br /&gt;
    commandes();&lt;br /&gt;
    sei();&lt;br /&gt;
    while (1) {&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour gérer la réception des données via le port SPI et pour configurer l'écran comme Esclave : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void) {&lt;br /&gt;
    // Configuration des broches&lt;br /&gt;
    SPI_DDR = (1 &amp;lt;&amp;lt; SPI_MISO);       // MISO en sortie&lt;br /&gt;
    SS_DDR &amp;amp;= ~((1 &amp;lt;&amp;lt; SPI_SCK) | (1 &amp;lt;&amp;lt; SPI_SS));&lt;br /&gt;
    SS_DDR &amp;amp;= ~(1 &amp;lt;&amp;lt; SPI_MOSI);&lt;br /&gt;
&lt;br /&gt;
    // Configuration du registre de contrôle SPI&lt;br /&gt;
    SPCR = (1 &amp;lt;&amp;lt; SPE);&lt;br /&gt;
}&lt;br /&gt;
uint8_t spi_wait_cmd(void) // Communication sur le bus SPI&lt;br /&gt;
{&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
    return SPDR;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Programmation du maitre ====&lt;br /&gt;
Pour la configuration de la carte maitre, on a repris le code spi qu'on a utilisé pour l'ordonnancement avec quelque modification pour utiliser un seul connecteur HE10: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void)&lt;br /&gt;
{&lt;br /&gt;
    // Configurer la broche de sortie pour MOSI&lt;br /&gt;
    SPI_DDR |= (1 &amp;lt;&amp;lt; SPI_MOSI);&lt;br /&gt;
&lt;br /&gt;
    // Configurer la broche de sortie pour SCK&lt;br /&gt;
    SPI_DDR |= (1 &amp;lt;&amp;lt; SPI_SCK);&lt;br /&gt;
&lt;br /&gt;
    // Configurer la broche d'entrée pour MISO&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1 &amp;lt;&amp;lt; SPI_MISO);&lt;br /&gt;
&lt;br /&gt;
      DDRD |= (1&amp;lt;&amp;lt;SS_3);&lt;br /&gt;
      PORTD |= (1&amp;lt;&amp;lt;SS_3);&lt;br /&gt;
&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1)|(1&amp;lt;&amp;lt;SPR0);&lt;br /&gt;
}&lt;br /&gt;
uint8_t spi_exch(uint8_t output) // Communication sur le bus SPI&lt;br /&gt;
{&lt;br /&gt;
    SPDR = output;&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
    return SPDR;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3045</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3045"/>
		<updated>2024-01-18T10:34:47Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Afficheur 7 segments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Les fonctions &amp;lt;code&amp;gt;spi_activer&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;spi_desactiver&amp;lt;/code&amp;gt; sont utilisées pour activer et désactiver les différents esclaves sur le bus SPI en manipulant les broches SS correspondantes. Cela permet de sélectionner le périphérique avec lequel le microcontrôleur va communiquer via le bus SPI.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(int chip_s) {&lt;br /&gt;
    if (chip_s == SS_2 || chip_s == SS_3) {&lt;br /&gt;
        PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    } else if (chip_s == SS_5) {&lt;br /&gt;
        PORTB &amp;amp;= ~(1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(int chip_s) {&lt;br /&gt;
    if (chip_s == SS_2 || chip_s == SS_3) {&lt;br /&gt;
        PORTD |= (1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    } else if (chip_s == SS_5) {&lt;br /&gt;
        PORTB |= (1 &amp;lt;&amp;lt; chip_s);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
===Controleur VGA===&lt;br /&gt;
Un contrôleur VGA sert à générer des signaux de synchronisation horizontale (HS) et verticale (VS), ainsi que des signaux de couleur (r, g, b) pour un écran VGA. L’horloge d'entrée est à 100 MHz et génère une horloge de sortie à 65 MHz généré par le wizard (clk_wiz_0).&lt;br /&gt;
&lt;br /&gt;
Le code ci-dessous permet de générer des signaux VGA pour afficher des images colorées sur un écran VGA et un Basys3 &lt;br /&gt;
&lt;br /&gt;
* Génération des signaux HS et VS pour indiquer les périodes de synchronisation horizontale et verticale&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
process1 : process(clock_65Mhz)&lt;br /&gt;
begin&lt;br /&gt;
       if clock_65Mhz'event and clock_65Mhz = '1' then&lt;br /&gt;
            if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1048 and compteur_hori &amp;lt;1183 then&lt;br /&gt;
                    HS &amp;lt;= '0';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1183 and compteur_hori &amp;lt; 1343 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 else&lt;br /&gt;
                 HS &amp;lt;= '1';&lt;br /&gt;
                 compteur_hori &amp;lt;= 0;&lt;br /&gt;
                 compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                  end if;&lt;br /&gt;
             end if;&lt;br /&gt;
             if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                    VS &amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;= 774 and compteur_vert &amp;lt; 780 then&lt;br /&gt;
                    VS &amp;lt;= '0';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;=780 and compteur_vert &amp;lt; 805 then&lt;br /&gt;
                    VS &amp;lt;='1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                else&lt;br /&gt;
                    VS&amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= 0;&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
&lt;br /&gt;
               end if;&lt;br /&gt;
            end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Génération des Signaux de Couleur (r, g, b) en utilisant les boutons b1, b2 et b3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
if b1 = '1' then&lt;br /&gt;
		    --couleur rouge&lt;br /&gt;
                if compteur_hori &amp;gt; 300 and compteur_hori &amp;lt; 600 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 300 and compteur_vert &amp;lt; 600 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur verte&lt;br /&gt;
             if b2 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur bleue&lt;br /&gt;
             if b3 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
           end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controleur bus SPI===&lt;br /&gt;
Les dispositifs SPI communiquent en utilisant une architecture maître-esclave avec un seul maître.Un ou plusieurs dispositifs esclaves SPI sont pris en charge par la sélection d'esclaves individuels &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt;&lt;br /&gt;
Avant de démarrer une communication avec un esclave particulier, le maître active la ligne &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt; associée à cet esclave en la faisant passer de l'état haut à l'état bas.&lt;br /&gt;
Une fois que l'esclave est sélectionné, le maître peut commencer à envoyer des données sur la ligne '''MOSI''' et recevoir des données sur la ligne '''MISO'''.&lt;br /&gt;
[[Fichier:SPI un maitre-esclave.png|gauche|vignette|546x546px|Un maitre un esclave]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SPI plusieurs esclaves.png|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous devons illustrer une implémentation d'un émetteur SPI synchrone. Dans notre contexte, on gère la transmission séquentielle d'octets sur la ligne '''MOSI''', tout en signalant la fin de chaque transmission par le signal &amp;lt;code&amp;gt;'''complete'''&amp;lt;/code&amp;gt;. Lorsqu'il est déclenché par un front montant d'horloge, le code gère différents états, tels que l'état &amp;lt;code&amp;gt;'''IDLE'''&amp;lt;/code&amp;gt; où le système est en attente, et l'état &amp;lt;code&amp;gt;'''TRANSFER'''&amp;lt;/code&amp;gt; où les données sont envoyées bit par bit.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Voici le code pour tester chaque état &lt;br /&gt;
&lt;br /&gt;
* Etat IDLE&lt;br /&gt;
Dans l'état IDLE, le système est en attente d'une nouvelle transmission SPI, et la transition vers l'état de transfert est conditionnée par la détection d'un signal de démarrage. Lorsque ce signal est activé, l'état passe à TRANSFER, initialisant la communication en activant la sélection d'esclave et préparant la transmission des données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when IDLE =&amp;gt;&lt;br /&gt;
    if start = '1' then&lt;br /&gt;
        -- Début d'une nouvelle transmission&lt;br /&gt;
        state &amp;lt;= TRANSFER;&lt;br /&gt;
        ss &amp;lt;= '0';   -- Activer la sélection d'esclave&lt;br /&gt;
        bit_counter &amp;lt;= 7;   -- Initialiser le compteur de bits&lt;br /&gt;
        mosi &amp;lt;= data_buffer(7);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat TRANSFER&lt;br /&gt;
L'état TRANSFER gère la transmission séquentielle des bits sur la ligne MOSI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when TRANSFER =&amp;gt;&lt;br /&gt;
     if bit_counter &amp;gt; 0 then&lt;br /&gt;
     -- Transfert des bits&lt;br /&gt;
         bit_counter &amp;lt;= bit_counter - 1;&lt;br /&gt;
         mosi &amp;lt;= data_buffer(bit_counter);&lt;br /&gt;
     else&lt;br /&gt;
         -- Fin de la transmission&lt;br /&gt;
         state &amp;lt;= DONE;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat DONE&lt;br /&gt;
Dans l'état DONE, après la fin de la transmission SPI, le système désactive la sélection d'esclave et peut lire les données reçues sur la ligne MISO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when DONE =&amp;gt;&lt;br /&gt;
-- Désactiver la sélection d'esclave et générer une impulsion d'horloge&lt;br /&gt;
      ss &amp;lt;= '1';&lt;br /&gt;
      --sclk &amp;lt;= not sclk;&lt;br /&gt;
      complete &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
      -- Lecture des données reçues sur la ligne MISO&lt;br /&gt;
      data_in &amp;lt;= data_in (6 downto 0) &amp;amp; miso;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne automatique, faut vérifier la position de x, pour cela on a ajouté la condition suivante : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if (pos.current_x == NB_COL) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour déplacer le curseur sur l'écran LCD :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdMoveCursor(uint8_t row, uint8_t col) {&lt;br /&gt;
    if (row == 0) {&lt;br /&gt;
        // Pour la première ligne&lt;br /&gt;
        lcdWrite8bits(0x80 + col, 0); // Adresse de début pour la première ligne + colonne&lt;br /&gt;
    } else if (row == 1) {&lt;br /&gt;
        // Pour la deuxième ligne&lt;br /&gt;
        lcdWrite8bits(0xC0 + col, 0); // Adresse de début pour la deuxième ligne + colonne&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour effacer le contenu affiché sur un écran LCD. on a ajouté la fonction lcdClear qui envoie une commande à l'écran LCD pour effacer son contenu, puis introduit un délai de 2 millisecondes pour permettre à l'écran de s'effacer correctement avant de poursuivre l'exécution du programme.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdClear() {&lt;br /&gt;
    lcdWrite8bits(0x01, 0);&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération.  &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le bon fonctionnement de notre carte : &lt;br /&gt;
[[Fichier:Affichage.mp4|néant|vignette|Vidéo]]&lt;br /&gt;
le code source complet est dans le git. &lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté qu'il y'a une erreur sur la carte: le pin CS de l'Atmega est liée au PD6 alors qu'il doit être connecté au PB2. Donc on a du interchanger CS et B7 sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec monsieur Redon la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]Malheureusement on a pris beaucoup de temps pour constater l'erreur, donc on a perdu du temps en pensant que l'erreur était dans le code.&lt;br /&gt;
&lt;br /&gt;
==== Programmation du microcontrôleur de la carte LCD ====&lt;br /&gt;
Pour traiter les commandes reçues via l'interface SPI, on a ajouté la fonction commandes() :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void commandes(void)&lt;br /&gt;
{&lt;br /&gt;
    char cmd = SPDR; //spi_wait_cmd();&lt;br /&gt;
    char data = spi_wait_cmd();&lt;br /&gt;
    char tmp;&lt;br /&gt;
&lt;br /&gt;
    if(cmd == 0x00)&lt;br /&gt;
    {&lt;br /&gt;
        lcdPutc('o'); //test&lt;br /&gt;
        lcdPutc('k');&lt;br /&gt;
&lt;br /&gt;
        if(data == INFO)&lt;br /&gt;
        {&lt;br /&gt;
            tmp = data;&lt;br /&gt;
            if(tmp != 0xff)&lt;br /&gt;
            {&lt;br /&gt;
                lcdPutc(data);&lt;br /&gt;
            }&lt;br /&gt;
            else if(tmp==0x00)&lt;br /&gt;
            {&lt;br /&gt;
                SPDR = 0xA2; //Pour Affichage,  Envoi de la donnée 0xA2 via SPI si la donnée reçue est égale à 0x00&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if(cmd == 0xff)&lt;br /&gt;
    {&lt;br /&gt;
        if(data == 0xff)&lt;br /&gt;
        {&lt;br /&gt;
            SPDR = 0x55; // Envoi de la donnée 0x55 via SPI si la commande est 0xff et la donnée reçue est 0xff&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Voici le main pour tester la communication entre le maitre (arduino) et notre écran LCD : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
    spi_init();&lt;br /&gt;
    lcdInit();&lt;br /&gt;
    commandes();&lt;br /&gt;
    sei();&lt;br /&gt;
    while (1) {&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour gérer la réception des données via le port SPI et pour configurer l'écran comme Esclave : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void) {&lt;br /&gt;
    // Configuration des broches&lt;br /&gt;
    SPI_DDR = (1 &amp;lt;&amp;lt; SPI_MISO);       // MISO en sortie&lt;br /&gt;
    SS_DDR &amp;amp;= ~((1 &amp;lt;&amp;lt; SPI_SCK) | (1 &amp;lt;&amp;lt; SPI_SS));&lt;br /&gt;
    SS_DDR &amp;amp;= ~(1 &amp;lt;&amp;lt; SPI_MOSI);&lt;br /&gt;
&lt;br /&gt;
    // Configuration du registre de contrôle SPI&lt;br /&gt;
    SPCR = (1 &amp;lt;&amp;lt; SPE);&lt;br /&gt;
}&lt;br /&gt;
uint8_t spi_wait_cmd(void) // Communication sur le bus SPI&lt;br /&gt;
{&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));&lt;br /&gt;
    return SPDR;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3040</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3040"/>
		<updated>2024-01-18T09:59:09Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Carte FPGA / VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
===Controleur VGA===&lt;br /&gt;
Un contrôleur VGA sert à générer des signaux de synchronisation horizontale (HS) et verticale (VS), ainsi que des signaux de couleur (r, g, b) pour un écran VGA. L’horloge d'entrée est à 100 MHz et génère une horloge de sortie à 65 MHz généré par le wizard (clk_wiz_0).&lt;br /&gt;
&lt;br /&gt;
Le code ci-dessous permet de générer des signaux VGA pour afficher des images colorées sur un écran VGA et un Basys3 &lt;br /&gt;
&lt;br /&gt;
* Génération des signaux HS et VS pour indiquer les périodes de synchronisation horizontale et verticale&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
process1 : process(clock_65Mhz)&lt;br /&gt;
begin&lt;br /&gt;
       if clock_65Mhz'event and clock_65Mhz = '1' then&lt;br /&gt;
            if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1048 and compteur_hori &amp;lt;1183 then&lt;br /&gt;
                    HS &amp;lt;= '0';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1183 and compteur_hori &amp;lt; 1343 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 else&lt;br /&gt;
                 HS &amp;lt;= '1';&lt;br /&gt;
                 compteur_hori &amp;lt;= 0;&lt;br /&gt;
                 compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                  end if;&lt;br /&gt;
             end if;&lt;br /&gt;
             if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                    VS &amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;= 774 and compteur_vert &amp;lt; 780 then&lt;br /&gt;
                    VS &amp;lt;= '0';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;=780 and compteur_vert &amp;lt; 805 then&lt;br /&gt;
                    VS &amp;lt;='1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                else&lt;br /&gt;
                    VS&amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= 0;&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
&lt;br /&gt;
               end if;&lt;br /&gt;
            end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Génération des Signaux de Couleur (r, g, b) en utilisant les boutons b1, b2 et b3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
if b1 = '1' then&lt;br /&gt;
		    --couleur rouge&lt;br /&gt;
                if compteur_hori &amp;gt; 300 and compteur_hori &amp;lt; 600 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 300 and compteur_vert &amp;lt; 600 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur verte&lt;br /&gt;
             if b2 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur bleue&lt;br /&gt;
             if b3 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
           end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controleur bus SPI===&lt;br /&gt;
Les dispositifs SPI communiquent en utilisant une architecture maître-esclave avec un seul maître.Un ou plusieurs dispositifs esclaves SPI sont pris en charge par la sélection d'esclaves individuels &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt;&lt;br /&gt;
Avant de démarrer une communication avec un esclave particulier, le maître active la ligne &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt; associée à cet esclave en la faisant passer de l'état haut à l'état bas.&lt;br /&gt;
Une fois que l'esclave est sélectionné, le maître peut commencer à envoyer des données sur la ligne '''MOSI''' et recevoir des données sur la ligne '''MISO'''.&lt;br /&gt;
[[Fichier:SPI un maitre-esclave.png|gauche|vignette|546x546px|Un maitre un esclave]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SPI plusieurs esclaves.png|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous devons illustrer une implémentation d'un émetteur SPI synchrone. Dans notre contexte, on gère la transmission séquentielle d'octets sur la ligne '''MOSI''', tout en signalant la fin de chaque transmission par le signal &amp;lt;code&amp;gt;'''complete'''&amp;lt;/code&amp;gt;. Lorsqu'il est déclenché par un front montant d'horloge, le code gère différents états, tels que l'état &amp;lt;code&amp;gt;'''IDLE'''&amp;lt;/code&amp;gt; où le système est en attente, et l'état &amp;lt;code&amp;gt;'''TRANSFER'''&amp;lt;/code&amp;gt; où les données sont envoyées bit par bit.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Voici le code pour tester chaque état &lt;br /&gt;
&lt;br /&gt;
* Etat IDLE&lt;br /&gt;
Dans l'état IDLE, le système est en attente d'une nouvelle transmission SPI, et la transition vers l'état de transfert est conditionnée par la détection d'un signal de démarrage. Lorsque ce signal est activé, l'état passe à TRANSFER, initialisant la communication en activant la sélection d'esclave et préparant la transmission des données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when IDLE =&amp;gt;&lt;br /&gt;
    if start = '1' then&lt;br /&gt;
        -- Début d'une nouvelle transmission&lt;br /&gt;
        state &amp;lt;= TRANSFER;&lt;br /&gt;
        ss &amp;lt;= '0';   -- Activer la sélection d'esclave&lt;br /&gt;
        bit_counter &amp;lt;= 7;   -- Initialiser le compteur de bits&lt;br /&gt;
        mosi &amp;lt;= data_buffer(7);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat TRANSFER&lt;br /&gt;
L'état TRANSFER gère la transmission séquentielle des bits sur la ligne MOSI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when TRANSFER =&amp;gt;&lt;br /&gt;
     if bit_counter &amp;gt; 0 then&lt;br /&gt;
     -- Transfert des bits&lt;br /&gt;
         bit_counter &amp;lt;= bit_counter - 1;&lt;br /&gt;
         mosi &amp;lt;= data_buffer(bit_counter);&lt;br /&gt;
     else&lt;br /&gt;
         -- Fin de la transmission&lt;br /&gt;
         state &amp;lt;= DONE;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat DONE&lt;br /&gt;
Dans l'état DONE, après la fin de la transmission SPI, le système désactive la sélection d'esclave et peut lire les données reçues sur la ligne MISO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when DONE =&amp;gt;&lt;br /&gt;
-- Désactiver la sélection d'esclave et générer une impulsion d'horloge&lt;br /&gt;
      ss &amp;lt;= '1';&lt;br /&gt;
      --sclk &amp;lt;= not sclk;&lt;br /&gt;
      complete &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
      -- Lecture des données reçues sur la ligne MISO&lt;br /&gt;
      data_in &amp;lt;= data_in (6 downto 0) &amp;amp; miso;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne automatique, faut vérifier la position de x, pour cela on a ajouté la condition suivante : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if (pos.current_x == NB_COL) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour déplacer le curseur sur l'écran LCD :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdMoveCursor(uint8_t row, uint8_t col) {&lt;br /&gt;
    if (row == 0) {&lt;br /&gt;
        // Pour la première ligne&lt;br /&gt;
        lcdWrite8bits(0x80 + col, 0); // Adresse de début pour la première ligne + colonne&lt;br /&gt;
    } else if (row == 1) {&lt;br /&gt;
        // Pour la deuxième ligne&lt;br /&gt;
        lcdWrite8bits(0xC0 + col, 0); // Adresse de début pour la deuxième ligne + colonne&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour effacer le contenu affiché sur un écran LCD. on a ajouté la fonction lcdClear qui envoie une commande à l'écran LCD pour effacer son contenu, puis introduit un délai de 2 millisecondes pour permettre à l'écran de s'effacer correctement avant de poursuivre l'exécution du programme.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdClear() {&lt;br /&gt;
    lcdWrite8bits(0x01, 0);&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération.  &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le bon fonctionnement de notre carte : &lt;br /&gt;
[[Fichier:Affichage.mp4|néant|vignette|Vidéo]]&lt;br /&gt;
le code source complet est dans le git. &lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté qu'il y'a une erreur sur la carte: le pin CS de l'Atmega est liée au PD6 alors qu'il doit être connecté au PB2. Donc on a du interchanger CS et B7 sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec monsieur Redon la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]Malheureusement on a pris beaucoup de temps pour constater l'erreur, donc on a perdu du temps en pensant que l'erreur était dans le code.&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3039</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3039"/>
		<updated>2024-01-18T09:53:57Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Carte FPGA / VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
===Controleur VGA===&lt;br /&gt;
Un contrôleur VGA sert à générer des signaux de synchronisation horizontale (HS) et verticale (VS), ainsi que des signaux de couleur (r, g, b) pour un écran VGA. L’horloge d'entrée est à 100 MHz et génère une horloge de sortie à 65 MHz généré par le wizard (clk_wiz_0).&lt;br /&gt;
&lt;br /&gt;
Le code ci-dessous permet de générer des signaux VGA pour afficher des images colorées sur un écran VGA &lt;br /&gt;
&lt;br /&gt;
* Génération des signaux HS et VS pour indiquer les périodes de synchronisation horizontale et verticale&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
process1 : process(clock_65Mhz)&lt;br /&gt;
begin&lt;br /&gt;
       if clock_65Mhz'event and clock_65Mhz = '1' then&lt;br /&gt;
            if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1048 and compteur_hori &amp;lt;1183 then&lt;br /&gt;
                    HS &amp;lt;= '0';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 elsif compteur_hori &amp;gt;= 1183 and compteur_hori &amp;lt; 1343 then&lt;br /&gt;
                    HS &amp;lt;= '1';&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
                 else&lt;br /&gt;
                 HS &amp;lt;= '1';&lt;br /&gt;
                 compteur_hori &amp;lt;= 0;&lt;br /&gt;
                 compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                  end if;&lt;br /&gt;
             end if;&lt;br /&gt;
             if compteur_hori &amp;lt; 1048 then&lt;br /&gt;
                if compteur_vert &amp;lt; 774 then&lt;br /&gt;
                    VS &amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;= 774 and compteur_vert &amp;lt; 780 then&lt;br /&gt;
                    VS &amp;lt;= '0';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                elsif compteur_vert &amp;lt;=780 and compteur_vert &amp;lt; 805 then&lt;br /&gt;
                    VS &amp;lt;='1';&lt;br /&gt;
                    compteur_vert &amp;lt;= compteur_vert + 1;&lt;br /&gt;
                else&lt;br /&gt;
                    VS&amp;lt;= '1';&lt;br /&gt;
                    compteur_vert &amp;lt;= 0;&lt;br /&gt;
                    compteur_hori &amp;lt;= compteur_hori + 1;&lt;br /&gt;
&lt;br /&gt;
               end if;&lt;br /&gt;
            end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Génération des Signaux de Couleur (r, g, b) en utilisant les boutons b1, b2 et b3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
if b1 = '1' then&lt;br /&gt;
		    --couleur rouge&lt;br /&gt;
                if compteur_hori &amp;gt; 300 and compteur_hori &amp;lt; 600 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 300 and compteur_vert &amp;lt; 600 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur verte&lt;br /&gt;
             if b2 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
&lt;br /&gt;
		 --couleur bleue&lt;br /&gt;
             if b3 = '1' then&lt;br /&gt;
                if compteur_hori &amp;gt; 360 and compteur_hori &amp;lt; 1080 then&lt;br /&gt;
                    if compteur_vert &amp;gt; 201 and compteur_vert &amp;lt; 604 then&lt;br /&gt;
                        r &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        g &amp;lt;= &amp;quot;0000&amp;quot;;&lt;br /&gt;
                        b &amp;lt;= &amp;quot;1111&amp;quot;;&lt;br /&gt;
                    end if;&lt;br /&gt;
                end if;&lt;br /&gt;
             end if;&lt;br /&gt;
           end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Controleur bus SPI===&lt;br /&gt;
Les dispositifs SPI communiquent en utilisant une architecture maître-esclave avec un seul maître.Un ou plusieurs dispositifs esclaves SPI sont pris en charge par la sélection d'esclaves individuels &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt;&lt;br /&gt;
Avant de démarrer une communication avec un esclave particulier, le maître active la ligne &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt; associée à cet esclave en la faisant passer de l'état haut à l'état bas.&lt;br /&gt;
Une fois que l'esclave est sélectionné, le maître peut commencer à envoyer des données sur la ligne '''MOSI''' et recevoir des données sur la ligne '''MISO'''.&lt;br /&gt;
[[Fichier:SPI un maitre-esclave.png|gauche|vignette|546x546px|Un maitre un esclave]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SPI plusieurs esclaves.png|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous devons illustrer une implémentation d'un émetteur SPI synchrone. Dans notre contexte, on gère la transmission séquentielle d'octets sur la ligne '''MOSI''', tout en signalant la fin de chaque transmission par le signal &amp;lt;code&amp;gt;'''complete'''&amp;lt;/code&amp;gt;. Lorsqu'il est déclenché par un front montant d'horloge, le code gère différents états, tels que l'état &amp;lt;code&amp;gt;'''IDLE'''&amp;lt;/code&amp;gt; où le système est en attente, et l'état &amp;lt;code&amp;gt;'''TRANSFER'''&amp;lt;/code&amp;gt; où les données sont envoyées bit par bit.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Voici le code pour tester chaque état &lt;br /&gt;
&lt;br /&gt;
* Etat IDLE&lt;br /&gt;
Dans l'état IDLE, le système est en attente d'une nouvelle transmission SPI, et la transition vers l'état de transfert est conditionnée par la détection d'un signal de démarrage. Lorsque ce signal est activé, l'état passe à TRANSFER, initialisant la communication en activant la sélection d'esclave et préparant la transmission des données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when IDLE =&amp;gt;&lt;br /&gt;
    if start = '1' then&lt;br /&gt;
        -- Début d'une nouvelle transmission&lt;br /&gt;
        state &amp;lt;= TRANSFER;&lt;br /&gt;
        ss &amp;lt;= '0';   -- Activer la sélection d'esclave&lt;br /&gt;
        bit_counter &amp;lt;= 7;   -- Initialiser le compteur de bits&lt;br /&gt;
        mosi &amp;lt;= data_buffer(7);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat TRANSFER&lt;br /&gt;
L'état TRANSFER gère la transmission séquentielle des bits sur la ligne MOSI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when TRANSFER =&amp;gt;&lt;br /&gt;
     if bit_counter &amp;gt; 0 then&lt;br /&gt;
     -- Transfert des bits&lt;br /&gt;
         bit_counter &amp;lt;= bit_counter - 1;&lt;br /&gt;
         mosi &amp;lt;= data_buffer(bit_counter);&lt;br /&gt;
     else&lt;br /&gt;
         -- Fin de la transmission&lt;br /&gt;
         state &amp;lt;= DONE;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat DONE&lt;br /&gt;
Dans l'état DONE, après la fin de la transmission SPI, le système désactive la sélection d'esclave et peut lire les données reçues sur la ligne MISO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when DONE =&amp;gt;&lt;br /&gt;
-- Désactiver la sélection d'esclave et générer une impulsion d'horloge&lt;br /&gt;
      ss &amp;lt;= '1';&lt;br /&gt;
      --sclk &amp;lt;= not sclk;&lt;br /&gt;
      complete &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
      -- Lecture des données reçues sur la ligne MISO&lt;br /&gt;
      data_in &amp;lt;= data_in (6 downto 0) &amp;amp; miso;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne automatique, faut vérifier la position de x, pour cela on a ajouté la condition suivante : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if (pos.current_x == NB_COL) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour déplacer le curseur sur l'écran LCD :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdMoveCursor(uint8_t row, uint8_t col) {&lt;br /&gt;
    if (row == 0) {&lt;br /&gt;
        // Pour la première ligne&lt;br /&gt;
        lcdWrite8bits(0x80 + col, 0); // Adresse de début pour la première ligne + colonne&lt;br /&gt;
    } else if (row == 1) {&lt;br /&gt;
        // Pour la deuxième ligne&lt;br /&gt;
        lcdWrite8bits(0xC0 + col, 0); // Adresse de début pour la deuxième ligne + colonne&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour effacer le contenu affiché sur un écran LCD. on a ajouté la fonction lcdClear qui envoie une commande à l'écran LCD pour effacer son contenu, puis introduit un délai de 2 millisecondes pour permettre à l'écran de s'effacer correctement avant de poursuivre l'exécution du programme.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdClear() {&lt;br /&gt;
    lcdWrite8bits(0x01, 0);&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération.  &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le bon fonctionnement de notre carte : &lt;br /&gt;
[[Fichier:Affichage.mp4|néant|vignette|Vidéo]]&lt;br /&gt;
le code source complet est dans le git. &lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté qu'il y'a une erreur sur la carte: le pin CS de l'Atmega est liée au PD6 alors qu'il doit être connecté au PB2. Donc on a du interchanger CS et B7 sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec monsieur Redon la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]Malheureusement on a pris beaucoup de temps pour constater l'erreur, donc on a perdu du temps en pensant que l'erreur était dans le code.&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3037</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3037"/>
		<updated>2024-01-18T09:50:45Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Controleur bus SPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
===Controleur bus SPI===&lt;br /&gt;
Les dispositifs SPI communiquent en utilisant une architecture maître-esclave avec un seul maître.Un ou plusieurs dispositifs esclaves SPI sont pris en charge par la sélection d'esclaves individuels &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt;&lt;br /&gt;
Avant de démarrer une communication avec un esclave particulier, le maître active la ligne &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt; associée à cet esclave en la faisant passer de l'état haut à l'état bas.&lt;br /&gt;
Une fois que l'esclave est sélectionné, le maître peut commencer à envoyer des données sur la ligne '''MOSI''' et recevoir des données sur la ligne '''MISO'''.&lt;br /&gt;
[[Fichier:SPI un maitre-esclave.png|gauche|vignette|546x546px|Un maitre un esclave]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SPI plusieurs esclaves.png|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous devons illustrer une implémentation d'un émetteur SPI synchrone. Dans notre contexte, on gère la transmission séquentielle d'octets sur la ligne '''MOSI''', tout en signalant la fin de chaque transmission par le signal &amp;lt;code&amp;gt;'''complete'''&amp;lt;/code&amp;gt;. Lorsqu'il est déclenché par un front montant d'horloge, le code gère différents états, tels que l'état &amp;lt;code&amp;gt;'''IDLE'''&amp;lt;/code&amp;gt; où le système est en attente, et l'état &amp;lt;code&amp;gt;'''TRANSFER'''&amp;lt;/code&amp;gt; où les données sont envoyées bit par bit.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Voici le code pour tester chaque état &lt;br /&gt;
&lt;br /&gt;
* Etat IDLE&lt;br /&gt;
Dans l'état IDLE, le système est en attente d'une nouvelle transmission SPI, et la transition vers l'état de transfert est conditionnée par la détection d'un signal de démarrage. Lorsque ce signal est activé, l'état passe à TRANSFER, initialisant la communication en activant la sélection d'esclave et préparant la transmission des données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when IDLE =&amp;gt;&lt;br /&gt;
    if start = '1' then&lt;br /&gt;
        -- Début d'une nouvelle transmission&lt;br /&gt;
        state &amp;lt;= TRANSFER;&lt;br /&gt;
        ss &amp;lt;= '0';   -- Activer la sélection d'esclave&lt;br /&gt;
        bit_counter &amp;lt;= 7;   -- Initialiser le compteur de bits&lt;br /&gt;
        mosi &amp;lt;= data_buffer(7);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat TRANSFER&lt;br /&gt;
L'état TRANSFER gère la transmission séquentielle des bits sur la ligne MOSI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when TRANSFER =&amp;gt;&lt;br /&gt;
     if bit_counter &amp;gt; 0 then&lt;br /&gt;
     -- Transfert des bits&lt;br /&gt;
         bit_counter &amp;lt;= bit_counter - 1;&lt;br /&gt;
         mosi &amp;lt;= data_buffer(bit_counter);&lt;br /&gt;
     else&lt;br /&gt;
         -- Fin de la transmission&lt;br /&gt;
         state &amp;lt;= DONE;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat DONE&lt;br /&gt;
Dans l'état DONE, après la fin de la transmission SPI, le système désactive la sélection d'esclave et peut lire les données reçues sur la ligne MISO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when DONE =&amp;gt;&lt;br /&gt;
-- Désactiver la sélection d'esclave et générer une impulsion d'horloge&lt;br /&gt;
      ss &amp;lt;= '1';&lt;br /&gt;
      --sclk &amp;lt;= not sclk;&lt;br /&gt;
      complete &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
      -- Lecture des données reçues sur la ligne MISO&lt;br /&gt;
      data_in &amp;lt;= data_in (6 downto 0) &amp;amp; miso;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne automatique, faut vérifier la position de x, pour cela on a ajouté la condition suivante : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if (pos.current_x == NB_COL) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour déplacer le curseur sur l'écran LCD :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdMoveCursor(uint8_t row, uint8_t col) {&lt;br /&gt;
    if (row == 0) {&lt;br /&gt;
        // Pour la première ligne&lt;br /&gt;
        lcdWrite8bits(0x80 + col, 0); // Adresse de début pour la première ligne + colonne&lt;br /&gt;
    } else if (row == 1) {&lt;br /&gt;
        // Pour la deuxième ligne&lt;br /&gt;
        lcdWrite8bits(0xC0 + col, 0); // Adresse de début pour la deuxième ligne + colonne&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour effacer le contenu affiché sur un écran LCD. on a ajouté la fonction lcdClear qui envoie une commande à l'écran LCD pour effacer son contenu, puis introduit un délai de 2 millisecondes pour permettre à l'écran de s'effacer correctement avant de poursuivre l'exécution du programme.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdClear() {&lt;br /&gt;
    lcdWrite8bits(0x01, 0);&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération.  &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le bon fonctionnement de notre carte : &lt;br /&gt;
[[Fichier:Affichage.mp4|néant|vignette|Vidéo]]&lt;br /&gt;
le code source complet est dans le git. &lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté qu'il y'a une erreur sur la carte: le pin CS de l'Atmega est liée au PD6 alors qu'il doit être connecté au PB2. Donc on a du interchanger CS et B7 sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec monsieur Redon la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]Malheureusement on a pris beaucoup de temps pour constater l'erreur, donc on a perdu du temps en pensant que l'erreur était dans le code.&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3036</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3036"/>
		<updated>2024-01-18T09:50:02Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Controleur bus SPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
===Controleur bus SPI===&lt;br /&gt;
Les dispositifs SPI communiquent en utilisant une architecture maître-esclave avec un seul maître.Un ou plusieurs dispositifs esclaves SPI sont pris en charge par la sélection d'esclaves individuels &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt;&lt;br /&gt;
Avant de démarrer une communication avec un esclave particulier, le maître active la ligne &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt; associée à cet esclave en la faisant passer de l'état haut à l'état bas.&lt;br /&gt;
Une fois que l'esclave est sélectionné, le maître peut commencer à envoyer des données sur la ligne '''MOSI''' et recevoir des données sur la ligne '''MISO'''.&lt;br /&gt;
[[Fichier:SPI un maitre-esclave.png|gauche|vignette|546x546px|Un maitre un esclave]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SPI plusieurs esclaves.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Nous devons illustrer une implémentation d'un émetteur SPI synchrone. Dans notre contexte, on gère la transmission séquentielle d'octets sur la ligne '''MOSI''', tout en signalant la fin de chaque transmission par le signal &amp;lt;code&amp;gt;'''complete'''&amp;lt;/code&amp;gt;. Lorsqu'il est déclenché par un front montant d'horloge, le code gère différents états, tels que l'état &amp;lt;code&amp;gt;'''IDLE'''&amp;lt;/code&amp;gt; où le système est en attente, et l'état &amp;lt;code&amp;gt;'''TRANSFER'''&amp;lt;/code&amp;gt; où les données sont envoyées bit par bit.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
Voici le code pour tester chaque état &lt;br /&gt;
&lt;br /&gt;
* Etat IDLE&lt;br /&gt;
Dans l'état IDLE, le système est en attente d'une nouvelle transmission SPI, et la transition vers l'état de transfert est conditionnée par la détection d'un signal de démarrage. Lorsque ce signal est activé, l'état passe à TRANSFER, initialisant la communication en activant la sélection d'esclave et préparant la transmission des données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when IDLE =&amp;gt;&lt;br /&gt;
    if start = '1' then&lt;br /&gt;
        -- Début d'une nouvelle transmission&lt;br /&gt;
        state &amp;lt;= TRANSFER;&lt;br /&gt;
        ss &amp;lt;= '0';   -- Activer la sélection d'esclave&lt;br /&gt;
        bit_counter &amp;lt;= 7;   -- Initialiser le compteur de bits&lt;br /&gt;
        mosi &amp;lt;= data_buffer(7);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat TRANSFER&lt;br /&gt;
L'état TRANSFER gère la transmission séquentielle des bits sur la ligne MOSI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when TRANSFER =&amp;gt;&lt;br /&gt;
     if bit_counter &amp;gt; 0 then&lt;br /&gt;
     -- Transfert des bits&lt;br /&gt;
         bit_counter &amp;lt;= bit_counter - 1;&lt;br /&gt;
         mosi &amp;lt;= data_buffer(bit_counter);&lt;br /&gt;
     else&lt;br /&gt;
         -- Fin de la transmission&lt;br /&gt;
         state &amp;lt;= DONE;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat DONE&lt;br /&gt;
Dans l'état DONE, après la fin de la transmission SPI, le système désactive la sélection d'esclave et peut lire les données reçues sur la ligne MISO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when DONE =&amp;gt;&lt;br /&gt;
-- Désactiver la sélection d'esclave et générer une impulsion d'horloge&lt;br /&gt;
      ss &amp;lt;= '1';&lt;br /&gt;
      --sclk &amp;lt;= not sclk;&lt;br /&gt;
      complete &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
      -- Lecture des données reçues sur la ligne MISO&lt;br /&gt;
      data_in &amp;lt;= data_in (6 downto 0) &amp;amp; miso;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne automatique, faut vérifier la position de x, pour cela on a ajouté la condition suivante : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if (pos.current_x == NB_COL) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour déplacer le curseur sur l'écran LCD :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdMoveCursor(uint8_t row, uint8_t col) {&lt;br /&gt;
    if (row == 0) {&lt;br /&gt;
        // Pour la première ligne&lt;br /&gt;
        lcdWrite8bits(0x80 + col, 0); // Adresse de début pour la première ligne + colonne&lt;br /&gt;
    } else if (row == 1) {&lt;br /&gt;
        // Pour la deuxième ligne&lt;br /&gt;
        lcdWrite8bits(0xC0 + col, 0); // Adresse de début pour la deuxième ligne + colonne&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour effacer le contenu affiché sur un écran LCD. on a ajouté la fonction lcdClear qui envoie une commande à l'écran LCD pour effacer son contenu, puis introduit un délai de 2 millisecondes pour permettre à l'écran de s'effacer correctement avant de poursuivre l'exécution du programme.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdClear() {&lt;br /&gt;
    lcdWrite8bits(0x01, 0);&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération.  &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le bon fonctionnement de notre carte : &lt;br /&gt;
[[Fichier:Affichage.mp4|néant|vignette|Vidéo]]&lt;br /&gt;
le code source complet est dans le git. &lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté qu'il y'a une erreur sur la carte: le pin CS de l'Atmega est liée au PD6 alors qu'il doit être connecté au PB2. Donc on a du interchanger CS et B7 sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec monsieur Redon la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]Malheureusement on a pris beaucoup de temps pour constater l'erreur, donc on a perdu du temps en pensant que l'erreur était dans le code.&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SPI_plusieurs_esclaves.png&amp;diff=3034</id>
		<title>Fichier:SPI plusieurs esclaves.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SPI_plusieurs_esclaves.png&amp;diff=3034"/>
		<updated>2024-01-18T09:48:17Z</updated>

		<summary type="html">&lt;p&gt;Handrian : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Communication un maitre avec plusieurs esclaves&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3033</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=3033"/>
		<updated>2024-01-18T09:46:09Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Carte FPGA / VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
===Controleur bus SPI===&lt;br /&gt;
Les dispositifs SPI communiquent en utilisant une architecture maître-esclave avec un seul maître.Un ou plusieurs dispositifs esclaves SPI sont pris en charge par la sélection d'esclaves individuels &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt;&lt;br /&gt;
Avant de démarrer une communication avec un esclave particulier, le maître active la ligne &amp;lt;code&amp;gt;'''SS'''&amp;lt;/code&amp;gt; associée à cet esclave en la faisant passer de l'état haut à l'état bas.&lt;br /&gt;
Une fois que l'esclave est sélectionné, le maître peut commencer à envoyer des données sur la ligne '''MOSI''' et recevoir des données sur la ligne '''MISO'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous devons illustrer une implémentation d'un émetteur SPI synchrone. Dans notre contexte, on gère la transmission séquentielle d'octets sur la ligne '''MOSI''', tout en signalant la fin de chaque transmission par le signal &amp;lt;code&amp;gt;'''complete'''&amp;lt;/code&amp;gt;. Lorsqu'il est déclenché par un front montant d'horloge, le code gère différents états, tels que l'état &amp;lt;code&amp;gt;'''IDLE'''&amp;lt;/code&amp;gt; où le système est en attente, et l'état &amp;lt;code&amp;gt;'''TRANSFER'''&amp;lt;/code&amp;gt; où les données sont envoyées bit par bit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voici le code pour tester chaque état &lt;br /&gt;
&lt;br /&gt;
* Etat IDLE&lt;br /&gt;
Dans l'état IDLE, le système est en attente d'une nouvelle transmission SPI, et la transition vers l'état de transfert est conditionnée par la détection d'un signal de démarrage. Lorsque ce signal est activé, l'état passe à TRANSFER, initialisant la communication en activant la sélection d'esclave et préparant la transmission des données.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when IDLE =&amp;gt;&lt;br /&gt;
    if start = '1' then&lt;br /&gt;
        -- Début d'une nouvelle transmission&lt;br /&gt;
        state &amp;lt;= TRANSFER;&lt;br /&gt;
        ss &amp;lt;= '0';   -- Activer la sélection d'esclave&lt;br /&gt;
        bit_counter &amp;lt;= 7;   -- Initialiser le compteur de bits&lt;br /&gt;
        mosi &amp;lt;= data_buffer(7);&lt;br /&gt;
    end if;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat TRANSFER&lt;br /&gt;
L'état TRANSFER gère la transmission séquentielle des bits sur la ligne MOSI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when TRANSFER =&amp;gt;&lt;br /&gt;
     if bit_counter &amp;gt; 0 then&lt;br /&gt;
     -- Transfert des bits&lt;br /&gt;
         bit_counter &amp;lt;= bit_counter - 1;&lt;br /&gt;
         mosi &amp;lt;= data_buffer(bit_counter);&lt;br /&gt;
     else&lt;br /&gt;
         -- Fin de la transmission&lt;br /&gt;
         state &amp;lt;= DONE;&lt;br /&gt;
     end if;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Etat DONE&lt;br /&gt;
Dans l'état DONE, après la fin de la transmission SPI, le système désactive la sélection d'esclave et peut lire les données reçues sur la ligne MISO&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot; line&amp;gt;&lt;br /&gt;
when DONE =&amp;gt;&lt;br /&gt;
-- Désactiver la sélection d'esclave et générer une impulsion d'horloge&lt;br /&gt;
      ss &amp;lt;= '1';&lt;br /&gt;
      --sclk &amp;lt;= not sclk;&lt;br /&gt;
      complete &amp;lt;= '1';&lt;br /&gt;
&lt;br /&gt;
      -- Lecture des données reçues sur la ligne MISO&lt;br /&gt;
      data_in &amp;lt;= data_in (6 downto 0) &amp;amp; miso;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
Pour le retour à la ligne automatique, faut vérifier la position de x, pour cela on a ajouté la condition suivante : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if (pos.current_x == NB_COL) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour déplacer le curseur sur l'écran LCD :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdMoveCursor(uint8_t row, uint8_t col) {&lt;br /&gt;
    if (row == 0) {&lt;br /&gt;
        // Pour la première ligne&lt;br /&gt;
        lcdWrite8bits(0x80 + col, 0); // Adresse de début pour la première ligne + colonne&lt;br /&gt;
    } else if (row == 1) {&lt;br /&gt;
        // Pour la deuxième ligne&lt;br /&gt;
        lcdWrite8bits(0xC0 + col, 0); // Adresse de début pour la deuxième ligne + colonne&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pour effacer le contenu affiché sur un écran LCD. on a ajouté la fonction lcdClear qui envoie une commande à l'écran LCD pour effacer son contenu, puis introduit un délai de 2 millisecondes pour permettre à l'écran de s'effacer correctement avant de poursuivre l'exécution du programme.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdClear() {&lt;br /&gt;
    lcdWrite8bits(0x01, 0);&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération.  &lt;br /&gt;
&lt;br /&gt;
Voici la vidéo montrant le bon fonctionnement de notre carte : &lt;br /&gt;
[[Fichier:Affichage.mp4|néant|vignette|Vidéo]]&lt;br /&gt;
le code source complet est dans le git. &lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté qu'il y'a une erreur sur la carte: le pin CS de l'Atmega est liée au PD6 alors qu'il doit être connecté au PB2. Donc on a du interchanger CS et B7 sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec monsieur Redon la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]Malheureusement on a pris beaucoup de temps pour constater l'erreur, donc on a perdu du temps en pensant que l'erreur était dans le code.&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SPI_un_maitre-esclave.png&amp;diff=3027</id>
		<title>Fichier:SPI un maitre-esclave.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SPI_un_maitre-esclave.png&amp;diff=3027"/>
		<updated>2024-01-18T09:34:52Z</updated>

		<summary type="html">&lt;p&gt;Handrian : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Maitre-esclave&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2904</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2904"/>
		<updated>2024-01-17T11:25:10Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Gestion des caractères de contrôle et initialisation LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2903</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2903"/>
		<updated>2024-01-17T11:24:37Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Gestion des caractères de contrôle et initialisation LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2902</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2902"/>
		<updated>2024-01-17T11:24:05Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Gestion des caractères de contrôle et initialisation LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Fichier:Retour_chariot_et_à_la_ligne.jpg|alt=Gestion /n et /r|centré|246x246px]]&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2901</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2901"/>
		<updated>2024-01-17T11:22:04Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Gestion des caractères de contrôle et initialisation LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Retour chariot et à la ligne.jpg|néant|center|Gestion /n et /r]]&lt;br /&gt;
&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Retour_chariot_et_%C3%A0_la_ligne.jpg&amp;diff=2900</id>
		<title>Fichier:Retour chariot et à la ligne.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Retour_chariot_et_%C3%A0_la_ligne.jpg&amp;diff=2900"/>
		<updated>2024-01-17T11:17:15Z</updated>

		<summary type="html">&lt;p&gt;Handrian : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;gestion /n et /r&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2899</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2899"/>
		<updated>2024-01-17T11:11:23Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Gestion des caractères de contrôle et initialisation LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
&lt;br /&gt;
==== Affichage des caractères ====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2898</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2898"/>
		<updated>2024-01-17T11:10:14Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Programmation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
==== Gestion des caractères de contrôle et initialisation LCD ====&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
&lt;br /&gt;
===== Affichage des caractères =====&lt;br /&gt;
Pour afficher chaque caractère on a écris la fonction &amp;lt;code&amp;gt;'''lcdPutc'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdPutc(char c){&lt;br /&gt;
    busy = 1;&lt;br /&gt;
    lcdWrite8bits(c,1);&lt;br /&gt;
    busy = 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;'''busy'''&amp;lt;/code&amp;gt; à '''1''' est utilisé pour indiquer l'état de l'écran LCD s'il est en train de traiter une opération &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2897</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2897"/>
		<updated>2024-01-17T10:58:22Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Ecriture sur la carte LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données :  &lt;br /&gt;
&lt;br /&gt;
* d'instruction '''« 0 »''' &lt;br /&gt;
* des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
La fonction '''lcdWrite8bits''' est conçue pour écrire une valeur de 8 bits de data sur l'écran LCD.&lt;br /&gt;
Pour la gestion du retour à la ligne et le retour chariot il faut vérifier si le caractère data est égal à un retour à la ligne &amp;lt;code&amp;gt;'''\n'''&amp;lt;/code&amp;gt; ou un retour chariot &amp;lt;code&amp;gt;'''\r'''&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 if ((data == '\n') || (data == '\r')) {&lt;br /&gt;
        pos.current_x = 0;&lt;br /&gt;
        pos.current_y = (pos.current_y + 1) % NB_LIGNE;&lt;br /&gt;
        lcdMoveCursor(pos.current_y, 0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La mise à jour du curseur dépend de la valeur de '''data''' et si elle vaut l'un des caractère de contrôle, le curseur se mettra à jour sur la ligne suivante grâce à la fonction &amp;lt;code&amp;gt;'''lcdMoveCursor(pos.current_y, 0)'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour initialiser l'écran LCD, nous avons écris la fonction suivante&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdInit(){&lt;br /&gt;
&lt;br /&gt;
    LCD_RS_INIT();&lt;br /&gt;
    LCD_EN_INIT();&lt;br /&gt;
    LCD_RW_INIT();&lt;br /&gt;
    LCD_DB4_INIT();&lt;br /&gt;
    LCD_DB5_INIT();&lt;br /&gt;
    LCD_DB6_INIT();&lt;br /&gt;
    LCD_DB7_INIT();&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
&lt;br /&gt;
    lcdWrite8bits(0x28,0); //4bits, 2 lignes&lt;br /&gt;
    lcdWrite8bits(0x08,0); //LCD off&lt;br /&gt;
    lcdWrite8bits(0x01,0); //Clear LCD&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(2);&lt;br /&gt;
    lcdWrite8bits(0x06,0); //incrementation&lt;br /&gt;
    lcdWrite8bits(0x0c,0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;'''lcdWrite8bits(0x0c, 0)'''&amp;lt;/code&amp;gt; : Allume l'écran LCD sans afficher le curseur.&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2896</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2896"/>
		<updated>2024-01-17T10:32:46Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Ecriture sur la carte LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- &amp;lt;code&amp;gt;'''rs'''&amp;lt;/code&amp;gt; indique si les données à écrire sont des données &lt;br /&gt;
  d'instruction '''« 0 »''' &lt;br /&gt;
  des données à afficher '''« 1 »'''&lt;br /&gt;
- Les blocs de &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; testent chaque bit dans &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;. Ils activent ou désactivent les lignes de données (DB4 à DB7).&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2895</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2895"/>
		<updated>2024-01-17T10:24:36Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Ecriture sur la carte LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données sur l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2894</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2894"/>
		<updated>2024-01-17T10:24:08Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Carte électronique numérique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction &amp;lt;code&amp;gt;'''lcdWrite4bits'''&amp;lt;/code&amp;gt; est conçue pour écrire quatre bits de données l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void lcdWrite4bits(uint8_t data, uint8_t rs){&lt;br /&gt;
&lt;br /&gt;
    if(rs)&lt;br /&gt;
        LCD_RS_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_RS_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_RW_OFF();&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_ON();&lt;br /&gt;
     _delay_us(1);&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 1)&lt;br /&gt;
        LCD_DB4_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB4_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 2)&lt;br /&gt;
        LCD_DB5_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB5_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 4)&lt;br /&gt;
        LCD_DB6_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB6_OFF();&lt;br /&gt;
&lt;br /&gt;
    if(data &amp;amp; 8)&lt;br /&gt;
         LCD_DB7_ON();&lt;br /&gt;
    else&lt;br /&gt;
        LCD_DB7_OFF();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    LCD_EN_OFF();&lt;br /&gt;
    _delay_us(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2893</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2893"/>
		<updated>2024-01-17T10:19:37Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Programmation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Les broches nécessaire à la programmation de l'écran LCD :&lt;br /&gt;
&lt;br /&gt;
* RS (Register Select)&lt;br /&gt;
* EN (Enable)&lt;br /&gt;
* R/W (Read/Write)&lt;br /&gt;
* DB4 à DB7&lt;br /&gt;
&lt;br /&gt;
==== Ecriture sur la carte LCD ====&lt;br /&gt;
La fonction '''lcdWrite4bits''' est conçue pour écrire quatre bits de données l’écran LCD en utilisant une interface 4 bits.&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2885</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2885"/>
		<updated>2024-01-16T21:59:14Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Clignotement des LEDs avec ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:AfficheurOrdonnancer.mp4|néant|vignette|Ordonnancement,écriture port série]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:AfficheurOrdonnancer.mp4&amp;diff=2884</id>
		<title>Fichier:AfficheurOrdonnancer.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:AfficheurOrdonnancer.mp4&amp;diff=2884"/>
		<updated>2024-01-16T21:58:05Z</updated>

		<summary type="html">&lt;p&gt;Handrian : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Vidéo de l'afficheur 7 segment avec test lecture/ecriture sur port série&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2883</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2883"/>
		<updated>2024-01-16T21:53:49Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Carte électronique numérique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Programmation de la carte fille LCD&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2882</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2882"/>
		<updated>2024-01-16T21:20:13Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Afficheur 7 segments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
Pour l'ordonnancement, nous l'avons testé sur l'afficheur 7 segments avec lecture/écriture sur le port série :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// fonction pour afficheur 7 segments&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
    pause_smp(SEMAPHORE_SPI);&lt;br /&gt;
    spi_activer(SS_3);&lt;br /&gt;
    spi_exch(0x76);&lt;br /&gt;
    spi_desactiver(SS_3);&lt;br /&gt;
&lt;br /&gt;
    while(1){&lt;br /&gt;
        for(int i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_activer(SS_3);&lt;br /&gt;
            spi_exch(caractere);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(SS_3);&lt;br /&gt;
         _wait_ms(5);&lt;br /&gt;
        liber_smp(SEMAPHORE_SPI);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]] &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2881</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2881"/>
		<updated>2024-01-16T20:02:12Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void afficheur(void)&lt;br /&gt;
{&lt;br /&gt;
     spi_activer();&lt;br /&gt;
     spi_exch(0x76);&lt;br /&gt;
     spi_desactiver();&lt;br /&gt;
    char seg[4] = &amp;quot;1234&amp;quot;;&lt;br /&gt;
     while(1){&lt;br /&gt;
         spi_activer();&lt;br /&gt;
         for(uint8_t i = 0; i &amp;lt; 4 ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            spi_exch(seg[i]);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
        spi_desactiver();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]] &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2880</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2880"/>
		<updated>2024-01-16T19:47:58Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Clignotement des LEDs avec ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Et voici la fonction permettant d'initialiser le contexte de chaque tâche :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_task(int id)&lt;br /&gt;
{&lt;br /&gt;
    uint16_t save_sp = SP;&lt;br /&gt;
    SP= taches[id].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
    uint16_t adresse=(uint16_t)taches[id].task_func;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (adresse &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((adresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTERS();&lt;br /&gt;
&lt;br /&gt;
    taches[id].pointer_pile = SP;&lt;br /&gt;
    SP = save_sp;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]] &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2879</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2879"/>
		<updated>2024-01-16T19:46:16Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Clignotement des LEDs avec ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et voici la fonction permettant d'initialiser le contexte de chaque tâche :[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]] &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2878</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2878"/>
		<updated>2024-01-16T19:38:12Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Clignotement des LEDs avec ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
 // Tâche 1&lt;br /&gt;
void task_LED_1() {&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
    PORTD &amp;amp;= ~(1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTD ^= (1 &amp;lt;&amp;lt; LED4_PIN);&lt;br /&gt;
        _delay_ms(200); // Fréquence 200 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
  &lt;br /&gt;
 // Tâche 2&lt;br /&gt;
void task_LED_2() {&lt;br /&gt;
    DDRC |= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
    PORTC &amp;amp;= ~(1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
&lt;br /&gt;
    while (1) {&lt;br /&gt;
        PORTC ^= (1 &amp;lt;&amp;lt; LED1_PIN);&lt;br /&gt;
        _delay_ms(1000); // Fréquence 1000 ms&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]] &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2877</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2877"/>
		<updated>2024-01-16T19:32:15Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Clignotement des LEDs avec ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur.  &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]] &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2870</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2870"/>
		<updated>2024-01-16T19:15:29Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* LCD avec SPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR (Interrupt Service Routine) qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer sinon la communication SPI ne sera pas fonctionnelle. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le &amp;quot;via&amp;quot; connecté à CS avec un fil. Puis relier le pin 10 avec B7 de l'écran LCD.  &lt;br /&gt;
[[Fichier:Carte resoudée.jpg|néant|vignette|Carte avec inter-changement des pins B7 et CS]] &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_resoud%C3%A9e.jpg&amp;diff=2868</id>
		<title>Fichier:Carte resoudée.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_resoud%C3%A9e.jpg&amp;diff=2868"/>
		<updated>2024-01-16T19:14:36Z</updated>

		<summary type="html">&lt;p&gt;Handrian : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La carte après modification des pins&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2857</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2857"/>
		<updated>2024-01-16T19:01:00Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Présentation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR (Interrupt Service Routine) qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2851</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2851"/>
		<updated>2024-01-16T18:49:15Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Clignotement des LEDs avec ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR (Interrupt Service Routine) qui sera déclenché par l'interruption.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED) {&lt;br /&gt;
     SAVE_REGISTERS();&lt;br /&gt;
  &lt;br /&gt;
     taches[current].pointer_pile = SP;&lt;br /&gt;
&lt;br /&gt;
     // Appel à l'ordonnanceur&lt;br /&gt;
     scheduler();&lt;br /&gt;
  &lt;br /&gt;
    SP = taches[current].pointer_pile;&lt;br /&gt;
&lt;br /&gt;
     RESTORE_REGISTERS();&lt;br /&gt;
     asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2848</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2848"/>
		<updated>2024-01-16T18:46:17Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Clignotement des LEDs avec ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. &lt;br /&gt;
&lt;br /&gt;
Pour réaliser l'ordonnanceur, nous avons besoin d'une fonction de gestion d'interruption ISR (Interrupt Service Routine) qui sera déclenché par l'interruption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2811</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2811"/>
		<updated>2024-01-16T15:25:38Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* LCD avec AvrIsp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec SPI&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2810</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2810"/>
		<updated>2024-01-16T15:25:22Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Présentation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
Voici tous la présentation de tous les composants de notre carte fille :[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2809</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2809"/>
		<updated>2024-01-16T15:24:43Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Présentation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. Voici tous les composants de notre carte fille :&lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2807</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2807"/>
		<updated>2024-01-16T15:22:50Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Clignotement des LEDs avec ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Pour l'afficheur 7 segments, nous l'avons dans un premier temps fait sans ordonnancement pour connaitre sa fonctionnalité. Pour le tester on a juste affiché &amp;quot;1 2 3 4&amp;quot; sur l'afficheur comme indiqué sur l'image ci-dessous : [[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé directement avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. Voici tous les composants de notre carte fille :&lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2806</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2806"/>
		<updated>2024-01-16T15:10:15Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Présentation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé directement avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. Voici tous les composants de notre carte fille :&lt;br /&gt;
&lt;br /&gt;
* Le potentiomètre&lt;br /&gt;
* le bouton reset&lt;br /&gt;
* les connecteurs&lt;br /&gt;
* l'écran LCD&lt;br /&gt;
* Les capacités&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2803</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2803"/>
		<updated>2024-01-16T15:08:20Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Présentation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé directement avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// the setup function runs once when you press reset or power the board&lt;br /&gt;
void setup() {&lt;br /&gt;
  // initialize digital pin LED_BUILTIN as an output.&lt;br /&gt;
  pinMode(7, OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// the loop function runs over and over again forever&lt;br /&gt;
void loop() {&lt;br /&gt;
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW&lt;br /&gt;
  delay(1000);                       // wait for a second&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. Voici tous les composants de notre carte fille :&lt;br /&gt;
[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2802</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2802"/>
		<updated>2024-01-16T15:07:06Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* LCD avec AvrIsp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé directement avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. Voici tous les composants de notre carte fille :&lt;br /&gt;
[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
Nous avons donc procéder avec le professeur la modification des pins. &lt;br /&gt;
[[Fichier:Piste à découper.jpg|néant|vignette]]&lt;br /&gt;
Nous avons couper la piste du pin 14 et le relier avec le via connecté à CS puis relier le pin 10 avec B7 de l'écran LCD. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2801</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2801"/>
		<updated>2024-01-16T15:04:35Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Présentation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier test de la carte.&lt;br /&gt;
&lt;br /&gt;
* Le microprossesseur&lt;br /&gt;
* une led&lt;br /&gt;
* L'horloge&lt;br /&gt;
* le connecteur HE10&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela, on a testé directement avec le code exemple présent Arduino IDE.  &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. Voici tous les composants de notre carte fille :&lt;br /&gt;
[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2800</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2800"/>
		<updated>2024-01-16T15:01:39Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* LCD avec AvrIsp */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Voici la carte Shield soudé :&amp;lt;/small&amp;gt; &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Nous avons soudé cette carte :&amp;lt;/small&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;small&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/small&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier Test de la carte.&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela; on a testé directement avec le code exemple présent Arduino IDE. [[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. Voici tous les composants de notre carte fille :&lt;br /&gt;
[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_apr%C3%A8s_modification.jpg&amp;diff=2797</id>
		<title>Fichier:Carte après modification.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_apr%C3%A8s_modification.jpg&amp;diff=2797"/>
		<updated>2024-01-16T14:47:47Z</updated>

		<summary type="html">&lt;p&gt;Handrian : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Carte fille soudée après modification&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Piste_%C3%A0_d%C3%A9couper.jpg&amp;diff=2794</id>
		<title>Fichier:Piste à découper.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Piste_%C3%A0_d%C3%A9couper.jpg&amp;diff=2794"/>
		<updated>2024-01-16T14:43:52Z</updated>

		<summary type="html">&lt;p&gt;Handrian : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Présentation des pistes&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2778</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2778"/>
		<updated>2024-01-16T13:16:25Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Présentation de la carte fille LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &amp;lt;big&amp;gt;Ordonnanceur / Système d'exploitation&amp;lt;/big&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Réalisation du Shield&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&amp;lt;big&amp;gt;'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|&amp;lt;big&amp;gt;carte Shield après première soudure&amp;lt;/big&amp;gt;|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|&amp;lt;big&amp;gt;câbles&amp;lt;/big&amp;gt;|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield.&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Voici la carte Shield soudé : &lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|&amp;lt;big&amp;gt;Photo de la carte Shield soudé&amp;lt;/big&amp;gt;|néant]]                       &lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Nous avons soudé cette carte :&amp;lt;/big&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]&amp;lt;big&amp;gt;Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&amp;lt;/big&amp;gt;&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Clignotement des LEDs avec ordonnanceur&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Au cours de la fabrication de notre carte, nous avons commencé la réalisation de l'ordonnanceur. Le principe c'est de créer deux tâches pour faire clignoter deux LEDs du bouclier avec des périodes différentes. La première tache allume et éteint une LED toutes les 200ms, la deuxième tache réalise la même opération sur une LED différente toutes les 1000ms.&lt;br /&gt;
[[Fichier:VID .mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;&amp;lt;big&amp;gt;Afficheur 7 segments&amp;lt;/big&amp;gt;&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Afficheur.jpg|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Présentation de la carte fille LCD&amp;lt;/u&amp;gt;  ===&lt;br /&gt;
'''Séance 14/11''' :&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu la carte, nous avons commencé la soudure des composants nécessaires pour un premier Test de la carte.&lt;br /&gt;
[[Fichier:Crte électronique.jpg|vignette|300x300px|gauche]]&lt;br /&gt;
[[Fichier:Crte soudée.jpg|vignette|centré]]Pour vérifier le bon fonctionnement de la carte, nous avons mis une led afin de savoir la fonctionnalité de la carte. &lt;br /&gt;
&lt;br /&gt;
Pour cela; on a testé directement avec le code exemple présent Arduino IDE. [[Fichier:Video 2023-11-28 at 21.38.57.mp4|vignette|Test de la led|néant]]&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé le reste des composants ainsi que l'écran LCD. Voici tous les composants de notre carte fille :&lt;br /&gt;
[[Fichier:Imagecarte.jpg|vignette|400x400px|carte soudée|néant]]&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Test de l'ecran avec Aduino IDE&amp;lt;/u&amp;gt; ===&lt;br /&gt;
[[Fichier:Testlcd.jpg|vignette|467x467px|test lcd]]&lt;br /&gt;
&lt;br /&gt;
Nous avons testé le lcd avec le code qui est présent sur Arduino IDE en utilisant le bus SPI.&lt;br /&gt;
Voici le code utilisé:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// include the library code:&lt;br /&gt;
#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// initialize the library by associating any needed LCD interface pin&lt;br /&gt;
// with the arduino pin number it is connected to&lt;br /&gt;
const int rs = A0, en = A2, d4 = 4, d5 = 5, d6 = 9, d7 = 10;&lt;br /&gt;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(A1,OUTPUT);&lt;br /&gt;
  digitalWrite(A1,LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  // set up the LCD's number of columns and rows:&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  // Print a message to the LCD.&lt;br /&gt;
  lcd.print(&amp;quot;hello, world!&amp;quot;);&lt;br /&gt;
  pinMode(7,OUTPUT);&lt;br /&gt;
  digitalWrite(7,HIGH);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // set the cursor to column 0, line 1&lt;br /&gt;
  // (note: line 1 is the second row, since counting begins with 0):&lt;br /&gt;
  lcd.setCursor(0, 1);&lt;br /&gt;
  // print the number of seconds since reset:&lt;br /&gt;
  lcd.print(millis() / 1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;LCD avec AvrIsp&amp;lt;/u&amp;gt; ===&lt;br /&gt;
Lors de la programmation de la carte fille, nous avons constaté que les pins du CS et de B7 de l'écran LCD devaient s'inter-changer. &lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2019</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2019"/>
		<updated>2023-11-06T21:17:48Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Réalisation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ordonnanceur / Système d'exploitation ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation du Shield&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|carte Shield après première soudure|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|câbles|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield. &lt;br /&gt;
&lt;br /&gt;
Voici la carte Shield soudé : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|Photo de la carte Shield soudé|néant]]                       &lt;br /&gt;
&lt;br /&gt;
Nous avons soudé cette carte : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifié le routage final et nous avons envoyé la carte afin de l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons  commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2018</id>
		<title>SE4Binome2023-10</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-10&amp;diff=2018"/>
		<updated>2023-11-06T21:16:30Z</updated>

		<summary type="html">&lt;p&gt;Handrian : /* Type de carte choisie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ordonnanceur / Système d'exploitation ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation du Shield&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 13/09 :''' Parmi les activités disponibles, nous avons soudé le régulateur de tension, le lecteur SD, les résistances liées aux LEDs. Nous avons réalisé 2 câbles pour les cartes filles et un adaptateur.&lt;br /&gt;
[[Fichier:Photo de la carte Shield après soudure.jpg|vignette|carte Shield après première soudure|gauche|333x333px]]&lt;br /&gt;
[[Fichier:2 câbles .jpg|vignette|câbles|néant|200x200px]]&lt;br /&gt;
[[Fichier:Adaptateur.jpg|vignette|néant|200x200px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Séance 19/09 :''' Durant cette séance nous avons soudé les autres résistances et les connecteurs. Et nous avons testé le bon fonctionnement de la carte Shield. &lt;br /&gt;
&lt;br /&gt;
Voici la carte Shield soudé : &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[Fichier:Photo de carte soudé.jpg|vignette|Photo de la carte Shield soudé|néant]]                       &lt;br /&gt;
&lt;br /&gt;
Nous avons soudé cette carte : &lt;br /&gt;
&lt;br /&gt;
[[Fichier:20230919.jpg|vignette|néant|200x200px]]Pour le test nous avons utilisé le code qui est disponible sur le git. Voici ci-dessous une vidéo montrant le clignotement des LEDs.&lt;br /&gt;
[[Fichier:Vidéo.mp4|centré|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Carte FPGA / VHDL ==&lt;br /&gt;
&lt;br /&gt;
== Carte électronique numérique ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Type de carte choisie&amp;lt;/u&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
'''La carte fille écran LCD.'''&lt;br /&gt;
&lt;br /&gt;
Elle se compose : &lt;br /&gt;
* d'un  ATMega328p&lt;br /&gt;
* d'un écran LCD à base de contrôleur HD44780&lt;br /&gt;
* d'un connecteur HE10&lt;br /&gt;
* d'un connecteur AVR ISP pour programmer le microcontrôleur&lt;br /&gt;
* d'un potentiomètre pour régler la luminosité des cristaux liquides&lt;br /&gt;
* d'un bouton switch pour le reset&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;u&amp;gt;Réalisation de la carte&amp;lt;/u&amp;gt; ===&lt;br /&gt;
'''Séance 22/09''' : Durant cette séance nous avons commencé la schématique de notre carte. &lt;br /&gt;
&lt;br /&gt;
Voici le schéma électronique de notre carte fille LCD : &lt;br /&gt;
[[Fichier:Schema.png|néant|vignette|600x600px|Schematic de la carte fille LCD]] &lt;br /&gt;
&lt;br /&gt;
'''Séance 03/10 :''' nous avons commencé le routage.&lt;br /&gt;
&lt;br /&gt;
'''Séance 17/10''' : routage terminé&lt;br /&gt;
&lt;br /&gt;
Après le routage nous avons obtenu :&lt;br /&gt;
[[Fichier:Routage1.png|néant|vignette|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Séance 24/10''' : &lt;br /&gt;
&lt;br /&gt;
Le routage terminé, le prof a vérifier le routage et nous avons envoyé la carte afinde l'imprimer.&lt;br /&gt;
&lt;br /&gt;
Durant cette même séance nous avons  commencer la programmation de l'ordonnancement.&lt;br /&gt;
[[Fichier:Carte fille.png|néant|vignette|routage fini|500x500px]]Voici une vue 3D de ce qui va se trouver au dessus de notre carte. Notre écran se trouvera donc en dessous.[[Fichier:3Dviewer.png|néant|vignette|500x500px|vue 3D]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;Voici le lien du git : https://archives.plil.fr/handrian/projet_pico.git&lt;/div&gt;</summary>
		<author><name>Handrian</name></author>
	</entry>
</feed>