<?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=Lwijsman</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=Lwijsman"/>
	<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Lwijsman"/>
	<updated>2026-05-14T03:43:39Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3185</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3185"/>
		<updated>2024-01-18T19:13:59Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.(ici nous renvoyons simplement le caractere tapé au clavier)&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);// Efface l'écran avant d'écrire dessus&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
[[Fichier:Ecran fonctionne.mp4|vignette|L'écran fonctionne|gauche]]&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3184</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3184"/>
		<updated>2024-01-18T19:13:28Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.(ici nous renvoyons simplement le caractere tapé au clavier)&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);// Efface l'écran avant d'écrire dessus&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
[[Fichier:Ecran fonctionne.mp4|vignette|L'écran fonctionne|gauche]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3183</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3183"/>
		<updated>2024-01-18T19:12:53Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.(ici nous renvoyons simplement le caractere tapé au clavier)&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);// Efface l'écran avant d'écrire dessus&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
[[Fichier:Ecran fonctionne.mp4|vignette|L'écran fonctionne|gauche]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3182</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3182"/>
		<updated>2024-01-18T19:11:58Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Démonstration d'écriture sur le port série : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.(ici nous renvoyons simplement le caractere tapé au clavier)&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);// Efface l'écran avant d'écrire dessus&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
[[Fichier:Ecran fonctionne.mp4|vignette|L'écran fonctionne|gauche]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3181</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3181"/>
		<updated>2024-01-18T19:09:59Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);// Efface l'écran avant d'écrire dessus&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
[[Fichier:Ecran fonctionne.mp4|vignette|L'écran fonctionne|gauche]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3180</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3180"/>
		<updated>2024-01-18T19:09:13Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);// Efface l'écran avant d'écrire dessus&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
[[Fichier:Ecran fonctionne.mp4|vignette|L'écran fonctionne|gauche]]&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3179</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3179"/>
		<updated>2024-01-18T19:08:23Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);// Efface l'écran avant d'écrire dessus&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
[[Fichier:Ecran fonctionne.mp4|vignette|L'écran fonctionne]]&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Ecran_fonctionne.mp4&amp;diff=3178</id>
		<title>Fichier:Ecran fonctionne.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Ecran_fonctionne.mp4&amp;diff=3178"/>
		<updated>2024-01-18T19:07:41Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ecriture sur l'écran&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3177</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3177"/>
		<updated>2024-01-18T19:06:18Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);// Efface l'écran avant d'écrire dessus&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3176</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3176"/>
		<updated>2024-01-18T19:04:47Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
    LCD_EraseScreen(2, 16);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture initiale&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);// écriture consecutive&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3175</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3175"/>
		<updated>2024-01-18T19:01:38Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
LCD_EraseScreen(2, 16);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;test 123!&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
	// col = 0;&lt;br /&gt;
	// col = 0;&lt;br /&gt;
&lt;br /&gt;
	_delay_ms(100);&lt;br /&gt;
	LCD_WriteText(&amp;quot; Hello! :)&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
	_delay_ms(50);&lt;br /&gt;
&lt;br /&gt;
	LCD_WriteText(&amp;quot;Now writing to much text so that the screen scrools down&amp;quot;, 2, 16, &amp;amp;row, &amp;amp;col, second_line_buff, &amp;amp;second_line_index);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3174</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=3174"/>
		<updated>2024-01-18T18:57:37Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Partie 2 - Programmation de la carte électronique : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
Également, nous ont été fourni les connecteurs pour l'afficheur 7 segments et la matrice de LEDS &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteint une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connexion SPI ==&lt;br /&gt;
Nous avons ensuite ajouté les fonctionnalités de communication sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Cela nous permet notamment de communiquer de l’ordonnanceur vers la matrice de LEDs afin d'y afficher quelque chose.&lt;br /&gt;
&lt;br /&gt;
Comme sur l'exemple ci-dessous :&lt;br /&gt;
[[Fichier:New.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le bus SPI est utilisé pour la communication série synchrone entre plusieurs périphériques. Nous avons donc premièrement implémenté une fonction d'initialisation qui configure le bus SPI, les broches définies comme entrées ou sorties, et la fréquence d'horloge.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_init(void){&lt;br /&gt;
    SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK);               // configuration sorties&lt;br /&gt;
    SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // configuration entrée&lt;br /&gt;
    DDRD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);&lt;br /&gt;
    SPI_PORT |= (1&amp;lt;&amp;lt;SPI_SS);&lt;br /&gt;
    SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
                                                         // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Les fonctions d'activation/désactivation de la communication en série sont gérée par la mise à l'état haut ou bas de la ligne Slave Select.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void spi_activer(void){                                  // Activer la communication&lt;br /&gt;
    PORTD &amp;amp;= ~(1&amp;lt;&amp;lt;4);                                    // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                               // Désactiver la communication&lt;br /&gt;
    PORTD |= (1&amp;lt;&amp;lt;4);                                     // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La fonction principal qui permet l'échange de données sur le bus spi est la fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt;. La fonction &amp;lt;code&amp;gt;spi_echange&amp;lt;/code&amp;gt; effectue le transfert d'octet sur le bus SPI en plaçant la valeur de l'octet dans le registre de données SPI (&amp;lt;code&amp;gt;SPDR&amp;lt;/code&amp;gt;), puis en attendant la fin du transfert avant de renvoyer l'octet reçu.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                      // Communication sur le bus SPI&lt;br /&gt;
    SPDR = envoi;                                        // octet a envoyer&lt;br /&gt;
    while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin d'envoi&lt;br /&gt;
    return SPDR;                                         // octet reçu&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Communication série : Matrice de LEDs ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était d'établir et gérer une connexion série avec la carte Arduino, c'est-à-dire de pouvoir lire ou envoyer des données entre la carte et un terminal grâce à une interface en ligne de commande. Nous avons donc ici utiliser l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;. Nous avons également implémenté des fonctions utilisant l'UART puisque la communication série est effectuée de manière asynchrone.&lt;br /&gt;
&lt;br /&gt;
=== Configuration de l'UART : ===&lt;br /&gt;
L'UART (Universal Asynchronous Receiver/Transmitter) est un protocole de communication qui permet d'établir des liaisons série et permet la transmission de données série asynchrones, ce qui signifie que les données sont transmises sans utiliser une horloge commune entre l'émetteur et le récepteur.&lt;br /&gt;
&lt;br /&gt;
La première fonction ci-dessous correspond donc à l'initialisation de l'UART :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void init_serie(int speed)&lt;br /&gt;
{&lt;br /&gt;
    // Défini baud rate&lt;br /&gt;
    UBRR0 = F_CPU / (((unsigned long int)speed) &amp;lt;&amp;lt; 4) - 1;&lt;br /&gt;
&lt;br /&gt;
    UCSR0B = (1 &amp;lt;&amp;lt; TXEN0 | 1 &amp;lt;&amp;lt; RXEN0);   // Active le module de transmission et réception&lt;br /&gt;
&lt;br /&gt;
    UCSR0C = (1 &amp;lt;&amp;lt; UCSZ01 | 1 &amp;lt;&amp;lt; UCSZ00); // Configure taille de données sur 8 bits&lt;br /&gt;
&lt;br /&gt;
    UCSR0A &amp;amp;= ~(1 &amp;lt;&amp;lt; U2X0); // No double-speed&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour communiquer avec l'UART, on implémente également les fonctions &amp;lt;code&amp;gt;send_serie&amp;lt;/code&amp;gt; et  &amp;lt;code&amp;gt;get_serie&amp;lt;/code&amp;gt;. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void send_serie(char c)&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, UDRE0); // Boucle d'attente d'info du registre de contrôle pour envoi de donnée&lt;br /&gt;
    UDR0 = c; // écrit un caractère dans le registre UDR0&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char get_serie()&lt;br /&gt;
{&lt;br /&gt;
    sem_P(SERIAL_COM);&lt;br /&gt;
    loop_until_bit_is_set(UCSR0A, RXC0);&lt;br /&gt;
    sem_V(SERIAL_COM);&lt;br /&gt;
    return UDR0; // renvoie le caractère reçu stocké dans le registre UDR0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afin de synchroniser l'échange de données et éviter les problèmes de synchronisation sur la liaison série, nous utilisons des sémaphores (voir &amp;lt;code&amp;gt;semaphore.c&amp;lt;/code&amp;gt; sur le dépôt git).&lt;br /&gt;
&lt;br /&gt;
=== Démonstration de lecture sur le port série : ===&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Lecture série.mp4|vignette|Lecture série|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme il est possible de constater sur la vidéo ci-dessus, nous arrivons à lire depuis l'Arduino sur le port série. Ainsi, dès qu'un caractère est tapé au clavier, il est affiché sur la matrie de LEDs.&lt;br /&gt;
&lt;br /&gt;
=== Démonstration d'écriture sur le port série : ===&lt;br /&gt;
[[Fichier:Ecriture serie.mp4|centré|vignette|Ecriture serie]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous sommes également capable d'écrire depuis le port série, les données sont envoyés depuis l'Arduino et afficher sur l'utilitaire &amp;lt;code&amp;gt;minicom&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Par manque de temps, nous n'avons malheureusement pas pu réaliser cette partie.&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numérique =&lt;br /&gt;
&lt;br /&gt;
L'objectif de cette partie était de concevoir et de créer un circuit imprimé (PCB) pour une carte écran LCD, englobant chaque étape du processus, depuis l'élaboration du schéma initial jusqu'à la programmation de l'affichage sur l'écran. &lt;br /&gt;
&lt;br /&gt;
Ainsi cette partie abordera plus en détail les points suivants :&lt;br /&gt;
&lt;br /&gt;
# Réalisation du PCB&lt;br /&gt;
#* Schematic&lt;br /&gt;
#* Routage&lt;br /&gt;
#* Soudure&lt;br /&gt;
# Programmation de la carte électronique&lt;br /&gt;
#* Code, explications et tests&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
=== Partie 1 - réalisation du PCB : ===&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontrôleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
Après le point d'avancement, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p certains ports n'étaient pas connectés aux endroits attendus. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustrer correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|vignette|Schematic final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois le circuit corrigé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|vignette|Routage final|centré|600x600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et tests : ====&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'Arduino en tant qu'ISP, mais nous obtenions une erreur. &lt;br /&gt;
Également, après un test en programmant directement la carte avec un programme simple en C et un ficher Makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
&lt;br /&gt;
Comme nous l'avons évoqué précédemment, les connexions de l'AVR ISP était finalement en cause. Nous avons donc réussi à corriger le problème directement en câblant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|Partie supérieure[[Fichier:Partie supérieure carte écran .png|alt=Partie supérieure carte écran |centré|vignette|400x400px|Partie supérieure carte écran ]]&lt;br /&gt;
|Partie inférieure[[Fichier:Partie inféreure carte écran .png|alt=Partie inférieure carte écran |centré|vignette|400x400px|Partie inférieure carte écran ]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs). L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précédemment.&lt;br /&gt;
&lt;br /&gt;
Ainsi, nous avons pu tester le programme &amp;quot;blink&amp;quot; fourni dans l'Arduino IDE et constater que notre carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Partie 2 - Programmation de la carte électronique : ===&lt;br /&gt;
&lt;br /&gt;
Nous avons un fichier LCD.c et LCD.h avec des fonctions qui servent à interagir avec l'écran. La fonction LCD_WriteText qui permet d'écrire une chaîne de caractères sur l'écran de manière à ce que le passage à la nouvelle ligne se fasse automatiquement.&lt;br /&gt;
&lt;br /&gt;
Le fichier main.c contient le programe qui utilise LCD.h affin de faire fonctionner l'ecran.&lt;br /&gt;
&lt;br /&gt;
Nous pouvons programmer l'atmega situé sur notre carte et cela fait fonctionner l'ecran comme sur la vidéo suivante:&lt;br /&gt;
&lt;br /&gt;
= Bilan du projet =&lt;br /&gt;
&lt;br /&gt;
Ce TP / Projet nous a permis d'aborder de nombreux point intéressants et d'en découvrir davantage sur plusieurs aspects majeurs comme la communication série ou encore les composants systèmes, avec l'ordonnanceur notamment.  &lt;br /&gt;
&lt;br /&gt;
La première partie que nous avons abordée était la réalisation de la carte PCB pour notre futur carte électronique. Nous avions d'ores et déjà abordé ce sujet l'année dernière, néanmoins, nous avons eu certaines difficultés lors de la conception de notre PCB. Ces difficultés nous ont coûté en termes de temps, mais nous avons su rebondir et faire les adaptations nécessaires pour obtenir une carte fonctionnelle et avancer sur la suite du projet.&lt;br /&gt;
&lt;br /&gt;
Nous avons consacré la majeur partie de notre temps à établir un ordonnanceur fonctionnel et opérationnel pour les différentes tâches suivant sa réalisation. Ce fut assez complexe mais réellement instructif. Nous avons pu également, réaliser la programmation de la carte écran afin de pouvoir interagir avec l'écran et afficher des caractères sur ce dernier.&lt;br /&gt;
&lt;br /&gt;
Malgré une première partie de projet compliquée, nous avons su nous investir davantage et redoubler d'efforts afin de pouvoir remplir nos objectifs. Ainsi, nous avons réussi à proposer une carte écran fonctionnelle, mais aussi un ordonnanceur et des fonctionnalités permettant une communication série entre notre machine et l'Arduino. Ceci, afin d'afficher des caractères sur une matrice de LEDs depuis un utilitaire minicom ou sur le terminal depuis l'Arduino.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2677</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2677"/>
		<updated>2024-01-12T14:09:15Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Connection SPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connection SPI ==&lt;br /&gt;
Nous avons ajouté des fonctionalitées de comunication SPI.&lt;br /&gt;
&lt;br /&gt;
cela nous permet notament de comuniquer de l'ordonanceur vars l'ecran affin d'y aficher quelque chose:&lt;br /&gt;
&lt;br /&gt;
comme sur cet exemple:&lt;br /&gt;
[[Fichier:New.mp4|gauche|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Schematic initial]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|gauche|vignette|Schematic final]]&lt;br /&gt;
Après le point d'avancement avec les professeurs, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p et que les ports MOSI, MISO et CLK n'étaient pas aux bons endroits. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustré correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|gauche|vignette|Routage final]]&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Routage initial]]Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois nos erreurs corrigées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
[[Fichier:Carte écran.jpg|alt=Carte écran|gauche|vignette|Carte écran|267x267px]][[Fichier:Partie inférieure carte écran .jpg|alt=Partie inférieure carte écran |vignette|Partie inférieure carte écran |267x267px]]Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
Comme nous l'avons évoqué précedemment, les connexions de l'AVR ISP était finalement en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précedemment.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2676</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2676"/>
		<updated>2024-01-12T14:08:49Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Connection SPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connection SPI ==&lt;br /&gt;
Nous avons ajouté des fonctionalitées de comunication SPI.&lt;br /&gt;
&lt;br /&gt;
cela nous permet notament de comuniquer de l'ordonanceur vars l'ecran affin d'y aficher quelque chose:&lt;br /&gt;
&lt;br /&gt;
comme sur cet exemple:&lt;br /&gt;
[[Fichier:New.mp4|gauche|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Schematic initial]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|gauche|vignette|Schematic final]]&lt;br /&gt;
Après le point d'avancement avec les professeurs, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p et que les ports MOSI, MISO et CLK n'étaient pas aux bons endroits. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustré correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|gauche|vignette|Routage final]]&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Routage initial]]Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois nos erreurs corrigées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
[[Fichier:Carte écran.jpg|alt=Carte écran|gauche|vignette|Carte écran|267x267px]][[Fichier:Partie inférieure carte écran .jpg|alt=Partie inférieure carte écran |vignette|Partie inférieure carte écran |267x267px]]Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
Comme nous l'avons évoqué précedemment, les connexions de l'AVR ISP était finalement en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précedemment.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:New.mp4&amp;diff=2675</id>
		<title>Fichier:New.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:New.mp4&amp;diff=2675"/>
		<updated>2024-01-12T14:07:04Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Écran qui affiche chiffres&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:WhatsApp_Video_2024-01-12_at_14.48.25.mp4&amp;diff=2674</id>
		<title>Fichier:WhatsApp Video 2024-01-12 at 14.48.25.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:WhatsApp_Video_2024-01-12_at_14.48.25.mp4&amp;diff=2674"/>
		<updated>2024-01-12T13:54:28Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Écran qui affiche chiffres.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2673</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2673"/>
		<updated>2024-01-12T13:42:27Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Conection SPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Connection SPI ==&lt;br /&gt;
Nous avons ajouté des fonctionalitées de comunication SPI.&lt;br /&gt;
&lt;br /&gt;
cela nous permet notament de comuniquer de l'ordonanceur vars l'ecran affin d'y aficher quelque chose:&lt;br /&gt;
&lt;br /&gt;
comme sur cet exemple:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Schematic initial]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|gauche|vignette|Schematic final]]&lt;br /&gt;
Après le point d'avancement avec les professeurs, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p et que les ports MOSI, MISO et CLK n'étaient pas aux bons endroits. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustré correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|gauche|vignette|Routage final]]&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Routage initial]]Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois nos erreurs corrigées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
[[Fichier:Carte écran.jpg|alt=Carte écran|gauche|vignette|Carte écran|267x267px]][[Fichier:Partie inférieure carte écran .jpg|alt=Partie inférieure carte écran |vignette|Partie inférieure carte écran |267x267px]]Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
Comme nous l'avons évoqué précedemment, les connexions de l'AVR ISP était finalement en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précedemment.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2672</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2672"/>
		<updated>2024-01-12T13:40:49Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
