« SE4Binome2024-2 » : différence entre les versions

De projets-se.plil.fr
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 1 : Ligne 1 :
= Rapport Pico-ordinateur =
= Rapport du Pico Ordinateur =
 
== Introduction ==
Ce rapport présente les différentes étapes de conception et de développement d'un "pico ordinateur" basé sur Arduino. Le projet comporte plusieurs composants, notamment une carte Shield, un ordonnanceur, et une carte fille pour un afficheur 7 segments. Les sections suivantes détaillent chaque composant, les tests réalisés et les résultats obtenus.


== Carte Shield ==
== Carte Shield ==
{{Cadre|
Nous avons réalisé et testé la carte Shield Arduino en soudant les différents composants. Le fonctionnement a été vérifié avec succès en faisant clignoter les LED et en testant les connecteurs à l'aide d'un afficheur 7 segments ainsi que le lecteur de carte SD.


Pour cela, nous avons utilisé les codes exemples disponibles dans l'environnement Arduino IDE, tels que les fonctions pour contrôler les LED et lire les données sur l'afficheur 7 segments.
=== Description ===
La carte Shield utilisée est une carte Arduino customisée que nous avons soudée et testée. Cette carte comporte plusieurs connecteurs et fonctionnalités, dont des LED et un lecteur de carte SD.


'''Exemple de code pour afficher sur l'afficheur 7 segments :'''
=== Tests Réalisés ===
<code>
Nous avons testé les éléments suivants :
 
* **Clignotement des LED** : Pour tester la fonctionnalité des LED, nous avons utilisé des codes d'exemples disponibles dans le logiciel Arduino, notamment le clignotement des LED via des boucles <code>digitalWrite()</code>.
 
* **Afficheur 7 segments** : Nous avons connecté un afficheur 7 segments à la carte Shield via une interface SPI. Voici un extrait du code utilisé pour afficher des nombres sur l'afficheur :
 
<syntaxhighlight lang="cpp">
#include <SPI.h>
#include <SPI.h>


Ligne 14 : Ligne 22 :


void setup() {
void setup() {
   pinMode(ssPin, OUTPUT);
   pinMode(ssPin, OUTPUT);
   digitalWrite(ssPin, HIGH);
   digitalWrite(ssPin, HIGH);
   SPI.begin();
   SPI.begin();
   SPI.setClockDivider(SPI_CLOCK_DIV64);
   SPI.setClockDivider(SPI_CLOCK_DIV64);
}
}


void loop() {
void loop() {
   // Envoyer des données vers l'afficheur 7 segments
   // Envoi des données à l'afficheur
   digitalWrite(ssPin, LOW);
   digitalWrite(ssPin, LOW);
   SPI.transfer('2'); // Affiche '2'
   SPI.transfer('1'); // Affiche '1' sur l'afficheur
   digitalWrite(ssPin, HIGH);
   digitalWrite(ssPin, HIGH);
  delay(1000);
}
}
</code>
</syntaxhighlight>
}}
 
Ce code configure la communication SPI et permet d'afficher des chiffres sur l'afficheur 7 segments.
 
* **Lecteur de carte SD** : Nous avons également testé le lecteur de carte SD intégré à la carte Shield à l'aide des exemples Arduino pour la gestion des fichiers.


