« SE4Binome2024-5 » : différence entre les versions
Ligne 46 : | Ligne 46 : | ||
<div style="float:left; width: 48%; padding-right: 10px;"> | |||
Le texte ici peut être n'importe quelle description ou explication. Vous pouvez l'ajuster pour qu'il prenne l'espace que vous souhaitez. Par exemple : | |||
Ce code initialise un minuteur en utilisant les registres du microcontrôleur pour configurer une interruption à un intervalle spécifié par la période et le diviseur. Le programme principal configure les registres nécessaires et lance l'interruption périodique pour manipuler un port. | |||
</div> | |||
<div style="float:right; width: 48%; padding-left: 10px;"> | |||
<syntaxhighlight lang="c" line> | <syntaxhighlight lang="c" line> | ||
#define CTC1 WGM12 // Meilleur nom pour le bit | #define CTC1 WGM12 // Meilleur nom pour le bit | ||
Ligne 82 : | Ligne 90 : | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | |||
==Coder le tableau des structures des processus== | ==Coder le tableau des structures des processus== |
Version du 13 novembre 2024 à 09:51
git : https://gitea.plil.fr/ktouron/se4-djadja-touron_pico.git
Carte fille clavier "matrice de touches"
Carte Shield
Carte Shield après soudure des composants
Allumage de LEDS sur Programmateur AVR
Avant de programmer directement sur le shield, nous avons allumé des LED pour tester la carte. Nous avons directement utilisé le code exemple fourni par l'IDE arduino en adaptant simplement les pins correspondant aux leds.
https://gitea.plil.fr/ktouron/se4-djadja-touron_pico/src/branch/main/PicoShield/Programmation/Blink
Test de lecture de la carte SD
Avant de programmer directement sur le shield, nous avons tester si la carte SD était bien détectée et lue. On a utilisé le code test présent dans l'IDE arduino en adaptant le port utilisé.
Test des connecteurs IDC HE10
Afin de tester nos connecteur HE10, nous avons utilisé un afficher 7 segments (Sparkfun 7 segments display). Pour pouvoir vérifier leurs fonctionnements nous avons branché l'afficheur sur chaque connecteur tour à tour. Le programme implanté est un simple connecteur à afficher sur l'afficheur. Voici une vidéo du compteur fonctionnant sur un des 5 connecteurs HE10. (Code ici (section : Example 2 SPI))
Carte Fille
Carte Fille après soudure des composants
Ordonnanceur
Pour les interruptions de notre ordonnanceur nous avons utilisé la procédure d'initialisation du minuteur avec le Timer1 disponible dans les cours de Mr.Redon en renseignant une période de 20ms. Nous l'avons disposé dans le fichier minuteur.c car nous n'allons plus le modifier pour le reste du projet. Dans un autre fichier process.c (avec process.h), nous allons y mettre nos structures pour les process et leurs états puis une union pour le temps qui le caractérise ainsi que toutes les fonctions associés.
Processus
Structure principale
Etat d'un processus
Le texte ici peut être n'importe quelle description ou explication. Vous pouvez l'ajuster pour qu'il prenne l'espace que vous souhaitez. Par exemple : Ce code initialise un minuteur en utilisant les registres du microcontrôleur pour configurer une interruption à un intervalle spécifié par la période et le diviseur. Le programme principal configure les registres nécessaires et lance l'interruption périodique pour manipuler un port.
#define CTC1 WGM12 // Meilleur nom pour le bit
#define PERIODE 20
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
}
ISR(TIMER1_COMPA_vect/*, ISR_NAKED*/) // Procédure d'interruption
{
PORTB ^= (1 << PB5);
}
int main(void){
DDRB |= (1 << PB5);
init_minuteur(256,PERIODE);
sei();
while(1);
}
Coder le tableau des structures des processus
Ce tableau des structures permet à un process d'ếtre caractériser par l'adresse du début de sa pile, l'adresse de la tâche (procédure) qu'elle va effectuer pui sont état (1 : réveillé, 0 : endormi).
typedef struct {
uint16_t adresseDepart; //adresse de la fonction de départ
uint16_t adressePile; //adresse de la pile d'exécution
bool etat; //état du processus (1 ou 0)
} Process;
Process table_process[MAXPROCESS];
Coder la fonction d'initialisation de la pile d'un processus
A REMPLIR
Taches ∞ pour faire clignoter deux leds à 2 fréquences premières entre elle
A REMPLIR
Lancement des deux tâches en parallèle grâce à l'ordonnanceur à tourniquet
A REMPLIR