<?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=Vsouopme</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=Vsouopme"/>
	<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Vsouopme"/>
	<updated>2026-05-18T17:00:53Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8762</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8762"/>
		<updated>2026-01-15T10:40:16Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Fonction `wait()` */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du cursus Systèmes Embarqués (SE4), ce projet consiste à concevoir un système capable de générer des signaux sonores de manière autonome. L'objectif est de transformer une valeur numérique calculée par un programme en une tension électrique réelle pour faire vibrer un haut-parleur.&lt;br /&gt;
&lt;br /&gt;
Le système repose sur deux éléments principaux :&lt;br /&gt;
&lt;br /&gt;
La carte Shield Arduino(PICO) : Équipée d'un microcontrôleur ATmega32U4, elle assure l'intelligence du système et l'ordonnancement des tâches.&lt;br /&gt;
La carte fille son : Elle contient le dispositif de conversion numérique-analogique (DAC) et l'étage d'amplification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.pdf.pdf|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On sauvegarde les registres et le registre d'etat SREG, pour ensuite les restaurer dans l'ordre inverse.&lt;br /&gt;
&lt;br /&gt;
le programme définit deux macros assembleur :&lt;br /&gt;
&lt;br /&gt;
* SAVE_REGISTERS (): sauvegarde l’ensemble des registres généraux ainsi que le registre d’état &amp;lt;code&amp;gt;SREG&amp;lt;/code&amp;gt;,&lt;br /&gt;
* RESTORE_REGISTERS () : restaure ces mêmes registres dans l’ordre inverse.&lt;br /&gt;
&lt;br /&gt;
Cette sauvegarde manuelle est rendue nécessaire par l’utilisation d’une interruption déclarée avec l’attribut &amp;lt;code&amp;gt;ISR_NAKED&amp;lt;/code&amp;gt;,&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS()  \&lt;br /&gt;
        asm volatile (  \&lt;br /&gt;
         &amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;in r0,__SREG__ \n\t push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r1 \n\t push r2 \n\t push r3 \n\t push r4 \n\t push r5 \n\t push r6 \n\t push r7 \n\t push r8 \n\t push r9                        \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;clr  r1 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r10 \n\t push r11 \n\t push r12 \n\t push r13 \n\t push r14 \n\t push r15 \n\t push r16 \n\t push r17 \n\t push r18 \n\t push r19 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r20 \n\t push r21 \n\t push r22 \n\t push r23 \n\t push r24 \n\t push r25 \n\t push r26 \n\t push r27 \n\t push r28 \n\t push r29 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r30 \n\t push r31 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
        asm volatile ( \&lt;br /&gt;
         &amp;quot;pop r31 \n\t pop r30 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r29 \n\t pop r28 \n\t pop r27 \n\t pop r26 \n\t pop r25 \n\t pop r24 \n\t pop r23 \n\t pop r22 \n\t pop r21 \n\t pop r20 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r19 \n\t pop r18 \n\t pop r17 \n\t pop r16 \n\t pop r15 \n\t pop r14 \n\t pop r13 \n\t pop r12 \n\t pop r11 \n\t pop r10 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r9 \n\t pop r8 \n\t pop r7 \n\t pop r6 \n\t pop r5 \n\t pop r4 \n\t pop r3 \n\t pop r2 \n\t pop r1                       \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t out __SREG__,r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ici on definit l'etat et la structure des  taches &lt;br /&gt;
&lt;br /&gt;
Les tâches peuvent se trouver dans deux états distincts :&lt;br /&gt;
&lt;br /&gt;
* '''Ready''' : la tâche est prête à être exécutée&lt;br /&gt;
* '''Sleep''' : la tâche est temporairement suspendue&lt;br /&gt;
&lt;br /&gt;
Chaque tâche est représentée par une structure '''Process''' contenant les informations nécessaires à sa gestion :&lt;br /&gt;
&lt;br /&gt;
* un pointeur vers la fonction à exécuter,&lt;br /&gt;
* l’adresse du pointeur de pile associé à la tâche,&lt;br /&gt;
* l’état courant de la tâche,&lt;br /&gt;
* le temps de sommeil restant avant son réveil.&lt;br /&gt;
&lt;br /&gt;
Cette structure constitue le bloc fondamental de l’ordonnanceur.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum{&lt;br /&gt;
        Ready,&lt;br /&gt;
        Sleep,&lt;br /&gt;
}task_state;&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
struct task {&lt;br /&gt;
        uint16_t function;&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
typedef struct  {&lt;br /&gt;
        void(*function)(void);&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
        volatile task_state state;&lt;br /&gt;
        uint16_t sleepTime;&lt;br /&gt;
}process;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Tableau des taches, la tache idle qui s'execute si aucune tache n'est prete&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void idle (void);&lt;br /&gt;
void task1 (void);&lt;br /&gt;
void task2 (void);&lt;br /&gt;
&lt;br /&gt;
process Tasks [MAX_TASKS] = {&lt;br /&gt;
        {idle, STACKTOP-STACKSIZE,Ready,0},&lt;br /&gt;
        {task1, STACKTOP-2*STACKSIZE,Ready,0},&lt;br /&gt;
        {task2, STACKTOP-3*STACKSIZE,Ready,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;L'interruption déclenche une fonction de gestion d'interruption (ISR pour Interrupt Service Routine).&lt;br /&gt;
&lt;br /&gt;
Cette interruption est déclenchée par le '''Timer1''' à intervalle régulier.&lt;br /&gt;
&lt;br /&gt;
Elle sert à :&lt;br /&gt;
&lt;br /&gt;
* Sauvegarder le contexte de la tâche courante&lt;br /&gt;
* Choisir la tâche suivante ('''scheduler''')&lt;br /&gt;
* Restaurer le contexte de la nouvelle tâche&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
SAVE_REGISTERS();&lt;br /&gt;
Tasks[current].stack=SP;&lt;br /&gt;
LED_PORT ^= (1&amp;lt;&amp;lt;LED1_BIT);&lt;br /&gt;
scheduler();&lt;br /&gt;
SP=Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fonction `wait()` ===&lt;br /&gt;
Comme première amélioration de votre ordonnanceur, il nous a été demandé de mettre en place un état endormi pour nos processus. Pour cela nous avons créer la procédure wait() qui a pour role :&lt;br /&gt;
&lt;br /&gt;
* De mettre une tache en pause pendant une duree donnee (avec Delay), tout ca sans bloquer les autres taches &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait(uint16_t delay) {&lt;br /&gt;
    Tasks[current].sleepTime = delay;&lt;br /&gt;
    Tasks[current].state = Sleep;&lt;br /&gt;
    TCNT1=nb_ticks-1;&lt;br /&gt;
    while(Tasks[current].state == Sleep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Par la suite, on a ajouter  les fonctions &lt;br /&gt;
&lt;br /&gt;
* add_task :  Fonction qui sert a ajouter une nouvelle tache au système&lt;br /&gt;
* remove_task : Fonction pour supprimer (desactiver) une tâche existante&lt;br /&gt;
&lt;br /&gt;
Ensuite dans la fonction principale, on &lt;br /&gt;
&lt;br /&gt;
* Configure les Leds LED1 et LED2 comme sortie &lt;br /&gt;
&lt;br /&gt;
* Initialise les  tâches        &lt;br /&gt;
&lt;br /&gt;
* Initialise le minuteur (timer)&lt;br /&gt;
* Charge la pile de la  tâche courante&lt;br /&gt;
* Restaure les registres &lt;br /&gt;
* Lance la  tâche avec '''reti'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//  Fonction pour ajouter une tâche&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
LED_DIR |= (1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT);&lt;br /&gt;
LED_PORT &amp;amp;=  ~((1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT));&lt;br /&gt;
&lt;br /&gt;
for(int i=0; i&amp;lt;MAX_TASKS; i++){&lt;br /&gt;
        if (Tasks[i].function!=0) init_stack(i);&lt;br /&gt;
       // Tasks[i].stack = (uint16_t)(STACKTOP - (i + 1) * STACKSIZE);&lt;br /&gt;
}&lt;br /&gt;
init_minuteur(256,PERIODE);&lt;br /&gt;
SP = Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
//sei();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
while(1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Clignotement de la led.mov|vignette|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;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin :&lt;br /&gt;
&lt;br /&gt;
* d'un microphone&lt;br /&gt;
* d'un haut-parleur pour jouer le son, &lt;br /&gt;
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Carte empruntée'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suite à des défauts de conception sur notre propre PCB, nous utilisons la carte du [https://wiki-se.plil.fr/mediawiki/index.php/I2L_2023_Groupe2 Groupe 2 (I2L 2023/24)]'''.&lt;br /&gt;
&lt;br /&gt;
* '''Adaptation''' : Nous avons dû identifier que cette carte utilise également le **PORTD** pour son réseau R-2R.&lt;br /&gt;
* '''Contrainte :''' Cette carte n'était pas prévue pour notre châssis PICO original, ce qui a nécessité une vérification des broches pour éviter tout court-circuit.&lt;br /&gt;
&lt;br /&gt;
'''Architecture logicielle'''&lt;br /&gt;
&lt;br /&gt;
Le code est divisé en 2 modules pour plus de clarté :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; : Point d'entrée, initialise le système et lance les tâches.&lt;br /&gt;
* &amp;lt;code&amp;gt;scheduler.c&amp;lt;/code&amp;gt; : L'ordonnanceur qui gère le multitâche &amp;quot;souple&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;audio_card.c&amp;lt;/code&amp;gt; : Le pilote bas-niveau qui communique avec le matériel.&lt;br /&gt;
&lt;br /&gt;
'''Pilote audio'''&lt;br /&gt;
&lt;br /&gt;
Le pilote utilise le **Timer 2** du microcontrôleur. Ce timer est réglé à '''10 kHz'''. À chaque &amp;quot;tic&amp;quot;, il déclenche une fonction qui fait une seule chose : &amp;lt;code&amp;gt;PORTD = échantillon&amp;lt;/code&amp;gt;. C'est l'écriture directe, la méthode la plus rapide possible sur AVR.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8761</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8761"/>
		<updated>2026-01-15T10:28:33Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Fonction `wait()` */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du cursus Systèmes Embarqués (SE4), ce projet consiste à concevoir un système capable de générer des signaux sonores de manière autonome. L'objectif est de transformer une valeur numérique calculée par un programme en une tension électrique réelle pour faire vibrer un haut-parleur.&lt;br /&gt;
&lt;br /&gt;
Le système repose sur deux éléments principaux :&lt;br /&gt;
&lt;br /&gt;
La carte Shield Arduino(PICO) : Équipée d'un microcontrôleur ATmega32U4, elle assure l'intelligence du système et l'ordonnancement des tâches.&lt;br /&gt;
La carte fille son : Elle contient le dispositif de conversion numérique-analogique (DAC) et l'étage d'amplification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.pdf.pdf|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On sauvegarde les registres et le registre d'etat SREG, pour ensuite les restaurer dans l'ordre inverse.&lt;br /&gt;
&lt;br /&gt;
le programme définit deux macros assembleur :&lt;br /&gt;
&lt;br /&gt;
* SAVE_REGISTERS (): sauvegarde l’ensemble des registres généraux ainsi que le registre d’état &amp;lt;code&amp;gt;SREG&amp;lt;/code&amp;gt;,&lt;br /&gt;
* RESTORE_REGISTERS () : restaure ces mêmes registres dans l’ordre inverse.&lt;br /&gt;
&lt;br /&gt;
Cette sauvegarde manuelle est rendue nécessaire par l’utilisation d’une interruption déclarée avec l’attribut &amp;lt;code&amp;gt;ISR_NAKED&amp;lt;/code&amp;gt;,&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS()  \&lt;br /&gt;
        asm volatile (  \&lt;br /&gt;
         &amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;in r0,__SREG__ \n\t push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r1 \n\t push r2 \n\t push r3 \n\t push r4 \n\t push r5 \n\t push r6 \n\t push r7 \n\t push r8 \n\t push r9                        \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;clr  r1 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r10 \n\t push r11 \n\t push r12 \n\t push r13 \n\t push r14 \n\t push r15 \n\t push r16 \n\t push r17 \n\t push r18 \n\t push r19 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r20 \n\t push r21 \n\t push r22 \n\t push r23 \n\t push r24 \n\t push r25 \n\t push r26 \n\t push r27 \n\t push r28 \n\t push r29 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r30 \n\t push r31 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
        asm volatile ( \&lt;br /&gt;
         &amp;quot;pop r31 \n\t pop r30 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r29 \n\t pop r28 \n\t pop r27 \n\t pop r26 \n\t pop r25 \n\t pop r24 \n\t pop r23 \n\t pop r22 \n\t pop r21 \n\t pop r20 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r19 \n\t pop r18 \n\t pop r17 \n\t pop r16 \n\t pop r15 \n\t pop r14 \n\t pop r13 \n\t pop r12 \n\t pop r11 \n\t pop r10 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r9 \n\t pop r8 \n\t pop r7 \n\t pop r6 \n\t pop r5 \n\t pop r4 \n\t pop r3 \n\t pop r2 \n\t pop r1                       \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t out __SREG__,r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ici on definit l'etat et la structure des  taches &lt;br /&gt;
&lt;br /&gt;
Les tâches peuvent se trouver dans deux états distincts :&lt;br /&gt;
&lt;br /&gt;
* '''Ready''' : la tâche est prête à être exécutée&lt;br /&gt;
* '''Sleep''' : la tâche est temporairement suspendue&lt;br /&gt;
&lt;br /&gt;
Chaque tâche est représentée par une structure '''Process''' contenant les informations nécessaires à sa gestion :&lt;br /&gt;
&lt;br /&gt;
* un pointeur vers la fonction à exécuter,&lt;br /&gt;
* l’adresse du pointeur de pile associé à la tâche,&lt;br /&gt;
* l’état courant de la tâche,&lt;br /&gt;
* le temps de sommeil restant avant son réveil.&lt;br /&gt;
&lt;br /&gt;
Cette structure constitue le bloc fondamental de l’ordonnanceur.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum{&lt;br /&gt;
        Ready,&lt;br /&gt;
        Sleep,&lt;br /&gt;
}task_state;&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
struct task {&lt;br /&gt;
        uint16_t function;&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
typedef struct  {&lt;br /&gt;
        void(*function)(void);&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
        volatile task_state state;&lt;br /&gt;
        uint16_t sleepTime;&lt;br /&gt;
}process;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Tableau des taches, la tache idle qui s'execute si aucune tache n'est prete&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void idle (void);&lt;br /&gt;
void task1 (void);&lt;br /&gt;
void task2 (void);&lt;br /&gt;
&lt;br /&gt;
process Tasks [MAX_TASKS] = {&lt;br /&gt;
        {idle, STACKTOP-STACKSIZE,Ready,0},&lt;br /&gt;
        {task1, STACKTOP-2*STACKSIZE,Ready,0},&lt;br /&gt;
        {task2, STACKTOP-3*STACKSIZE,Ready,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;L'interruption déclenche une fonction de gestion d'interruption (ISR pour Interrupt Service Routine).&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
SAVE_REGISTERS();&lt;br /&gt;
Tasks[current].stack=SP;&lt;br /&gt;
LED_PORT ^= (1&amp;lt;&amp;lt;LED1_BIT);&lt;br /&gt;
scheduler();&lt;br /&gt;
SP=Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fonction `wait()` ===&lt;br /&gt;
Comme première amélioration de votre ordonnanceur, il nous a été demandé de mettre en place un état endormi pour nos processus. Pour cela nous avons créer la procédure wait() qui a pour role :&lt;br /&gt;
&lt;br /&gt;
* De mettre une tache en pause pendant une duree donnee (avec Delay), tout ca sans bloquer les autres taches &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait(uint16_t delay) {&lt;br /&gt;
    Tasks[current].sleepTime = delay;&lt;br /&gt;
    Tasks[current].state = Sleep;&lt;br /&gt;
    TCNT1=nb_ticks-1;&lt;br /&gt;
    while(Tasks[current].state == Sleep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Par la suite, on a ajouter  les fonctions &lt;br /&gt;
&lt;br /&gt;
* add_task :  Fonction qui sert a ajouter une nouvelle tache au système&lt;br /&gt;
* remove_task : Fonction pour supprimer (desactiver) une tâche existante&lt;br /&gt;
&lt;br /&gt;
Ensuite dans la fonction principale, on &lt;br /&gt;
&lt;br /&gt;
* Configure les Leds LED1 et LED2 comme sortie &lt;br /&gt;
&lt;br /&gt;
* Initialise les  tâches        &lt;br /&gt;
&lt;br /&gt;
* Initialise le minuteur (timer)&lt;br /&gt;
* Charge la pile de la  tâche courante&lt;br /&gt;
* Restaure les registres &lt;br /&gt;
* Lance la  tâche avec '''reti'''&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
//  Fonction pour ajouter une tâche&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
LED_DIR |= (1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT);&lt;br /&gt;
LED_PORT &amp;amp;=  ~((1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT));&lt;br /&gt;
&lt;br /&gt;
for(int i=0; i&amp;lt;MAX_TASKS; i++){&lt;br /&gt;
        if (Tasks[i].function!=0) init_stack(i);&lt;br /&gt;
       // Tasks[i].stack = (uint16_t)(STACKTOP - (i + 1) * STACKSIZE);&lt;br /&gt;
}&lt;br /&gt;
init_minuteur(256,PERIODE);&lt;br /&gt;
SP = Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
//sei();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
while(1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Clignotement de la led.mov|vignette|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;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin :&lt;br /&gt;
&lt;br /&gt;
* d'un microphone&lt;br /&gt;
* d'un haut-parleur pour jouer le son, &lt;br /&gt;
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Carte empruntée'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suite à des défauts de conception sur notre propre PCB, nous utilisons la carte du [https://wiki-se.plil.fr/mediawiki/index.php/I2L_2023_Groupe2 Groupe 2 (I2L 2023/24)]'''.&lt;br /&gt;
&lt;br /&gt;
* '''Adaptation''' : Nous avons dû identifier que cette carte utilise également le **PORTD** pour son réseau R-2R.&lt;br /&gt;
* '''Contrainte :''' Cette carte n'était pas prévue pour notre châssis PICO original, ce qui a nécessité une vérification des broches pour éviter tout court-circuit.&lt;br /&gt;
&lt;br /&gt;
'''Architecture logicielle'''&lt;br /&gt;
&lt;br /&gt;
Le code est divisé en 2 modules pour plus de clarté :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; : Point d'entrée, initialise le système et lance les tâches.&lt;br /&gt;
* &amp;lt;code&amp;gt;scheduler.c&amp;lt;/code&amp;gt; : L'ordonnanceur qui gère le multitâche &amp;quot;souple&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;audio_card.c&amp;lt;/code&amp;gt; : Le pilote bas-niveau qui communique avec le matériel.&lt;br /&gt;
&lt;br /&gt;
'''Pilote audio'''&lt;br /&gt;
&lt;br /&gt;
Le pilote utilise le **Timer 2** du microcontrôleur. Ce timer est réglé à '''10 kHz'''. À chaque &amp;quot;tic&amp;quot;, il déclenche une fonction qui fait une seule chose : &amp;lt;code&amp;gt;PORTD = échantillon&amp;lt;/code&amp;gt;. C'est l'écriture directe, la méthode la plus rapide possible sur AVR.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8759</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8759"/>
		<updated>2026-01-05T14:57:19Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du cursus Systèmes Embarqués (SE4), ce projet consiste à concevoir un système capable de générer des signaux sonores de manière autonome. L'objectif est de transformer une valeur numérique calculée par un programme en une tension électrique réelle pour faire vibrer un haut-parleur.&lt;br /&gt;
&lt;br /&gt;
Le système repose sur deux éléments principaux :&lt;br /&gt;
&lt;br /&gt;
La carte Shield Arduino(PICO) : Équipée d'un microcontrôleur ATmega32U4, elle assure l'intelligence du système et l'ordonnancement des tâches.&lt;br /&gt;
La carte fille son : Elle contient le dispositif de conversion numérique-analogique (DAC) et l'étage d'amplification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.pdf.pdf|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On sauvegarde les registres et le registre d'etat SREG, pour ensuite les restaurer dans l'ordre inverse.&lt;br /&gt;
&lt;br /&gt;
le programme définit deux macros assembleur :&lt;br /&gt;
&lt;br /&gt;
* SAVE_REGISTERS (): sauvegarde l’ensemble des registres généraux ainsi que le registre d’état &amp;lt;code&amp;gt;SREG&amp;lt;/code&amp;gt;,&lt;br /&gt;
* RESTORE_REGISTERS () : restaure ces mêmes registres dans l’ordre inverse.&lt;br /&gt;
&lt;br /&gt;
Cette sauvegarde manuelle est rendue nécessaire par l’utilisation d’une interruption déclarée avec l’attribut &amp;lt;code&amp;gt;ISR_NAKED&amp;lt;/code&amp;gt;,&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS()  \&lt;br /&gt;
        asm volatile (  \&lt;br /&gt;
         &amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;in r0,__SREG__ \n\t push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r1 \n\t push r2 \n\t push r3 \n\t push r4 \n\t push r5 \n\t push r6 \n\t push r7 \n\t push r8 \n\t push r9                        \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;clr  r1 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r10 \n\t push r11 \n\t push r12 \n\t push r13 \n\t push r14 \n\t push r15 \n\t push r16 \n\t push r17 \n\t push r18 \n\t push r19 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r20 \n\t push r21 \n\t push r22 \n\t push r23 \n\t push r24 \n\t push r25 \n\t push r26 \n\t push r27 \n\t push r28 \n\t push r29 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r30 \n\t push r31 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
        asm volatile ( \&lt;br /&gt;
         &amp;quot;pop r31 \n\t pop r30 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r29 \n\t pop r28 \n\t pop r27 \n\t pop r26 \n\t pop r25 \n\t pop r24 \n\t pop r23 \n\t pop r22 \n\t pop r21 \n\t pop r20 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r19 \n\t pop r18 \n\t pop r17 \n\t pop r16 \n\t pop r15 \n\t pop r14 \n\t pop r13 \n\t pop r12 \n\t pop r11 \n\t pop r10 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r9 \n\t pop r8 \n\t pop r7 \n\t pop r6 \n\t pop r5 \n\t pop r4 \n\t pop r3 \n\t pop r2 \n\t pop r1                       \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t out __SREG__,r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ici on definit l'etat et la structure des  taches &lt;br /&gt;
&lt;br /&gt;
Les tâches peuvent se trouver dans deux états distincts :&lt;br /&gt;
&lt;br /&gt;
* '''Ready''' : la tâche est prête à être exécutée&lt;br /&gt;
* '''Sleep''' : la tâche est temporairement suspendue&lt;br /&gt;
&lt;br /&gt;
Chaque tâche est représentée par une structure '''Process''' contenant les informations nécessaires à sa gestion :&lt;br /&gt;
&lt;br /&gt;
* un pointeur vers la fonction à exécuter,&lt;br /&gt;
* l’adresse du pointeur de pile associé à la tâche,&lt;br /&gt;
* l’état courant de la tâche,&lt;br /&gt;
* le temps de sommeil restant avant son réveil.&lt;br /&gt;
&lt;br /&gt;
Cette structure constitue le bloc fondamental de l’ordonnanceur.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum{&lt;br /&gt;
        Ready,&lt;br /&gt;
        Sleep,&lt;br /&gt;
}task_state;&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
struct task {&lt;br /&gt;
        uint16_t function;&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
typedef struct  {&lt;br /&gt;
        void(*function)(void);&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
        volatile task_state state;&lt;br /&gt;
        uint16_t sleepTime;&lt;br /&gt;
}process;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Tableau des taches, la tache idle qui s'execute si aucune tache n'est prete&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void idle (void);&lt;br /&gt;
void task1 (void);&lt;br /&gt;
void task2 (void);&lt;br /&gt;
&lt;br /&gt;
process Tasks [MAX_TASKS] = {&lt;br /&gt;
        {idle, STACKTOP-STACKSIZE,Ready,0},&lt;br /&gt;
        {task1, STACKTOP-2*STACKSIZE,Ready,0},&lt;br /&gt;
        {task2, STACKTOP-3*STACKSIZE,Ready,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;L'interruption déclenche une fonction de gestion d'interruption (ISR pour Interrupt Service Routine).&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
SAVE_REGISTERS();&lt;br /&gt;
Tasks[current].stack=SP;&lt;br /&gt;
LED_PORT ^= (1&amp;lt;&amp;lt;LED1_BIT);&lt;br /&gt;
scheduler();&lt;br /&gt;
SP=Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Fonction `wait()` ===&lt;br /&gt;
Comme première amélioration de votre ordonnanceur, il nous a été demandé de mettre en place un état endormi pour nos processus. Pour cela nous avons créer la procédure wait() suivante :&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void wait(uint16_t delay) {&lt;br /&gt;
    Tasks[current].sleepTime = delay;&lt;br /&gt;
    Tasks[current].state = Sleep;&lt;br /&gt;
    TCNT1=nb_ticks-1;&lt;br /&gt;
    while(Tasks[current].state == Sleep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
LED_DIR |= (1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT);&lt;br /&gt;
LED_PORT &amp;amp;=  ~((1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT));&lt;br /&gt;
&lt;br /&gt;
for(int i=0; i&amp;lt;MAX_TASKS; i++){&lt;br /&gt;
        if (Tasks[i].function!=0) init_stack(i);&lt;br /&gt;
       // Tasks[i].stack = (uint16_t)(STACKTOP - (i + 1) * STACKSIZE);&lt;br /&gt;
}&lt;br /&gt;
init_minuteur(256,PERIODE);&lt;br /&gt;
SP = Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
//sei();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
while(1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Clignotement de la led.mov|vignette|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;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin :&lt;br /&gt;
&lt;br /&gt;
* d'un microphone&lt;br /&gt;
* d'un haut-parleur pour jouer le son, &lt;br /&gt;
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Carte empruntée'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suite à des défauts de conception sur notre propre PCB, nous utilisons la carte du [https://wiki-se.plil.fr/mediawiki/index.php/I2L_2023_Groupe2 Groupe 2 (I2L 2023/24)]'''.&lt;br /&gt;
&lt;br /&gt;
* '''Adaptation''' : Nous avons dû identifier que cette carte utilise également le **PORTD** pour son réseau R-2R.&lt;br /&gt;
* '''Contrainte :''' Cette carte n'était pas prévue pour notre châssis PICO original, ce qui a nécessité une vérification des broches pour éviter tout court-circuit.&lt;br /&gt;
&lt;br /&gt;
'''Architecture logicielle'''&lt;br /&gt;
&lt;br /&gt;
Le code est divisé en 2 modules pour plus de clarté :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; : Point d'entrée, initialise le système et lance les tâches.&lt;br /&gt;
* &amp;lt;code&amp;gt;scheduler.c&amp;lt;/code&amp;gt; : L'ordonnanceur qui gère le multitâche &amp;quot;souple&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;audio_card.c&amp;lt;/code&amp;gt; : Le pilote bas-niveau qui communique avec le matériel.&lt;br /&gt;
&lt;br /&gt;
'''Pilote audio'''&lt;br /&gt;
&lt;br /&gt;
Le pilote utilise le **Timer 2** du microcontrôleur. Ce timer est réglé à '''10 kHz'''. À chaque &amp;quot;tic&amp;quot;, il déclenche une fonction qui fait une seule chose : &amp;lt;code&amp;gt;PORTD = échantillon&amp;lt;/code&amp;gt;. C'est l'écriture directe, la méthode la plus rapide possible sur AVR.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8734</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8734"/>
		<updated>2026-01-05T13:46:30Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du cursus Systèmes Embarqués (SE4), ce projet consiste à concevoir un système capable de générer des signaux sonores de manière autonome. L'objectif est de transformer une valeur numérique calculée par un programme en une tension électrique réelle pour faire vibrer un haut-parleur.&lt;br /&gt;
&lt;br /&gt;
Le système repose sur deux éléments principaux :&lt;br /&gt;
&lt;br /&gt;
La carte Shield Arduino(PICO) : Équipée d'un microcontrôleur ATmega32U4, elle assure l'intelligence du système et l'ordonnancement des tâches.&lt;br /&gt;
La carte fille son : Elle contient le dispositif de conversion numérique-analogique (DAC) et l'étage d'amplification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.pdf.pdf|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On sauvegarde les registres CPU; et le registre d'etat SREG, pour ensuite les restaurer dans l'ordre inverse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS()  \&lt;br /&gt;
        asm volatile (  \&lt;br /&gt;
         &amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;in r0,__SREG__ \n\t push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r1 \n\t push r2 \n\t push r3 \n\t push r4 \n\t push r5 \n\t push r6 \n\t push r7 \n\t push r8 \n\t push r9                        \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;clr  r1 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r10 \n\t push r11 \n\t push r12 \n\t push r13 \n\t push r14 \n\t push r15 \n\t push r16 \n\t push r17 \n\t push r18 \n\t push r19 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r20 \n\t push r21 \n\t push r22 \n\t push r23 \n\t push r24 \n\t push r25 \n\t push r26 \n\t push r27 \n\t push r28 \n\t push r29 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r30 \n\t push r31 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
        asm volatile ( \&lt;br /&gt;
         &amp;quot;pop r31 \n\t pop r30 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r29 \n\t pop r28 \n\t pop r27 \n\t pop r26 \n\t pop r25 \n\t pop r24 \n\t pop r23 \n\t pop r22 \n\t pop r21 \n\t pop r20 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r19 \n\t pop r18 \n\t pop r17 \n\t pop r16 \n\t pop r15 \n\t pop r14 \n\t pop r13 \n\t pop r12 \n\t pop r11 \n\t pop r10 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r9 \n\t pop r8 \n\t pop r7 \n\t pop r6 \n\t pop r5 \n\t pop r4 \n\t pop r3 \n\t pop r2 \n\t pop r1                       \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t out __SREG__,r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ici on definit l'etat et la structure des  taches &lt;br /&gt;
&lt;br /&gt;
Chaque tâche contient :&lt;br /&gt;
&lt;br /&gt;
* Pointeur vers la fonction&lt;br /&gt;
* Adresse du pointeur de pile&lt;br /&gt;
* État&lt;br /&gt;
* Temps de sommeil restant&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum{&lt;br /&gt;
        Ready,&lt;br /&gt;
        Sleep,&lt;br /&gt;
}task_state;&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
struct task {&lt;br /&gt;
        uint16_t function;&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
typedef struct  {&lt;br /&gt;
        void(*function)(void);&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
        volatile task_state state;&lt;br /&gt;
        uint16_t sleepTime;&lt;br /&gt;
}process;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Tableau des taches, la tache idle qui s'execute si aucune tache n'est prete&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void idle (void);&lt;br /&gt;
void task1 (void);&lt;br /&gt;
void task2 (void);&lt;br /&gt;
&lt;br /&gt;
process Tasks [MAX_TASKS] = {&lt;br /&gt;
        {idle, STACKTOP-STACKSIZE,Ready,0},&lt;br /&gt;
        {task1, STACKTOP-2*STACKSIZE,Ready,0},&lt;br /&gt;
        {task2, STACKTOP-3*STACKSIZE,Ready,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;L'interruption déclenche une fonction de gestion d'interruption (ISR pour Interrupt Service Routine).&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
SAVE_REGISTERS();&lt;br /&gt;
Tasks[current].stack=SP;&lt;br /&gt;
LED_PORT ^= (1&amp;lt;&amp;lt;LED1_BIT);&lt;br /&gt;
scheduler();&lt;br /&gt;
SP=Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void wait(uint16_t delay) {&lt;br /&gt;
    Tasks[current].sleepTime = delay;&lt;br /&gt;
    Tasks[current].state = Sleep;&lt;br /&gt;
    TCNT1=nb_ticks-1;&lt;br /&gt;
    while(Tasks[current].state == Sleep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
LED_DIR |= (1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT);&lt;br /&gt;
LED_PORT &amp;amp;=  ~((1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT));&lt;br /&gt;
&lt;br /&gt;
for(int i=0; i&amp;lt;MAX_TASKS; i++){&lt;br /&gt;
        if (Tasks[i].function!=0) init_stack(i);&lt;br /&gt;
       // Tasks[i].stack = (uint16_t)(STACKTOP - (i + 1) * STACKSIZE);&lt;br /&gt;
}&lt;br /&gt;
init_minuteur(256,PERIODE);&lt;br /&gt;
SP = Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
//sei();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
while(1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Clignotement de la led.mov|vignette|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;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin :&lt;br /&gt;
&lt;br /&gt;
* d'un microphone&lt;br /&gt;
* d'un haut-parleur pour jouer le son, &lt;br /&gt;
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Carte empruntée'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suite à des défauts de conception sur notre propre PCB, nous utilisons la carte du '''Groupe 2 (I2L 2023)'''.&lt;br /&gt;
&lt;br /&gt;
* '''Adaptation''' : Nous avons dû identifier que cette carte utilise également le **PORTD** pour son réseau R-2R.&lt;br /&gt;
* '''Contrainte :''' Cette carte n'était pas prévue pour notre châssis PICO original, ce qui a nécessité une vérification des broches pour éviter tout court-circuit.&lt;br /&gt;
&lt;br /&gt;
'''Architecture logicielle'''&lt;br /&gt;
&lt;br /&gt;
Le code est divisé en 2 modules pour plus de clarté :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; : Point d'entrée, initialise le système et lance les tâches.&lt;br /&gt;
* &amp;lt;code&amp;gt;scheduler.c&amp;lt;/code&amp;gt; : L'ordonnanceur qui gère le multitâche &amp;quot;souple&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;audio_card.c&amp;lt;/code&amp;gt; : Le pilote bas-niveau qui communique avec le matériel.&lt;br /&gt;
&lt;br /&gt;
'''Pilote audio'''&lt;br /&gt;
&lt;br /&gt;
Le pilote utilise le **Timer 2** du microcontrôleur. Ce timer est réglé à '''10 kHz'''. À chaque &amp;quot;tic&amp;quot;, il déclenche une fonction qui fait une seule chose : &amp;lt;code&amp;gt;PORTD = échantillon&amp;lt;/code&amp;gt;. C'est l'écriture directe, la méthode la plus rapide possible sur AVR.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8732</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8732"/>
		<updated>2026-01-05T13:34:40Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du cursus Systèmes Embarqués (SE4), ce projet consiste à concevoir un système capable de générer des signaux sonores de manière autonome. L'objectif est de transformer une valeur numérique calculée par un programme en une tension électrique réelle pour faire vibrer un haut-parleur.&lt;br /&gt;
&lt;br /&gt;
Le système repose sur deux éléments principaux :&lt;br /&gt;
&lt;br /&gt;
La carte Shield Arduino(PICO) : Équipée d'un microcontrôleur ATmega32U4, elle assure l'intelligence du système et l'ordonnancement des tâches.&lt;br /&gt;
La carte fille son : Elle contient le dispositif de conversion numérique-analogique (DAC) et l'étage d'amplification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.pdf.pdf|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS()  \&lt;br /&gt;
        asm volatile (  \&lt;br /&gt;
         &amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;in r0,__SREG__ \n\t push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r1 \n\t push r2 \n\t push r3 \n\t push r4 \n\t push r5 \n\t push r6 \n\t push r7 \n\t push r8 \n\t push r9                        \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;clr  r1 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r10 \n\t push r11 \n\t push r12 \n\t push r13 \n\t push r14 \n\t push r15 \n\t push r16 \n\t push r17 \n\t push r18 \n\t push r19 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r20 \n\t push r21 \n\t push r22 \n\t push r23 \n\t push r24 \n\t push r25 \n\t push r26 \n\t push r27 \n\t push r28 \n\t push r29 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r30 \n\t push r31 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
        asm volatile ( \&lt;br /&gt;
         &amp;quot;pop r31 \n\t pop r30 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r29 \n\t pop r28 \n\t pop r27 \n\t pop r26 \n\t pop r25 \n\t pop r24 \n\t pop r23 \n\t pop r22 \n\t pop r21 \n\t pop r20 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r19 \n\t pop r18 \n\t pop r17 \n\t pop r16 \n\t pop r15 \n\t pop r14 \n\t pop r13 \n\t pop r12 \n\t pop r11 \n\t pop r10 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r9 \n\t pop r8 \n\t pop r7 \n\t pop r6 \n\t pop r5 \n\t pop r4 \n\t pop r3 \n\t pop r2 \n\t pop r1                       \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t out __SREG__,r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ici on definit l'etat de la tache&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum{&lt;br /&gt;
        Ready,&lt;br /&gt;
        Sleep,&lt;br /&gt;
}task_state;&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
struct task {&lt;br /&gt;
        uint16_t function;&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
typedef struct  {&lt;br /&gt;
        void(*function)(void);&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
        volatile task_state state;&lt;br /&gt;
        uint16_t sleepTime;&lt;br /&gt;
}process;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void idle (void);&lt;br /&gt;
void task1 (void);&lt;br /&gt;
void task2 (void);&lt;br /&gt;
&lt;br /&gt;
process Tasks [MAX_TASKS] = {&lt;br /&gt;
        {idle, STACKTOP-STACKSIZE,Ready,0},&lt;br /&gt;
        {task1, STACKTOP-2*STACKSIZE,Ready,0},&lt;br /&gt;
        {task2, STACKTOP-3*STACKSIZE,Ready,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
SAVE_REGISTERS();&lt;br /&gt;
Tasks[current].stack=SP;&lt;br /&gt;
LED_PORT ^= (1&amp;lt;&amp;lt;LED1_BIT);&lt;br /&gt;
scheduler();&lt;br /&gt;
SP=Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void wait(uint16_t delay) {&lt;br /&gt;
    Tasks[current].sleepTime = delay;&lt;br /&gt;
    Tasks[current].state = Sleep;&lt;br /&gt;
    TCNT1=nb_ticks-1;&lt;br /&gt;
    while(Tasks[current].state == Sleep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
LED_DIR |= (1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT);&lt;br /&gt;
LED_PORT &amp;amp;=  ~((1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT));&lt;br /&gt;
&lt;br /&gt;
for(int i=0; i&amp;lt;MAX_TASKS; i++){&lt;br /&gt;
        if (Tasks[i].function!=0) init_stack(i);&lt;br /&gt;
       // Tasks[i].stack = (uint16_t)(STACKTOP - (i + 1) * STACKSIZE);&lt;br /&gt;
}&lt;br /&gt;
init_minuteur(256,PERIODE);&lt;br /&gt;
SP = Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
//sei();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
while(1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Clignotement de la led.mov|vignette|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;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin :&lt;br /&gt;
&lt;br /&gt;
* d'un microphone&lt;br /&gt;
* d'un haut-parleur pour jouer le son, &lt;br /&gt;
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Carte empruntée'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Suite à des défauts de conception sur notre propre PCB, nous utilisons la carte du '''Groupe 2 (I2L 2023)'''.&lt;br /&gt;
&lt;br /&gt;
* '''Adaptation''' : Nous avons dû identifier que cette carte utilise également le **PORTD** pour son réseau R-2R.&lt;br /&gt;
* '''Contrainte :''' Cette carte n'était pas prévue pour notre châssis PICO original, ce qui a nécessité une vérification des broches pour éviter tout court-circuit.&lt;br /&gt;
&lt;br /&gt;
'''Architecture logicielle'''&lt;br /&gt;
&lt;br /&gt;
Le code est divisé en 2 modules pour plus de clarté :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;main.c&amp;lt;/code&amp;gt; : Point d'entrée, initialise le système et lance les tâches.&lt;br /&gt;
* &amp;lt;code&amp;gt;scheduler.c&amp;lt;/code&amp;gt; : L'ordonnanceur qui gère le multitâche &amp;quot;souple&amp;quot;.&lt;br /&gt;
* &amp;lt;code&amp;gt;audio_card.c&amp;lt;/code&amp;gt; : Le pilote bas-niveau qui communique avec le matériel.&lt;br /&gt;
&lt;br /&gt;
'''Pilote audio'''&lt;br /&gt;
&lt;br /&gt;
Le pilote utilise le **Timer 2** du microcontrôleur. Ce timer est réglé à '''10 kHz'''. À chaque &amp;quot;tic&amp;quot;, il déclenche une fonction qui fait une seule chose : &amp;lt;code&amp;gt;PORTD = échantillon&amp;lt;/code&amp;gt;. C'est l'écriture directe, la méthode la plus rapide possible sur AVR.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8730</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8730"/>
		<updated>2026-01-05T13:33:53Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du cursus Systèmes Embarqués (SE4), ce projet consiste à concevoir un système capable de générer des signaux sonores de manière autonome. L'objectif est de transformer une valeur numérique calculée par un programme en une tension électrique réelle pour faire vibrer un haut-parleur.&lt;br /&gt;
&lt;br /&gt;
Le système repose sur deux éléments principaux :&lt;br /&gt;
&lt;br /&gt;
La carte Shield Arduino(PICO) : Équipée d'un microcontrôleur ATmega32U4, elle assure l'intelligence du système et l'ordonnancement des tâches.&lt;br /&gt;
La carte fille son : Elle contient le dispositif de conversion numérique-analogique (DAC) et l'étage d'amplification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.pdf.pdf|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS()  \&lt;br /&gt;
        asm volatile (  \&lt;br /&gt;
         &amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;in r0,__SREG__ \n\t push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r1 \n\t push r2 \n\t push r3 \n\t push r4 \n\t push r5 \n\t push r6 \n\t push r7 \n\t push r8 \n\t push r9                        \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;clr  r1 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r10 \n\t push r11 \n\t push r12 \n\t push r13 \n\t push r14 \n\t push r15 \n\t push r16 \n\t push r17 \n\t push r18 \n\t push r19 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r20 \n\t push r21 \n\t push r22 \n\t push r23 \n\t push r24 \n\t push r25 \n\t push r26 \n\t push r27 \n\t push r28 \n\t push r29 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r30 \n\t push r31 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
        asm volatile ( \&lt;br /&gt;
         &amp;quot;pop r31 \n\t pop r30 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r29 \n\t pop r28 \n\t pop r27 \n\t pop r26 \n\t pop r25 \n\t pop r24 \n\t pop r23 \n\t pop r22 \n\t pop r21 \n\t pop r20 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r19 \n\t pop r18 \n\t pop r17 \n\t pop r16 \n\t pop r15 \n\t pop r14 \n\t pop r13 \n\t pop r12 \n\t pop r11 \n\t pop r10 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r9 \n\t pop r8 \n\t pop r7 \n\t pop r6 \n\t pop r5 \n\t pop r4 \n\t pop r3 \n\t pop r2 \n\t pop r1                       \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t out __SREG__,r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ici on definit l'etat de la tache&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum{&lt;br /&gt;
        Ready,&lt;br /&gt;
        Sleep,&lt;br /&gt;
}task_state;&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
struct task {&lt;br /&gt;
        uint16_t function;&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
typedef struct  {&lt;br /&gt;
        void(*function)(void);&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
        volatile task_state state;&lt;br /&gt;
        uint16_t sleepTime;&lt;br /&gt;
}process;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void idle (void);&lt;br /&gt;
void task1 (void);&lt;br /&gt;
void task2 (void);&lt;br /&gt;
&lt;br /&gt;
process Tasks [MAX_TASKS] = {&lt;br /&gt;
        {idle, STACKTOP-STACKSIZE,Ready,0},&lt;br /&gt;
        {task1, STACKTOP-2*STACKSIZE,Ready,0},&lt;br /&gt;
        {task2, STACKTOP-3*STACKSIZE,Ready,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0},&lt;br /&gt;
        {0,0}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
SAVE_REGISTERS();&lt;br /&gt;
Tasks[current].stack=SP;&lt;br /&gt;
LED_PORT ^= (1&amp;lt;&amp;lt;LED1_BIT);&lt;br /&gt;
scheduler();&lt;br /&gt;
SP=Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void wait(uint16_t delay) {&lt;br /&gt;
    Tasks[current].sleepTime = delay;&lt;br /&gt;
    Tasks[current].state = Sleep;&lt;br /&gt;
    TCNT1=nb_ticks-1;&lt;br /&gt;
    while(Tasks[current].state == Sleep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
LED_DIR |= (1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT);&lt;br /&gt;
LED_PORT &amp;amp;=  ~((1&amp;lt;&amp;lt;LED1_BIT)|(1&amp;lt;&amp;lt;LED2_BIT));&lt;br /&gt;
&lt;br /&gt;
for(int i=0; i&amp;lt;MAX_TASKS; i++){&lt;br /&gt;
        if (Tasks[i].function!=0) init_stack(i);&lt;br /&gt;
       // Tasks[i].stack = (uint16_t)(STACKTOP - (i + 1) * STACKSIZE);&lt;br /&gt;
}&lt;br /&gt;
init_minuteur(256,PERIODE);&lt;br /&gt;
SP = Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
//sei();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
while(1);&lt;br /&gt;
&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Clignotement de la led.mov|vignette|gauche]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin :&lt;br /&gt;
&lt;br /&gt;
* d'un microphone&lt;br /&gt;
* d'un haut-parleur pour jouer le son, &lt;br /&gt;
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8728</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8728"/>
		<updated>2026-01-05T13:28:00Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans le cadre du cursus Systèmes Embarqués (SE4), ce projet consiste à concevoir un système capable de générer des signaux sonores de manière autonome. L'objectif est de transformer une valeur numérique calculée par un programme en une tension électrique réelle pour faire vibrer un haut-parleur.&lt;br /&gt;
&lt;br /&gt;
Le système repose sur deux éléments principaux :&lt;br /&gt;
&lt;br /&gt;
La carte Shield Arduino(PICO) : Équipée d'un microcontrôleur ATmega32U4, elle assure l'intelligence du système et l'ordonnancement des tâches.&lt;br /&gt;
La carte fille son : Elle contient le dispositif de conversion numérique-analogique (DAC) et l'étage d'amplification.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.pdf.pdf|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS()  \&lt;br /&gt;
        asm volatile (  \&lt;br /&gt;
         &amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;in r0,__SREG__ \n\t push r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r1 \n\t push r2 \n\t push r3 \n\t push r4 \n\t push r5 \n\t push r6 \n\t push r7 \n\t push r8 \n\t push r9                        \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;clr  r1 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r10 \n\t push r11 \n\t push r12 \n\t push r13 \n\t push r14 \n\t push r15 \n\t push r16 \n\t push r17 \n\t push r18 \n\t push r19 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r20 \n\t push r21 \n\t push r22 \n\t push r23 \n\t push r24 \n\t push r25 \n\t push r26 \n\t push r27 \n\t push r28 \n\t push r29 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;push r30 \n\t push r31 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
        asm volatile ( \&lt;br /&gt;
         &amp;quot;pop r31 \n\t pop r30 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r29 \n\t pop r28 \n\t pop r27 \n\t pop r26 \n\t pop r25 \n\t pop r24 \n\t pop r23 \n\t pop r22 \n\t pop r21 \n\t pop r20 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r19 \n\t pop r18 \n\t pop r17 \n\t pop r16 \n\t pop r15 \n\t pop r14 \n\t pop r13 \n\t pop r12 \n\t pop r11 \n\t pop r10 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r9 \n\t pop r8 \n\t pop r7 \n\t pop r6 \n\t pop r5 \n\t pop r4 \n\t pop r3 \n\t pop r2 \n\t pop r1                       \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t out __SREG__,r0 \n\t&amp;quot; \&lt;br /&gt;
         &amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
        );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;ici on definit l'etat de la tache&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum{&lt;br /&gt;
        Ready,&lt;br /&gt;
        Sleep,&lt;br /&gt;
}task_state;&lt;br /&gt;
&lt;br /&gt;
#if 0&lt;br /&gt;
struct task {&lt;br /&gt;
        uint16_t function;&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
};&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
typedef struct  {&lt;br /&gt;
        void(*function)(void);&lt;br /&gt;
        uint16_t stack;&lt;br /&gt;
        volatile task_state state;&lt;br /&gt;
        uint16_t sleepTime;&lt;br /&gt;
}process;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
SAVE_REGISTERS();&lt;br /&gt;
Tasks[current].stack=SP;&lt;br /&gt;
LED_PORT ^= (1&amp;lt;&amp;lt;LED1_BIT);&lt;br /&gt;
scheduler();&lt;br /&gt;
SP=Tasks[current].stack;&lt;br /&gt;
RESTORE_REGISTERS();&lt;br /&gt;
asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void wait(uint16_t delay) {&lt;br /&gt;
    Tasks[current].sleepTime = delay;&lt;br /&gt;
    Tasks[current].state = Sleep;&lt;br /&gt;
    TCNT1=nb_ticks-1;&lt;br /&gt;
    while(Tasks[current].state == Sleep);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void add_task(void (*task_function)(void)) {&lt;br /&gt;
    for (int n = 0; n &amp;lt; MAX_TASKS; n++) {&lt;br /&gt;
        if (Tasks[n].function == 0) {&lt;br /&gt;
            Tasks[n].function = task_function;&lt;br /&gt;
            Tasks[n].stack = (uint16_t)(STACKTOP - n * STACKSIZE);&lt;br /&gt;
            Tasks[n].state = Ready;&lt;br /&gt;
            sei();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fonction pour supprimer une tâche&lt;br /&gt;
void remove_task(int n) {&lt;br /&gt;
    if (n &amp;gt;= 0 &amp;amp;&amp;amp; n &amp;lt; MAX_TASKS) {&lt;br /&gt;
        Tasks[n].function = 0;  // Supprime la tâche en réinitialisant la fonction&lt;br /&gt;
        Tasks[n].state = Sleep; // Met la tâche en état de sommeil&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int8_t SCHEDULER_AddTask(void (*pFunction)(void), uint32_t Period_ms, uint8_t Priority) {&lt;br /&gt;
    if (TaskCount &amp;lt; MAX_TASKS) {&lt;br /&gt;
        TaskList[TaskCount].pFunction = pFunction;&lt;br /&gt;
        TaskList[TaskCount].Period_ms = Period_ms;&lt;br /&gt;
        TaskList[TaskCount].Last_Run_Time = GlobalTick; // Exécution immédiate&lt;br /&gt;
        TaskList[TaskCount].Priority = Priority;&lt;br /&gt;
        TaskList[TaskCount].ID = TaskCount + 1;&lt;br /&gt;
        TaskCount++;&lt;br /&gt;
        //return TaskCount;&lt;br /&gt;
	return TaskList[TaskCount - 1].ID;&lt;br /&gt;
    }&lt;br /&gt;
    return 0; // en cas d'echec&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Clignotement de la led.mov|vignette]]&lt;br /&gt;
&lt;br /&gt;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin :&lt;br /&gt;
&lt;br /&gt;
* d'un microphone&lt;br /&gt;
* d'un haut-parleur pour jouer le son, &lt;br /&gt;
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Clignotement_de_la_led.mov&amp;diff=8727</id>
		<title>Fichier:Clignotement de la led.mov</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Clignotement_de_la_led.mov&amp;diff=8727"/>
		<updated>2026-01-05T13:27:32Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;clignotement de la led&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8625</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8625"/>
		<updated>2025-12-11T17:16:53Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ici on definit la structure d'une tâche, qu'elle fonction elle doit exécuter, quand elle doit etre exécuter, la derniere fois qu'elle ''été exécuté, sa priorité et son ID''&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    void (*pFunction)(void); // Pointeur vers la fonction de la tâche&lt;br /&gt;
    uint32_t Period_ms;      // Période d'exécution souhaitée (en ms)&lt;br /&gt;
    uint32_t Last_Run_Time;  // Timestamp de la dernière exécution&lt;br /&gt;
    uint8_t  Priority;       // Priorité (0: la plus faible)&lt;br /&gt;
    uint8_t  ID;             // ID de la tâche&lt;br /&gt;
} Task_t;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ici, configure le Timer1 pour générer '''une interruption toutes les 20 ms'''. Cette interruption sert de '''tick système''' pour que le scheduler exécute les tâches périodiques.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void SCHEDULER_Init(void) {&lt;br /&gt;
    TaskCount = 0;&lt;br /&gt;
    GlobalTick = 0;&lt;br /&gt;
&lt;br /&gt;
    // 1. Mise à zéro des Registres&lt;br /&gt;
    TCCR1A = 0; // Réinitialise TCCR1A&lt;br /&gt;
    TCCR1B = 0; // Réinitialise TCCR1B&lt;br /&gt;
    TCNT1  = 0; // Initialise le compteur à zéro&lt;br /&gt;
&lt;br /&gt;
    // 2. Mode CTC (Clear Timer on Compare Match)&lt;br /&gt;
    // WGM12 = 1 dans TCCR1B pour le mode CTC&lt;br /&gt;
    TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
&lt;br /&gt;
    OCR1A = 5000; &lt;br /&gt;
&lt;br /&gt;
    // 3. Définir le Prescaler à 1024 (CS12=1, CS10=1 dans TCCR1B)&lt;br /&gt;
    TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); &lt;br /&gt;
&lt;br /&gt;
    // 4. Autoriser l'interruption Timer1 Compare Match A (OCIE1A dans TIMSK1)&lt;br /&gt;
    TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
&lt;br /&gt;
    // 5. Activer les interruptions globales&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ici, il est question d'enregistrer une nouvelle tâches, en mettant son code, sa période, son ID, etc....&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int8_t SCHEDULER_AddTask(void (*pFunction)(void), uint32_t Period_ms, uint8_t Priority) {&lt;br /&gt;
    if (TaskCount &amp;lt; MAX_TASKS) {&lt;br /&gt;
        TaskList[TaskCount].pFunction = pFunction;&lt;br /&gt;
        TaskList[TaskCount].Period_ms = Period_ms;&lt;br /&gt;
        TaskList[TaskCount].Last_Run_Time = GlobalTick; // Exécution immédiate&lt;br /&gt;
        TaskList[TaskCount].Priority = Priority;&lt;br /&gt;
        TaskList[TaskCount].ID = TaskCount + 1;&lt;br /&gt;
        TaskCount++;&lt;br /&gt;
        //return TaskCount;&lt;br /&gt;
	return TaskList[TaskCount - 1].ID;&lt;br /&gt;
    }&lt;br /&gt;
    return 0; // en cas d'echec&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin :&lt;br /&gt;
&lt;br /&gt;
* d'un microphone&lt;br /&gt;
* d'un haut-parleur pour jouer le son, &lt;br /&gt;
* d'un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8624</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8624"/>
		<updated>2025-12-11T17:15:31Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et vue 3D&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ici on definit la structure d'une tâche, qu'elle fonction elle doit exécuter, quand elle doit etre exécuter, la derniere fois qu'elle ''été exécuté, sa priorité et son ID''&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    void (*pFunction)(void); // Pointeur vers la fonction de la tâche&lt;br /&gt;
    uint32_t Period_ms;      // Période d'exécution souhaitée (en ms)&lt;br /&gt;
    uint32_t Last_Run_Time;  // Timestamp de la dernière exécution&lt;br /&gt;
    uint8_t  Priority;       // Priorité (0: la plus faible)&lt;br /&gt;
    uint8_t  ID;             // ID de la tâche&lt;br /&gt;
} Task_t;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ici, configure le Timer1 pour générer '''une interruption toutes les 20 ms'''. Cette interruption sert de '''tick système''' pour que le scheduler exécute les tâches périodiques.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void SCHEDULER_Init(void) {&lt;br /&gt;
    TaskCount = 0;&lt;br /&gt;
    GlobalTick = 0;&lt;br /&gt;
&lt;br /&gt;
    // 1. Mise à zéro des Registres&lt;br /&gt;
    TCCR1A = 0; // Réinitialise TCCR1A&lt;br /&gt;
    TCCR1B = 0; // Réinitialise TCCR1B&lt;br /&gt;
    TCNT1  = 0; // Initialise le compteur à zéro&lt;br /&gt;
&lt;br /&gt;
    // 2. Mode CTC (Clear Timer on Compare Match)&lt;br /&gt;
    // WGM12 = 1 dans TCCR1B pour le mode CTC&lt;br /&gt;
    TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
&lt;br /&gt;
    OCR1A = 5000; &lt;br /&gt;
&lt;br /&gt;
    // 3. Définir le Prescaler à 1024 (CS12=1, CS10=1 dans TCCR1B)&lt;br /&gt;
    TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); &lt;br /&gt;
&lt;br /&gt;
    // 4. Autoriser l'interruption Timer1 Compare Match A (OCIE1A dans TIMSK1)&lt;br /&gt;
    TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
&lt;br /&gt;
    // 5. Activer les interruptions globales&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ici, il est question d'enregistrer une nouvelle tâches, en mettant son code, sa période, son ID, etc....&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int8_t SCHEDULER_AddTask(void (*pFunction)(void), uint32_t Period_ms, uint8_t Priority) {&lt;br /&gt;
    if (TaskCount &amp;lt; MAX_TASKS) {&lt;br /&gt;
        TaskList[TaskCount].pFunction = pFunction;&lt;br /&gt;
        TaskList[TaskCount].Period_ms = Period_ms;&lt;br /&gt;
        TaskList[TaskCount].Last_Run_Time = GlobalTick; // Exécution immédiate&lt;br /&gt;
        TaskList[TaskCount].Priority = Priority;&lt;br /&gt;
        TaskList[TaskCount].ID = TaskCount + 1;&lt;br /&gt;
        TaskCount++;&lt;br /&gt;
        //return TaskCount;&lt;br /&gt;
	return TaskList[TaskCount - 1].ID;&lt;br /&gt;
    }&lt;br /&gt;
    return 0; // en cas d'echec&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Description&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Notre carte fille son sera alimentée par la carte mère.&lt;br /&gt;
&lt;br /&gt;
Elle comporte une ATmega328p comme coeur et sa spécificité est un convertisseur numérique vers analogique dit R-2R.&lt;br /&gt;
&lt;br /&gt;
Pour fonctionner, elle a besoin d'un microphone permettant d'ecouter le bruit, d'un haut-parleur pour jouer le son, un connecteur USB permettant la configuration de l'appareil via une connexion a un ordinateur .&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Schématique - routage et vue 3D&amp;lt;/small&amp;gt; ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8623</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8623"/>
		<updated>2025-12-11T16:41:48Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et routage&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ici on definit la structure d'une tâche, qu'elle fonction elle doit exécuter, quand elle doit etre exécuter, la derniere fois qu'elle ''été exécuté, sa priorité et son ID''&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    void (*pFunction)(void); // Pointeur vers la fonction de la tâche&lt;br /&gt;
    uint32_t Period_ms;      // Période d'exécution souhaitée (en ms)&lt;br /&gt;
    uint32_t Last_Run_Time;  // Timestamp de la dernière exécution&lt;br /&gt;
    uint8_t  Priority;       // Priorité (0: la plus faible)&lt;br /&gt;
    uint8_t  ID;             // ID de la tâche&lt;br /&gt;
} Task_t;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ici, configure le Timer1 pour générer '''une interruption toutes les 20 ms'''. Cette interruption sert de '''tick système''' pour que le scheduler exécute les tâches périodiques.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void SCHEDULER_Init(void) {&lt;br /&gt;
    TaskCount = 0;&lt;br /&gt;
    GlobalTick = 0;&lt;br /&gt;
&lt;br /&gt;
    // 1. Mise à zéro des Registres&lt;br /&gt;
    TCCR1A = 0; // Réinitialise TCCR1A&lt;br /&gt;
    TCCR1B = 0; // Réinitialise TCCR1B&lt;br /&gt;
    TCNT1  = 0; // Initialise le compteur à zéro&lt;br /&gt;
&lt;br /&gt;
    // 2. Mode CTC (Clear Timer on Compare Match)&lt;br /&gt;
    // WGM12 = 1 dans TCCR1B pour le mode CTC&lt;br /&gt;
    TCCR1B |= (1 &amp;lt;&amp;lt; WGM12); &lt;br /&gt;
&lt;br /&gt;
    OCR1A = 5000; &lt;br /&gt;
&lt;br /&gt;
    // 3. Définir le Prescaler à 1024 (CS12=1, CS10=1 dans TCCR1B)&lt;br /&gt;
    TCCR1B |= (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS10); &lt;br /&gt;
&lt;br /&gt;
    // 4. Autoriser l'interruption Timer1 Compare Match A (OCIE1A dans TIMSK1)&lt;br /&gt;
    TIMSK1 |= (1 &amp;lt;&amp;lt; OCIE1A); &lt;br /&gt;
&lt;br /&gt;
    // 5. Activer les interruptions globales&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ici, il est question d'enregistrer une nouvelle tâches, en mettant son code, sa période, son ID, etc....&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int8_t SCHEDULER_AddTask(void (*pFunction)(void), uint32_t Period_ms, uint8_t Priority) {&lt;br /&gt;
    if (TaskCount &amp;lt; MAX_TASKS) {&lt;br /&gt;
        TaskList[TaskCount].pFunction = pFunction;&lt;br /&gt;
        TaskList[TaskCount].Period_ms = Period_ms;&lt;br /&gt;
        TaskList[TaskCount].Last_Run_Time = GlobalTick; // Exécution immédiate&lt;br /&gt;
        TaskList[TaskCount].Priority = Priority;&lt;br /&gt;
        TaskList[TaskCount].ID = TaskCount + 1;&lt;br /&gt;
        TaskCount++;&lt;br /&gt;
        //return TaskCount;&lt;br /&gt;
	return TaskList[TaskCount - 1].ID;&lt;br /&gt;
    }&lt;br /&gt;
    return 0; // en cas d'echec&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
====Réalisation====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8622</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8622"/>
		<updated>2025-12-11T16:08:08Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et routage&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ici on definit la structure d'une tâche, qu'elle fonction elle doit exécuter, quand elle doit etre exécuter, la derniere fois qu'elle ''été exécuté, sa priorité et son ID''&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    void (*pFunction)(void); // Pointeur vers la fonction de la tâche&lt;br /&gt;
    uint32_t Period_ms;      // Période d'exécution souhaitée (en ms)&lt;br /&gt;
    uint32_t Last_Run_Time;  // Timestamp de la dernière exécution&lt;br /&gt;
    uint8_t  Priority;       // Priorité (0: la plus faible)&lt;br /&gt;
    uint8_t  ID;             // ID de la tâche&lt;br /&gt;
} Task_t;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Carte Son'''==&lt;br /&gt;
&lt;br /&gt;
====Réalisation====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8619</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8619"/>
		<updated>2025-12-11T15:45:27Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et routage&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8618</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8618"/>
		<updated>2025-12-11T15:43:50Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;Schématique - Routage et routage&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8617</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8617"/>
		<updated>2025-12-11T15:42:37Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;'''Schématique - Routage et routage'''&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
=== Code de l'ordonnanceur ===&lt;br /&gt;
Un ordonnanceur sert à gérer l'exécution des tâches dans un système temps réel, en assurant qu'elles s'exécutent dans un ordre optimal et respectent les délais&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8616</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8616"/>
		<updated>2025-12-11T15:21:59Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
&lt;br /&gt;
== '''Shield''' ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;small&amp;gt;Réalisation du shield arduino&amp;lt;/small&amp;gt; ===&lt;br /&gt;
Nous avons réalisé un bouclier pour Arduino Uno afin d'implémenter un système d'ordonnancement, ce qui nous permettra de simuler le fonctionnement d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;small&amp;gt;'''Schématique - Routage et routage'''&amp;lt;/small&amp;gt; ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8615</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8615"/>
		<updated>2025-12-11T15:05:38Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur : lien git [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.git]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous avons commencés par la realisation d'un shield arduino, et ensuite la réalisation de la carte son.&lt;br /&gt;
== Shield ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8566</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8566"/>
		<updated>2025-12-05T12:49:02Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;'''Présentation projet'''&amp;lt;/big&amp;gt; ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Code source&amp;lt;/big&amp;gt; ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CARTE SON ==&lt;br /&gt;
La première étape est de réaliser le schema et le routage de notre carte. &lt;br /&gt;
&lt;br /&gt;
Pour notre carte, nous avons pris comme composants :&lt;br /&gt;
&lt;br /&gt;
* Un microphone&lt;br /&gt;
* Un microprocesseur &lt;br /&gt;
* Un haut parleur &lt;br /&gt;
* Un USB données et alimentation&lt;br /&gt;
* AVR ISP&lt;br /&gt;
&lt;br /&gt;
== Shield ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur1.png|gauche|vignette|352x352px]]&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur.png|gauche|vignette|352x352px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur 3.png|gauche|vignette|790x790px]]&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;
[[Fichier:Code 4 de l'ordonnanceur.png|gauche|vignette|753x753px]]&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;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Code 5 de l'ordonnenceur.png|gauche|vignette|462x462px]]&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;
&lt;br /&gt;
[[Fichier:Code 6 de l'ordonnenceur.png|gauche|vignette|482x482px]]&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;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Vidéo test de l'ordonnenceur.mov|gauche|vignette]]&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8565</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8565"/>
		<updated>2025-12-05T12:39:32Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;Présentation projet&amp;lt;/big&amp;gt;  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Code source&amp;lt;/big&amp;gt; ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CARTE SON ==&lt;br /&gt;
La première étape est de réaliser le schema et le routage de notre carte. &lt;br /&gt;
&lt;br /&gt;
Pour notre carte, nous avons pris comme composants :&lt;br /&gt;
&lt;br /&gt;
* Un microphone&lt;br /&gt;
* Un microprocesseur &lt;br /&gt;
* Un haut parleur &lt;br /&gt;
* Un USB données et alimentation&lt;br /&gt;
* AVR ISP&lt;br /&gt;
&lt;br /&gt;
== Shield ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur1.png|gauche|vignette|352x352px]]&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur.png|gauche|vignette|352x352px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur 3.png|gauche|vignette|790x790px]]&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;
[[Fichier:Code 4 de l'ordonnanceur.png|gauche|vignette|753x753px]]&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;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Code 5 de l'ordonnenceur.png|gauche|vignette|462x462px]]&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;
&lt;br /&gt;
[[Fichier:Code 6 de l'ordonnenceur.png|gauche|vignette|482x482px]]&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;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Vidéo test de l'ordonnenceur.mov|gauche|vignette]]&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8564</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8564"/>
		<updated>2025-12-05T12:37:48Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;Présentation projet&amp;lt;/big&amp;gt;  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Code source&amp;lt;/big&amp;gt; ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CARTE SON ==&lt;br /&gt;
La première étape est de réaliser le schema et le routage de notre carte. &lt;br /&gt;
&lt;br /&gt;
Pour notre carte, nous avons pris comme composants :&lt;br /&gt;
&lt;br /&gt;
* Un microphone&lt;br /&gt;
* Un microprocesseur &lt;br /&gt;
* Un haut parleur &lt;br /&gt;
* Un USB données et alimentation&lt;br /&gt;
* AVR ISP&lt;br /&gt;
&lt;br /&gt;
== Shield ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur1.png|gauche|vignette|352x352px]]&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur.png|gauche|vignette|352x352px]]&lt;br /&gt;
[[Fichier:Vidéo test de l'ordonnenceur.mov|vignette]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur 3.png|gauche|vignette|790x790px]]&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;
[[Fichier:Code 4 de l'ordonnanceur.png|gauche|vignette|753x753px]]&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;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Code 5 de l'ordonnenceur.png|gauche|vignette|462x462px]]&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;
&lt;br /&gt;
[[Fichier:Code 6 de l'ordonnenceur.png|gauche|vignette|482x482px]]&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Vid%C3%A9o_test_de_l%27ordonnenceur.mov&amp;diff=8563</id>
		<title>Fichier:Vidéo test de l'ordonnenceur.mov</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Vid%C3%A9o_test_de_l%27ordonnenceur.mov&amp;diff=8563"/>
		<updated>2025-12-05T12:36:39Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;vidéo du fonctionnement du code de l'ordonnenceur&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8562</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8562"/>
		<updated>2025-12-05T12:32:21Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;Présentation projet&amp;lt;/big&amp;gt;  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Code source&amp;lt;/big&amp;gt; ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CARTE SON ==&lt;br /&gt;
La première étape est de réaliser le schema et le routage de notre carte. &lt;br /&gt;
&lt;br /&gt;
Pour notre carte, nous avons pris comme composants :&lt;br /&gt;
&lt;br /&gt;
* Un microphone&lt;br /&gt;
* Un microprocesseur &lt;br /&gt;
* Un haut parleur &lt;br /&gt;
* Un USB données et alimentation&lt;br /&gt;
* AVR ISP&lt;br /&gt;
&lt;br /&gt;
== Shield ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur1.png|gauche|vignette|352x352px]]&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur.png|gauche|vignette|352x352px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;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;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur 3.png|gauche|vignette|790x790px]]&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;
[[Fichier:Code 4 de l'ordonnanceur.png|gauche|vignette|753x753px]]&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;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Code 5 de l'ordonnenceur.png|gauche|vignette|462x462px]]&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;
&lt;br /&gt;
[[Fichier:Code 6 de l'ordonnenceur.png|gauche|vignette|482x482px]]&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_6_de_l%27ordonnenceur.png&amp;diff=8561</id>
		<title>Fichier:Code 6 de l'ordonnenceur.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_6_de_l%27ordonnenceur.png&amp;diff=8561"/>
		<updated>2025-12-05T12:31:55Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;sixième code de l'ordonnenceur&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_5_de_l%27ordonnenceur.png&amp;diff=8560</id>
		<title>Fichier:Code 5 de l'ordonnenceur.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_5_de_l%27ordonnenceur.png&amp;diff=8560"/>
		<updated>2025-12-05T12:26:51Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;cinquième partie du code de l'ordonnanceur&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_4_de_l%27ordonnanceur.png&amp;diff=8559</id>
		<title>Fichier:Code 4 de l'ordonnanceur.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_4_de_l%27ordonnanceur.png&amp;diff=8559"/>
		<updated>2025-12-05T12:22:14Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;quatrième partie du code de l'ordonnanceur&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8558</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8558"/>
		<updated>2025-12-05T11:59:00Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;Présentation projet&amp;lt;/big&amp;gt;  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Code source&amp;lt;/big&amp;gt; ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CARTE SON ==&lt;br /&gt;
La première étape est de réaliser le schema et le routage de notre carte. &lt;br /&gt;
&lt;br /&gt;
Pour notre carte, nous avons pris comme composants :&lt;br /&gt;
&lt;br /&gt;
* Un microphone&lt;br /&gt;
* Un microprocesseur &lt;br /&gt;
* Un haut parleur &lt;br /&gt;
* Un USB données et alimentation&lt;br /&gt;
* AVR ISP&lt;br /&gt;
&lt;br /&gt;
== Shield ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur1.png|gauche|vignette|352x352px]]&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur.png|gauche|vignette|352x352px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_de_l%27ordonnanceur_3.png&amp;diff=8557</id>
		<title>Fichier:Code de l'ordonnanceur 3.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_de_l%27ordonnanceur_3.png&amp;diff=8557"/>
		<updated>2025-12-05T11:48:04Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;troisième Code de l'ordonnanceur&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8556</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8556"/>
		<updated>2025-12-05T11:44:23Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Ordonnanceur / Système d'exploitation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;Présentation projet&amp;lt;/big&amp;gt;  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Code source&amp;lt;/big&amp;gt; ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CARTE SON ==&lt;br /&gt;
La première étape est de réaliser le schema et le routage de notre carte. &lt;br /&gt;
&lt;br /&gt;
Pour notre carte, nous avons pris comme composants :&lt;br /&gt;
&lt;br /&gt;
* Un microphone&lt;br /&gt;
* Un microprocesseur &lt;br /&gt;
* Un haut parleur &lt;br /&gt;
* Un USB données et alimentation&lt;br /&gt;
* AVR ISP&lt;br /&gt;
&lt;br /&gt;
== Shield ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur1.png|gauche|vignette|352x352px]]&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur.png|gauche|vignette|352x352px]]&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_de_l%27ordonnanceur.png&amp;diff=8555</id>
		<title>Fichier:Code de l'ordonnanceur.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_de_l%27ordonnanceur.png&amp;diff=8555"/>
		<updated>2025-12-05T11:27:44Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Deuxieme partie du code de l'ordonnanceur&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8554</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8554"/>
		<updated>2025-12-05T11:24:26Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;Présentation projet&amp;lt;/big&amp;gt;  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Code source&amp;lt;/big&amp;gt; ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CARTE SON ==&lt;br /&gt;
La première étape est de réaliser le schema et le routage de notre carte. &lt;br /&gt;
&lt;br /&gt;
Pour notre carte, nous avons pris comme composants :&lt;br /&gt;
&lt;br /&gt;
* Un microphone&lt;br /&gt;
* Un microprocesseur &lt;br /&gt;
* Un haut parleur &lt;br /&gt;
* Un USB données et alimentation&lt;br /&gt;
* AVR ISP&lt;br /&gt;
&lt;br /&gt;
== Shield ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:PicoShield - schema vue3D SE4-2025 G4.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
![[Fichier:PicoShield pcb schema routage se4 pico 4 2025.png|vignette|PicoShield - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D se4 pico 4 2025.png|vignette|PicoShield - schema vue3D SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:PicoShield pcb schema vue3D verso se4 pico 4 2025.png|vignette|PicoShield - schema vue3D  SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== '''Carte Son''' ==&lt;br /&gt;
&lt;br /&gt;
==== Réalisation ====&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
![[Fichier:SoundCard pcb electrical se4 pico 4 2025.png|alt=PicoShield - schema électrique SE4-2025|centré|vignette|Carte son - schema electrique SE4-2025 G4]]&lt;br /&gt;
![[Fichier:SoundCard pcb schema se4 pico 4 2025.png|alt=Carte son - schema routage SE4-2025 G4|vignette|Carte son - schema routage SE4-2025 G4]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:SoundCard pcb se4 pico 4 2025.png|alt=Carte son - schema vue3D recto SE4-2025 G4|vignette|Carte son - schema vue3D recto SE4-2025 G4]]&lt;br /&gt;
|[[Fichier:SoundCard pcb verso se4 pico 4 2025.png|alt=Carte son - schema vue3D verso SE4-2025 G4|vignette|Carte son - schema vue3D verso SE4-2025 G4]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== '''Ordonnanceur / Système d'exploitation''' ==&lt;br /&gt;
Le code implémente un '''mini ordonnanceur préemptif''' sur Arduino, qui alterne deux tâches toutes les 20 ms grâce à un timer et à son ISR.&lt;br /&gt;
&lt;br /&gt;
Chaque tâche a sa propre pile et son contexte CPU.&lt;br /&gt;
[[Fichier:Code de l'ordonnanceur1.png|gauche|vignette|352x352px]]&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_de_l%27ordonnanceur1.png&amp;diff=8553</id>
		<title>Fichier:Code de l'ordonnanceur1.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_de_l%27ordonnanceur1.png&amp;diff=8553"/>
		<updated>2025-12-05T11:21:19Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Première partie du code de l'ordonnanceur&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_ordonnenceur_1.png&amp;diff=8551</id>
		<title>Fichier:Code ordonnenceur 1.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Code_ordonnenceur_1.png&amp;diff=8551"/>
		<updated>2025-12-05T11:09:33Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Premier partie du code&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2025-11-03_235306.png&amp;diff=8349</id>
		<title>Fichier:Capture d'écran 2025-11-03 235306.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Capture_d%27%C3%A9cran_2025-11-03_235306.png&amp;diff=8349"/>
		<updated>2025-11-03T23:02:40Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schematic&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8269</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8269"/>
		<updated>2025-10-24T11:52:50Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''&amp;lt;big&amp;gt;Carte Son&amp;lt;/big&amp;gt;''' pour un pico ordinateur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;big&amp;gt;Présentation projet&amp;lt;/big&amp;gt;  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;big&amp;gt;Code source&amp;lt;/big&amp;gt; ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CARTE SON ==&lt;br /&gt;
La première étape est de réaliser le schema et le routage de notre carte. ............&lt;br /&gt;
&lt;br /&gt;
Pour notre carte, nous avons pris comme composants :&lt;br /&gt;
&lt;br /&gt;
* Un microphone&lt;br /&gt;
* Un microprocesseur &lt;br /&gt;
* Un haut parleur &lt;br /&gt;
* Un USB données et alimentation&lt;br /&gt;
* AVR ISP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Schématique, Routage et vue 3D&amp;lt;/big&amp;gt;'''[[Fichier:test.pdf|left|600px|alt=Schema_carte_son|vignette|Schema carte son]]&lt;br /&gt;
[[Fichier:soundCardTest.png|right|800px|alt=Sound Card 3D|vignette|Sound Card3D]]&lt;br /&gt;
[[Fichier:Screenshot 2025-10-24 13-27-08.png|gauche|vignette|705x705px]]&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tests Réalisés ==&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Screenshot_2025-10-24_13-27-08.png&amp;diff=8268</id>
		<title>Fichier:Screenshot 2025-10-24 13-27-08.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Screenshot_2025-10-24_13-27-08.png&amp;diff=8268"/>
		<updated>2025-10-24T11:35:48Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Carte son - Schematic editor&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8267</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8267"/>
		<updated>2025-10-24T11:32:57Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : /* Schématique et vue 3D */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''''&amp;lt;u&amp;gt;Carte Son&amp;lt;/u&amp;gt;'' pour un pico ordinateur'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Présentation projet  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code source ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pico Shield ==&lt;br /&gt;
La première étape est de réaliser …&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
&lt;br /&gt;
=== Composants ===&lt;br /&gt;
Afin de réaliser notre ..., nous utilisons les composants suivants :&lt;br /&gt;
&lt;br /&gt;
- Puce ATMega328-A en tant que microprocesseur&lt;br /&gt;
- ...&lt;br /&gt;
- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schématique et vue 3D ====&lt;br /&gt;
[[Fichier:test.pdf|left|600px|alt=Schema_carte_son|vignette|Schema carte son]]&lt;br /&gt;
[[Fichier:soundCardTest.png|right|800px|alt=Sound Card 3D|vignette|Sound Card3D]]&lt;br /&gt;
[[Fichier:Carte son- Schematic editor.png|vignette]]&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tests Réalisés ==&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_son-_Schematic_editor.png&amp;diff=8266</id>
		<title>Fichier:Carte son- Schematic editor.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_son-_Schematic_editor.png&amp;diff=8266"/>
		<updated>2025-10-24T11:31:07Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;La photo désigne le schema de notre carte son&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8256</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8256"/>
		<updated>2025-10-21T21:25:13Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''''&amp;lt;u&amp;gt;Carte Son&amp;lt;/u&amp;gt;'' pour un pico ordinateur'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Présentation projet  ==&lt;br /&gt;
Dans ce projet, il est question pour nous de réaliser un pico ordinateur composé de différentes cartes fille. Notre groupe avait donc la responsabilité de réaliser la carte son du pico ordinateur.&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Code source ===&lt;br /&gt;
Pour suivre l'avancée du travail, les fichiers seront déposés sur le repo suivant : [https://gitea.plil.fr/vsouopme/SE4-PICO-B4.git SE4-PICO-B4.] &lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pico Shield ==&lt;br /&gt;
La première étape est de réaliser …&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hardware ===&lt;br /&gt;
&lt;br /&gt;
=== Composants ===&lt;br /&gt;
Afin de réaliser notre ..., nous utilisons les composants suivants :&lt;br /&gt;
&lt;br /&gt;
- Puce ATMega328-A en tant que microprocesseur&lt;br /&gt;
- ...&lt;br /&gt;
- ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Schématique et vue 3D ====&lt;br /&gt;
[[Fichier:test.pdf|left|600px|alt=Schema_carte_son|vignette|Schema carte son]]&lt;br /&gt;
[[Fichier:soundCardTest.png|right|800px|alt=Sound Card 3D|vignette|Sound Card3D]]&lt;br /&gt;
&amp;lt;p style=&amp;quot;clear: both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tests Réalisés ==&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8229</id>
		<title>SE4Binome2025-4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2025-4&amp;diff=8229"/>
		<updated>2025-10-11T14:29:02Z</updated>

		<summary type="html">&lt;p&gt;Vsouopme : Page créée avec « '''''&amp;lt;u&amp;gt;Carte Son&amp;lt;/u&amp;gt;'' pour un pico-ordinateur''' »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''''&amp;lt;u&amp;gt;Carte Son&amp;lt;/u&amp;gt;'' pour un pico-ordinateur'''&lt;/div&gt;</summary>
		<author><name>Vsouopme</name></author>
	</entry>
</feed>