== Ordonnanceur ==
== Ordonnanceur ==
{{Cadre|
Nous avons commencé à implémenter un ordonnanceur basique pour gérer plusieurs tâches. Le timer a été initialisé et nous avons déclaré différentes tâches, mais la gestion complète des tâches n'est pas encore fonctionnelle.


Voici une explication des fonctions principales utilisées pour la gestion des tâches :
=== Introduction ===
L'ordonnanceur est une partie essentielle de notre pico ordinateur, permettant la gestion de plusieurs tâches. Nous avons configuré un timer pour ordonnancer différentes tâches, mais les tests de ces tâches avec l'ordonnanceur n'ont pas encore abouti à un succès complet.


'''Initialisation des tâches'''
=== Fonctionnement du Timer ===
Cette fonction permet de sauvegarder et de restaurer les registres à chaque changement de tâche.
Nous avons initialisé le **timer 1** pour gérer l'ordonnancement des tâches. Voici une explication du code utilisé pour initialiser le minuteur :
<code>
#define SAVE_REGISTERS() \
asm volatile ( \
  "push r0 \n\t" \
  "in r0, __SREG__ \n\t" \
  "push r0 \n\t" \
  "push r1 \n\t" \
  /* Sauvegarde des registres ici... */ \
);


void init_pile(int N){
<syntaxhighlight lang="cpp">
  uint16_t tempSP = SP;
void init_minuteur(int diviseur, long periode) {
  SP = task[N].stackPointer;
    TCCR1A = 0;              
  uint16_t adresse=(uint16_t)task[N].addressFunction;
    TCCR1B = (1 << CTC1);    
  asm volatile("push %0" : : "r" (adresse & 0x00ff) );
    switch (diviseur) {
  asm volatile("push %0" : : "r" ((adresse & 0xff00)>>8) );
        case 8: TCCR1B |= (1 << CS11); break;
  SAVE_REGISTERS();
        case 64: TCCR1B |= (1 << CS11 | 1 << CS10); break;
  task[N].stackPointer = SP;
        case 256: TCCR1B |= (1 << CS12); break;
  SP = tempSP;
        case 1024: TCCR1B |= (1 << CS12 | 1 << CS10); break;
    }
    OCR1A = F_CPU / 1000 * periode / diviseur; 
    TCNT1 = 0;              
    TIMSK1 = (1 << OCIE1A);  
}
}
</code>
</syntaxhighlight>
 
Ce code configure le timer pour générer des interruptions à des périodes régulières, ce qui permet d'interrompre une tâche en cours et de passer à une autre.


'''Minuteur'''
=== Gestion des Tâches ===
Le minuteur est utilisé pour déclencher les interruptions, permettant de passer d'une tâche à une autre de manière régulière.
Chaque tâche est définie dans un tableau structuré. Voici un extrait du tableau de processus qui stocke les tâches et leurs pointeurs de pile :
<code>
 
void init_minuteur(int diviseur, long periode) {
<syntaxhighlight lang="cpp">
  TCCR1A=0;
typedef struct process {
  TCCR1B=(1<<CTC1);
    uint16_t stackPointer;
  switch(diviseur){
    void (*addressFunction)(void);
     case 8: TCCR1B |= (1<<CS11); break;
     int state;
     case 64: TCCR1B |= (1<<CS11 | 11<<CS10); break;
} process;
     case 256: TCCR1B |= (1<<CS12); break;
 
     case 1024: TCCR1B |= (1<<CS12 | 1<<CS10); break;
process task[NB_TASKS] = {
  }
    {0x700, Serial_Led, 0},
  OCR1A = F_CPU/1000*periode/diviseur;
    {0x600, LED1_blink, 0},
  TIMSK1 = (1<<OCIE1A);
     {0x500, Serial_Message, 0}
};
</syntaxhighlight>
 
La fonction <code>scheduler()</code> se charge de passer d'une tâche à une autre :
 
<syntaxhighlight lang="cpp">
void scheduler() {
     currentTask++;
     if (currentTask == NB_TASKS) currentTask = 0; // Mode Round Robin
}
}
</code>
</syntaxhighlight>
}}
 
Une interruption est utilisée pour sauvegarder et restaurer les registres lors du changement de tâche.
 
== Carte Fille Afficheur ==
 
=== Schématique ===
Nous avons commencé à dessiner le schéma de notre carte fille, qui sera utilisée pour connecter un afficheur. Ce schéma inclut les connexions SPI nécessaires pour l'afficheur 7 segments et les autres composants qui y seront intégrés.
 
=== Liste des Composants ===
* [[Insérer la liste des composants ici]]


== Carte fille afficheur ==
== Conclusion ==
{{Cadre|
Bien que certains aspects du projet soient encore en développement, nous avons réussi à tester avec succès la carte Shield et certaines fonctionnalités comme l'affichage 7 segments et le clignotement des LED. L'implémentation de l'ordonnanceur et des tâches est en bonne voie, mais nécessite encore quelques ajustements pour une exécution parfaite. Nous prévoyons d'approfondir ces aspects dans les prochaines étapes du projet.
Nous avons commencé à travailler sur le schéma de la carte fille pour l'afficheur. L'objectif est de créer une carte additionnelle qui permettra de gérer l'affichage avec plus de flexibilité.
}}

Version du 15 octobre 2024 à 19:30

Rapport du Pico Ordinateur

Introduction