=== Première approche : ===&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 2 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, ces fonctions utilisent la fonction _delay_ms pour maintenir les LEDs allumés pendant un certain temps. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
=== Approche avancée : ===&lt;br /&gt;
Nous avons ensuite cherché à implémenter une fonction faisant office de pause, mais qui contrairement au delay, n'agissait pas comme une interruption à tout le programme. La fonction ''wait_ms'' permet de mettre une tâche en attente pendant un certain nombre de millisecondes.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait_ms(int ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    taskList[currentTask].timer = ms;&lt;br /&gt;
    taskList[currentTask].state = SLEEPING;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Le timer de la tâche prend la valeur en milliseconde spécifié dans l'argument de la fonction et la fonction passe en état de sommeil. Dans le programme, la fonction TCNT1 permet de mesurer le temps écoulé depuis l'appel à la fonction ''wait_ms'', elle est donc ici fixée à 0. On fait ensuite directement appel à la routine d'interruption pour déclencher le mécanisme de gestion du temps.&lt;br /&gt;
&lt;br /&gt;
La routine d'interruption du Timer1 est implémentée de telle sorte que le contexte de la tâche en cours est sauvegardé, l'ordonnanceur est appelé, puis le contexte de la prochaine tâche à exécuter est restauré.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
  // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
  portSAVE_CONTEXT();&lt;br /&gt;
  // Sauvegarde la valeur actuelle du pointeur de pile (SP)&lt;br /&gt;
  taskList[currentTask].stackPointer = SP; &lt;br /&gt;
  // Appel à l'ordonnanceur&lt;br /&gt;
  scheduler();&lt;br /&gt;
  // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
  SP = taskList[currentTask].stackPointer;&lt;br /&gt;
  // restaure les valeurs des registres depuis la pile.&lt;br /&gt;
  portRESTORE_CONTEXT();&lt;br /&gt;
  // return from interupt&lt;br /&gt;
  asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La fonction scheduler, commentée ci-dessous, permet de gérer l'ordonnancement des tâches en fonction de leur temps d'attente défini.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
    for(int i = 0; i &amp;lt; NUM_TASKS; i++){// Pour chaque tâche&lt;br /&gt;
        if(taskList[i].state == SLEEPING){ // Si elle est en état SLEEPING&lt;br /&gt;
            uint16_t time_elapsed = 20;&lt;br /&gt;
              if(TCNT1 != 0){ // Le timer a commencé à compter&lt;br /&gt;
                  time_elapsed = TCNT1 * 200 / OCR1A / 10; // Temps en milliseconde écoulé depuis la dernière interruption&lt;br /&gt;
                  TCNT1 = 0; // Réinitialisation du timer pour la prochaine interruption&lt;br /&gt;
              }&lt;br /&gt;
&lt;br /&gt;
              taskList[i].timer = taskList[i].timer - time_elapsed;&lt;br /&gt;
&lt;br /&gt;
              if(taskList[i].timer == 0) // Fin du timer&lt;br /&gt;
              {&lt;br /&gt;
                taskList[i].state = RUNNING; // La tâche se réveille&lt;br /&gt;
              }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    // Permet de sélectionner la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
    do{&lt;br /&gt;
        currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
    }while(taskList[currentTask].state == SLEEPING);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme complet et détaillé de notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
== Conection SPI ==&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Schematic initial]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Carte fille ecran LCD.pdf|alt=Carte fille ecran LCD|gauche|vignette|Schematic final]]&lt;br /&gt;
Après le point d'avancement avec les professeurs, nous nous sommes aperçus que nous n'avions pas correctement effectué le pinout de l'Atmega328p et que les ports MOSI, MISO et CLK n'étaient pas aux bons endroits. Nous avons donc su adapter notre carte afin qu'elle puisse être programmée.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc corrigé le schematic afin qu'il puisse illustré correctement le fonctionnement de la carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
[[Fichier:PCB carte ecran final.png|alt=PCB carte ecran final|gauche|vignette|Routage final]]&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Routage initial]]Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
&lt;br /&gt;
Nous avons aussi du adapter notre routage pour qu'il corresponde avec notre carte une fois nos erreurs corrigées.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
[[Fichier:Carte écran.jpg|alt=Carte écran|gauche|vignette|Carte écran|267x267px]][[Fichier:Partie inférieure carte écran .jpg|alt=Partie inférieure carte écran |vignette|Partie inférieure carte écran |267x267px]]Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
Comme nous l'avons évoqué précedemment, les connexions de l'AVR ISP était finalement en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.[[Fichier:Blink carte fille.mp4|vignette|Blink carte fille|centré]]&lt;br /&gt;
Nous avons ensuite soudé le reste des composants (potentiomètre et connecteurs).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'un des pins du connecteur femelle (16 pins) sur la carte n'était pas correctement relié à la masse et nous empêché d'afficher sur l'écran. Erreur certainement causé au moment de la création du plan de masse, mais finalement corrigée en soudant un fil sur le dessous de la carte de la même manière que précedemment.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2474</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2474"/>
		<updated>2023-12-12T15:21:41Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Soudures et programmation : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien pour notre démonstration. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
[[Fichier:Blink carte fille.mp4|gauche|vignette|Blink carte fille]]&lt;br /&gt;
Finalement, les connexions de l'AVR ISP était en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons soudée le reste des composants (potentiometre et conneteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imgecran.png|vignette|L'écran ne se comporte pas comme prevu.|310x310px]]&lt;br /&gt;
L'ecran ne se comporte pas comme prevu en effet en essayant d'afficher hello world il y a un simple caractere qui s'affiche. (ici 0).&lt;br /&gt;
&lt;br /&gt;
Apres avoir debugé la carte on voit que un des concteurs de l'ecran n'etait pas relié a la masse. apres avoir corigé, lecran est alimenté correctement&lt;br /&gt;
&lt;br /&gt;
[[Fichier:WhatsApp Image 2023-12-12 at 16.09.54.jpg|vignette|Ecran alumé]]&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:WhatsApp_Image_2023-12-12_at_16.09.54.jpg&amp;diff=2473</id>
		<title>Fichier:WhatsApp Image 2023-12-12 at 16.09.54.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:WhatsApp_Image_2023-12-12_at_16.09.54.jpg&amp;diff=2473"/>
		<updated>2023-12-12T15:21:02Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ecran&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2472</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2472"/>
		<updated>2023-12-12T15:20:02Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Soudures et programmation : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien pour notre démonstration. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
