<?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=Lderycke</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=Lderycke"/>
	<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Lderycke"/>
	<updated>2026-05-14T05:53:23Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2770</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2770"/>
		<updated>2024-01-16T11:06:19Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Résultats et axes d'amélioration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur. Cette vérification de compteur se fait dans la fonction scheduler on modifie un peu alors la fonction.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait(uint8_t reason, uint16_t data){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = reason;&lt;br /&gt;
    sleep.data = data;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    for(int i=0; i&amp;lt;NB_TASK; i++){&lt;br /&gt;
        if(task[i].state == SLEEP &amp;amp;&amp;amp; task[i].sleep.reason == DELAY_SLEEPING){&lt;br /&gt;
            &lt;br /&gt;
            // Récupérer la différence de temps&lt;br /&gt;
            uint16_t difftime_ms = 20;&lt;br /&gt;
            if(TCNT1 != 0){&lt;br /&gt;
                difftime_ms = TCNT1*200/OCR1A/10; // On multiplie par 10 pour ne pas avoir de problème avec les nombres flottants&lt;br /&gt;
                TCNT1 = 0;&lt;br /&gt;
            }&lt;br /&gt;
            task[i].sleep.data -= difftime_ms;&lt;br /&gt;
            &lt;br /&gt;
            if(task[i].sleep.data &amp;lt;= 0){&lt;br /&gt;
                task[i].state = AWAKE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    do{&lt;br /&gt;
        currentTask ++;&lt;br /&gt;
        if(currentTask &amp;gt;= NB_TASK) currentTask = 0; // Attention si tous les processus sont à l'arrêt&lt;br /&gt;
    }while(task[currentTask].state == SLEEP);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
Ayant voulu nous concentrer sur notre carte électronique clavier afin d'obtenir un périphérique (quasiment) parfaitement opérationnel, nous ne nous sommes pas attardés sur la carte FPGA en VHDL et ne l'avons pas entamé.&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ensemble de nos fichiers sont disponible dans notre [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git git].&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version des deux boutons (ici on prend l'exemple du reset) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation et familiarisation SPI en amont==&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes familiariser avec le SPI avant de se lancer sur notre carte.&lt;br /&gt;
Nous essayons donc d'utiliser l'afficheur 7 segments pour faire un compteur.&lt;br /&gt;
&lt;br /&gt;
Tout d'abord il faut initialiser le SPI. En modifiant certains registres nous permettons à notre carte mère d'utiliser le SPI. Attention à bien mettre la borche SS de base (même si dans notre application elle n'est pas utilisée) en sortie sinon le SPI ne fonctionne pas.&lt;br /&gt;
&lt;br /&gt;
Ensuite en lisant la datasheet de l'afficheur 7 segments on comprend qu'il est assez simple à utiliser et son fonctionnement est basé uniquement sur des instructions séquentielles en SPI. Attention vitesse de travail max 250kHz soit la clock de l'atmega diviser par au minimum 64. On se sert de ce tableau qui nous sera aussi très utile plus tard.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Tableau clockAtmega.png|centré|sans_cadre|800x800px]]&lt;br /&gt;
&lt;br /&gt;
L'exemple de suite d'instruction suivant permet d'afficher un compteur. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void Write7Segment(){&lt;br /&gt;
    counter = 0;&lt;br /&gt;
    initSPI();&lt;br /&gt;
    while(1){&lt;br /&gt;
        //Calcul&lt;br /&gt;
        counter++;&lt;br /&gt;
        if (counter &amp;gt; 9999) counter = 0;&lt;br /&gt;
        uint8_t digit1 = counter/1000;&lt;br /&gt;
        uint8_t digit2 = (counter - digit1*1000) / 100;&lt;br /&gt;
        uint8_t digit3 = (counter - digit1*1000 - digit2*100) / 10;&lt;br /&gt;
        uint8_t digit4 = (counter - digit1*1000 - digit2*100 - digit3*10);&lt;br /&gt;
&lt;br /&gt;
        selectSlaveSPI(&amp;amp;PORTC, SS3);&lt;br /&gt;
        transferSPI(0x76);&lt;br /&gt;
        transferSPI(digit1);&lt;br /&gt;
        transferSPI(digit2);&lt;br /&gt;
        transferSPI(digit3);&lt;br /&gt;
        transferSPI(digit4);&lt;br /&gt;
        wait(DELAY_SLEEPING, 100);&lt;br /&gt;
        unselectSlaveSPI(&amp;amp;PORTC, SS3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Test à 500kHz: &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Compteur_500kHz_rduhr.mp4|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Test à 250kHz:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Compteur 250kHz 3 rduhr.mp4|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Test à 125kHz: &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Compteur_125kHz_2_rduhr.mp4|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
A 500kHz ça ne fonctionne pas logique !&lt;br /&gt;
Par contre on peut voir que curieusement le comportement est différent à une vitesse plus faible. Il parait logique qu'à une vitesse trop élevée il peut apparaitre certains bugs mais à plus faible vitesse cela reste un mystère pour nous... La vitesse de transmission viendra d'ailleurs nous poser beaucoup d'interrogation dans la suite de ce projet nottament certains bugs pour récupérer les touches de notre clavier.&lt;br /&gt;
&lt;br /&gt;
==Programmation de la carte==&lt;br /&gt;
&lt;br /&gt;
A l'aide de la LUFA et de leur démo &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt;, nous allons tenter de reconnaître les touches tapés sur un clavier. Pour vérifier cela et débuggé notre code, nous avons ajouté 8 LEDs de tests destinés à afficher la valeur binaire des caractère ASCII correspondant.&lt;br /&gt;
&lt;br /&gt;
Pour ce faire dans le fichier de démo lufa, nous avons implémenté la conversion des keycodes en caractères ascii. Il a été plus simple pour nous de convertion en utilisant le layout anglais qwerty. Il a donc fallu effectué une conversion également pour certaines touches afin de passer de qwerty à azerty. Pour finir nous considérons que de base les clés sont celles du bas lowerKey abcd. Si un événement vient mettre le drapeau upper (mode majuscule) à 1 alors nous passons sur les upperkey ABCD.&lt;br /&gt;
&lt;br /&gt;
On se base sur ce layout: &lt;br /&gt;
[[Fichier:Layout qwerty 3 rduhr.png|néant|vignette]]&lt;br /&gt;
On effectue la conversion pour ce layout:&lt;br /&gt;
[[Fichier:Layout azerty rduhr.png|néant|vignette]]&lt;br /&gt;
&lt;br /&gt;
A l'aide de son keycode nous avons codé la mise en place du mode majuscule grâce au capslock.&lt;br /&gt;
Nous pouvons maintenant recevoir sur notre carte les caractères classiques (a à z, 0 à 9, espace, entrée, tabulation...)&lt;br /&gt;
&lt;br /&gt;
Après quelques complications sur la recherche des keycodes (vive la lufa !) nous pouvons également désormais activer le mode majuscule avec les touches shift droite et gauche. Nous avons également rajouté la possibilité de taper les caractères spéciaux associés aux nombres et à droite du clavier. Malheureusement, les caractères ¨, µ, £ et § n'étant pas présent dans la table ASCII, ils ne seront pas disponible sur notre clavier.&lt;br /&gt;
&lt;br /&gt;
Grâce aux leds et à convertisseur ascii nous vérifions que la reconnaissance des touches est bonne.&lt;br /&gt;
[[Fichier:Test leds rduhr.mp4|vignette|néant]]&lt;br /&gt;
&lt;br /&gt;
les fonctions pour les leds et pour le reste de notre projet se trouvent dans le fichier inout.c afin de ne pas surcharger le fichier keyboardHost.&lt;br /&gt;
&lt;br /&gt;
Nous souhaitons ensuite communiquer avec la carte mère par le bus SPI. Nous vérifions donc que nous réussissons à lancer une interruption spi sur la carte fille.&lt;br /&gt;
Nous vérifions également que nore carte fille peut envoyer une interruption par la ligne d'interruption du connecteur HE10. Cette ligne servira plus tard à indiquer qu'il y a des touches dans le buffer et qu'il faut que la carte mère interroge notre carte dès que possible. &lt;br /&gt;
&lt;br /&gt;
Ensuite à l'aide d'un switch nous décodons l'instructions reçu lors d'une interruption SPI.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
ISR(SPI_STC_vect) {&lt;br /&gt;
    cli();&lt;br /&gt;
    uint8_t receivedData = SPDR;&lt;br /&gt;
    switch (receivedData){&lt;br /&gt;
        case 0x00: &lt;br /&gt;
            SPDR = 0x01;&lt;br /&gt;
            break;&lt;br /&gt;
        case 0x01:&lt;br /&gt;
            if(!sizeSendFlag){&lt;br /&gt;
                SPDR = sizeBuffer();&lt;br /&gt;
                sizeSendFlag = 1;&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            SPDR = dequeue();&lt;br /&gt;
            if(!sizeBuffer()){&lt;br /&gt;
                setLowOutput(&amp;amp;PORTB, INT);&lt;br /&gt;
                sizeSendFlag = 0;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            SPDR = dequeue();&lt;br /&gt;
            if(!sizeBuffer()){&lt;br /&gt;
                setLowOutput(&amp;amp;PORTB, INT);&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    sei();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3 instructions possibles : &lt;br /&gt;
* 0x00, nous envoyons 0x01 correspondant à notre type (clavier).&lt;br /&gt;
* 0x01, nous envoyons d'abord le nombre de touche dans le buffer puis nous envoyons à chaque nouvelle requète la dernière touche du buffer.&lt;br /&gt;
* toutes autres instructions, nous envoyons la dernière clé du buffer.&lt;br /&gt;
Lorsqu'on dépile on vérifie si le buffer n'est pas vide. S'il l'est on remet à bas notre ligne d'interruption.&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons en plus un buffer géré en FIFO. Celui-ci retient les clés tapées la tête de buffer et la queue. Retenir la tête et la queue et la faire bouger nous permet de limiter les opérations. Autrement il aurait fallu décaler toutes les clés dans le buffer en cas de dequeue ou enqueue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
uint8_t isEmpty(){&lt;br /&gt;
    return buffer.head == -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t isFull() {&lt;br /&gt;
    return (buffer.tail + 1) % MAX_DATA == buffer.head;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t sizeBuffer(){&lt;br /&gt;
    if(isEmpty()) return 0;&lt;br /&gt;
    if(buffer.tail &amp;lt; buffer.head)&lt;br /&gt;
        return MAX_DATA - (buffer.head - buffer.tail) + 1;&lt;br /&gt;
    return buffer.tail - buffer.head + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void enqueue(char key){&lt;br /&gt;
    if (isFull()) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    buffer.tail = (buffer.tail + 1) % MAX_DATA;&lt;br /&gt;
    buffer.data[buffer.tail] = key;&lt;br /&gt;
    if (isEmpty()) {&lt;br /&gt;
        buffer.head = 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char dequeue(){&lt;br /&gt;
    if (isEmpty()) {&lt;br /&gt;
        return 0x00;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    char key = buffer.data[buffer.head];&lt;br /&gt;
&lt;br /&gt;
    if (buffer.head == buffer.tail) {&lt;br /&gt;
        // Le buffer est maintenant vide&lt;br /&gt;
        buffer.head = -1;&lt;br /&gt;
        buffer.tail = -1;&lt;br /&gt;
    } else {&lt;br /&gt;
        buffer.head = (buffer.head + 1) % MAX_DATA;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return key;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin nous ajoutons une fonction qui permet de connaître la taille de la FIFO.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
uint8_t sizeBuffer(){&lt;br /&gt;
    if(isEmpty()) return 0;&lt;br /&gt;
    if(buffer.tail &amp;lt; buffer.head)&lt;br /&gt;
        return MAX_DATA - (buffer.head - buffer.tail) + 1;&lt;br /&gt;
    return buffer.tail - buffer.head + 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos leds de test ici s'avèrent très pratique et nous permettent entre autre de vérifier notre fonction de taille de buffer.&lt;br /&gt;
&lt;br /&gt;
==Primitive carte mère==&lt;br /&gt;
&lt;br /&gt;
Afin de simplifier l'utilisation de notre carte fille nous avons codé différentes primitives pour la carte mère elles se retrouvent toutes dans la librairie libdevice que nous avons testé sur notre carte mère à nous. Pour le groupe s'occuppant de la carte mère il suffira donc d'inclure cette librairie et d'utiliser les fonctions à sa guise (attention par contre à adapter les broches dans le .h).&lt;br /&gt;
&lt;br /&gt;
note : la librairie est compilé par son propre makefile.&lt;br /&gt;
&lt;br /&gt;
====device.c/.h====&lt;br /&gt;
&lt;br /&gt;
Ce fichier n'est pas spécifique à notre carte et peut être utilisé par toutes les autres cartes filles.&lt;br /&gt;
&lt;br /&gt;
il comporte tout d'abord les fonctions de gestion de spi: &lt;br /&gt;
* initSPI: initialise la transmission SPI. Attention à adapter les ports d'entrées et de sortie à la carte mère utilisée.&lt;br /&gt;
* selectSlaveSPI / unselectSlaveSPI: sélectionne/désélectionne le périphérique à qui transmettre l'info.&lt;br /&gt;
* transferSPI: envoie et récupère l'information sur le bus SPI.&lt;br /&gt;
&lt;br /&gt;
Par la suite nous ajoutons une seconde couche plus spécifique à notre application. Elle repose sur le typage de chaque composant exemple pour notre clavier le type est 0x01:&lt;br /&gt;
* initConnectorsList: crée une liste nous permettant de sauvegarder des informations sur les connecteurs (leurs brochese et leur périphérique attaché). De plus cette fonction vient sonder chaque He10 afin de connaître le périphérique attaché permettant d'être plus modulaire leur de la connexion.&lt;br /&gt;
* indexDevice: renvoie l'index du périphérique recherché.&lt;br /&gt;
* transferDataTo: se sert de indexDevice et des fonctions spi pour envoyer une données à un périphérique en particulier.&lt;br /&gt;
* checkInterrupt: vient sonder un périphérique pour savoir si sa ligne d'interruption est à l'état haut.&lt;br /&gt;
&lt;br /&gt;
Pour nous simplifier la tâche on code des fonctions utilent comme getDeviceList qui renvoie une liste du type de chaque périphérique et initDevice qui initialise le SPI et la liste des périphériques.&lt;br /&gt;
&lt;br /&gt;
====keyboard.c/.h====&lt;br /&gt;
&lt;br /&gt;
Ce fichier quant à lui est spécifique à notre périphérique et se base sur device.c.&lt;br /&gt;
&lt;br /&gt;
Il permet à la carte mère de récupérer une clé à l'aide de grabKey. La récupération de plusieurs clés et aussi possible grâce à grabKeys pour se faire nous récupérons d'abord la taille du tableau comprenant les clés pour allouer de l'espace et savoir le nombre de requète spi à effectuer. Cela est fait grâce à bufferSize.&lt;br /&gt;
&lt;br /&gt;
==Résultats et axes d'amélioration==&lt;br /&gt;
Le projet pico-ordinateur nous a permis d'expérimenter une fois de plus la gestion d'un projet liant électronique et informatique embarquée. Dans notre cas, nous nous sommes concentrer sur le clavier de l'ordinateur, que nous pourrons considérer comme quasiment fonctionnel quoiqu'un peut perfectible. En effet, nous avons remarqué certains décalage de touches sur le gestionnaire minicom. Ces décalages sont présent, d'après nous, suite à un problème de gestion de la connexion SPI. Nous n'avons pas eu le temps de résoudre ce problème, et cela aurait pu être un axe d'amélioration de notre projet. Nous n'avons également pas pu vérifier la compatibilité et la bonne gestion de notre clavier directement sur la carte mère du binôme concerné. Nous aurions pu, pour s'assurer du bon fonctionnement de la liaison entre cartes clavier, mère et écran, afficher les caractères tapés au clavier. Cependant, notre clavier a lui tout seul permet tout de même d'écrire à une fréquence correcte les caractères souhaités.&lt;br /&gt;
&lt;br /&gt;
= Références utiles =&lt;br /&gt;
Lien du git : [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git git].&lt;br /&gt;
&lt;br /&gt;
Lien Lufa pour retrouver l'ensemble des keycodes : [http://fourwalledcubicle.com/files/LUFA/Doc/151115/html/group___group___u_s_b_class_h_i_d_common.html Vive la lufa]&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2557</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2557"/>
		<updated>2023-12-21T08:09:57Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Carte électronique numérique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
Ayant voulu nous concentrer sur notre carte électronique clavier afin d'obtenir un périphérique (quasiment) parfaitement opérationnel, nous ne nous sommes pas attardés sur la carte FPGA en VHDL et ne l'avons pas entamé.&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ensemble de nos fichiers sont disponible dans notre [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git git].&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version des deux boutons (ici on prend l'exemple du reset) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation de la carte==&lt;br /&gt;
&lt;br /&gt;
A l'aide de la LUFA et de leur démo &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt;, nous allons tenter de reconnaître les touches tapés sur un clavier. Pour vérifier cela et débuggé notre code, nous avons ajouté 8 LEDs de tests destinés à afficher la valeur binaire des caractère ASCII correspondant. Après quelques problèmes de conversion entre qwerty et azerty, nous pouvons maintenant recevoir sur notre carte les caractères classiques (a à z, 0 à 9, espace, entrée, tabulation...) et nous pouvons même passer les lettres en majuscule à l'aide de la touche verrouille maj. Voici ci-dessous une parti du code de &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void processKeyUp(uint8_t KeyCode){&lt;br /&gt;
	clearLeds();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void processKeyDown(uint8_t KeyCode, uint8_t Modifier){&lt;br /&gt;
	&lt;br /&gt;
	char PressedKey = 0;&lt;br /&gt;
&lt;br /&gt;
	if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
	}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '0';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = ' ';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '\n';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_TAB){&lt;br /&gt;
		PressedKey = '\t';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_DELETE){&lt;br /&gt;
		PressedKey = 0x7f;&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = 'M';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_CAPS_LOCK)&lt;br /&gt;
	{&lt;br /&gt;
		if(upper){&lt;br /&gt;
			upper = 0;&lt;br /&gt;
		}else {&lt;br /&gt;
			upper = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1)){&lt;br /&gt;
		PressedKey = 0xff;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Qwerty to Azerty&lt;br /&gt;
	switch (PressedKey) {&lt;br /&gt;
		case 'A':&lt;br /&gt;
			PressedKey = 'Q';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Z':&lt;br /&gt;
			PressedKey = 'W';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Q':&lt;br /&gt;
			PressedKey = 'A';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'W':&lt;br /&gt;
			PressedKey = 'Z';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'M':&lt;br /&gt;
			PressedKey = ',';&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Maj&lt;br /&gt;
		&lt;br /&gt;
	if (upper == 0){&lt;br /&gt;
		if((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
			PressedKey = PressedKey + 0x20;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	printLeds(PressedKey);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons également désormais activer le mode majuscule avec les touches shift droite et gauche. Nous avons également rajouté la possibilité de taper les caractères spéciaux associés aux nombres et à droite du clavier. Malheureusement, les caractères ¨, µ, £ et § n'étant pas présent dans la table ASCII, ils ne seront pas disponible sur notre clavier. Les accents tels que é, è, à, ù et ç ont été remplacé par la lettre de base (e, a, u, c).&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant devoir retenir les dernières touches tapées dans un buffer. En effet, en cas de freeze de la machine, il est tout de même nécessaire de se rappeler de la suite de touche tapée par l'utilisateur. Pour ce faire, nous avons créé une structure &amp;lt;code&amp;gt;buffer_t&amp;lt;/code&amp;gt;, contenant un tableau de touches &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, l'index de la dernière touche tapée &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; et l'index de la première touche tapée &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. A chaque appel au clavier par la carte mère, nous envoyons la touche présente à l'index &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; et nous la décalons de 1, en suivant en quelque sorte la technique FIFO. De cette manière, en ayant un tableau assez grand, on est capable de retenir un bon nombre de touches tapées par l'utilisateur et de les retenir en cas de problème.&lt;br /&gt;
&lt;br /&gt;
Dans la continuité du TP, une interruption est envoyé à la carte mère et le calcul du nombre de touche stocké se fait par la primitive &amp;lt;code&amp;gt;sizeBuffer()&amp;lt;/code&amp;gt;. Pour vérifier le bon fonctionnement de cette méthode, nous envoyons une interruption faisant clignoter la LED du connecteur HE10 relié à notre carte clavier uniquemet lorsque le buffer atteint une taille égal 3.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2556</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2556"/>
		<updated>2023-12-21T08:08:43Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Carte FPGA / VHDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
Ayant voulu nous concentrer sur notre carte électronique clavier afin d'obtenir un périphérique (quasiment) parfaitement opérationnel, nous ne nous sommes pas attardés sur la carte FPGA en VHDL et ne l'avons pas entamé.&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version des deux boutons (ici on prend l'exemple du reset) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation de la carte==&lt;br /&gt;
&lt;br /&gt;
A l'aide de la LUFA et de leur démo &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt;, nous allons tenter de reconnaître les touches tapés sur un clavier. Pour vérifier cela et débuggé notre code, nous avons ajouté 8 LEDs de tests destinés à afficher la valeur binaire des caractère ASCII correspondant. Après quelques problèmes de conversion entre qwerty et azerty, nous pouvons maintenant recevoir sur notre carte les caractères classiques (a à z, 0 à 9, espace, entrée, tabulation...) et nous pouvons même passer les lettres en majuscule à l'aide de la touche verrouille maj. Voici ci-dessous une parti du code de &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void processKeyUp(uint8_t KeyCode){&lt;br /&gt;
	clearLeds();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void processKeyDown(uint8_t KeyCode, uint8_t Modifier){&lt;br /&gt;
	&lt;br /&gt;
	char PressedKey = 0;&lt;br /&gt;
&lt;br /&gt;
	if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
	}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '0';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = ' ';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '\n';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_TAB){&lt;br /&gt;
		PressedKey = '\t';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_DELETE){&lt;br /&gt;
		PressedKey = 0x7f;&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = 'M';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_CAPS_LOCK)&lt;br /&gt;
	{&lt;br /&gt;
		if(upper){&lt;br /&gt;
			upper = 0;&lt;br /&gt;
		}else {&lt;br /&gt;
			upper = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1)){&lt;br /&gt;
		PressedKey = 0xff;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Qwerty to Azerty&lt;br /&gt;
	switch (PressedKey) {&lt;br /&gt;
		case 'A':&lt;br /&gt;
			PressedKey = 'Q';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Z':&lt;br /&gt;
			PressedKey = 'W';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Q':&lt;br /&gt;
			PressedKey = 'A';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'W':&lt;br /&gt;
			PressedKey = 'Z';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'M':&lt;br /&gt;
			PressedKey = ',';&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Maj&lt;br /&gt;
		&lt;br /&gt;
	if (upper == 0){&lt;br /&gt;
		if((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
			PressedKey = PressedKey + 0x20;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	printLeds(PressedKey);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons également désormais activer le mode majuscule avec les touches shift droite et gauche. Nous avons également rajouté la possibilité de taper les caractères spéciaux associés aux nombres et à droite du clavier. Malheureusement, les caractères ¨, µ, £ et § n'étant pas présent dans la table ASCII, ils ne seront pas disponible sur notre clavier. Les accents tels que é, è, à, ù et ç ont été remplacé par la lettre de base (e, a, u, c).&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant devoir retenir les dernières touches tapées dans un buffer. En effet, en cas de freeze de la machine, il est tout de même nécessaire de se rappeler de la suite de touche tapée par l'utilisateur. Pour ce faire, nous avons créé une structure &amp;lt;code&amp;gt;buffer_t&amp;lt;/code&amp;gt;, contenant un tableau de touches &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, l'index de la dernière touche tapée &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; et l'index de la première touche tapée &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. A chaque appel au clavier par la carte mère, nous envoyons la touche présente à l'index &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; et nous la décalons de 1, en suivant en quelque sorte la technique FIFO. De cette manière, en ayant un tableau assez grand, on est capable de retenir un bon nombre de touches tapées par l'utilisateur et de les retenir en cas de problème.&lt;br /&gt;
&lt;br /&gt;
Dans la continuité du TP, une interruption est envoyé à la carte mère et le calcul du nombre de touche stocké se fait par la primitive &amp;lt;code&amp;gt;sizeBuffer()&amp;lt;/code&amp;gt;. Pour vérifier le bon fonctionnement de cette méthode, nous envoyons une interruption faisant clignoter la LED du connecteur HE10 relié à notre carte clavier uniquemet lorsque le buffer atteint une taille égal 3.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2335</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2335"/>
		<updated>2023-12-11T08:13:35Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version des deux boutons (ici on prend l'exemple du reset) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation de la carte==&lt;br /&gt;
&lt;br /&gt;
A l'aide de la LUFA et de leur démo &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt;, nous allons tenter de reconnaître les touches tapés sur un clavier. Pour vérifier cela et débuggé notre code, nous avons ajouté 8 LEDs de tests destinés à afficher la valeur binaire des caractère ASCII correspondant. Après quelques problèmes de conversion entre qwerty et azerty, nous pouvons maintenant recevoir sur notre carte les caractères classiques (a à z, 0 à 9, espace, entrée, tabulation...) et nous pouvons même passer les lettres en majuscule à l'aide de la touche verrouille maj. Voici ci-dessous une parti du code de &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void processKeyUp(uint8_t KeyCode){&lt;br /&gt;
	clearLeds();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void processKeyDown(uint8_t KeyCode, uint8_t Modifier){&lt;br /&gt;
	&lt;br /&gt;
	char PressedKey = 0;&lt;br /&gt;
&lt;br /&gt;
	if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
	}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '0';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = ' ';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '\n';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_TAB){&lt;br /&gt;
		PressedKey = '\t';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_DELETE){&lt;br /&gt;
		PressedKey = 0x7f;&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = 'M';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_CAPS_LOCK)&lt;br /&gt;
	{&lt;br /&gt;
		if(upper){&lt;br /&gt;
			upper = 0;&lt;br /&gt;
		}else {&lt;br /&gt;
			upper = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1)){&lt;br /&gt;
		PressedKey = 0xff;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Qwerty to Azerty&lt;br /&gt;
	switch (PressedKey) {&lt;br /&gt;
		case 'A':&lt;br /&gt;
			PressedKey = 'Q';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Z':&lt;br /&gt;
			PressedKey = 'W';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Q':&lt;br /&gt;
			PressedKey = 'A';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'W':&lt;br /&gt;
			PressedKey = 'Z';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'M':&lt;br /&gt;
			PressedKey = ',';&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Maj&lt;br /&gt;
		&lt;br /&gt;
	if (upper == 0){&lt;br /&gt;
		if((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
			PressedKey = PressedKey + 0x20;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	printLeds(PressedKey);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons également désormais activer le mode majuscule avec les touches shift droite et gauche. Nous avons également rajouté la possibilité de taper les caractères spéciaux associés aux nombres et à droite du clavier. Malheureusement, les caractères ¨, µ, £ et § n'étant pas présent dans la table ASCII, ils ne seront pas disponible sur notre clavier. Les accents tels que é, è, à, ù et ç ont été remplacé par la lettre de base (e, a, u, c).&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant devoir retenir les dernières touches tapées dans un buffer. En effet, en cas de freeze de la machine, il est tout de même nécessaire de se rappeler de la suite de touche tapée par l'utilisateur. Pour ce faire, nous avons créé une structure &amp;lt;code&amp;gt;buffer_t&amp;lt;/code&amp;gt;, contenant un tableau de touches &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, l'index de la dernière touche tapée &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; et l'index de la première touche tapée &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. A chaque appel au clavier par la carte mère, nous envoyons la touche présente à l'index &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; et nous la décalons de 1, en suivant en quelque sorte la technique FIFO. De cette manière, en ayant un tableau assez grand, on est capable de retenir un bon nombre de touches tapées par l'utilisateur et de les retenir en cas de problème.&lt;br /&gt;
&lt;br /&gt;
Dans la continuité du TP, une interruption est envoyé à la carte mère et le calcul du nombre de touche stocké se fait par la primitive &amp;lt;code&amp;gt;sizeBuffer()&amp;lt;/code&amp;gt;. Pour vérifier le bon fonctionnement de cette méthode, nous envoyons une interruption faisant clignoter la LED du connecteur HE10 relié à notre carte clavier uniquemet lorsque le buffer atteint une taille égal 3.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2334</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2334"/>
		<updated>2023-12-11T08:04:11Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version des deux boutons (ici on prend l'exemple du reset) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation de la carte==&lt;br /&gt;
&lt;br /&gt;
A l'aide de la LUFA et de leur démo &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt;, nous allons tenter de reconnaître les touches tapés sur un clavier. Pour vérifier cela et débuggé notre code, nous avons ajouté 8 LEDs de tests destinés à afficher la valeur binaire des caractère ASCII correspondant. Après quelques problèmes de conversion entre qwerty et azerty, nous pouvons maintenant recevoir sur notre carte les caractères classiques (a à z, 0 à 9, espace, entrée, tabulation...) et nous pouvons même passer les lettres en majuscule à l'aide de la touche verrouille maj. Voici ci-dessous une parti du code de &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void processKeyUp(uint8_t KeyCode){&lt;br /&gt;
	clearLeds();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void processKeyDown(uint8_t KeyCode, uint8_t Modifier){&lt;br /&gt;
	&lt;br /&gt;
	char PressedKey = 0;&lt;br /&gt;
&lt;br /&gt;
	if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
	}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '0';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = ' ';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '\n';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_TAB){&lt;br /&gt;
		PressedKey = '\t';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_DELETE){&lt;br /&gt;
		PressedKey = 0x7f;&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = 'M';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_CAPS_LOCK)&lt;br /&gt;
	{&lt;br /&gt;
		if(upper){&lt;br /&gt;
			upper = 0;&lt;br /&gt;
		}else {&lt;br /&gt;
			upper = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1)){&lt;br /&gt;
		PressedKey = 0xff;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Qwerty to Azerty&lt;br /&gt;
	switch (PressedKey) {&lt;br /&gt;
		case 'A':&lt;br /&gt;
			PressedKey = 'Q';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Z':&lt;br /&gt;
			PressedKey = 'W';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Q':&lt;br /&gt;
			PressedKey = 'A';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'W':&lt;br /&gt;
			PressedKey = 'Z';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'M':&lt;br /&gt;
			PressedKey = ',';&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Maj&lt;br /&gt;
		&lt;br /&gt;
	if (upper == 0){&lt;br /&gt;
		if((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
			PressedKey = PressedKey + 0x20;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	printLeds(PressedKey);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons également désormais activer le mode majuscule avec les touches shift droite et gauche. Nous avons également rajouté la possibilité de taper les caractères spéciaux associés aux nombres et à droite du clavier. Malheureusement, les caractères ¨, µ, £ et § n'étant pas présent dans la table ASCII, ils ne seront pas disponible sur notre clavier. Les accents tels que é, è, à, ù et ç ont été remplacé par la lettre de base (e, a, u, c).&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant devoir retenir les dernières touches tapées dans un buffer. En effet, en cas de freeze de la machine, il est tout de même nécessaire de se rappeler de la suite de touche tapée par l'utilisateur. Pour ce faire, nous avons créé une structure &amp;lt;code&amp;gt;buffer_t&amp;lt;/code&amp;gt;, contenant un tableau de touches &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, l'index de la dernière touche tapée &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; et l'index de la première touche tapée &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt;. A chaque appel au clavier par la carte mère, nous envoyons la touche présente à l'index &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; et nous la décalons de 1, en suivant en quelque sorte la technique FIFO. De cette manière, en ayant un tableau assez grand, on est capable de retenir un bon nombre de touches tapées par l'utilisateur et de les retenir en cas de problème.&lt;br /&gt;
&lt;br /&gt;
Dans la continuité du TP, une interruption est envoyé à la carte mère dès que le buffer aura atteint une certaine taille, calculée par la fonction &amp;lt;code&amp;gt;sizeBuffer()&amp;lt;/code&amp;gt;. Pour vérifier le bon fonctionnement de cette méthode, nous faisons clignoter la LED du connecteur HE10 relié à notre carte clavier uniquemet lorsqu'une interruption est envoyé.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2308</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2308"/>
		<updated>2023-12-07T11:09:43Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Programmation de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version des deux boutons (ici on prend l'exemple du reset) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation de la carte==&lt;br /&gt;
&lt;br /&gt;
A l'aide de la LUFA et de leur démo &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt;, nous allons tenter de reconnaître les touches tapés sur un clavier. Pour vérifier cela et débuggé notre code, nous avons ajouté 8 LEDs de tests destinés à afficher la valeur binaire des caractère ASCII correspondant. Après quelques problèmes de conversion entre qwerty et azerty, nous pouvons maintenant recevoir sur notre carte les caractères classiques (a à z, 0 à 9, espace, entrée, tabulation...) et nous pouvons même passer les lettres en majuscule à l'aide de la touche verrouille maj. Voici ci-dessous une parti du code de &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void processKeyUp(uint8_t KeyCode){&lt;br /&gt;
	clearLeds();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void processKeyDown(uint8_t KeyCode, uint8_t Modifier){&lt;br /&gt;
	&lt;br /&gt;
	char PressedKey = 0;&lt;br /&gt;
&lt;br /&gt;
	if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
	}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '0';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = ' ';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '\n';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_TAB){&lt;br /&gt;
		PressedKey = '\t';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_DELETE){&lt;br /&gt;
		PressedKey = 0x7f;&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = 'M';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_CAPS_LOCK)&lt;br /&gt;
	{&lt;br /&gt;
		if(upper){&lt;br /&gt;
			upper = 0;&lt;br /&gt;
		}else {&lt;br /&gt;
			upper = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1)){&lt;br /&gt;
		PressedKey = 0xff;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Qwerty to Azerty&lt;br /&gt;
	switch (PressedKey) {&lt;br /&gt;
		case 'A':&lt;br /&gt;
			PressedKey = 'Q';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Z':&lt;br /&gt;
			PressedKey = 'W';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Q':&lt;br /&gt;
			PressedKey = 'A';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'W':&lt;br /&gt;
			PressedKey = 'Z';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'M':&lt;br /&gt;
			PressedKey = ',';&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Maj&lt;br /&gt;
		&lt;br /&gt;
	if (upper == 0){&lt;br /&gt;
		if((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
			PressedKey = PressedKey + 0x20;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	printLeds(PressedKey);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons également désormais activer le mode majuscule avec les touches shift droite et gauche. Nous avons également rajouté la possibilité de taper les caractères spéciaux associés aux nombres et à droite du clavier. Malheureusement, les caractères ¨, µ, £ et § n'étant pas présent dans la table ASCII, ils ne seront pas disponible sur notre clavier. Les accents tels que é, è, à, ù et ç ont été remplacé par la lettre de base (e, a, u, c).&lt;br /&gt;
&lt;br /&gt;
Nous allons maintenant devoir retenir les dernières touches tapées dans un buffer. En effet, en cas de freeze de la machine, il est tout de même nécessaire de se rappeler de la suite de touche tapée par l'utilisateur. Pour ce faire, nous avons créé une structure &amp;lt;code&amp;gt;buffer_t&amp;lt;/code&amp;gt;, contenant un tableau de touches &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt;, l'index de la dernière touche tapée &amp;lt;code&amp;gt;last_index&amp;lt;/code&amp;gt; et l'index de la première touche tapée &amp;lt;code&amp;gt;first_index&amp;lt;/code&amp;gt;. A chaque appel au clavier par la carte mère, nous envoyons la touche présente à l'index &amp;lt;code&amp;gt;first_index&amp;lt;/code&amp;gt; et nous la décalons de 1, en suivant en quelque sorte la technique FIFO. De cette manière, en ayant un tableau assez grand, on est capable de retenir un bon nombre de touches tapées par l'utilisateur et de les retenir en cas de problème.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2172</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2172"/>
		<updated>2023-11-28T15:52:29Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version des deux boutons (ici on prend l'exemple du reset) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation de la carte==&lt;br /&gt;
&lt;br /&gt;
A l'aide de la LUFA et de leur démo &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt;, nous allons tenter de reconnaître les touches tapés sur un clavier. Pour vérifier cela et débuggé notre code, nous avons ajouté 8 LEDs de tests destinés à afficher la valeur binaire des caractère ASCII correspondant. Après quelques problèmes de conversion entre qwerty et azerty, nous pouvons maintenant recevoir sur notre carte les caractères classiques (a à z, 0 à 9, espace, entrée, tabulation...) et nous pouvons même passer les lettres en majuscule à l'aide de la touche verrouille maj. Voici ci-dessous une parti du code de &amp;lt;code&amp;gt;KeyboardHost&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void processKeyUp(uint8_t KeyCode){&lt;br /&gt;
	clearLeds();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void processKeyDown(uint8_t KeyCode, uint8_t Modifier){&lt;br /&gt;
	&lt;br /&gt;
	char PressedKey = 0;&lt;br /&gt;
&lt;br /&gt;
	if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';&lt;br /&gt;
	}&lt;br /&gt;
		else if ((KeyCode &amp;gt;= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &amp;amp;&lt;br /&gt;
			(KeyCode  &amp;lt; HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '0';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SPACE)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = ' ';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_ENTER)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = '\n';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_TAB){&lt;br /&gt;
		PressedKey = '\t';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_DELETE){&lt;br /&gt;
		PressedKey = 0x7f;&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_SEMICOLON_AND_COLON)&lt;br /&gt;
	{&lt;br /&gt;
		PressedKey = 'M';&lt;br /&gt;
	}&lt;br /&gt;
	else if (KeyCode == HID_KEYBOARD_SC_CAPS_LOCK)&lt;br /&gt;
	{&lt;br /&gt;
		if(upper){&lt;br /&gt;
			upper = 0;&lt;br /&gt;
		}else {&lt;br /&gt;
			upper = 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else if (Modifier &amp;amp; (1 &amp;lt;&amp;lt; 1)){&lt;br /&gt;
		PressedKey = 0xff;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Qwerty to Azerty&lt;br /&gt;
	switch (PressedKey) {&lt;br /&gt;
		case 'A':&lt;br /&gt;
			PressedKey = 'Q';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Z':&lt;br /&gt;
			PressedKey = 'W';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'Q':&lt;br /&gt;
			PressedKey = 'A';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'W':&lt;br /&gt;
			PressedKey = 'Z';&lt;br /&gt;
			break;&lt;br /&gt;
		case 'M':&lt;br /&gt;
			PressedKey = ',';&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	// Maj&lt;br /&gt;
		&lt;br /&gt;
	if (upper == 0){&lt;br /&gt;
		if((KeyCode &amp;gt;= HID_KEYBOARD_SC_A) &amp;amp;&amp;amp; (KeyCode &amp;lt;= HID_KEYBOARD_SC_Z)){&lt;br /&gt;
			PressedKey = PressedKey + 0x20;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	printLeds(PressedKey);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cependant, nous n'arrivons pas encore à y arriver à l'aide des shifts gauche et droit.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2140</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2140"/>
		<updated>2023-11-21T16:09:39Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Soudage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version des deux boutons (ici on prend l'exemple du reset) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2139</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2139"/>
		<updated>2023-11-21T16:09:03Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Soudage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version de ces deux fichiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:Carte soudee lderrduh.jpg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2138</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2138"/>
		<updated>2023-11-21T16:08:17Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Soudage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version de ces deux fichiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:carte_soudee_lderrduh.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2137</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2137"/>
		<updated>2023-11-21T16:07:56Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Soudage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version de ces deux fichiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Nvboutonschem.jpg|Nouvelle empreinte du bouton&lt;br /&gt;
Fichier:Nvboutonroute.jpg|Nouveau routage du bouton&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:carte_soudee.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Nvboutonroute.jpg&amp;diff=2136</id>
		<title>Fichier:Nvboutonroute.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Nvboutonroute.jpg&amp;diff=2136"/>
		<updated>2023-11-21T16:06:32Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Nvboutonschem.jpg&amp;diff=2135</id>
		<title>Fichier:Nvboutonschem.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Nvboutonschem.jpg&amp;diff=2135"/>
		<updated>2023-11-21T16:06:23Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_soudee_lderrduh.jpg&amp;diff=2134</id>
		<title>Fichier:Carte soudee lderrduh.jpg</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte_soudee_lderrduh.jpg&amp;diff=2134"/>
		<updated>2023-11-21T16:05:30Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2133</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2133"/>
		<updated>2023-11-21T15:59:17Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une rotation de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version de ces deux fichiers :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Schematicv2.jpg|Schematic modifié&lt;br /&gt;
Fichier:Routagev2.jpg|Routage modifié&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:carte_soudee.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Carte soudée et alimentée par HE10]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2132</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2132"/>
		<updated>2023-11-21T15:57:19Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Soudage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Fichier:Romain soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
Fichier:Leds qui clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance ! Au cours du premier test, notre carte n'était pas reconnu et nous avions des valeurs de tensions incohérentes en différents points. Après different soudage-resoudage de nombreux composants, nous avons compris que ceci venait en fait des boutons. En effet, nous avons choisi un composant incorrect sur notre schematic ce qui a entrainé des erreurs sur notre routage, ce qui engendre le fait que le port reset et le port HWB était constamment en court-circuit avec le ground (ceci explique cela...). Pour résoudre le problème, nous avons resoudé nos boutons avec une erreur de 90° et avons mis à jour notre schematic et le routage qui va avec. Voici donc la deuxième version de ces deux fichiers :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé les premiers tests le 21/11et ces derniers furent concluant. Notre carte est reconnu par le terminal avec la commande &amp;lt;code&amp;gt;lsusb&amp;lt;/code&amp;gt; et on a pu faire clignoter nos LEDs de test.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2079</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2079"/>
		<updated>2023-11-15T09:02:44Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Soudage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define STARTED 2&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;br /&gt;
&lt;br /&gt;
En ce grand jour du 15/11, nous avons enfin reçu notre AT90USB647 et pourrons commencer la soudure à la prochaine séance !&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2072</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2072"/>
		<updated>2023-11-15T08:37:38Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.c :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void wait_ms(uint16_t ms){&lt;br /&gt;
    cli();&lt;br /&gt;
    task[currentTask].state = SLEEP;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
    sleep.reason = DELAY_SLEEPING;&lt;br /&gt;
    sleep.data = ms;&lt;br /&gt;
    task[currentTask].sleep = sleep;&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    sei();&lt;br /&gt;
    TIMER1_COMPA_vect();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ordonnanceur.h :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;header&amp;quot; line&amp;gt;&lt;br /&gt;
#define STARTED 2&lt;br /&gt;
#define SLEEP 0&lt;br /&gt;
#define AWAKE 1&lt;br /&gt;
&lt;br /&gt;
#define DELAY_SLEEPING 0&lt;br /&gt;
&lt;br /&gt;
typedef struct sleep_t{&lt;br /&gt;
    uint8_t reason;&lt;br /&gt;
    uint16_t data;&lt;br /&gt;
}sleep_t;&lt;br /&gt;
&lt;br /&gt;
typedef struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    uint8_t state;&lt;br /&gt;
    sleep_t sleep;&lt;br /&gt;
}task_t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici donc ci-dessous le résultat en contrôlant l'état des LEDs (ce dernier ressemble ostensiblement à la vidéo précédente, mais cette fois ci, les temps voulus sont exacts) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Leds_sleep.mov&amp;diff=2070</id>
		<title>Fichier:Leds sleep.mov</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Leds_sleep.mov&amp;diff=2070"/>
		<updated>2023-11-15T08:31:31Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2069</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2069"/>
		<updated>2023-11-15T08:31:11Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_sleep.mov||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée et contrôlée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2061</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2061"/>
		<updated>2023-11-15T07:31:38Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt;. Désormais, chaque structure &amp;lt;code&amp;gt;task_t&amp;lt;/code&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;code&amp;gt;sleep_t&amp;lt;/code&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2060</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=2060"/>
		<updated>2023-11-15T07:19:27Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Afin d'endormir les tâches, nous écrivons une fonction &amp;lt;pre&amp;gt;wait&amp;lt;/pre&amp;gt;. Désormais, chaque structure &amp;lt;pre&amp;gt;task_t&amp;lt;/pre&amp;gt; inclut son état (endormi ou éveillé) et une structure &amp;lt;pre&amp;gt;sleep_t&amp;lt;/pre&amp;gt; qui contient deux paramètres. Ces deux paramètres sont la raison de l'endormissement de la tâche et un compteur. Le but de notre fonction est d'attendre la fin du compteur pour changer son état et réinitialiser le compteur.&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Leds_ordonnancees.mp4&amp;diff=1984</id>
		<title>Fichier:Leds ordonnancees.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Leds_ordonnancees.mp4&amp;diff=1984"/>
		<updated>2023-11-06T10:41:00Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1982</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1982"/>
		<updated>2023-11-06T10:38:21Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:leds_ordonnancees.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1945</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1945"/>
		<updated>2023-11-06T10:18:11Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
Cependant, vous pouvez voir ci-dessous que les tâches sont 3 fois plus longues que voulues. En effet, chaque delay est multipplié par le nombre de tâches à réaliser (ici, 3). Nous devons donc réfléchir à une méthode permettant d'endormir les tâches non sollicitées par l'ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:led_ordonnancée.mp4||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;LEDs ordonnancée]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1933</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1933"/>
		<updated>2023-11-06T09:53:25Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions, des tâches (leur addresse, leur pointeur de pile par exemple: 0x0600, leur état) ... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1930</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1930"/>
		<updated>2023-11-06T09:50:44Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions... puis récupère le pointeur de pile et lance manuellement la première tâche (task0). A chaque interruption de l'ISR, on sauvegarde le contexte de la tâche en cours, on choisit la prochaine tâche (task0 --&amp;gt; task1) et on restaure le contexte précédent associé à cette tâche. A la fin de l'interruption, la tâche voulue se lance et on attend la prochaine interruption pour continuer l'algorithme.&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1927</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1927"/>
		<updated>2023-11-06T09:48:14Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.Ci-dessous, voici le code permettant de gérer l'ordonnancement :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct task_t{&lt;br /&gt;
    void (*addr)(void);&lt;br /&gt;
    uint16_t sp;&lt;br /&gt;
    int state;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void initTask(int taskId){&lt;br /&gt;
    int save = SP;&lt;br /&gt;
    SP = task[taskId].sp;&lt;br /&gt;
    uint16_t address = (uint16_t)task[taskId].addr;&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (address &amp;amp; 0x00ff) );&lt;br /&gt;
    asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((address &amp;amp; 0xff00)&amp;gt;&amp;gt;8) );&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[taskId].sp = SP;&lt;br /&gt;
    SP = save;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void scheduler (){&lt;br /&gt;
    currentTask ++;&lt;br /&gt;
    if(currentTask == NB_TASK) currentTask = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED){&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
    SAVE_REGISTER();&lt;br /&gt;
    task[currentTask].sp = SP;&lt;br /&gt;
    // Appel à l'ordonnanceur&lt;br /&gt;
    scheduler();&lt;br /&gt;
    // Récupération du contexte de la tâche ré-activée&lt;br /&gt;
    SP = task[currentTask].sp; &lt;br /&gt;
    RESTORE_REGISTER();&lt;br /&gt;
    &lt;br /&gt;
    asm volatile(&amp;quot;reti&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    setup();&lt;br /&gt;
    SP = task[currentTask].sp;&lt;br /&gt;
    task0();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le main réalise d'abord le setup des LEDs, des interruptions... puis récupère le pointeur de pile et lance manuellement la première tâche (task0).&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1923</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1923"/>
		<updated>2023-11-06T09:39:27Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après moulte tentative, nous sommes parvenus à réaliser un ordonnancuer fonctionelle qui a comme tâches le clignotement de 3 LEDs. Cependant, ce multi-tasking engendre un ralentissement des temps voulu, il faut donc géré cette partie afin de faire correspondre les délais du cahier des charges et ceux de notre réalisation.&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1833</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1833"/>
		<updated>2023-10-24T13:08:09Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous testerons notre ordonnanceur dans un premier temps avec 3 tâches représentées par le clignotement d'une Led. Nous avons débuté par un premier programme pour vérifier le clignotement des Leds et faire fonctionner l'ISR nue. Après vérification que tout fonctionne bien, nous essayons de sauvegarder le contexte et de le reconstituer.&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soudage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu notre carte en 5 exemplaires le 24/10, et avons décidé de continuer l'ordonnanceur avant de commencer la soudure.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Routage_rduhr_lderycke.png&amp;diff=1814</id>
		<title>Fichier:Routage rduhr lderycke.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Routage_rduhr_lderycke.png&amp;diff=1814"/>
		<updated>2023-10-17T12:41:45Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1801</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1801"/>
		<updated>2023-10-13T07:21:24Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Ordonnanceur / SE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre ordonnanceur va, dans un premier temps, être chargé d'un simple clignotement de LEDs. Par la suite, nous allons complexifier sa tâche en mettant en conccurence 3 tâches différentes, que l'ordonnanceur devra traiter en parallèle. Notre but est donc de concevoir un programme capable de retenir les 33 registres (mémoires + registre d'état) de chaque tâches mais aussi l'endroit où elle s'est arrêté.&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1800</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1800"/>
		<updated>2023-10-13T07:19:21Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB ! Après vérifications auprès de Mrs Boé et Redon, nous avons supprimé certains test points prenant trop de place et avons déplacer certains composants (rapprochage du crystal et des condensateur du microprocesseur, perfectionnement de la carte, ajout de vias pour répartir le transfert de courant entre les deux faces pour la masse...) nous avons généré les deux fichiers nécessaires à l'impression par un prestataire extérieur et avons, en attendant sa réception, commencé à travailler notre ordonnanceur.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1677</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1677"/>
		<updated>2023-09-22T10:12:16Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
L'ENSEMBLE DE NOS FICHIERS SONT DISPONIBLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1676</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1676"/>
		<updated>2023-09-22T10:11:38Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L'ENSEMBLE DE NOS FICHIERS SONT DISPONIVLE [https://archives.plil.fr/lderycke/Pico_rduhr_lderycke.git ICI]&lt;br /&gt;
&lt;br /&gt;
=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1670</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1670"/>
		<updated>2023-09-22T09:49:11Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenaient ces test point sur le PCB !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1667</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1667"/>
		<updated>2023-09-22T09:42:29Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille. Nous avons fait le choix de connecter chaque pin seul à un test point, ce qui nous a valu en premier lieu de sacré problème quant à l'organisation de l'espace que prenait ces test point sur le PCB !&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage_rduhr_lderycke.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1662</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1662"/>
		<updated>2023-09-22T08:56:20Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1661</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1661"/>
		<updated>2023-09-22T08:56:05Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&amp;lt;\div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div&amp;gt;[[file:routage.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&amp;lt;\div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1660</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1660"/>
		<updated>2023-09-22T08:54:57Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic]]&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille&lt;br /&gt;
&lt;br /&gt;
[[file:routage.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage]]&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1657</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1657"/>
		<updated>2023-09-22T08:53:54Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic/div&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Après avoir assigné les correctes footprint à chacun des éléments, nous avons commencé le routage de notre carte fille&lt;br /&gt;
&lt;br /&gt;
[[file:routage.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Routage/div&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1652</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1652"/>
		<updated>2023-09-22T08:35:16Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
[[file:schematic1.png||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic/div&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Schematic1.png&amp;diff=1651</id>
		<title>Fichier:Schematic1.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Schematic1.png&amp;diff=1651"/>
		<updated>2023-09-22T08:34:41Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1650</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1650"/>
		<updated>2023-09-22T08:32:58Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;br /&gt;
&lt;br /&gt;
[[file:schematic1.jpeg||thumb|center|300px|&amp;lt;div style=&amp;quot;text-align:center;&amp;quot;&amp;gt;Schematic/div&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1648</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1648"/>
		<updated>2023-09-22T08:27:38Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Schematic et routage de la carte */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce [https://wiki-se.plil.fr/mediawiki/index.php/SE4_2022/2023_EC5 projet].&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1646</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1646"/>
		<updated>2023-09-22T08:25:22Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Carte électronique numérique */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;br /&gt;
&lt;br /&gt;
==Schematic et routage de la carte==&lt;br /&gt;
&lt;br /&gt;
Nous avons réalisé le schematic de notre carte en nous basant sur ce projet :&lt;br /&gt;
Nous avons pris la décision d'utiliser le même port USB femelle pour brancher le clavier et programmer la carte avec l'ordinateur (plutôt qu'un femelle pour le clavier et un mâle pour la programmation).&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1644</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1644"/>
		<updated>2023-09-22T08:23:12Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Type de carte choisi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier. Nous allons donc souder et programmer une carte sur laquelle sera branché un clavier en USB.&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1555</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1555"/>
		<updated>2023-09-18T11:15:38Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Type de carte choisi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier.&lt;br /&gt;
&lt;br /&gt;
Nous avons soudé l'ensemble des composants du shield arduino et avons testé son bon fonctionnement à l'aide de l'application Arduino. Voici ci-dessous une vidéo du clignotement des LEDs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1554</id>
		<title>SE4Binome2023-3</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2023-3&amp;diff=1554"/>
		<updated>2023-09-18T11:13:37Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : /* Type de carte choisi */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Ordonnanceur / SE=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Carte FPGA / VHDL=&lt;br /&gt;
&lt;br /&gt;
=Carte électronique numérique=&lt;br /&gt;
&lt;br /&gt;
==Type de carte choisi==&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi la carte fille gérant le clavier.&lt;br /&gt;
&lt;br /&gt;
Nous avons souder l'ensemble des composants du shield arduino afin de pouvoir&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
File:romain_soudure.jpg|Romain qui soude avec passion&lt;br /&gt;
File:leds_qui_clignotent.mp4|Vidéo du clignotement des LEDs&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Leds_qui_clignotent.mp4&amp;diff=1553</id>
		<title>Fichier:Leds qui clignotent.mp4</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Leds_qui_clignotent.mp4&amp;diff=1553"/>
		<updated>2023-09-18T11:12:36Z</updated>

		<summary type="html">&lt;p&gt;Lderycke : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Lderycke</name></author>
	</entry>
</feed>