Ce rapport présente les différentes étapes de conception et de développement d'un "pico ordinateur" basé sur Arduino. Le projet comporte plusieurs composants, notamment une carte Shield, un ordonnanceur, et une carte fille pour un afficheur 7 segments. Les sections suivantes détaillent chaque composant, les tests réalisés et les résultats obtenus.

Carte Shield

Description

La carte Shield utilisée est une carte Arduino customisée que nous avons soudée et testée. Cette carte comporte plusieurs connecteurs et fonctionnalités, dont des LED et un lecteur de carte SD.

Tests Réalisés

Nous avons testé les éléments suivants :

  • **Clignotement des LED** : Pour tester la fonctionnalité des LED, nous avons utilisé des codes d'exemples disponibles dans le logiciel Arduino, notamment le clignotement des LED via des boucles digitalWrite().
  • **Afficheur 7 segments** : Nous avons connecté un afficheur 7 segments à la carte Shield via une interface SPI. Voici un extrait du code utilisé pour afficher des nombres sur l'afficheur :
#include <SPI.h>

const int ssPin = 1;

void setup() {
  pinMode(ssPin, OUTPUT);  
  digitalWrite(ssPin, HIGH);  
  SPI.begin();  
  SPI.setClockDivider(SPI_CLOCK_DIV64);  
}

void loop() {
  // Envoi des données à l'afficheur
  digitalWrite(ssPin, LOW);
  SPI.transfer('1');  // Affiche '1' sur l'afficheur
  digitalWrite(ssPin, HIGH);
}

Ce code configure la communication SPI et permet d'afficher des chiffres sur l'afficheur 7 segments.

  • **Lecteur de carte SD** : Nous avons également testé le lecteur de carte SD intégré à la carte Shield à l'aide des exemples Arduino pour la gestion des fichiers.

Ordonnanceur

Introduction

L'ordonnanceur est une partie essentielle de notre pico ordinateur, permettant la gestion de plusieurs tâches. Nous avons configuré un timer pour ordonnancer différentes tâches, mais les tests de ces tâches avec l'ordonnanceur n'ont pas encore abouti à un succès complet.

Fonctionnement du Timer

Nous avons initialisé le **timer 1** pour gérer l'ordonnancement des tâches. Voici une explication du code utilisé pour initialiser le minuteur :

void init_minuteur(int diviseur, long periode) {
    TCCR1A = 0;               
    TCCR1B = (1 << CTC1);      
    switch (diviseur) {
        case 8: TCCR1B |= (1 << CS11); break;
        case 64: TCCR1B |= (1 << CS11 | 1 << CS10); break;
        case 256: TCCR1B |= (1 << CS12); break;
        case 1024: TCCR1B |= (1 << CS12 | 1 << CS10); break;
    }
    OCR1A = F_CPU / 1000 * periode / diviseur;  
    TCNT1 = 0;                
    TIMSK1 = (1 << OCIE1A);   
}

Ce code configure le timer pour générer des interruptions à des périodes régulières, ce qui permet d'interrompre une tâche en cours et de passer à une autre.

Gestion des Tâches

Chaque tâche est définie dans un tableau structuré. Voici un extrait du tableau de processus qui stocke les tâches et leurs pointeurs de pile :

typedef struct process {
    uint16_t stackPointer;
    void (*addressFunction)(void);
    int state;
} process;

process task[NB_TASKS] = {
    {0x700, Serial_Led, 0},
    {0x600, LED1_blink, 0},
    {0x500, Serial_Message, 0}
};

La fonction scheduler() se charge de passer d'une tâche à une autre :

void scheduler() {
    currentTask++;
    if (currentTask == NB_TASKS) currentTask = 0; // Mode Round Robin
}

Une interruption est utilisée pour sauvegarder et restaurer les registres lors du changement de tâche.

Carte Fille Afficheur

Schématique

Nous avons commencé à dessiner le schéma de notre carte fille, qui sera utilisée pour connecter un afficheur. Ce schéma inclut les connexions SPI nécessaires pour l'afficheur 7 segments et les autres composants qui y seront intégrés.

Liste des Composants

Conclusion

Bien que certains aspects du projet soient encore en développement, nous avons réussi à tester avec succès la carte Shield et certaines fonctionnalités comme l'affichage 7 segments et le clignotement des LED. L'implémentation de l'ordonnanceur et des tâches est en bonne voie, mais nécessite encore quelques ajustements pour une exécution parfaite. Nous prévoyons d'approfondir ces aspects dans les prochaines étapes du projet.