[[Fichier:Blink carte fille.mp4|gauche|vignette|Blink carte fille]]&lt;br /&gt;
Finalement, les connexions de l'AVR ISP était en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons soudée le reste des composants (potentiometre et conneteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imgecran.png|vignette|L'écran ne se comporte pas comme prevu.|310x310px]]&lt;br /&gt;
L'ecran ne se comporte pas comme prevu en effet en essayant d'afficher hello world il y a un simple caractere qui s'affiche. (ici 0).&lt;br /&gt;
&lt;br /&gt;
Apres avoir debugé la carte on voit que un des concteurs de l'ecran n'etait pas relié a la masse. apres avoir corigé, lecran est alimenté correctement&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2469</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2469"/>
		<updated>2023-12-11T16:39:24Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Soudures et programmation : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien pour notre démonstration. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
[[Fichier:Blink carte fille.mp4|gauche|vignette|Blink carte fille]]&lt;br /&gt;
Finalement, les connexions de l'AVR ISP était en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons soudée le reste des composants (potentiometre et conneteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imgecran.png|vignette|L'écran ne se comporte pas comme prevu.|310x310px]]&lt;br /&gt;
L'ecran ne se comporte pas comme prevu en effet en essayant d'afficher hello world il y a un simple caractere qui s'affiche. (ici 0).&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2468</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2468"/>
		<updated>2023-12-11T16:38:19Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Soudures et programmation : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien pour notre démonstration. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
[[Fichier:Blink carte fille.mp4|gauche|vignette|Blink carte fille]]&lt;br /&gt;
Finalement, les connexions de l'AVR ISP était en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons soudée le reste des composants (potentiometre et conneteurs.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imgecran.png|vignette|L'écran ne se comporte pas comme prevu.]]&lt;br /&gt;
L'ecran ne se comporte pas comme prevu en effet en essayant d'afficher hello world il y a un simple caractere qui s'affiche. (ici 0).&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Imgecran.png&amp;diff=2467</id>
		<title>Fichier:Imgecran.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Imgecran.png&amp;diff=2467"/>
		<updated>2023-12-11T16:37:49Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;img&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Ecran_afiche.jpg&amp;diff=2466</id>
		<title>Fichier:Ecran afiche.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Ecran_afiche.jpg&amp;diff=2466"/>
		<updated>2023-12-11T16:30:00Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ecran fonctionne mal&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2465</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2465"/>
		<updated>2023-12-11T16:28:03Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Soudures et tentatives de programmation : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Shield soudé et câbles HE10.jpg|vignette|Shield soudé et câbles HE10]]&lt;br /&gt;
