<?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=Yyahiani</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=Yyahiani"/>
	<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Yyahiani"/>
	<updated>2026-09-19T17:23:11Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.39.1</generator>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6762</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6762"/>
		<updated>2024-11-18T19:03:18Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
À l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6. Pour cela nous configurons la communication SPI avec avr-gcc grâce au code présent dans le fichier spi.c grandement inspiré du code présent sur le site de Mr Redon (https://rex.plil.fr/Enseignement/Systeme/Systeme.PSE/systeme.html). Ci-dessous un aperçu du code source utiliser pour gerer la communication SPI ainsi que celui utilisé pour gérer l'affichage du sept segments.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define SPI_DDR         DDRB&lt;br /&gt;
#define SS_DDR          DDRC&lt;br /&gt;
#define SPI_PORT        PORTC&lt;br /&gt;
&lt;br /&gt;
#define SPI_SS_M        2 // master ?&lt;br /&gt;
#define SPI_MOSI        3&lt;br /&gt;
#define SPI_MISO        4&lt;br /&gt;
#define SPI_SCK         5&lt;br /&gt;
&lt;br /&gt;
void spi_activer(void){                              // Activer le périphérique&lt;br /&gt;
SPI_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;0);                            // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                           // Désactiver le périphérique&lt;br /&gt;
SPI_PORT |= (1&amp;lt;&amp;lt;0);                             // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                // Communication sur le bus SPI&lt;br /&gt;
SPDR = envoi;// Octet a envoyer&lt;br /&gt;
while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin envoi (drapeau SPIF du statut)&lt;br /&gt;
return SPDR;                                         // Octet reçu&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_init(void){                                 // Initialisation du bus SPI&lt;br /&gt;
SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK)|(1&amp;lt;&amp;lt;SPI_SS_M);   // Définition des sorties&lt;br /&gt;
SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // Définition de l'entrée&lt;br /&gt;
                             // Désactivation du périphérique&lt;br /&gt;
SS_DDR |= (1&amp;lt;&amp;lt;0); // afficheur sur pc0&lt;br /&gt;
SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
SPI_PORT |= (1&amp;lt;&amp;lt;0);                                                   // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
||&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
spi_init();&lt;br /&gt;
spi_activer();&lt;br /&gt;
    spi_echange(0x76); // adresse de l'afficheur du 7 segment&lt;br /&gt;
    spi_desactiver();&lt;br /&gt;
&lt;br /&gt;
while(1){&lt;br /&gt;
         spi_activer(); // active &lt;br /&gt;
         spi_echange('G');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('R');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('p');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('6');&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(); //désactive&lt;br /&gt;
         _delay_ms(5);            &lt;br /&gt;
       }&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
