Vous êtes sur la page 1sur 2

Université des Sciences et de la Technologie d’Oran – Mohamed Boudiaf

Faculté de Génie Electrique – Département d’Electronique


Niveau: M2 – ESE / Module: Systèmes Temps Réel

TP no 3: Réalisation d’un horloge à base de FreeRTOS

L’objectif de ce TP est d’implémenter un compteur de secondes (horloge) et d’afficher sa valeur en décimal


sur les afficheurs 7 segments, en utilisant le noyau temps réel FreeRTOS. La carte EasyPIC 7 contient quatre
afficheurs 7 segments mis ensembles pour former un affichage à 4 digits (de 0 à 9999). Ces afficheurs sont mis
en parallèle sur le même bus de données (PORTD), et sont gérés par la technique de multiplexage en utilisant
les lignes de sélection de RA0 à RA3. En multiplexant les données à travers les afficheurs assez rapidement, on
crée l’illusion que les quatre afficheurs fonctionnent simultanément (voir figure 1).

Figure 1 – Schéma du montage des afficheurs 7 segments sur la carte EasyPIC 7

1 Détermination de la fréquence optimale de multiplexage


Le but de cette partie est de définir la fréquence de clignotement optimale d’une Led, non perceptible par
l’œil humain. Pour ce faire, on utilise la méthode de dichotomie sur l’intervalle des périodes [1 ms ; 40
ms] (1ms étant la période du tick du noyau, période minimale atteinte par vTaskDelay).
1. Configurer le PORTB en sortie en faisant appel à la fonction PORTBInitialise, définie dans le fichier
FonctionsTP.c.
2. Créer une tâche permettant de faire clignoter la Led (PORTB.RB0) à la période T = 1 ms, en utilisant
la fonction vTaskDelay() et l’instruction suivante permettant d’effectuer le clignotement de la Led :

PORTBbits.RB0 = !(PORTBbits.RB0);

Observer le clignotement de la Led. Est-il visible ?


3. Changer la période de clignotement à T = 40 ms. Le clignotement est-il visible ?
4. En appliquant la méthode de dichotomie, trouver la période de clignotement maximale non perceptible
par l’œil humain que l’on note Topt .

2 Implémentation de l’horloge
Le système ”horloge” est implémenté en deux tâches : une tâche de comptage qui incrémente une variable
globale, et une tâche permettant d’afficher la valeur de cette variable globale sur les afficheurs 7 segments,
en utilisant la technique de multiplexage. Les deux tâches ont ainsi une relation de communication par zone
commune de donnée qui est la variable globale.

Mlle A. AARIZOU et Dr M. SAHARI 2022 – 2023


1. Configurer en sortie les ports PORTD et PORTA utilisés par les afficheurs 7 segments en faisant appel à
la fonction SevSegConfig() définie dans le fichier FonctionsTP.c.
2. Créer et définir la tâche périodique de comptage vTaskCount qui se charge d’incrémenter, toutes les
secondes, une variable globale préalablement déclarée et initialisée. La variable ne doit pas dépasser
la valeur de ’9999’ pour ne pas dépasser la capacité d’affichage des quatre afficheurs 7 segments.
3. Créer et définir la tâche périodique d’affichage vTaskDisplay en utilisant la fonction suivante définie
dans FonctionsTP.c :

void SevSegDisplay(unsigned int value, unsigned char position);

Cette fonction permet d’afficher un digit de la valeur ’value’ dans sa position qui est précisée par le
paramètre ’position’. Exemple : l’instruction SevSegDisplay(1234, 1) permet d’afficher le digit
de valeur ’4’ sur l’afficheur 7 segments de position ’1’ (celui des unités).
4. En exploitant la période Topt trouvée dans la partie 1 définir la période de la tâche vTaskDisplay de
sorte à afficher à tour de rôle les quatre digits sur leurs afficheurs correspondants.

3 Gestion de l’horloge par un clavier : Synchronisation entre tâches


par vTaskSuspend et vTaskResume
Cette parie consiste à lancer ou suspendre l’horloge en utilisant deux boutons poussoirs associés au PORTC
de la manière suivante :
− L’horloge est initialement suspendue.
− Le bouton PORTC.RC7 lance l’horloge.
− Le bouton PORTC.RC6 suspend l’horloge.

1. Configurer le PORTC en entrée en utilisant le code suivant :

TRISC = 0xC0; //RC7 et RC6 en entree


ANSELC = 0x00; //PORTC en entree digitale

2. Dans le code de la tâche comptage vTaskCount, faire appel à la fonction suivante fournie par FreeRTOS,
de sorte que la tâche comptage se suspende elle-même :

void vTaskSuspend( TaskHandle_t xTaskToSuspend );

3. Créer et définir une tâche vTaskKey de période 100 ms permettant de lire les boutons RC7 et RC6
par scrutation, et qui, suite à l’appui de l’un des boutons, permet de suspendre ou de lancer la tâche
vTaskCount comme décrit plus haut. L’API permettant de lancer la tâche est définie par le prototype
suivant :

void vTaskResume( TaskHandle_t xTaskToResume )

∗ Note : La carte est configurée de sorte que l’appui sur l’un des boutons génère un ’0’ logique.

Vous aimerez peut-être aussi