Le premier objectif était de réaliser la partie matériel de notre projet.&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison HE10 carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles.&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void scheduler() {&lt;br /&gt;
 &lt;br /&gt;
  // Choisi la tâche suivante à exécuter en tournant en boucle&lt;br /&gt;
  currentTask = (currentTask + 1) % NUM_TASKS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Le processus 2 allume et éteind une LED toutes les 500ms, le processus 0 réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien pour notre démonstration. &amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Définition des tâches&lt;br /&gt;
void task0() {&lt;br /&gt;
  // Code de la tâche 0&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTB, PB5);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(1000);&lt;br /&gt;
    Output_flip(&amp;amp;PORTB, PB5);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void task2() {&lt;br /&gt;
  //Code de la tâche 2&lt;br /&gt;
  Output_setHigh(&amp;amp;PORTD, PD7);&lt;br /&gt;
  while (1)&lt;br /&gt;
  {&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
    Output_flip(&amp;amp;PORTD, PD7);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
[[Fichier:Blink.mp4|centré|vignette|Deux LEDs clignotent indépendamment]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Soudures et programmation : ====&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Nous avons ainsi pu tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. &lt;br /&gt;
Egalement, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. &lt;br /&gt;
&lt;br /&gt;
Comme nous n'arrivions pas à programmer la carte, nous avons premièrement eu quelques doutes concernant la soudure du quartz, nous avons donc choisi de le remplacer mais cela n'a pas résolu le problème.&lt;br /&gt;
[[Fichier:Blink carte fille.mp4|gauche|vignette|Blink carte fille]]&lt;br /&gt;
Finalement, les connexions de l'AVR ISP était en cause, nous avions inversé SCK, MISO et MOSI. Nous avons donc réussi à corriger le problème directement en cablant sur la carte. Nous avons donc implémenté un programme pour tester le clignotement d'une LED. La carte fonctionne.&lt;br /&gt;
&lt;br /&gt;
Nous avons soudée le reste des composants (potentiometre et conneteurs.&lt;br /&gt;
&lt;br /&gt;
L'ecran ne se comporte pas comme prevu en effet en essayant d'afficher hello world il y a un simple caractere qui s'affiche. (ici 0).&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2347</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2347"/>
		<updated>2023-12-11T09:02:16Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Réalisation du shield : ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser les différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. Le deuxième processus allume et éteind une LED toutes les 500ms, le troisième processus réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien. En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
==== Soudure et programmation : ====&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Ensuite nous avons tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. De plus, après un test en programmant directement la carte avec un programme simple en C et un makefile adapté, nous en sommes arrivés à la conclusion que notre carte était défaillante. Comme nous n'arrivons pas à programmer la carte, nous avons quelques doutes concernant la soudure du quartz. Une des solutions possible est de tenter de ressouder une autre carte pour pouvoir la programmer correctement.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2330</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2330"/>
		<updated>2023-12-11T07:52:05Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Réalisation du shield : ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser les différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. Le deuxième processus allume et éteind une LED toutes les 500ms, le troisième processus réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien. En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
==== Soudure et programmation : ====&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Ensuite nous avons tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. Comme nous n'arrivons pas à programmer la carte, nous avons quelques doutes concernant la soudure du quartz. Une des solutions possible est de tenter de ressouder une autre carte pour pouvoir la programmer correctement.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2329</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2329"/>
		<updated>2023-12-11T07:50:30Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Soudure : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Réalisation du shield : ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser les différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. Le deuxième processus allume et éteind une LED toutes les 500ms, le troisième processus réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien. En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
==== Soudure : ====&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB, nous avons réalisé la soudure des composants sur la carte. Ensuite nous avons tenter de programmer la carte avec l'arduino en tant qu'ISP, mais nous avons une erreur. Comme nous n'arrivons pas à programmer la carte, nous avons quelques doutes concernant la soudure du quartz. Une des solutions possible est de tenter de ressouder une autre carte pour pouvoir la programmer correctement.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2328</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2328"/>
		<updated>2023-12-11T07:44:00Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Soudure : */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Réalisation du shield : ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser les différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. Le deuxième processus allume et éteind une LED toutes les 500ms, le troisième processus réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien. En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB&lt;br /&gt;
&lt;br /&gt;
==== Soudure : ====&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé la care en soudant les composants. toutefois etant donée que nous n'arrivons pas a programmer la carte, nous avons quelques doutes concernant la soudure du quartz.&lt;br /&gt;
Nous pensons resouder une autre carte.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2327</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2327"/>
		<updated>2023-12-11T07:43:25Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Carte fille écran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Réalisation du shield : ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser les différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. Le deuxième processus allume et éteind une LED toutes les 500ms, le troisième processus réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien. En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;br /&gt;
&lt;br /&gt;
Après réception de la carte PCB&lt;br /&gt;
&lt;br /&gt;
==== Soudure : ====&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé la care en soudant les composants. toutefois etant donee que nus n'arrivons pas a programmer la carte, nous avons quelques doutes concernant la soudure du quartz.&lt;br /&gt;
Nous pensons resouder une autre carte.&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2171</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2171"/>
		<updated>2023-11-28T13:11:31Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Programmation de l'ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Réalisation du shield : ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser les différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. Le deuxième processus allume et éteind une LED toutes les 500ms, le troisième processus réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien. En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer/tree/master/Ordonnanceur git].&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2170</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2170"/>
		<updated>2023-11-28T13:10:11Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GIT =&lt;br /&gt;
https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer&lt;br /&gt;
&lt;br /&gt;
= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Réalisation du shield : ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser les différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. Le deuxième processus allume et éteind une LED toutes les 500ms, le troisième processus réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien. En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer git].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2169</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=2169"/>
		<updated>2023-11-28T13:09:16Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Programmation de l'ordonnanceur */  ajout lien git&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ordonnanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Matériel ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Réalisation du shield : ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un premier TP pratique nous a permis de réaliser les différents composants qui allaient nous servir par la suite pour le bon fonctionnement de notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous avons ainsi pu réaliser les composants suivant :&lt;br /&gt;
&lt;br /&gt;
* Réalisation des cables de liaison carte-mère/carte-fille avec des cables plats ruban 8 broches et des connecteurs HE10 femelles&lt;br /&gt;
&lt;br /&gt;
* Réalisation du shield : soudure du Lecteur SD, des LEDs et résistances, et des ports HE10 males&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Programmation de l'ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour l'ordonnanceur, nous avons commencé par réaliser la fonction d'interruption qui se déclenche toutes les 20ms. Ensuite, nous avons créé 3 processus distincts afin de tester le bon fonctionnement de notre ordonnanceur. Le deuxième processus allume et éteind une LED toutes les 500ms, le troisième processus réalise la même opération sur une LED différente toutes les 1000ms, et le troisième processus ne fait rien. En implantant le programme sur la carte + shield, on constate que le programme fonctionne correctement, c'est-à-dire que chacune des deux LEDs clignotent à son rythme et les deux processus de gestion des LEDs fonctionnent simultanément.&lt;br /&gt;
&lt;br /&gt;
Le programme détaillé de  notre ordonnanceur est disponible sur [https://archives.plil.fr/lwijsman/PICO_lwijsman_apalifer git].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Référence écran : sparkfun ADM1602k-NSW-FBS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schematic : ====&lt;br /&gt;
[[Fichier:Schematic carte ecran.png|vignette|Carte écran schematic]]&lt;br /&gt;
La première étape de notre projet consistait à la réalisation du schematic sous KiCad de notre carte écran. Afin de réaliser le schéma du routage et pour que l'écran soit correctement connecté nous nous sommes référés à la documentation de l'écran afin de relier chacune des broches du connecteur aux labels correspondants. Vous trouverez ci-contre le schematic et les composants de la carte.&lt;br /&gt;
&lt;br /&gt;
Plus spécifiquement, cette carte possède :&lt;br /&gt;
&lt;br /&gt;
* un microcontroleur atmega328p&lt;br /&gt;
* un connecteur HE10 permettant de la relier à la carte mère&lt;br /&gt;
* un AVR ISP permettant la programmation de la carte&lt;br /&gt;
* des LEDs&lt;br /&gt;
* un connecteur 1x16 broches permettant la connexion avec l'écran&lt;br /&gt;
&lt;br /&gt;
Une fois le schematic réalisé et après vérification, nous avons pu commencer à effectuer le routage de notre carte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Routage : ====&lt;br /&gt;
&lt;br /&gt;
Pour le routage, nous avons également utilisé le logiciel KiCad. Vous trouverez ci-contre l'image correspondante à ce dernier.&lt;br /&gt;
[[Fichier:Routage PCB écran.png|vignette|Carté écran routage]]&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=1437</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=1437"/>
		<updated>2023-09-12T13:25:43Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ordonanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;br /&gt;
Référence écran : NHD-C12832A1Z-FSW-FBW-3V3-ND&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=1428</id>
		<title>SE4Binome2023-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-7&amp;diff=1428"/>
		<updated>2023-09-12T13:01:55Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : Page créée avec « = Ordonanceur =    = Carte FPGA / VHDL =  = Carte électronique numerique =  == Carte fille écran LCD == »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ordonanceur = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Carte FPGA / VHDL =&lt;br /&gt;
&lt;br /&gt;
= Carte électronique numerique =&lt;br /&gt;
&lt;br /&gt;
== Carte fille écran LCD ==&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Pico_SE4_2023/2024&amp;diff=1422</id>
		<title>Pico SE4 2023/2024</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Pico_SE4_2023/2024&amp;diff=1422"/>
		<updated>2023-09-12T12:43:18Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Réalisations des élèves */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Objectif =&lt;br /&gt;
&lt;br /&gt;
Pour l'année académique 2023/2024 nous vous demandons de construire un pico-ordinateur comprenant les éléments suivants :&lt;br /&gt;
* un processeur de type microcontrôleur ;&lt;br /&gt;
* un clavier ;&lt;br /&gt;
* un dispositif d'affichage ;&lt;br /&gt;
* un système d'exploitation stocké dans la mémoire flash du microcontrôleur ;&lt;br /&gt;
* une mémoire de masse allant au delà de la mémoire flash sus-citée ;&lt;br /&gt;
* un dispositif de communication avec l'extérieur.&lt;br /&gt;
&lt;br /&gt;
Pour faire en sorte que tous les éléments puissent communiquer entre eux nous vous demandons d'utiliser un bus série.&lt;br /&gt;
&lt;br /&gt;
= Compétences évaluées =&lt;br /&gt;
&lt;br /&gt;
Les compétences suivantes doivent être acquises durant ce module.&lt;br /&gt;
* Savoir comprendre, ou à défaut être actif en séances pour poser les questions pertinentes aux encadrants.&lt;br /&gt;
* Savoir produire un travail régulier et documenté durant la totalité de la période.&lt;br /&gt;
* Savoir concevoir et réaliser des cartes électroniques fonctionnelles.&lt;br /&gt;
* Savoir concevoir et programmer un circuit FPGA en VHDL.&lt;br /&gt;
* Savoir structurer et écrire des pilotes pour cartes électroniques.&lt;br /&gt;
* Savoir concevoir et implanter des primitives systèmes et un micro-système d'exploitation.&lt;br /&gt;
&lt;br /&gt;
= Organisation du travail =&lt;br /&gt;
&lt;br /&gt;
Vous aurez, comme d'habitude, la lourde tâche de tester ce module de travaux pratiques.&lt;br /&gt;
&lt;br /&gt;
Ce sera d'autant moins facile que nous vous demandons de vous coordonner pour réaliser le pico-ordinateur : un seul exemplaire fonctionnel est attendu par groupes de 4 binômes.&lt;br /&gt;
&lt;br /&gt;
Vous allez donc devoir vous organiser pour que chaque binôme réalise une partie de l'ensemble. Cela dit des tâches identiques sont à réaliser par tous les binômes, ces tâches vous permettront de vous exercer mais aussi de tester vos réalisations spécifiques.&lt;br /&gt;
&lt;br /&gt;
== Matériel fourni ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[file:2023_Bouclier_Pico.pdf||thumb|right|400px]]&lt;br /&gt;
&lt;br /&gt;
Pour que chaque binôme puisse avoir un minimum d'autonomie, un matériel de base est fourni :&lt;br /&gt;
* un Arduino Uno pour prototyper le coeur d'une carte mère ;&lt;br /&gt;
* un bouclier Arduino pour disposer d'une mémoire de masse (carte SD) et de connecteurs vers les cartes filles, voir le schéma et le PCB ci-contre ;&lt;br /&gt;
* d'une matrice de LED et d'un afficheur 7-segments tous les deux gérables par SPI pour pouvoir écrire les briques de votre système d'exploitation.&lt;br /&gt;
&lt;br /&gt;
Le projet KiCAD pour le bouclier Arduino est disponible : [[Média:2023_Bouclier_Pico.zip]]&lt;br /&gt;
&lt;br /&gt;
Les projets KiCAD pour connecter les périphériques via un connecteur sont disponibles : [[Média:2023_HE10-periph.zip]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[file:2023_Bouclier_Pico_PCB.png||thumb|center|300px]]&lt;br /&gt;
&lt;br /&gt;
Vision de la carte partiellement montée. L'accès à la carte SD est fonctionnel.&lt;br /&gt;
&lt;br /&gt;
[[file:2023_Bouclier_Pico_Test.jpg||thumb|center|300px]]&lt;br /&gt;
&lt;br /&gt;
Pour la partie programmation concernant la carte SD vous pouvez vous appuyer sur le projet ci-contre utilisant &amp;lt;code&amp;gt;avr-gcc&amp;lt;/code&amp;gt; comme compilateur : [[Fichier:TestSD_avrgcc.zip]].&lt;br /&gt;
&lt;br /&gt;
== Réalisations par binôme ==&lt;br /&gt;
&lt;br /&gt;
Chaque binôme réalise :&lt;br /&gt;
* un système d'exploitation basé sur un ordonnanceur ;&lt;br /&gt;
* une carte fille FPGA programmée par VHDL, le binôme écrit aussi le code pour que la carte puisse être gérée par le système d'exploitation ;&lt;br /&gt;
* une carte mère ou une carte fille à base de microcontrôleur, le binôme écrit aussi le code pour que la carte puisse être gérée par le système d'exploitation, le binôme peut réaliser plusieurs cartes pour maximiser sa note.&lt;br /&gt;
&lt;br /&gt;
== Réalisation par groupe de binômes ==&lt;br /&gt;
&lt;br /&gt;
Par groupe de 4 binômes vous devez réaliser un pico-ordinateur complet :&lt;br /&gt;
* une carte mère ;&lt;br /&gt;
* une carte fille FPGA/VHDL fonctionnelle et supportée par votre carte mère ;&lt;br /&gt;
* au moins 3 cartes filles fonctionnelles et supportées par votre carte mère (clavier, écran, réseau) ;&lt;br /&gt;
* vous pouvez ajouter une cinquième carte fille optionnelle de type carte son.&lt;br /&gt;
&lt;br /&gt;
= Cahier des charges =&lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
Vous n'avez pas besoin d'avoir conçu et réalisé des cartes électroniques pour commencer à écrire le système d'exploitation du pico-ordinateur et en particulier l'ordonnanceur sous-jacent.&lt;br /&gt;
&lt;br /&gt;
Le principe est d'utiliser un minuteur du microcontrôleur pour lancer périodiquement une fonction d'interruption que vous allez transformer en ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
Dans un premier temps vous testerez votre ordonnanceur en créant deux tâches statiques pour faire clignoter, avec des périodes différentes, deux LED du bouclier fourni.&lt;br /&gt;
&lt;br /&gt;
Par la suite vous allez complexifier votre ordonnanceur en ajoutant :&lt;br /&gt;
* une tâche de lecture de caractère par le port série (stocké en mémoire partagé) ;&lt;br /&gt;
* une tâche d'écriture sur le port série (du caractère lu sur le port série) ;&lt;br /&gt;
* une tâche d'écriture sur la matrice (du caractère lu sur le port série) ;&lt;br /&gt;
* une tâche d'écriture sur l'afficheur 7 segments (du caractère lu sur le port série).&lt;br /&gt;
&lt;br /&gt;
Les deux dernières tâches sont plus compliquées à réaliser dans la mesure où elles utilisent une ressource commune.&lt;br /&gt;
&lt;br /&gt;
== Cartes filles FPGA ==&lt;br /&gt;
&lt;br /&gt;
Les cartes filles FPGA doivent être programmées en VHDL. Tous les binômes doivent implanter en VHDL :&lt;br /&gt;
* un contrôleur de bus série SPI ;&lt;br /&gt;
* un décodeur des commandes reçues par SPI (commandes sur un octet avec éventuellement des paramètres à suivre) ;&lt;br /&gt;
* un contrôleur d'écran VGA affichant le contenu graphique de la RAM de la carte FPGA.&lt;br /&gt;
&lt;br /&gt;
A minima il faut une commande pour insérer un pixel d'une couleur donnée dans la RAM d'affichage.&lt;br /&gt;
&lt;br /&gt;
Vous pouvez aussi ajouter des fonctionnalités supplémentaires à votre carte FPGA :&lt;br /&gt;
* mémoire de masse par accès direct à une carte mémoire SD ;&lt;br /&gt;
* carte réseau Ethernet en utilisant un module PHY Ethernet.&lt;br /&gt;
&lt;br /&gt;
Pour les fonctionnalités supplémentaires vous devez prévoir des commandes supplémentaire au niveau du décodeur.&lt;br /&gt;
&lt;br /&gt;
== Cartes électroniques ==&lt;br /&gt;
&lt;br /&gt;
Vous devez réaliser deux type de cartes électroniques à base de microcontrôleur : une carte mère et des cartes filles.&lt;br /&gt;
La carte FPGA/VHDL décrite dans la section précédente est considérée comme une carte fille.&lt;br /&gt;
&lt;br /&gt;
Les cartes filles sont connectées via un bus série à la carte mère. C'est aussi la carte mère qui alimente les cartes filles.&lt;br /&gt;
Enfin la carte mère dispose d'une mémoire permanente pour stocker des fichiers.&lt;br /&gt;
&lt;br /&gt;
Les cartes filles peuvent être de différents types :&lt;br /&gt;
* carte fille clavier ;&lt;br /&gt;
* carte fille d'affichage ;&lt;br /&gt;
* carte fille série (se comporte comme un clavier et comme un dispositif d'affichage) ;&lt;br /&gt;
* carte fille réseau ;&lt;br /&gt;
* carte fille mémoire de masse (alternative à la mémoire de masse de la carte mère) ;&lt;br /&gt;
* carte fille son.&lt;br /&gt;
&lt;br /&gt;
Pour un type donné vous avez le choix entre plusieurs technologies pour réaliser votre carte. Par exemple une carte fille clavier peut être implantée par une matrice de touches ou en utilisant un clavier USB.&lt;br /&gt;
&lt;br /&gt;
== Programmation système ==&lt;br /&gt;
&lt;br /&gt;
Le système d'exploitation du pico-ordinateur doit avoir les fonctionnalités d'un DOS (Disk Operating System), à savoir :&lt;br /&gt;
* lecture des commandes tapées par l'utilisateur ;&lt;br /&gt;
* téléchargement d'exécutables ou de sources via le dispositif de communication extérieur  ;&lt;br /&gt;
* sauvegarde et chargement d'exécutables ou de sources via la mémoire de masse ;&lt;br /&gt;
* permettre l'affichage de chaînes de caractères ;&lt;br /&gt;
* comprend un interpréteur micro-python pour faire tourner les sources ;&lt;br /&gt;
* les différentes fonctionnalités sont réalisées sous forme de tâches gérées par un ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
=== Commandes de base ===&lt;br /&gt;
&lt;br /&gt;
Ces commandes sont les commandes les plus simples à implanter :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Commande !! Description&lt;br /&gt;
|-&lt;br /&gt;
| VERSION || Affiche la version du système d'exploitation&lt;br /&gt;
|-&lt;br /&gt;
| DEVICES || Affiche la liste des cartes filles connectées&lt;br /&gt;
|-&lt;br /&gt;
| ECHO || Affiche les arguments de la commande&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Commandes liées aux processus ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Commande !! Description&lt;br /&gt;
|-&lt;br /&gt;
| PS || Liste les processus disponibles et leur état&lt;br /&gt;
|-&lt;br /&gt;
| SLEEP || Met un processus en sommeil&lt;br /&gt;
|-&lt;br /&gt;
| WAKE || Relance un processus dormant&lt;br /&gt;
|-&lt;br /&gt;
| EXEC || Création d'un processus à partir d'un fichier exécutable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
La commande EXEC est complexe à réaliser, elle est optionnelle pour l'année 2023/2024.&lt;br /&gt;
&lt;br /&gt;
=== Commandes liées au système de fichiers ===&lt;br /&gt;
&lt;br /&gt;
Commandes pour gérer le système de fichiers :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Commande !! Description&lt;br /&gt;
|-&lt;br /&gt;
| FORMAT || Formate le système de fichiers&lt;br /&gt;
|-&lt;br /&gt;
| LIST || Affiche les fichiers du répertoire principal&lt;br /&gt;
|-&lt;br /&gt;
| CREATE || Création d'un fichier avec l'entrée standard&lt;br /&gt;
|-&lt;br /&gt;
| TYPE || Affiche le contenu d'un fichier&lt;br /&gt;
|-&lt;br /&gt;
| COPY || Copie un fichier&lt;br /&gt;
|-&lt;br /&gt;
| RENAME || Renomme un fichier&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Commandes liées au réseau ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Commande !! Description&lt;br /&gt;
|-&lt;br /&gt;
| REMOTE || Liste les fichiers disponibles sur le réseau&lt;br /&gt;
|-&lt;br /&gt;
| GET || Télécharge un fichier en provenance du réseau&lt;br /&gt;
|-&lt;br /&gt;
| PUT || Sauve un fichier sur le réseau&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Programmation des pilotes ==&lt;br /&gt;
&lt;br /&gt;
La programmation c'est aussi l'écriture des sous-systèmes ou des pilotes liés à chaque cartes :&lt;br /&gt;
* pour la carte mère, il faut écrire un sous-système de gestion de fichiers ;&lt;br /&gt;
* pour la carte fille comportant une matrice de touches, il faut écrire le pilote identifiant les touches actionnées et gérant l'envoi de ces touches à la carte mère ;&lt;br /&gt;
* pour la carte fille gérant un clavier USB, il faut utiliser un projet LUFA pour scanner régulièrement le clavier USB et envoyer d'éventuels événements à la carte mère ;&lt;br /&gt;
*  pour la carte fille gérant un écran LCD, il faut écrire le pilote capable de gérer l'écran et la partie récupérant les données de la carte mère ;&lt;br /&gt;
* pour la carte fille gérant une clé USB, il faut utiliser un projet LUFA pour l'accès à la clé et écrire un sous-système de gestion de fichiers ;&lt;br /&gt;
* la carte fille gérant une connexion série ne nécessite qu'un modeste pilote de communication avec la carte mère ;&lt;br /&gt;
* pour la carte fille permettant une connexion avec le monde extérieur via de simples points d'accès USB de volume (EP Bulk), il faut écrire le pilote pour communication avec la carte mère mais aussi le programme sur le PC permettant la réception ou l'envoi de fichiers ;&lt;br /&gt;
* pour la carte fille permettant une connexion Ethernet au dessus d'USB (RNDIS), il faut écrire une micro-pile réseau capable de récupérer et d'envoyer des fichiers au travers de paquets Ethernet mais aussi le programme sur le PC cible capable de comprendre ces paquets Ethernet ;&lt;br /&gt;
* pour la carte fille incluant une puce Ethernet, il faut implanter la micro-pile réseau et le programme évoquée ci-dessus mais aussi le pilote capable de gérer la puce Ethernet ;&lt;br /&gt;
* pour la carte fille son, il faut écrire la partie permettant de récupérer les échantillons, les copier en mémoire, et les jouer à la vitesse d'échantillonnage préalablement transmise.&lt;br /&gt;
&lt;br /&gt;
= Spécifications techniques =&lt;br /&gt;
&lt;br /&gt;
== Ordonnanceur ==&lt;br /&gt;
&lt;br /&gt;
Pour réaliser votre ordonnanceur commencez par programmer le minuteur 1 de l'ATMega328p de sorte à ce qu'il génère une interruption toutes&lt;br /&gt;
les 20ms. L'interruption va déclencher une fonction de gestion d'interruption (ISR pour Interrupt Service Routine). Vous utiliserez une ISR nue pour éviter les interférences du compilateur sur la pile d'exécution :&lt;br /&gt;
 ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
 {&lt;br /&gt;
 /* Sauvegarde du contexte de la tâche interrompue */&lt;br /&gt;
 ...&lt;br /&gt;
 /* Appel à l'ordonnanceur */&lt;br /&gt;
 scheduler();&lt;br /&gt;
 /* Récupération du contexte de la tâche ré-activée */&lt;br /&gt;
 ...&lt;br /&gt;
 asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
Vous constatez qu'il vous reste à écrire, dans l'ISR, le code pour sauvegarder et récupérer le contexte d'exécution d'une tâche. Pour cela réfléchissez aux éléments d'un microcontrôleur qui sont nécessaires pour l'exécution d'un programme puis réfléchissez à une méthode pour sauver l'état de ces éléments. &lt;br /&gt;
&lt;br /&gt;
Au moins dans un premier temps, les tâches seront définies de façon statique. Toutes les tâches doivent être définies dans un tableau global, seront lancées dès le démarrage du microcontrôleur et ne se termineront que lorsque le microcontrôleur sera arrêté ou relancé. Une tâche est à définir par une structure dont un des champs doit être la fonction réalisant la tâche. A vous de définir les autres champs.&lt;br /&gt;
&lt;br /&gt;
Avant de démarrer l'ordonnanceur, il faut prendre soin à ce que la récupération du contexte dans l'ISR fonctionne alors que les tâches n'auront pas encore été lancées. Il faut donc une fonction permettant d'initialiser le contexte pour chaque tâche.&lt;br /&gt;
&lt;br /&gt;
== Cartes électroniques à microcontrôleur ==&lt;br /&gt;
&lt;br /&gt;
Le bus série préconisé pour la communication entre la carte mère et les cartes filles est un bus SPI. Au niveau physique, les connexions entre cartes mères et cartes filles doivent être réalisées via des connecteurs HE-10 à 8 broches :&lt;br /&gt;
* 2 broches pour l'alimentation ;&lt;br /&gt;
* 3 broches pour les signaux SPI (MISO, MOSI, SCK) ;&lt;br /&gt;
* 1 broche pour le CS (Chip Select) ;-&lt;br /&gt;
* 1 broche pour une éventuelle ligne d'interruption ;&lt;br /&gt;
* 1 broche pour une eventuelle réinitialisation de la carte (Reset).&lt;br /&gt;
&lt;br /&gt;
Il est conseillé d'organiser les broches sur les connecteurs HE-10 sur le modèle du bouclier Arduino fourni.&lt;br /&gt;
&lt;br /&gt;
La carte mère est constituée autour d'un ATMega328p et d'une puce mémoire de type AT45DB641E de 8 Mo. Il faut réflechir à l'alimentation sachant que :&lt;br /&gt;
* l'alimentation de la carte mère doit être suffisante pour alimenter les cartes filles ;&lt;br /&gt;
* l'alimentation du microcontrôleur doit être compatible avec l'alimentation de la puce mémoire sauf à prévoir une conversion de niveaux logiques entre les deux puces ;&lt;br /&gt;
* les cartes filles d'un même pico-ordinateur doivent être alimentées avec la même tension.&lt;br /&gt;
&lt;br /&gt;
Voici quelques exemples d'architectures de cartes filles :&lt;br /&gt;
* une carte fille SPI avec un ATMega328p et une matrice de touches ;&lt;br /&gt;
* une carte fille SPI avec un AT90USB647 pour connexion à un clavier USB ou une clef USB ;&lt;br /&gt;
* une carte fille SPI avec un ATMega328p et un écran LCD 2 lignes HD44780 ;&lt;br /&gt;
* une carte fille SPI avec un ATMega16u2 pour une connexion série USB ;&lt;br /&gt;
* une carte fille SPI avec un ATMega328p et un DAC R-2R comme carte son ;&lt;br /&gt;
* une carte fille SPI avec un ATMega16u2 (ou supérieur) pour une connexion réseau (périphérique USB générique EP bulk ou périphérique USB RNDIS) ;&lt;br /&gt;
* une carte fille SPI avec un ATMega328p et un ENC28J60 pour une connexion Ethernet 10Mb/s.&lt;br /&gt;
&lt;br /&gt;
Toutes les cartes doivent permettre un accès au port série de leur microcontrôleur pour un déverminage via un FTDI. Vous devez aussi ajouter des points de test pour les lignes importantes : lignes du bus SPI, horloge, alimentations, etc.&lt;br /&gt;
&lt;br /&gt;
Toutes les cartes filles répondent à la commande SPI constituée de l'octet de commande 0x00 et de l'octet de donnée 0x00. Le résultat se lit sur le second octet de réponse et détermine le type de la carte fille. Le chiffre de poid fort de la réponse est un code magique : 0xa. Le chiffre de poid faible est donné par le tableau ci-dessous :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Chiffre !! Type de carte&lt;br /&gt;
|-&lt;br /&gt;
| 0x1 || Clavier&lt;br /&gt;
|-&lt;br /&gt;
| 0x2 || Affichage&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || Réseau&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || Carte son&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Il est bon aussi de prévoir que les cartes filles puissent répondre à une commande SPI permettant de savoir si elles sont occupées ou non. L'octet de commande serait 0xFF et l'octet de donnée 0xFF. En cas de succès les deux octets de réponse sont à 0x55. Les cartes filles doivent prendre soin d'initialiser leur réponse SPI à autre chose que 0x55 lorsqu'elles se lancent dans un traitement autre qu'une écoute SPI.&lt;br /&gt;
&lt;br /&gt;
== Electronique et programmation système ==&lt;br /&gt;
 &lt;br /&gt;
=== Carte mère ===&lt;br /&gt;
&lt;br /&gt;
La carte mère doit comporter un microcontrôleur ATMega328p, une puce mémoire AT45DB641E et 5 connecteurs HE10 pour connecter une carte fille FPGA et 4 cartes filles à microcontrôleur.&lt;br /&gt;
&lt;br /&gt;
Vous avez aussi quelques points à approfondir.&lt;br /&gt;
# La source d'alimentation de votre pico-ordinateur, le plus simple semble être un connecteur USB pour utiliser soit un PC soit une batterie comme source ;&lt;br /&gt;
# La tension d'alimentation du microcontrôleur et des cartes filles :&lt;br /&gt;
#* soit vous optez pour du 5V auquel cas il faut prévoir un régulateur de tension pour la puce mémoire et une adaptation des niveaux logiques pour cette même puce (voir le schéma des boucliers Arduino),&lt;br /&gt;
#* soit vous partez sur du 3.3V et vos cartes filles doivent tourner en 3.3V, vu que vous aurez probablement un adaptateur 5V il faut quand même prévoir un régulateur 3.3V assez costaud sur la carte mère, de plus vous ne pouvez pas dépasser 8Mhz comme horloge ;&lt;br /&gt;
# La méthode de programmation de la carte mère :&lt;br /&gt;
#* soit vous programmez le microcontrôleur via un connecteur AVR ISP, un programmateur et l'utilitaire &amp;lt;code&amp;gt;avrdude&amp;lt;/code&amp;gt; ;&lt;br /&gt;
#* soit vous ajoutez une puce pour réaliser un pont USB vers série vous pourrez alors programmer le microcontrôleur avec &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt;, attention il faut tout de même prévoir des connecteurs AVR ISP pour charger l'amorceur sur l'ATMega328p et l'éventuel ATMega8u2 (vous utilisez cette puce pour l'USB/série plutôt qu'une puce FTDI).&lt;br /&gt;
&lt;br /&gt;
Du coté programmation vous êtes chargés d'écrire les fonctions d'accès à la mémoire, des primitives systèmes implantant un micro-système de fichiers et des primitives de communication via le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Les fonctions de base d'accès à la mémoire sont facilement trouvables, par exemple sur les sites du bureau d'études systèmes embarqués des PeiP.&lt;br /&gt;
&lt;br /&gt;
Concernant le micro-système de fichiers, les fonctionnalités suivantes doivent être implantées :&lt;br /&gt;
&lt;br /&gt;
* le système de fichiers doit résider dans la mémoire de 8 Mo, les accès à la mémoire se font par blocs de 256 octets ;&lt;br /&gt;
* l'accès au système de fichiers se fait par des primitives système ;&lt;br /&gt;
* le micro-système de fichiers ne comporte qu'un répertoire : le répertoire principal, ce dernier peut comporter au maximum 64 fichiers, un fichier est caractérisé par un nom de 16 caractères au maximum, sa taille et ses blocs de données, un fichier est décrit par un maximum de 16 blocs de données ;&lt;br /&gt;
* le superbloc du système de fichiers comprend, en plus de la description du répertoire racine, une carte bit à bit des blocs de données libres, cette carte nécessite 16 blocs ;&lt;br /&gt;
* les différentes primitives à implanter sont :&lt;br /&gt;
** &amp;lt;code&amp;gt;append&amp;lt;/code&amp;gt; pour créer un fichier si non existant et ajouter des données en fin de fichier, les paramètres sont le nom du fichier, les données à ajouter et la taille des données,&lt;br /&gt;
** &amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt; pour lire des données dans un fichier, les paramètres sont le nom du fichier, le tableau dans lequel stocker les données, la taille du tableau et le déplacement par rapport au début du fichier,&lt;br /&gt;
** &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt; pour détruire un fichier, le seul paramètre est le nom du fichier,&lt;br /&gt;
** &amp;lt;code&amp;gt;rename&amp;lt;/code&amp;gt; pour renommer un fichier, les paramètres sont l'ancien et le nouveau noms du fichier,&lt;br /&gt;
** &amp;lt;code&amp;gt;copy&amp;lt;/code&amp;gt; pour copier un fichier, les paramètres sont le nom du fichier original et le nom de la copie.&lt;br /&gt;
&lt;br /&gt;
Les primitives pour le bus SPI doivent être :&lt;br /&gt;
* une fonction d'initialisation avec le mode SPI désiré et la vitesse d'horloge souhaitée ;&lt;br /&gt;
* une primitive pour envoyer quelques octets via le bus SPI :&lt;br /&gt;
** les paramètres de la primitive sont le tableau des octets à envoyer, le tableau des octets à recevoir, le nombre d'octets à envoyer et la spécification de la sortie CS de sélection du périphérique SPI,&lt;br /&gt;
** la primitive stocke l'opération dans une file et effectue l'envoi dès que le bus est libre,&lt;br /&gt;
** si la file est pleine la primitive peut retourner un code d'erreur sinon la primitive retourne l'identifiant unique de l'opération,&lt;br /&gt;
** les octets de réponse du périphérique sont stockés dans le tableau des octets à recevoir, si le pointeur est nul les réponses ne sont pas stockées ;&lt;br /&gt;
* une primitive pour attendre la fin d'un envoi SPI, il faut donner en unique paramètre l'identifiant de l'opération, l'attente s'effectue en mettant le processus appelant en mode sommeil et en le réveillant dès que l'opération est effectuée.&lt;br /&gt;
&lt;br /&gt;
Précisons que les tableaux stockés dans la file d'attente (requête et réponse SPI) le sont sous la forme de pointeurs. Ces pointeurs peuvent être librérés une fois l'opération effectuée.&lt;br /&gt;
&lt;br /&gt;
=== Carte fille clavier &amp;quot;matrice de touches&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
La réalisation de la carte est simple, il s'agit de scanner une matrice de touches à l'aide d'un ATMega328p. N'oubliez pas le connecteur HE10 pour la connexion de cette carte fille à une carte mère. Sur le connecteur HE10 il faut prévoir à la fois la ligne de sélection SPI (utilisez la broche SS par défaut sur votre carte) et une ligne pour générer une interruption sur la carte mère. Vous devez faire avec l'alimentation fournie par la carte mère. Regardez aussi la problèmatique sur la programmation décrite dans la section sur la carte mère.&lt;br /&gt;
&lt;br /&gt;
Du coté programmation, c'est plus compliqué, vous êtes déjà chargés d'écrire la fonction de scan des touches :&lt;br /&gt;
* le scan des touches consiste juste à passer les lignes de la matrice en sorties, les colonnes en entrées avec résistance de charge et de rentrer dans une boucle pour passer une sortie à GND tandis que les autres restent à VCC, il suffit alors de consulter les entrées pour voir si une touche est appuyée (ou plusieurs) ;&lt;br /&gt;
* si une touche est appuyée la touche est stockée dans un tampon et la ligne d'interruption est activée ;&lt;br /&gt;
* si une requête SPI de code commande 0x01 est reçue, le nombre de touches dans le tampon est envoyé suivi des touches elles-mêmes.&lt;br /&gt;
&lt;br /&gt;
Ensuite, au niveau de la carte mère vous devez écrire la primitive gérant les claviers. Cette primitive prend en paramètre la ligne de sélection SPI du clavier ciblé et un tampon pour stocker les codes des touches. La taille du tampon est aussi passée en paramètre. La primitive prépare une transmission SPI constituée du seul octet de valeur 0x01 en prenant soin de préciser un tableau pour stocker d'éventuelles touches. Attention, la transmission SPI est constituée de l'octet 0x01 mais aussi d'autant d'octets de valeurs indéterminées qu'il est attendu d'octets dans la réponse SPI. La primitive se met alors en attente de la réponse.&lt;br /&gt;
&lt;br /&gt;
Au niveau du système d'exploitation les comportements suivants sont à implanter :&lt;br /&gt;
* à l'initialisation de la carte mère les périphériques SPI doivent être contactés pour déterminer lequels sont des claviers, des commandes SPI 0x00 sont donc envoyées avec attente des réponses SPI ;&lt;br /&gt;
* le processus SHELL toujours présent dans le système d'exploitation doit avoir le comportement suivant :&lt;br /&gt;
** si une interruption est reçue qui correspond à un périphérique clavier, le SHELL doit utiliser la primitive de lecture clavier pour obtenir la ou les touches appuyées ;&lt;br /&gt;
** dans un premier temps, les caractères reçus sont affichés en utilisant la primitive d'affichage (echo) ;&lt;br /&gt;
** à terme les lignes de caractères reçues sont analysées pour en extraire des commandes et les exécuter.&lt;br /&gt;
&lt;br /&gt;
=== Carte fille clavier &amp;quot;USB&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Votre carte électronique doit tourner autour d'un AT90USB647 (ou supérieur). Ce microcontrôleur peut être programmé, en utilisant la bibliothèque LUFA, comme hôte USB. Il est donc possible de gérer, de cette façon un clavier USB et de faire interface avec la carte mère. Le schéma de la carte est très semblable à celui d'une carte comportant un ATMega16u2. Vous pouvez vous appuyer sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet keylogger]. Le plus simple est de programmer le microcontrôleur en utilisant l'utilitaire &amp;lt;code&amp;gt;dfu-programmer&amp;lt;/code&amp;gt;, pour cela il faut prévoir, en plus d'un connecteur USB A femelle pour le clavier, un connecteur USB mâle pour la programmation.&lt;br /&gt;
&lt;br /&gt;
La programmation pour la gestion du clavier USB doit se reposer sur la démonstration &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; de la bibliothèque LUFA. La conversion des modificateurs et des codes de touches en caractères ASCII sont à votre charge.&lt;br /&gt;
&lt;br /&gt;
Pour le reste de la programmation voir la section sur la carte fille &amp;quot;matrice de touches&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Carte fille écran LCD ===&lt;br /&gt;
&lt;br /&gt;
Cette carte comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. L'écran LCD nécessite un potentiomètre pour régler la luminosité   des cristaux liquides. N'oubliez pas le connecteur HE10 pour la connexion de cette carte fille à une carte mère. Sur le connecteur HE10 il faut prévoir une ligne de sélection SPI. Aucune ligne d'interruption n'est nécessaire pour cette carte. Enfin il vous faut prévoir un connecteur AVR ISP pour programmer le microcontrôleur.&lt;br /&gt;
&lt;br /&gt;
Le microcontrôleur de la carte fille doit être programmé pour gérer le contrôleur HD44780 ou compatible :&lt;br /&gt;
* les écrans avec 1, 2, 3 ou 4 lignes doivent être gérés ;&lt;br /&gt;
* les caractères ASCII doivent être affichés sur l'écran ;&lt;br /&gt;
* les caractères spéciaux &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;\r&amp;lt;/code&amp;gt; doivent être pris en compte pour le saut de ligne et le retour chariot ;&lt;br /&gt;
* les codes VT100 doivent être pris en compte, en particulier pour le déplacement du curseur doivent être pris en compte ;&lt;br /&gt;
* le contrôleur HD44780 ou compatible doit être configuré en mode défilement automatique.&lt;br /&gt;
&lt;br /&gt;
Les caractères à afficher ou spéciaux (y compris les séquences VT100) sont reçus par le bus SPI par la carte fille préfixés par le code commande 0x01. &lt;br /&gt;
&lt;br /&gt;
Au niveau de la carte mère vous devez écrire la primitive système. Cette primitive prend en paramètre la ligne de sélection SPI de l'écran ciblé et la chaîne des caractères à envoyer. La primitive prépare une transmission SPI constituée de l'octet de commande 0x01 et des octets correspondant aux caractères.&lt;br /&gt;
&lt;br /&gt;
Il ne faut pas demander un affichage si un autre affichage est en cours. C'est possible à réaliser avec la ligne prévue pour une interruption. La carte fille peut mettre cette ligne en état haut quand un affichage est en cours. Du coup la primitive peut se mettre en attente sur un état bas avant d'envoyer la requête SPI. C'est aussi possible de lancer des commandes 0xFF sur la carte jusqu'à obtenir les octets de réponse indiquant que la carte est libre.&lt;br /&gt;
&lt;br /&gt;
Cette primitive est utilisée par le système d'exploitation pour réaliser l'écho des commandes dans le SHELL et aussi par toutes les commandes qui nécessitent un affichage. Tous les écrans doivent être sollicités lors des affichages, il faut donc que le système d'exploitation scanne les périphériques SPI pour trouver les écrans comme il le fait pour les claviers.&lt;br /&gt;
&lt;br /&gt;
=== Carte fille réseau RNDIS ===&lt;br /&gt;
&lt;br /&gt;
Le but de cette carte est de permettre au pico-ordinateur de converser avec l'extérieur. Une carte RNDIS permet de faire transister des paquets Ethernet au dessus d'une liaison USB. La carte n'a besoin que d'un microcontrôleur avec capacités USB pour fonctionner. Vous pouvez utiliser un &lt;br /&gt;
ATMega16u2, un ATMega32u4 ou un AT90USB suivant la taille mémoire dont vous souhaitez disposer. Gardez en mémoire qu'un paquet Ethernet peut comporter jusqu'à 1500 octets. La programmation du microcontrôleur se fera par DFU USB. Il est notable que la programmation du microcontrôleur et la communication vers l'extérieur se fait par le même connecteur USB.&lt;br /&gt;
&lt;br /&gt;
La communication se fait forcément via le PC auquel la carte fille est connectée par USB. Cela dit si ce PC est connecté en réseau, les fichiers auxquels le pico-ordinateur accède peuvent se trouver sur un autre PC. Si votre carte fille est correctement programmée comme carte RNDIS USB, le PC sous Linux va automatiquement créer une interface réseau &amp;lt;code&amp;gt;usb0&amp;lt;/code&amp;gt;. A vous de la démarrer avec la commande &amp;lt;code&amp;gt;ip link set usb0 up&amp;lt;/code&amp;gt; ou une commande du type &amp;lt;code&amp;gt;ip address add @IP/masque dev usb0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
La base de la programmation de cette carte est la démonstration LUFA RNDIS. Des versions de cette démonstration incluent une implantation de pile TCP/IP. A vous de voir à quel niveau vous souhaitez que votre carte réseau opère :&lt;br /&gt;
* si vous visez Ethernet, votre projet LUFA sera assez simple à écrire mais l'application sur le PC sera un peu exotique, il vous faudra utiliser la programmation socket en mode RAW ;&lt;br /&gt;
* si vous visez UDP, votre projet LUFA sera plus complexe mais l'application sur le PC pourra se faire avec des sockets en mode non connecté standard ;&lt;br /&gt;
* si vous visez TCP, votre projet LUFA sera complexe et nécessitera un microcontrôleur avec pas mal de mémoire, par contre vous pourrez utiliser des applications standard sur le PC (serveur Web ou FTP).&lt;br /&gt;
&lt;br /&gt;
Au niveau de la carte, en plus de votre pile réseau vous devez écrire les fonctions permettant de lister des fichiers distants, de les recevoir et d'en envoyer :&lt;br /&gt;
* Si la commande SPI est 0x01, la carte mère vous demande de lister les fichiers distants, vous devez donc former les paquets réseau nécessaires pour envoyer la demande, la commande SPI peut comporter un argument supplémentaire pour préciser la localisation des fichiers. A la suite d'une commande 0x01, la carte mère doit envoyer des commandes 0x11 pour récupérer tous les noms de fichiers, idéalement un nom par commande 0x11 pour ne pas déborder la mémoire du microcontrôleur. Si le fichier n'est pas le dernier la réponse SPI est 0x01 sinon 0x00.  Si vous utilisez Ethernet ou UDP, il faut prévoir un délai maximal pour la réception des paquets de sorte à ne pas bloquer la commande. En cas de non réception de paquet, il faut retourner un code SPI d'erreur, par exemple 0x02.&lt;br /&gt;
&lt;br /&gt;
* Si la commande SPI est 0x02, la carte mère souhaite récupérer un fichier. Vous devez former les paquets réseau nécessaires pour demander le fichier précisé dans la suite de la commande SPI. De la même façon que pour la liste, des commandes SPI ultérieures 0x12 doivent être envoyées pour récupérer le contenu du fichier, la carte mère précise dans la commande la taille de données qu'elle est prête à accepter par requête. Même principe pour les réponses SPI que pour les commandes 0x11. Si vous utilisez Ethernet ou UDP, il faut mettre en place le même dispositif de surveillance de perte de paquets que pour la liste.&lt;br /&gt;
&lt;br /&gt;
* Si la commande SPI est 0x03, la carte mère souhaite envoyer un fichier. Vous devez former les paquets réseau nécessaires pour préparer la réception du fichier précisé dans la suite de la commande SPI. De la même façon que pour la liste, des commandes SPI ultérieures 0x13 doivent être envoyées pour passer les fragements de fichier. Si vous utilisez Ethernet ou UDP, les paquets envoyés pour transmettre les fragments comportent un numéro de séquence. La carte mère termine par un fragment vide pour indiquer que le fichier est totalement transféré. Dans ce dernier cas un paquet particulier doit être envoyé pour indiquer la fin du fichier. Une réponse est requise pour ce paquet, cette réponse peut être un succès (tous les fragments ont été reçus) ou échec. Il convient de répercuter cette réponse en tant que réponse SPI : 0x00 pour succès ou 0x02 en cas d'erreur que ce soit une erreur remontée ou une absence de paquet réponse.&lt;br /&gt;
&lt;br /&gt;
Au niveau de la carte mère vous devez écrire les primitives système permettant de préparer et de réaliser les listes, récupération et envois de fichiers. Ces primitives sont de simples encapsulation des commandes SPI décrites ci-dessus avec attente des réponses SPI pour les commandes de chiffre de poid fort 0x1. Il faut cependant s'assurer, avant chaque requête SPI, que la carte RNDIS est libre en utilisant la commande 0xFF.&lt;br /&gt;
&lt;br /&gt;
Ces primitives sont utilisées par le système d'exploitation pour réaliser les commandes de sauvegarde et de chargement de fichiers. Il est supposé qu'il n'existe qu'une carte réseau par pico-ordinateur avec une ligne de sélection de périphérique SPI fixe.&lt;br /&gt;
&lt;br /&gt;
=== Carte fille réseau &amp;quot;points d'accès de volume&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
Cette carte est identique, au niveau électronique, à la carte réseau RNDIS. La seule différence réside dans la façon de faire transiter les paquets réseau de la carte vers le PC auquel elle est connectée en USB. Pour cette carte, il vous est proposé de faire ce transfert en utilisant deux points d'accès USB de type volume (bulk), un entrant et un sortant. Cette fois vous n'aurez pas l'aide du noyau Linux pour la création de l'interface réseau. Vous allez devoir écrire votre propre programme PC pour faire le pont entre la carte et une interface réseau virtuelle.&lt;br /&gt;
&lt;br /&gt;
Sous Linux la création d'une interface virtuelle est possible avec la fonction ci-dessous.&lt;br /&gt;
&lt;br /&gt;
 int allocateNetworkDevice(char *name,int flags){&lt;br /&gt;
 struct ifreq ifr;&lt;br /&gt;
 int fd,err;&lt;br /&gt;
 char *clonedev = &amp;quot;/dev/net/tun&amp;quot;;&lt;br /&gt;
 /* Open the clone device */&lt;br /&gt;
 if((fd=open(clonedev,O_RDWR))&amp;lt;0) return fd;&lt;br /&gt;
 /* Preparation of the struct ifr, of type &amp;quot;struct ifreq&amp;quot; */&lt;br /&gt;
 memset(&amp;amp;ifr,0,sizeof(ifr));&lt;br /&gt;
 ifr.ifr_flags=flags;   /* IFF_TUN or IFF_TAP, plus maybe IFF_NO_PI */&lt;br /&gt;
 if(name!=NULL) strncpy(ifr.ifr_name,name,IFNAMSIZ);&lt;br /&gt;
 /* Try to create the device */&lt;br /&gt;
 if((err=ioctl(fd,TUNSETIFF,(void *)&amp;amp;ifr))&amp;lt;0){ close(fd); return err; }&lt;br /&gt;
 /* Write back the name of the * interface to the variable &amp;quot;name&amp;quot; */&lt;br /&gt;
 if(name!=NULL) strcpy(name,ifr.ifr_name);&lt;br /&gt;
 return fd;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Le descripteur de fichier retourné est utilisable avec &amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt; pour récupérer les paquets Ethernet entrants et avec &amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt; pour envoyer des paquets sur l'interface. Pour transmettre les paquets à la carte ou lire ceux provenant de la carte vous pouvez utiliser la bibliothèque &amp;lt;code&amp;gt;libusb-1.0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour le reste de la programmation liée à cette carte vous reporter à ce qui est demandé pour la carte réseau RNDIS.&lt;br /&gt;
&lt;br /&gt;
=== Carte fille réseau Ethernet ===&lt;br /&gt;
&lt;br /&gt;
Cette version de la carte réseau se connecte à un commutateur Ethernet et non pas à un PC pour communiquer avec le monde extérieur.&lt;br /&gt;
&lt;br /&gt;
Au niveau électronique une puce Ethernet ENC28J60 (ou supérieur) est supervisée par un microcontrôleur ATMega328p. Toutes les précisions concernant les cartes à base d'ATMega328p s'appliquent (voir par exemple la carte fille clavier &amp;quot;matrice de touches). Vous trouverez la documentation de la puce Ethernet à l'adresse http://ww1.microchip.com/downloads/en/devicedoc/39662c.pdf. Un exemple de programmtion de la puce ENC624J600 est disponible à l'adresse https://github.com/2xs/smews/tree/develop/targets/Arduino_ethernet/drivers. Vous pouvez vous en inspirer pour la programmation de la puce ENC28J60.&lt;br /&gt;
&lt;br /&gt;
La programmation spécifique à cette carte concerne l'envoi des paquets à la puce ENC28J60 et la récupération des paquets en provenance de la puce ENC28J60. Comme pour la liaison RNDIS, trois options s'ouvrent à vous pour l'implémentation de votre pile réseau :&lt;br /&gt;
&lt;br /&gt;
*programmation Ethernet, votre projet sera assez simple à écrire mais l'application sur le PC sera un peu exotique, il vous faudra utiliser la programmation socket en mode RAW ;&lt;br /&gt;
* programmation UDP, votre projet sera plus complexe mais l'application sur le PC pourra se faire avec des sockets en mode non connecté standard ;&lt;br /&gt;
* programmation TCP, votre projet sera plus complexe;  par contre vous pourrez utiliser des applications standard sur le PC (serveur Web ou FTP).&lt;br /&gt;
&lt;br /&gt;
Le reste de la programmation (communication avec la carte mère et ajouts dans le système d'exploitation) est identique à ce qui est décrit pour la carte réseau RNDIS.&lt;br /&gt;
&lt;br /&gt;
=== Carte fille son ===&lt;br /&gt;
 &lt;br /&gt;
D'un point de vue électronique la carte n'est pas très compliquée, elle comporte un ATMega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R utilisant un réseau de résistance pour implanter la conversion. Utilisez au moins un DAC sur 8 bits, vous devez pouvoir pousser jusqu'à 12 bits en utilisant pratiquement toutes les sorties disponibles. En sortie du DAC utilisez un montage Darligton pour commander le haut-parleur. N'oubliez pas le connecteur HE10 pour connecter votre carte à une carte mère. Utilisez la ligne de sélection SPI par défaut pour que la carte mère puisse commander votre carte et prévoyez une ligne d'interruption. Enfin il vous faut prévoir un connecteur AVR ISP pour programmer le microcontrôleur.&lt;br /&gt;
&lt;br /&gt;
Le microcontrôleur de la carte fille doit être programmé pour pouvoir jouer des sons déjà enregistrés :&lt;br /&gt;
* des variables globales doivent être configurées pour spécifier les caractéristiques des enregistrements à jouer :&lt;br /&gt;
** précision d'échantillonnage (8 à 24 bits même si au-delà de 14 bits vous devez abandonner les bits de poids faibles),&lt;br /&gt;
** vitesse d'acquisition (vous trouverez la vitesse maximale par essais et erreurs),&lt;br /&gt;
** format des enregistrements (vous vous limiterez à un format PCM entier classique avec représentation petit-boutiste) ;&lt;br /&gt;
* une fonction permettant d'envoyer les échantillons, à la bonne vitesse, sur le DAC.&lt;br /&gt;
&lt;br /&gt;
Les échantillons sonores sont reçus par le bus SPI préfixés par le code commande 0x02. Les 2 valeurs de configuration, précision sur un octet et vitesse sur quatre octets sont envoyées préfixés par le code commande 0x01.&lt;br /&gt;
&lt;br /&gt;
Au niveau de la carte mère vous devez écrire les primitives système :&lt;br /&gt;
* la première primitive correspond au message SPI de code commande 0x01 et passe les paramètres de configuration à la carte fille ;&lt;br /&gt;
* la seconde primitive correspond au message SPI de code commande 0x02 et passe les échantillons sonores à jouer à la carte fille, la primitive s'assure auparavent que la carte n'est pas déjà occupée à jouer des échantillons avec la commande SPI 0xFF, en cas de carte occupée le code 0xFF est retourné.&lt;br /&gt;
&lt;br /&gt;
Ces primitives sont utilisées utilisée par le système d'exploitation pour implanter une nouvelle commande &amp;lt;code&amp;gt;PLAY&amp;lt;/code&amp;gt; permettant de jouer un fichier WAV :&lt;br /&gt;
* l'entête du fichier est récupéré avec la primitive &amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt; ;&lt;br /&gt;
* l'entête WAV est analysée pour récupérer la fréquence et la précision d'échantillonnage, ces données sont passées à la carte son via la première primitive décrite ci-dessus ;&lt;br /&gt;
* le nombre de canaux est récupéré dans l'entête, les echantillons du premier canal sont alors lus grâce à &amp;lt;code&amp;gt;read&amp;lt;/code&amp;gt; et envoyés à la carte son en utilisant la seconde primitive ;&lt;br /&gt;
* si les échantillons sont envoyés trop vite et donnent lieu à un code d'erreur de la seconde primitive, les mêmes échantillons sont à nouveau envoyés et ainsi de suite ;&lt;br /&gt;
* éventuellement, si votre système d'exploitation dispose d'une primitive &amp;lt;code&amp;gt;usleep&amp;lt;/code&amp;gt; vous pouvez mettre en place un algorithme d'attente après chaque appel à la primitive, ce temps peut être calculé en fonction de la vitesse de restitution et du nombre d'échantillons envoyés.&lt;br /&gt;
&lt;br /&gt;
= Réalisations des élèves =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Numéro du binôme !! Numéro du groupe !! Elèves !! Page &lt;br /&gt;
|-&lt;br /&gt;
| Binôme 1&lt;br /&gt;
| Groupe 1&lt;br /&gt;
| Taha Nehari &amp;amp; Martin Chauveliere&lt;br /&gt;
| [[SE4Binome2023-1|Binôme 1 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 2&lt;br /&gt;
| Groupe 1&lt;br /&gt;
| Simon CRUCHET &amp;amp; Amaury BECQUET&lt;br /&gt;
| [[SE4Binome2023-2|Binôme 2 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 3&lt;br /&gt;
| Groupe 1&lt;br /&gt;
| Louis DERYCKERE &amp;amp; Romain DUHR&lt;br /&gt;
| [[SE4Binome2023-3|Binôme 3 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 4&lt;br /&gt;
| Groupe 1&lt;br /&gt;
| Thomas NAVE &amp;amp; Thibault DUYCK&lt;br /&gt;
| [[SE4Binome2023-4|Binôme 4 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 5&lt;br /&gt;
| Groupe 2&lt;br /&gt;
| Stéphane KADER ISSACK &amp;amp; Marion NORMAND&lt;br /&gt;
| [[SE4Binome2023-5|Binôme 5 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 6&lt;br /&gt;
| Groupe 2&lt;br /&gt;
| Dylan Ling&lt;br /&gt;
| [[SE4Binome2023-6|Binôme 6 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 7&lt;br /&gt;
| Groupe 2&lt;br /&gt;
| Louis Wijsman &amp;amp; Adrien Paliferro&lt;br /&gt;
| [[SE4Binome2023-7|Binôme 7 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 8&lt;br /&gt;
| Groupe 2&lt;br /&gt;
| Prénom Nom &amp;amp; Prénom Nom&lt;br /&gt;
| [[SE4Binome2023-8|Binôme 8 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 9&lt;br /&gt;
| Groupe 3&lt;br /&gt;
| Prénom Nom &amp;amp; Prénom Nom&lt;br /&gt;
| [[SE4Binome2023-9|Binôme 9 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 10&lt;br /&gt;
| Groupe 3&lt;br /&gt;
| Prénom Nom &amp;amp; Prénom Nom&lt;br /&gt;
| [[SE4Binome2023-10|Binôme 10 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
| Binôme 11&lt;br /&gt;
| Groupe 3&lt;br /&gt;
| Prénom Nom &amp;amp; Prénom Nom&lt;br /&gt;
| [[SE4Binome2023-11|Binôme 11 2023/2024]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=952</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=952"/>
		<updated>2023-06-02T13:13:08Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé un programme permettant de faire clignoter les led de la carte (voir https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/blob/main/test_led/ClignoterLED.c&lt;br /&gt;
&lt;br /&gt;
Cela fonctionnerait, puis otre carte est devenu inprogramable sans que nous sachions pourquoi.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc du re faire une carte en re soudant tout les composants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
la nouvelle carte fonctionnait comme prévu:&lt;br /&gt;
[[Fichier:Imageledcarte.png|néant|vignette|Led allumée sur la carte.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons en suite voulu faire fonctionner le moteur DC.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Apres l'avoir soudé, nous avons pas réussi a le faire fonctionner.&lt;br /&gt;
&lt;br /&gt;
Malheureusement lors de la dernière séance la carte n'est a nouveau plus détectée par l'ordinateur. &lt;br /&gt;
&lt;br /&gt;
Nous ne pouvons plu la programer mais le programe présent fonctionne toujours et fait clignoter les LED.&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=911</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=911"/>
		<updated>2023-05-28T15:14:04Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé un programme permettant de faire clignoter les led de la carte (voir https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/blob/main/test_led/ClignoterLED.c&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imageledcarte.png|néant|vignette|Led allumée sur la carte.]]&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=910</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=910"/>
		<updated>2023-05-28T15:13:25Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé un programme permettant d'allumer les led de la carte (voir https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/blob/main/test_led/ClignoterLED.c&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imageledcarte.png|néant|vignette|Led allumée sur la carte.]]&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=909</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=909"/>
		<updated>2023-05-28T15:04:37Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé un programme permettant d'allumer les led de la carte (voir git premier_syst_lwijsman_abrasse1/test_led/'''ClignoterLED.c'''&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imageledcarte.png|néant|vignette|Led allumée sur la carte.]]&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=908</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=908"/>
		<updated>2023-05-28T15:04:05Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé un programme permettant d'allumer les led de la carte (voir git premier_syst_lwijsman_abrasse1/test_led/'''ClignoterLED.c'''&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image.png|néant|vignette|313x313px]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Imageledcarte.png|néant|vignette|Led allumée sur la carte.]]&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=907</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=907"/>
		<updated>2023-05-28T15:03:45Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé un programme permettant d'allumer les led de la carte (voir git premier_syst_lwijsman_abrasse1/test_led/'''ClignoterLED.c'''&lt;br /&gt;
&lt;br /&gt;
Cela fonctionne.&lt;br /&gt;
[[Fichier:Imageledcarte.png|néant|vignette|Led allumée sur la carte.]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image.png|néant|vignette|313x313px]]&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=906</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=906"/>
		<updated>2023-05-28T15:01:15Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé un programme permettant d'allumer les led de la carte (voir git premier_syst_lwijsman_abrasse1/test_led/'''ClignoterLED.c'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cela fonctionne.&lt;br /&gt;
[[Fichier:Imageledcarte.png|vignette|Led allumée sur la carte.]]&lt;br /&gt;
[[Fichier:Image.png|vignette|313x313px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Imageledcarte.png&amp;diff=905</id>
		<title>Fichier:Imageledcarte.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Imageledcarte.png&amp;diff=905"/>
		<updated>2023-05-28T14:59:14Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;image carte led&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=904</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=904"/>
		<updated>2023-05-28T14:57:03Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé un programme permettant d'allumer les led de la carte.&lt;br /&gt;
[[Fichier:Image.png|vignette|313x313px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Image.png&amp;diff=903</id>
		<title>Fichier:Image.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Image.png&amp;diff=903"/>
		<updated>2023-05-28T14:54:54Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;imge code led&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=902</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=902"/>
		<updated>2023-05-28T14:53:11Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=901</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=901"/>
		<updated>2023-05-28T14:52:09Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Détail de chaque séance= =:&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=671</id>
		<title>SE3Binome2022-7</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE3Binome2022-7&amp;diff=671"/>
		<updated>2023-05-09T13:46:53Z</updated>

		<summary type="html">&lt;p&gt;Lwijsman : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;lien git (univ): https://archives.plil.fr/lwijsman/premier_syst_lwijsman_abrasse1/tree/master&lt;br /&gt;
&lt;br /&gt;
== But du projet ==&lt;br /&gt;
&lt;br /&gt;
Nous devions réaliser une voiture miniature fonctionnelle. Chaque groupe était libre de choisir les composants de la voiture. Lorsque nous nous sommes lancé dans le projet, nos attentes étaient celles-ci:&lt;br /&gt;
&lt;br /&gt;
* une voiture de taille 1:43&lt;br /&gt;
* roue motrice avec propulsion&lt;br /&gt;
* roue directionnel&lt;br /&gt;
* voiture contrôlait à distance par Bluetooth&lt;br /&gt;
&lt;br /&gt;
Et pour être plus ambitieux, si nous avons le temps:&lt;br /&gt;
&lt;br /&gt;
* créer une interface sur le téléphone pour controller la voiture&lt;br /&gt;
* charge de la batterie en interne&lt;br /&gt;
&lt;br /&gt;
== Kicad ==&lt;br /&gt;
&lt;br /&gt;
Nous avons réaliser le schéma électronique de la voiture sur le logiciel Kicad. Il nous a fallut au total 6 séances pour faire l'intégralité du schéma, le pcb et rooter. Afin de nous aider, dans notre projet, nous avions à notre disposition des photos de schéma de voiture fonctionnelle. Nous avons pu ainsi réaliser les parties suivantes:&lt;br /&gt;
&lt;br /&gt;
-Le microcontrolleur&lt;br /&gt;
[[Fichier:MicroP.png|néant|vignette|368x368px]]&lt;br /&gt;
-La partie USB:&lt;br /&gt;
[[Fichier:USB.png|néant|vignette|334x334px]]&lt;br /&gt;
-L'antenne:&lt;br /&gt;
[[Fichier:Antenne.png|néant|vignette|381x381px]]&lt;br /&gt;
-Les moteurs:&lt;br /&gt;
[[Fichier:Moteurs.png|néant|vignette|375x375px]]&lt;br /&gt;
-Les LED:&lt;br /&gt;
[[Fichier:LED 6.png|néant|vignette|348x348px]]&lt;br /&gt;
&lt;br /&gt;
Pour avoir le résultat suivant: &lt;br /&gt;
&lt;br /&gt;
-le schématique&lt;br /&gt;
[[Fichier:Kicad binome5.png|néant|vignette|816x816px]]&lt;br /&gt;
-le PCB: &lt;br /&gt;
[[Fichier:Pcb binome5.png|néant|vignette|785x785px]]&lt;br /&gt;
&lt;br /&gt;
== Les pièces ajoutées ==&lt;br /&gt;
&lt;br /&gt;
Certaines pièces n'étaient pas présentent dans les librairies kicad que nous avions à notre disposition. Nous avons donc dû ainsi faire les symboles et les footprints des pièces suivantes:&lt;br /&gt;
&lt;br /&gt;
-l'antenne:&lt;br /&gt;
[[Fichier:Symbole antenne.png|néant|vignette]]&lt;br /&gt;
[[Fichier:Footprint antenne.png|néant|vignette]]&lt;br /&gt;
-Le drv8210DRL:&lt;br /&gt;
[[Fichier:Symbole drv8210.png|néant|vignette]]&lt;br /&gt;
-Le moteur à propulsion:&lt;br /&gt;
[[Fichier:Footprint moteur propulsion.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une fois notre carte imprimée et soudée, nous passons au code. Dans un premier temps nous avons fait un test pour savoir si notre carte était bien perçu par notre ordinateur, avec la commande &amp;quot;lsusb&amp;quot;.&lt;br /&gt;
[[Fichier:Lsusb.png|néant|vignette|878x878px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Détail de chaque séance:&lt;br /&gt;
28/02/2023&lt;br /&gt;
&lt;br /&gt;
séance 2&lt;br /&gt;
&lt;br /&gt;
*création d'un repo gitlab pour le projet &lt;br /&gt;
&lt;br /&gt;
*on a réalisé le shéma electronique sur kicad (fichiers sur gitlab) on a cree une librairie pour le controleur de moteur&lt;br /&gt;
&lt;br /&gt;
14/03/2013&lt;br /&gt;
&lt;br /&gt;
Séance 3:&lt;br /&gt;
&lt;br /&gt;
*On a ajouté le module bluetooth au shematic en le connectant avec la liaison serie au microcontroleur.&lt;br /&gt;
*On a du créer le shematic ainsi que l'empreinte.&lt;br /&gt;
*pour le moment notre projet est sur gitlab, on va le transferer vers un gitlab univ&lt;br /&gt;
&lt;br /&gt;
il faudra rooter le pcb maintenant que on a tt les composants sur le shematic.&lt;br /&gt;
&lt;br /&gt;
BLE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/BM70_71-Bluetooth-Low-Energy-BLE-Module-DS60001372L.pdf &lt;br /&gt;
&lt;br /&gt;
figure 2.5&lt;br /&gt;
&lt;br /&gt;
ANT3216LL00R2400A&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
21/03/2023&lt;br /&gt;
Séance 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on a fait tout les footprints&lt;br /&gt;
&lt;br /&gt;
on vas pouvoir passer au routage&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
04/04/2023&lt;br /&gt;
&lt;br /&gt;
on ajoute ISP que on avais oublié&lt;br /&gt;
&lt;br /&gt;
On a fait le shape du pcb a partir de mesures sur le chasis de la voiture&lt;br /&gt;
&lt;br /&gt;
on a placée les composants sur pcb pour routage&lt;/div&gt;</summary>
		<author><name>Lwijsman</name></author>
	</entry>
</feed>