video test multitache ordo (portsérie/LEDs) : &lt;br /&gt;
[[Fichier:Test ordo.mov|centre|vignette]]&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:schemaLCD.pdf|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
||[[Fichier:routageLCD.pdf|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:recto3D.pdf|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
||[[Fichier:verso3D.pdf|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
réception de la carte PCB:&lt;br /&gt;
[[Fichier:Carte.pdf.pdf|centre|vignette]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte.pdf&amp;diff=6761</id>
		<title>Fichier:Carte.pdf</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte.pdf&amp;diff=6761"/>
		<updated>2024-11-18T19:02:31Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6760</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6760"/>
		<updated>2024-11-18T19:00:49Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
À l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6. Pour cela nous configurons la communication SPI avec avr-gcc grâce au code présent dans le fichier spi.c grandement inspiré du code présent sur le site de Mr Redon (https://rex.plil.fr/Enseignement/Systeme/Systeme.PSE/systeme.html). Ci-dessous un aperçu du code source utiliser pour gerer la communication SPI ainsi que celui utilisé pour gérer l'affichage du sept segments.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define SPI_DDR         DDRB&lt;br /&gt;
#define SS_DDR          DDRC&lt;br /&gt;
#define SPI_PORT        PORTC&lt;br /&gt;
&lt;br /&gt;
#define SPI_SS_M        2 // master ?&lt;br /&gt;
#define SPI_MOSI        3&lt;br /&gt;
#define SPI_MISO        4&lt;br /&gt;
#define SPI_SCK         5&lt;br /&gt;
&lt;br /&gt;
void spi_activer(void){                              // Activer le périphérique&lt;br /&gt;
SPI_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;0);                            // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                           // Désactiver le périphérique&lt;br /&gt;
SPI_PORT |= (1&amp;lt;&amp;lt;0);                             // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                // Communication sur le bus SPI&lt;br /&gt;
SPDR = envoi;// Octet a envoyer&lt;br /&gt;
while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin envoi (drapeau SPIF du statut)&lt;br /&gt;
return SPDR;                                         // Octet reçu&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_init(void){                                 // Initialisation du bus SPI&lt;br /&gt;
SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK)|(1&amp;lt;&amp;lt;SPI_SS_M);   // Définition des sorties&lt;br /&gt;
SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // Définition de l'entrée&lt;br /&gt;
                             // Désactivation du périphérique&lt;br /&gt;
SS_DDR |= (1&amp;lt;&amp;lt;0); // afficheur sur pc0&lt;br /&gt;
SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
SPI_PORT |= (1&amp;lt;&amp;lt;0);                                                   // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
||&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
spi_init();&lt;br /&gt;
spi_activer();&lt;br /&gt;
    spi_echange(0x76); // adresse de l'afficheur du 7 segment&lt;br /&gt;
    spi_desactiver();&lt;br /&gt;
&lt;br /&gt;
while(1){&lt;br /&gt;
         spi_activer(); // active &lt;br /&gt;
         spi_echange('G');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('R');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('p');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('6');&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(); //désactive&lt;br /&gt;
         _delay_ms(5);            &lt;br /&gt;
       }&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
video test multitache ordo (portsérie/LEDs) : &lt;br /&gt;
[[Fichier:Test ordo.mov|centre|vignette]]&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:schemaLCD.pdf|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
||[[Fichier:routageLCD.pdf|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:recto3D.pdf|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
||[[Fichier:verso3D.pdf|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
réception de la carte PCB:&lt;br /&gt;
[[Fichier:Carte.pdf|centre|vignette]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6759</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6759"/>
		<updated>2024-11-18T19:00:20Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
À l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6. Pour cela nous configurons la communication SPI avec avr-gcc grâce au code présent dans le fichier spi.c grandement inspiré du code présent sur le site de Mr Redon (https://rex.plil.fr/Enseignement/Systeme/Systeme.PSE/systeme.html). Ci-dessous un aperçu du code source utiliser pour gerer la communication SPI ainsi que celui utilisé pour gérer l'affichage du sept segments.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define SPI_DDR         DDRB&lt;br /&gt;
#define SS_DDR          DDRC&lt;br /&gt;
#define SPI_PORT        PORTC&lt;br /&gt;
&lt;br /&gt;
#define SPI_SS_M        2 // master ?&lt;br /&gt;
#define SPI_MOSI        3&lt;br /&gt;
#define SPI_MISO        4&lt;br /&gt;
#define SPI_SCK         5&lt;br /&gt;
&lt;br /&gt;
void spi_activer(void){                              // Activer le périphérique&lt;br /&gt;
SPI_PORT &amp;amp;= ~(1&amp;lt;&amp;lt;0);                            // Ligne SS à l'état bas&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_desactiver(void){                           // Désactiver le périphérique&lt;br /&gt;
SPI_PORT |= (1&amp;lt;&amp;lt;0);                             // Ligne SS à l'état haut&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t spi_echange(uint8_t envoi){                // Communication sur le bus SPI&lt;br /&gt;
SPDR = envoi;// Octet a envoyer&lt;br /&gt;
while(!(SPSR &amp;amp; (1&amp;lt;&amp;lt;SPIF)));                          // Attente fin envoi (drapeau SPIF du statut)&lt;br /&gt;
return SPDR;                                         // Octet reçu&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void spi_init(void){                                 // Initialisation du bus SPI&lt;br /&gt;
SPI_DDR |= (1&amp;lt;&amp;lt;SPI_MOSI)|(1&amp;lt;&amp;lt;SPI_SCK)|(1&amp;lt;&amp;lt;SPI_SS_M);   // Définition des sorties&lt;br /&gt;
SPI_DDR &amp;amp;= ~(1&amp;lt;&amp;lt;SPI_MISO);                           // Définition de l'entrée&lt;br /&gt;
                             // Désactivation du périphérique&lt;br /&gt;
SS_DDR |= (1&amp;lt;&amp;lt;0); // afficheur sur pc0&lt;br /&gt;
SPCR = (1&amp;lt;&amp;lt;SPE)|(1&amp;lt;&amp;lt;MSTR)|(1&amp;lt;&amp;lt;SPR1);                 // Activation SPI (SPE) en état maître (MSTR)&lt;br /&gt;
SPI_PORT |= (1&amp;lt;&amp;lt;0);                                                   // horloge F_CPU/64 (SPR1=1,SPR0=0)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
||&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
#include &amp;quot;SPI.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(void){&lt;br /&gt;
spi_init();&lt;br /&gt;
spi_activer();&lt;br /&gt;
    spi_echange(0x76); // adresse de l'afficheur du 7 segment&lt;br /&gt;
    spi_desactiver();&lt;br /&gt;
&lt;br /&gt;
while(1){&lt;br /&gt;
         spi_activer(); // active &lt;br /&gt;
         spi_echange('G');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('R');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('p');&lt;br /&gt;
         _delay_ms(5);&lt;br /&gt;
         spi_echange('6');&lt;br /&gt;
&lt;br /&gt;
         spi_desactiver(); //désactive&lt;br /&gt;
         _delay_ms(5);            &lt;br /&gt;
       }&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
video test multitache ordo (portsérie/LEDs) : &lt;br /&gt;
[[Fichier:Test ordo.mov|centre|vignette]]&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:schemaLCD.pdf|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
||[[Fichier:routageLCD.pdf|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:recto3D.pdf|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
||[[Fichier:verso3D.pdf|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
réception de la carte PCB:&lt;br /&gt;
[[Fichier:Carte.pdf|vignette]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte.pdf.pdf&amp;diff=6757</id>
		<title>Fichier:Carte.pdf.pdf</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Carte.pdf.pdf&amp;diff=6757"/>
		<updated>2024-11-18T11:19:29Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Voici notre carte avant la soudure des composants.&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6694</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6694"/>
		<updated>2024-11-18T09:51:09Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
video test multitache ordo (portsérie/LEDs) : &lt;br /&gt;
[[Fichier:Test ordo.mov|centre|vignette]]&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD.pdf|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD.pdf|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recto3D.pdf|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
[[Fichier:verso3D.pdf|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Test_ordo.mov&amp;diff=6693</id>
		<title>Fichier:Test ordo.mov</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Test_ordo.mov&amp;diff=6693"/>
		<updated>2024-11-18T09:49:56Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Voici une video test de notre ordonnanceur, nos testons le multitâches concernant les LEDs et la lecture du port série&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Recto3D.pdf&amp;diff=6581</id>
		<title>Fichier:Recto3D.pdf</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Recto3D.pdf&amp;diff=6581"/>
		<updated>2024-11-13T10:03:52Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Verso3D.pdf&amp;diff=6579</id>
		<title>Fichier:Verso3D.pdf</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Verso3D.pdf&amp;diff=6579"/>
		<updated>2024-11-13T10:03:25Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:RoutageLCD.pdf&amp;diff=6577</id>
		<title>Fichier:RoutageLCD.pdf</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:RoutageLCD.pdf&amp;diff=6577"/>
		<updated>2024-11-13T10:02:43Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6576</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6576"/>
		<updated>2024-11-13T10:02:07Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD.pdf|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD.pdf|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recto3D.pdf|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
[[Fichier:verso3D.pdf|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6575</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6575"/>
		<updated>2024-11-13T10:01:46Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD.pdf|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:recto3D|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
[[Fichier:verso3D|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SchemaLCD.pdf&amp;diff=6570</id>
		<title>Fichier:SchemaLCD.pdf</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SchemaLCD.pdf&amp;diff=6570"/>
		<updated>2024-11-13T10:00:56Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6568</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6568"/>
		<updated>2024-11-13T09:57:55Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SchemaLCD|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageLCD|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Recto3D|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
[[Fichier:Verso3D|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6567</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6567"/>
		<updated>2024-11-13T09:57:40Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:SchemaLCD|vignette|thumb|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageLCD|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Recto3D|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
[[Fichier:Verso3D|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6564</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6564"/>
		<updated>2024-11-13T09:55:51Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD|vignette|thumb|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Recto3D|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
[[Fichier:Verso3D|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Verso3D.png&amp;diff=6552</id>
		<title>Fichier:Verso3D.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Verso3D.png&amp;diff=6552"/>
		<updated>2024-11-13T09:50:12Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Recto3D.png&amp;diff=6550</id>
		<title>Fichier:Recto3D.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Recto3D.png&amp;diff=6550"/>
		<updated>2024-11-13T09:49:39Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6548</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6548"/>
		<updated>2024-11-13T09:49:22Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Recto3D|vignette|gauche|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
[[Fichier:Verso3D|vignette|droite|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6546</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6546"/>
		<updated>2024-11-13T09:48:51Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Recto3D|vignette|Visualisation 3D de notre carte PCB (face avant)]] [[Fichier:Verso3D|vignette|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6544</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6544"/>
		<updated>2024-11-13T09:48:30Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD|vignette|centre|Routage de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
résultats 3D:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Recto3D|vignette|Visualisation 3D de notre carte PCB (face avant)]]&lt;br /&gt;
[[Fichier:Verso3D|vignette|Visualisation 3D de notre carte PCB (face arrière)]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SchemaLCD.png&amp;diff=6542</id>
		<title>Fichier:SchemaLCD.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:SchemaLCD.png&amp;diff=6542"/>
		<updated>2024-11-13T09:45:04Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:RoutageLCD.png&amp;diff=6541</id>
		<title>Fichier:RoutageLCD.png</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:RoutageLCD.png&amp;diff=6541"/>
		<updated>2024-11-13T09:44:36Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : Yyahiani a téléversé une nouvelle version de Fichier:RoutageLCD.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Routage de la Carte Fille : Ecran LCD&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6540</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6540"/>
		<updated>2024-11-13T09:44:00Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Carte file ecran LCD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD|vignette|centre|Routage de notre carte fille écran]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6539</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6539"/>
		<updated>2024-11-13T09:43:40Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RoutageLCD|vignette|Routage de notre carte fille écran]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6538</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6538"/>
		<updated>2024-11-13T09:42:46Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD|vignette|centre|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD|vignette|centre|Schématique de notre carte fille écran]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6536</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6536"/>
		<updated>2024-11-13T09:40:53Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma. Vous pouvez voir ci-dessous la version finale du routage concernant le PCB du Bouclier ainsi que ce dernier après soudures des différents composants.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]||&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centre|Carte après soudure]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]] ||&lt;br /&gt;
[[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code C (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permet de faire clignoter les leds.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
|}&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]||&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Visualisation&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:signal.png|200px|thumb|gauche|Signal d'horloge]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Le signal d'horloge de notre Arduino est correct.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne venant pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|centre|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE10===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous vérifions le bon fonctionnement des connecteurs HE10 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La principale tâche à accomplir est de faire cligonter deux LED à des fréquences différentes. Pour cela nous passerons par plusieurs étapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme vous pouvez le voir dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256. Nous avons donc une nouvelle fréquence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces macros sont écrites dans des fichiers présents dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons défini nos processus comme des structures que nous avons stockées dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre prochain objectif est de lancer deux tâches en parallèle en incluant un ordonnanceur à torniquet dans l'ISR. Pour cela nous utilisons en plus du timer présenté plus haut; une fonction d'initialisation des tâches ('''init_taches()''') et une '''ISR nue''' cette fois, qui gère la succession des tâches.&lt;br /&gt;
{|class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Code C !! Vidéo de fonctionnement&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
void init_taches()&lt;br /&gt;
{&lt;br /&gt;
    for(uint8_t cpt=1; cpt&amp;lt;TACHE_MAX; cpt++)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t sauv = SP;&lt;br /&gt;
        SP = taches[cpt].pile;&lt;br /&gt;
        uint16_t addresse=(uint16_t) taches[cpt].tache;&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; (addresse &amp;amp; 0x00ff));&lt;br /&gt;
        asm volatile(&amp;quot;push %0&amp;quot; : : &amp;quot;r&amp;quot; ((addresse &amp;amp; 0xff00)&amp;gt;&amp;gt;8));&lt;br /&gt;
        SAVE_REGISTERS();&lt;br /&gt;
        taches[cpt].pile = SP;&lt;br /&gt;
        SP = sauv;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect,ISR_NAKED)&lt;br /&gt;
{&lt;br /&gt;
    // Sauvegarde du contexte de la tâche interrompue&lt;br /&gt;
	SAVE_REGISTERS();&lt;br /&gt;
  	taches[tache_courante].pile = SP;&lt;br /&gt;
	// Appel à l'ordonnanceur &lt;br /&gt;
	tache_courante ++;&lt;br /&gt;
    if (tache_courante &amp;gt;= TACHE_MAX)&lt;br /&gt;
    {&lt;br /&gt;
      tache_courante = 0;&lt;br /&gt;
    }&lt;br /&gt;
	// Récupération du contexte de la tâche ré-activée &lt;br /&gt;
	SP = taches[tache_courante].pile;&lt;br /&gt;
  	RESTORE_REGISTERS();&lt;br /&gt;
	&lt;br /&gt;
    asm volatile ( &amp;quot;reti&amp;quot; );&lt;br /&gt;
    TCNT1=0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||[[Fichier:Cli2LED.mp4|vignette|Les 2 LEDS clignotent à des fréquences differentes]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Carte file ecran LCD=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
La carte fille ecran comporte un ATMega328p et un écran LCD à base de contrôleur HD44780. Nous utilisons comme nous le precisé dans le wiki un potentiomètre pour régler la luminosité des cristaux liquides ainsi qu'un connecteur HE10 pour la connexion de cette carte fille à notre carte mère sur lequel nous avons bien prevu une ligne de sélection SPI. Aucune ligne d'interruption n'était initialement necessaire mais suite au rajoût d'une RAM SPI nous avons dû en rajouter une pour gérer les interruptions.La carte mère écrit dans la RAM et le uC de la carte fille rafraichit l'écran régulièrement; en outre pour éviter les conflits entre la carte mère qui écrit et la carte fille qui lit il est nécessaire d'effectuer une gestion de priorités entre les differents signaux MOSI, d'horloge et de selection. Cette   gestion se fait à l'aide de circuits intermédaires présents dans notre schématique inspirés des circuits &amp;quot;NMOS highside&amp;quot; que nous avons réalisé avec l'aide de nos Encadrants Mr BOE et Mr REDON.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici les étapes de conceptions de notre carte fille:&lt;br /&gt;
&lt;br /&gt;
schématique:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:schemaLCD|vignette|Schématique de notre carte fille écran]]&lt;br /&gt;
&lt;br /&gt;
routage:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:routageLCD|vignette|Schématique de notre carte fille écran]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6419</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6419"/>
		<updated>2024-10-23T09:52:44Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Accomplissement des taches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme le code présent dans notre git : '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces codes sont présent dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6417</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6417"/>
		<updated>2024-10-23T09:52:21Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Accomplissement des taches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme le code présent dans notre git : * '''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces codes sont présent dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6415</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6415"/>
		<updated>2024-10-23T09:51:57Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Accomplissement des taches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme le code présent dans notre git : *'''pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c'''&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces codes sont présent dans notre GIT : &lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h'''&lt;br /&gt;
* '''pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h'''&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6412</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6412"/>
		<updated>2024-10-23T09:50:34Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme le code présent dans notre git : pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces codes sont présent dans notre GIT : &lt;br /&gt;
- pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h&lt;br /&gt;
- pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6411</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6411"/>
		<updated>2024-10-23T09:50:18Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Ordonnanceur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme le code présent dans notre git : pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres, ces codes sont présent dans notre GIT : &lt;br /&gt;
- pico_yahiani_zongo/Software/ordo_tourni_2taches/save_registers.h&lt;br /&gt;
- pico_yahiani_zongo/Software/ordo_tourni_2taches/restore_registers.h&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6409</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6409"/>
		<updated>2024-10-23T09:47:22Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Accomplissement des taches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme le code présent dans notre git : pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6408</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6408"/>
		<updated>2024-10-23T09:46:58Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Accomplissement des taches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme le code présent dans notre git : pico_yahiani_zongo/Software/ISR_nonNue_1tache/timer.c&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6407</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6407"/>
		<updated>2024-10-23T09:44:16Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6406</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6406"/>
		<updated>2024-10-23T09:43:07Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6405</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6405"/>
		<updated>2024-10-23T09:42:41Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Problème */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6404</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6404"/>
		<updated>2024-10-23T09:41:46Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Problème */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code (GIT : pico_yahiani_zongo/Software/test_clk_arduino):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6403</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6403"/>
		<updated>2024-10-23T09:40:38Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* LEDs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c (GIT : pico_yahiani_zongo/Software/clignotement) qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6386</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6386"/>
		<updated>2024-10-23T09:08:41Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centre|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centre|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6385</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6385"/>
		<updated>2024-10-23T09:07:58Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6384</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6384"/>
		<updated>2024-10-23T09:07:32Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centré|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6382</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6382"/>
		<updated>2024-10-23T09:07:01Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centré|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|droite|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6380</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6380"/>
		<updated>2024-10-23T09:06:23Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centré|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette|centré|clignotement des LEDs]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6379</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6379"/>
		<updated>2024-10-23T09:05:12Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centré|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Videotest.mov|vignette]]&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
[[Fichier:signal.png|200px|thumb|gauche|signal horloge]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
[[Fichier:Csd.png|200px|thumb|gauche|Carte SD reconnue]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Connecteurs HE610===&lt;br /&gt;
A l'aide d'un afficheur 7-segments nous verifions le bon fonctionnement des connecteurs HE610 en affichant &amp;quot;GrP6&amp;quot; pour Groupe6.&lt;br /&gt;
[[Fichier:7s.jpg|vignette|centre|connecteur HE610 fonctionnel]]&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PB5 cli.mp4|vignette|centre|LED PB5 clignote]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Videotest.mov&amp;diff=6378</id>
		<title>Fichier:Videotest.mov</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=Fichier:Videotest.mov&amp;diff=6378"/>
		<updated>2024-10-23T09:05:01Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;video test&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6263</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6263"/>
		<updated>2024-10-15T12:59:54Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tests==&lt;br /&gt;
===LEDs===&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centré|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
video1&lt;br /&gt;
&lt;br /&gt;
===Puce mémoire===&lt;br /&gt;
Apres avoir tester les LEDs, nous cherchons à tester notre puce mémoire pour assurer son bon fonctionnement, cependant nous avons rencontré un petit problème.&lt;br /&gt;
====Problème====&lt;br /&gt;
En effet, lors du test de notre puce mémoire nous avons introduit une carte SD pour vérifier via le logiciel Arduino si notre puce mémoire détecte la carte SD, cependant, ce fut sans succès.&lt;br /&gt;
&lt;br /&gt;
Nous avons donc vérifier l'horloge de notre Arduino Uno sur un oscilloscope en y injectant ce code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;SPI.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// set pin 10 as the slave select for the digital pot:&lt;br /&gt;
const int slaveSelectPin = 10;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  // set the slaveSelectPin as an output:&lt;br /&gt;
  Serial.begin (9600);&lt;br /&gt;
  pinMode(slaveSelectPin, OUTPUT),&lt;br /&gt;
  // initialize SPI:&lt;br /&gt;
  SPI.begin();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  &lt;br /&gt;
  digitalWrite(slaveSelectPin, LOW);&lt;br /&gt;
  SPI.transfer(0xaa);&lt;br /&gt;
  Serial.write(&amp;quot;ok&amp;quot;);&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
l'horloge de notre Arduino est fonctionnelle:&lt;br /&gt;
&lt;br /&gt;
photo1&lt;br /&gt;
&lt;br /&gt;
Le problème ne vient donc pas de l'Arduino, nous avons donc dessoudé et ressoudé notre puce mémoire et le problème à été résolu:&lt;br /&gt;
 &lt;br /&gt;
photo2&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6254</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6254"/>
		<updated>2024-10-15T12:15:38Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : /* Test fonctionnement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif avec les 3 autres binômes de notre groupe de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant. Pour ce qui concerne notre binome notre travail portera sur la realisation d'une carte ecran qui devra remplir les taches precisées dans l'énoncé du projet.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réalisé un shield qui nous servira, dans le cas où la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère. &lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
==Realisation==&lt;br /&gt;
Nous nous sommes aidés des indications du professeur en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permis de savoir comment intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
[[Fichier:Connecteur.pdf|vignette|centré|schematique du Bouclier ]]&lt;br /&gt;
Ci dessous vous pouvez voir la version finale du routage concernant le PCB du Bouclier;&lt;br /&gt;
[[Fichier:PcbRout.png|vignette|centré|PCB routé]]&lt;br /&gt;
Après reception de notre PCB nous avons entamé la phase de soudure de nos composants. le Bouclier après soudure se présente comme suit :&lt;br /&gt;
[[Fichier:Pcb1.jpg|vignette|centré|Carte après soudure]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Suite à une erreur d'orientation de nos broches; connecter l'arduino et notre Bouclier devenait une tâche beaucoup plus &amp;quot;compliquée&amp;quot; que prévu, mais grâce à une idée ingénieuse proposée par nos encadrants (Mr BOE et Mr REDON) nous y sommes parvenus. Le bouclier se connecte donc à l'arduino de la façon suivante:&lt;br /&gt;
[[Fichier:COnBoAr.jpg|vignette|gauche|connexion Bouclier-Arduino]][[Fichier:ConBoucAr.jpg|vignette|centré|connexion Bouclier-Arduino]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test fonctionnement==&lt;br /&gt;
Après avoir connecté notre bouclier et l'arduino nous avons effectué les tests et constaté l'allumage des differentes LED; attestant du bon fonctionnement de notre bouclier.&lt;br /&gt;
&lt;br /&gt;
Voici le code c qui nous permettra de faire clignoter les leds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line=&amp;quot;1&amp;quot; start=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
#define BROCHE_LED_BLEU 4&lt;br /&gt;
#define BROCHE_LED_ORANGE 7&lt;br /&gt;
#define BROCHE_LED_ROUGE 14&lt;br /&gt;
#define BROCHE_LED_JAUNE 17&lt;br /&gt;
#define BROCHE_D3 0&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(BROCHE_LED_BLEU, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_JAUNE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ROUGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_LED_ORANGE, OUTPUT);&lt;br /&gt;
  pinMode(BROCHE_D3, OUTPUT) ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(BROCHE_D3, HIGH);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, HIGH);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
  digitalWrite (BROCHE_LED_BLEU, HIGH);&lt;br /&gt;
  delay (1000);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, HIGH);&lt;br /&gt;
  delay (1000) ;&lt;br /&gt;
  digitalWrite(BROCHE_LED_ROUGE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_BLEU, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_JAUNE, LOW);&lt;br /&gt;
  digitalWrite(BROCHE_LED_ORANGE, LOW);&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Snapchat-186857338.jpg|vignette|gauche|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
[[Fichier:Snapchat-1046850592.jpg|vignette|centré|fonctionnement effectif du bouclier (LED allumées)]]&lt;br /&gt;
&lt;br /&gt;
==Accomplissement des taches==&lt;br /&gt;
=== Ordonnanceur ===&lt;br /&gt;
La principale tache a accomplir est de faire cligonter deux LED a des prefquences differentes. Pour cela nous passerons par plusieurs etapes. La première tâche à realiser est de programmer le '''minuteur 1''' de l'ATMega328p de sorte à ce qu'il génère une interruption toutes les '''20ms'''. Pour cela nous nous sommes inspirés du code donné par l'un de nos encadrants (Mr REDON) et avons le minuteur 1 programmé comme ceci:&lt;br /&gt;
[[Fichier:Timer.png|vignette|gauche|programmation minuteur 1]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Le Timer 1 est configuré en mode '''CTC''' c'est à dire qu'il se réinitialise automatiquement à chaque fois qu'il atteint la valeur OCR1A.Le prescaler est configuré à 256, ce qui divise la fréquence de l'horloge système(16000000hz)par 256.Nous avons donc une nouvelle frequence d'horloge à 62500 hz, ce qui implique que les coups d'horloge (ticks) s'effectuent toutes les 16us. Le timer compte jusqu'à 1250 ticks, ce qui génère une interruption toutes les 20 ms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La seconde étape consistait à faire clignoter la LED broche Arduino 13(PB5) en utilisant une ISR '''non nue''' avec notre timer. Le code suivant nous a permis de réaliser cette tâche.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
#define PRESCALER 256&lt;br /&gt;
#define NB_TICK  1250&lt;br /&gt;
#define CTC1  WGM12  // Better name&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void init_timer(void){&lt;br /&gt;
TCCR1A = 0;  &lt;br /&gt;
TCCR1B = 1&amp;lt;&amp;lt;CTC1; &lt;br /&gt;
#if (PRESCALER==8)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11);&lt;br /&gt;
#elif (PRESCALER==64)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS11 | 11&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#elif (PRESCALER==256)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12);&lt;br /&gt;
#elif (PRESCALER==1024)&lt;br /&gt;
 TCCR1B |= (1&amp;lt;&amp;lt;CS12 | 1&amp;lt;&amp;lt;CS10);&lt;br /&gt;
#endif&lt;br /&gt;
 &lt;br /&gt;
OCR1A = NB_TICK;&lt;br /&gt;
TCNT1 = 0;&lt;br /&gt;
TIMSK1 = (1&amp;lt;&amp;lt;OCIE1A);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect, ISR_NAKED){    // Procédure d'interruption&lt;br /&gt;
  PORTB ^= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
  DDRB |= (1&amp;lt;&amp;lt;PB5);&lt;br /&gt;
  init_timer();&lt;br /&gt;
  sei();&lt;br /&gt;
  while(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour passer d'une ISR '''non nue''' à une ISR '''naked''' il faut écrire les macros de sauvegardes et de restaurations des registres. Nous les avons écrites comme ceci :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define SAVE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;in r0, __SREG__ \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;cli \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;clr r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r18  \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;push r31 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
#define RESTORE_REGISTERS() \&lt;br /&gt;
asm volatile ( \&lt;br /&gt;
&amp;quot;pop r31 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r30 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r29 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r28 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r27 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r26 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r25 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r24 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r23 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r22 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r21 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r20 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r19 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r18 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r17 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r16 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r15 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r14 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r13 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r12 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r11 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r10 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r9 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r8 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r7 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r6 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r5 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r4 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r3 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r2 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r1 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;out __SREG__, r0 \n\t&amp;quot; \&lt;br /&gt;
&amp;quot;pop r0 \n\t&amp;quot; \&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la suite nous avons définis nos processus comme des structures que nous avons stocké dans un tableau. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot; line&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
  void (*tache)(void);	&lt;br /&gt;
  int pile;&lt;br /&gt;
  int temps;&lt;br /&gt;
  int etat;//wake ou sleepy (processus actif ou en attente)&lt;br /&gt;
}tache; &lt;br /&gt;
tache taches[TACHE_MAX]; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:20241006 170632.mp4|vignette|gauche|Leds clignotant à des fréquences différentes]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6054</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6054"/>
		<updated>2024-09-30T10:22:40Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réaliser un shield qui nous servira, dans le cas ou la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes aidé des indication du professeurs en première séance pour réaliser le schéma de notre shield, nous y avons rajouté une puce mémoire AT45DB161D, la datasheet nous a permit de savoir commander intégrer notre puce memoire dans notre schéma:&lt;br /&gt;
&lt;br /&gt;
[[File:|description]]&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
	<entry>
		<id>https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6053</id>
		<title>SE4Binome2024-6</title>
		<link rel="alternate" type="text/html" href="https://projets-se.plil.fr/mediawiki/index.php?title=SE4Binome2024-6&amp;diff=6053"/>
		<updated>2024-09-30T10:11:01Z</updated>

		<summary type="html">&lt;p&gt;Yyahiani : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=GIT=&lt;br /&gt;
Nos codes et nos conceptions kicad sont disponibles via notre GIT : https://gitea.plil.fr/yyahiani/pico_yahiani_zongo.git&lt;br /&gt;
&lt;br /&gt;
=Objectif=&lt;br /&gt;
&lt;br /&gt;
Nous avons pour objectif de construire un pico-ordinateur qui intégrera plusieurs éléments essentiels. Voici les composants que nous allons inclure :&lt;br /&gt;
&lt;br /&gt;
*Un processeur de type microcontrôleur : Cela constituera le cœur de notre pico-ordinateur, permettant de gérer toutes les opérations.&lt;br /&gt;
&lt;br /&gt;
*Un clavier : Pour l'entrée de données, il nous permettra d'interagir facilement avec notre dispositif.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif d'affichage : Cela nous permettra de visualiser les informations et les résultats des opérations effectuées par notre pico-ordinateur.&lt;br /&gt;
&lt;br /&gt;
*Un système d'exploitation : Celui-ci sera stocké dans la mémoire flash du microcontrôleur, garantissant un fonctionnement fluide de notre appareil.&lt;br /&gt;
&lt;br /&gt;
*Une mémoire de masse : Nous prévoyons d'ajouter une mémoire qui ira au-delà de la mémoire flash, pour stocker davantage de données.&lt;br /&gt;
&lt;br /&gt;
*Un dispositif de communication externe : Cela nous permettra d'interagir avec d'autres dispositifs ou réseaux.&lt;br /&gt;
&lt;br /&gt;
Enfin, pour assurer la communication entre tous ces éléments, nous allons mettre en place un bus série. Cela facilitera les échanges de données et garantira une intégration harmonieuse de chaque composant.&lt;br /&gt;
&lt;br /&gt;
En premier lieu, nous avons d'abord réaliser un shield qui nous servira, dans le cas ou la carte mère n'abouti pas, à pouvoir tester nos cartes filles à l'aide d'un Arduino uno pour prototyper le coeur d'une carte mère.&lt;br /&gt;
&lt;br /&gt;
=Shield=&lt;/div&gt;</summary>
		<author><name>Yyahiani</name></author>
	</entry>
</feed>