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

De projets-se.plil.fr
Aller à la navigation Aller à la recherche
Ligne 97 : Ligne 97 :
</syntaxhighlight>
</syntaxhighlight>
Ordonnanceur Naked en Round-Robin ( Tourniquet en patois ) :
Ordonnanceur Naked en Round-Robin ( Tourniquet en patois ) :
Pour commencer, nous avons séparer le programme de clignotement des Leds en 5 programmes, 1 pour chaque Led.
<syntaxhighlight lang="c" line="1" start="1">
<syntaxhighlight lang="c" line="1" start="1">
void Led1(void)
void Led1(void)

Version du 20 novembre 2024 à 10:24

Lien du GIT : https://gitea.plil.fr/jwacquet/Pico_Binome4_Justin_Ibrahim.git

Shield Arduino

Projet Kicad : Fichier:Projet Kicad Shield.zip

Le shield va nous permettre de tester nos cartes filles sans la carte mère du Pico. Pour faire nos tests, le shield doit posséder un lecteur de carte SD pour tester la mémoire, des LEDs pour tester des processus et des ports He-10 pour y brancher des cartes filles.

Carte Shield Soudé :

Carte shield soudée face


Petite erreur de conception, la carte a été routée à l'envers... Ce n'est pas catastrophique (un peu quand même) et c'est rattrapable en rajoutant des rallonges pour avoir assez d'espace pour brancher les He-10.

Maintenant que la carte est soudé nous devons tester les différents éléments de la carte.

Test LED :

Pour tester les Leds nous avons réalisé un programme sur arduino qui allume les Leds.


Test cart SD :

Nous avons placé la carte SD dans le lecteur puis nous avons utilisé le programme info-carte sur l'IDE Arduino pour vérifier que le lecteur était fonctionnel.

Capture d'écran de l'IDE Arduino lors du test du lecteur de carte SD


Test Port He-10 :

Pour tester les ports He-10, nous avons connecté un afficheur 7-segment pour vérifier qu'ils fonctionnent.


Malgré des difficultés à connecter les afficheurs 7-segments à cause de défaut de conceptions, les 5 ports HE-10 sont fonctionnels.

Ordonnanceur :

Ordonnanceur (No Naked):


Le principe de l'ordonnanceur est de simuler une execution en parallele des tâches.


Pour cela, on génère un minuteur qui va nous donner une durée d'exécution d'un programme avant que ce-dernier ne se fasse interrompre pour qu'une autre tâche s'exécute.

Lorsqu'une tâche précédemment interrompue se réexécute, elle reprend là où elle en était dans son processus.

Ici la fonction d'interruption ISR fait clignoter les Leds lors d'une interruption, la fonction sei() active les interruptions.

#include <avr/io.h>
#include <avr/interrupt.h>

#define CTC1 WGM12

#define PERIODE         1000

ISR(TIMER1_COMPA_vect){    // Procédure d'interruption
int led1=(PORTC & 0x0f);
led1 >>= 1; if(led1==0) led1=0b00001001;
PORTC &= 0xf0; PORTC |= led1;

int led2=(PORTD & 0x0f);
led2 >>= 1; if(led2==0) led2=0b10010010;
PORTD &= 0xf0; PORTD |= led2;
}


void init_minuteur(int diviseur,long periode){
TCCR1A=0;               // Le mode choisi n'utilise pas ce registre
TCCR1B=(1<<CTC1);       // Réinitialisation du minuteur sur expiration
switch(diviseur){
  case    8: TCCR1B |= (1<<CS11); break;
  case   64: TCCR1B |= (1<<CS11 | 11<<CS10); break;
  case  256: TCCR1B |= (1<<CS12); break;
  case 1024: TCCR1B |= (1<<CS12 | 1<<CS10); break;
}
// Un cycle prend 1/F_CPU secondes.
// Un pas de compteur prend diviseur/F_CPU secondes.
// Pour une periode en millisecondes, il faut (periode/1000)/(diviseur/F_CPU) pas
// soit (periode*F_CPU)/(1000*diviseur)
OCR1A=F_CPU/1000*periode/diviseur;  // Calcul du pas
TCNT1=0;                // Compteur initialisé
TIMSK1=(1<<OCIE1A);     // Comparaison du compteur avec OCR1A
}

int main(){
    init_minuteur(1024,PERIODE);
    DDRC |= 0b00001001;
    DDRD |= 0b10010010;
    PORTC &= ~0b00001001;
    PORTD &= ~0b10010010;
    init_minuteur(256,PERIODE);
    sei();    // Autorisation des interruptions
    while(1);
}

Ordonnanceur Naked en Round-Robin ( Tourniquet en patois ) :

Pour commencer, nous avons séparer le programme de clignotement des Leds en 5 programmes, 1 pour chaque Led.

void Led1(void)
{
  while (1)
  {
    PORTC ^= 0b00000001;
    _delay_ms(100);
  }
}

void Led2(void)
{
  while (1)
  {
    PORTD ^= 0b00000010;
    _delay_ms(200);
  }
}

void Led3(void)
{
  while (1)
  {
    PORTC ^= 0b00001000;
    _delay_ms(300);
  }
}

void Led4(void)
{
  while (1)
  {
    PORTD ^= 0b00010000;
    _delay_ms(400);
  }
}

void Led5(void)
{
  while (1)
  {
    PORTD ^= 0b10000000;
    _delay_ms(500);
  }
}
Video de démonstration de l'ordonnanceur en tourniquet

Ordonnanceur Naked avec fonction d'endormissement des tâches :

bonjour

Carte Réseau

Projet Kicad:Fichier:Kicad CReseau.zip

Conception

Nous allons réaliser la carte fille réseau. Nous avons décidé de partir sur la carte RNDIS, avec un AT90USB1287 car il a une plus grande capacité de stockage que l'AtMega32u4. La carte communiquera avec l'extérieur par mini USB et pourra être alimenté de deux manières différentes: Soit par la carte mère ou soit par le port USB directement grâce à un jumper. On a également ajouté des LEDs qui vont servir de témoins lorsqu'il y a communication.

Schématique de la carte réseau
Schéma du PCB



Bilan de puissance

Suite à une demande de la part de l'équipe Mère, nous allons effectuer un bilan de puissance de notre carte :

Le composant majeur de notre carte est le microprocesseur, l'AT90USB.

Carte d'écran du courant de l'AT90USB

Avec un tension d'entrée de 5V et une fréquence de 16MHz, le microprocesseur consomme : 0,030A x 5V =0,15 W.