Masar
Masar
Bac Tunisie
Entraîner la reconnaissance
PIC-AAutomatisme — PIC et mikroPascal

PIC — TMR0 compteur, ADC et affichage LCD

Idée directrice

Sur PIC 16F876A en mikroPascal, on configure TMR0 en compteur d’impulsions (OPTION_REG, entrée RA4), le CAN/ADC (`ADC_INIT`, `adc_read`), puis on affiche avec `lcd_out(ligne, colonne, texte)`.

Signature de reconnaissance — l'énoncé se trahit ainsi

PIC 16F876A ; TMR0 ; ADC ; lcd_out ; mikroPascal

Sujet principal

Exercice — dans l’esprit des sujets techniques

6 questionsCorrigé masqué

A — Comptage (type 2019). Un capteur S2S2 est relié à l’entrée RA4 d’un PIC 16F876A pour compter des fûts.

  1. Pourquoi choisir RA4 / TMR0 plutôt qu’une simple entrée logique pollée pour compter des impulsions rapides ?
  2. Que configure l’instruction `OPTION_REG:=$E8` dans le corrigé type (compteur à front montant sur RA4) ?
  3. Cite deux instructions d’initialisation de l’afficheur LCD vues au bac.

B — Mesure de vitesse (type 2022). Une dynamo tachymétrique livre 005V5\,\mathrm{V} sur RA3/AN3. La vitesse se calcule ncalcul=16×M1023n_{\mathrm{calcul}}=\dfrac{16\times M}{1023}MM est la lecture ADC 10 bits.

  1. Écrire la séquence d’initialisation : module CAN + lecture de la voie 3.
  2. Si M=511M=511, calculer ncalculn_{\mathrm{calcul}} (valeur réelle).
  3. Compléter : `lcd_out(1,1, …… );` pour afficher le texte `Vitesse de rotation ` en ligne 1 colonne 1.
Voir la correction commentéeAprès avoir posé votre démarche

A1. TMR0 en mode compteur incrémente sur les fronts sans rater d’impulsions entre deux lectures logicielles (corrigé 2019).

A2. Configure le timer/compteur pour compter sur front montant de RA4 (`OPTION_REG:=$E8`).

A3. `lcd_init();` et `lcd_cmd(_LCD_CURSOR_OFF);`.

B1. `ADC_INIT();` puis `M:= adc_read(3);`.

B2. ncalcul=16×511/10238,0n_{\mathrm{calcul}}=16\times 511/1023\approx 8{,}0.

B3. `lcd_out(1,1,'Vitesse de rotation ');` (corrigé 2022).

Exercices d'entraînement — une nuance à la fois

Entraînement 01 / 09

Drill — ADC 10 bits

1 questionCorrigé masqué

Sur le PIC, après `ADC_INIT` et `adc_read(3)`, pourquoi divise-t-on par 10231023 dans ncalcul=(16M)/1023n_{\mathrm{calcul}}=(16 M)/1023 pour l’affichage LCD ?

Voir la correction commentéeAprès avoir posé votre démarche

L’ADC 10 bits du PIC code 0010231023 pour 00VrefV_{\mathrm{ref}} ; on normalise MM avant `lcd_out` / `bytetostr`.

Entraînement 02 / 09

Drill — RA4

1 questionCorrigé masqué

Relier le capteur de comptage à RA4 sert à : (a) PWM (b) compteur d’impulsions TMR0 (c) DAC.

Voir la correction commentéeAprès avoir posé votre démarche

(b) compteur d’impulsions via TMR0 (corrigé 2019).

Entraînement 03 / 09

PIC — RA4 et TMR0 en mode compteur

3 questionsCorrigé masqué

Sur une carte à PIC 16F876A (sujet type fabrication de fûts), un capteur S2S2 détecte chaque fût fabriqué. On relie S2S2 à l’entrée RA4 pour compter les impulsions via le timer TMR0 programmé en mode compteur (mikroPascal Pro).

  1. Pourquoi relier le capteur à RA4 plutôt qu’à une entrée logique quelconque pollée en boucle ?
  2. Que configure l’instruction `OPTION_REG:=\$E8` d’après le corrigé type ?
  3. Écrire l’instruction qui remet TMR0 à zéro avant la boucle de comptage.
Voir la correction commentéeAprès avoir posé votre démarche

1. RA4 est l’entrée externe du TMR0 en mode compteur : chaque impulsion incrémente le timer matériellement, sans rater d’impulsions rapides qu’un simple test logiciel pourrait manquer.

2. `OPTION_REG:=\$E8` configure le compteur à front montant sur RA4 (commentaire du corrigé 2019).

3. `tmr0:=0;` initialise le compteur avant le `while true do`.

Entraînement 04 / 09

PIC — initialisation de l’afficheur LCD

3 questionsCorrigé masqué

Un programme mikroPascal affiche des grandeurs sur un LCD 2 lignes branché sur un port du PIC (sujet type 2019). On dispose des routines bibliothèque `lcd_init`, `lcd_cmd`, `lcd_out`.

  1. Citer deux instructions d’initialisation de l’afficheur LCD vues au bac.
  2. Compléter : `lcd_out(1,5, txt1);` affiche `txt1` sur quelle ligne et quelle colonne ?
  3. Pourquoi déclarer les bits `LCD_RS`, `LCD_EN`, `LCD_D4`… `LCD_D7` avant le `begin` principal ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Exemples du corrigé : `lcd_init();` et `lcd_cmd(_LCD_CURSOR_OFF);`.

2. Ligne 1, colonne 5 : la signature est `lcd_out(ligne, colonne, texte)`.

3. Ces `sbit` décrivent le câblage matériel de l’afficheur sur les broches du microcontrôleur ; sans cette déclaration, les routines LCD ne savent pas quelles broches piloter.

Entraînement 05 / 09

PIC — ADC 10 bits et formule n_calcul

3 questionsCorrigé masqué
Une dynamo tachymétrique livre une tension 005V5\,\mathrm{V} sur la broche RA3/AN3 d’un PIC. Après conversion, la vitesse affichée est calculée par
ncalcul=16×M1023n_{\mathrm{calcul}}=\dfrac{16\times M}{1023}

MM est la lecture entière du CAN 10 bits.
  1. Écrire la séquence d’instructions : configuration de RA3 en analogique, `ADC_INIT`, puis lecture de la voie 3.
  2. Si M=767M=767, calculer ncalculn_{\mathrm{calcul}} (valeur réelle).
  3. Pourquoi le dénominateur est-il 10231023 et non 10001000 ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Exemple type corrigé 2022 : configuration ADCON1 pour RA3/AN3 analogique, `ADC_INIT();`, puis `M:= adc_read(3);`.

2. ncalcul=16×7671023=12272102312,00n_{\mathrm{calcul}}=\dfrac{16\times 767}{1023}=\dfrac{12272}{1023}\approx 12{,}00.

3. Un CAN 10 bits code 2101=10232^{10}-1=1023 quanta entre 00 et VrefV_{\mathrm{ref}} ; 10231023 est la pleine échelle numérique, pas une base décimale.

Entraînement 06 / 09

PIC — lecture adc_read et affichage vitesse

3 questionsCorrigé masqué

Après `M:= adc_read(3);` et `n_calcul:= (16 * M) / 1023;`, le programme convertit la vitesse en octet pour l’affichage LCD : `n:= byte(n_calcul);` puis `bytetostr` / `lcd_out`.

  1. Pourquoi convertir `n_calcul` (type réel) en `byte` avant l’affichage ?
  2. Écrire l’instruction `lcd_out` pour afficher le texte `Vitesse de rotation ` en ligne 1, colonne 1.
  3. Si M=0M=0, que vaut ncalculn_{\mathrm{calcul}} ? Interpréter physiquement (dynamo à l’arrêt).
Voir la correction commentéeAprès avoir posé votre démarche

1. Les routines d’affichage numériques du bac travaillent souvent sur des entiers / chaînes ; `byte(n_calcul)` retient la partie entière affichable sur le LCD.

2. `lcd_out(1,1,'Vitesse de rotation ');`

3. ncalcul=0n_{\mathrm{calcul}}=0 : tension nulle sur AN3 → vitesse nulle (arbre arrêté). C’est un contrôle de cohérence simple avant une action de sécurité.

Entraînement 07 / 09

PIC — structure d’un programme mikroPascal

3 questionsCorrigé masqué

Un corrigé de bac Technique demande de compléter un programme en mikroPascal PRO pour un PIC16F876A : déclaration des variables, configuration des `TRIS`, initialisation LCD, puis boucle `while true do`.

  1. Quelle est la première ligne typique (entête) d’un programme mikroPascal ?
  2. Que signifie configurer un bit de `TRISB` à 00 ? à 11 ?
  3. Pourquoi le corrigé rappelle-t-il de faire correspondre chaque `begin` à un `end` ?
Voir la correction commentéeAprès avoir posé votre démarche

1. `Program` suivi du nom du programme et d’un point-virgule, par exemple `Program compt_lcd_16F876A;`.

2. `TRIS=0` : broche en sortie ; `TRIS=1` : broche en entrée.

3. Un `begin` sans `end` (ou l’inverse) casse la structure des boucles et des blocs conditionnels : le programme ne compile pas ou exécute une logique fausse.

Entraînement 08 / 09

PIC — comptage d’un lot et condition TMR0

3 questionsCorrigé masqué

On compte un lot de fûts avec TMR0. Le cahier des charges indique qu’on traite la production tant que le compteur reste strictement inférieur à 100100 : dans le programme, le test s’écrit `if tmr0 < 100 then …`.

  1. Que représente la variable `tmr0` dans ce programme de comptage ?
  2. Si `tmr0` vaut 3737, le test `tmr0 < 100` est-il vrai ? Que fait-on typiquement dans le `then` ?
  3. Pourquoi initialiser `tmr0:=0` avant la boucle `while true do` ?
Voir la correction commentéeAprès avoir posé votre démarche

1. `tmr0` est le contenu du timer/compteur matériel : il vaut le nombre d’impulsions (fûts) déjà comptées depuis la dernière remise à zéro.

2. Oui, 37<10037<100 est vrai. On calcule souvent une grandeur dérivée et on affiche le compte via `byteToStr` puis `lcd_out`.

3. Sans remise à zéro, le compteur pourrait démarrer à une valeur résiduelle et fausser le lot (dépassement prématuré de 100100).

Entraînement 09 / 09

PIC — ADCON1 et entrée analogique AN3

3 questionsCorrigé masqué

Avant d’appeler `ADC_INIT()` et `adc_read(3)`, le corrigé configure le registre ADCON1 pour que la broche RA3/AN3 soit une entrée analogique (dynamo tachymétrique 005V5\,\mathrm{V}).

  1. Pourquoi faut-il configurer RA3 en analogique avant la lecture ADC ?
  2. Que fait `ADC_INIT()` dans la séquence type du bac ?
  3. Si l’on lit par erreur la voie 00 au lieu de la voie 33, que risque-t-on physiquement pour la mesure de vitesse ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Sans configuration analogique, la broche reste numérique : le CAN ne convertit pas correctement la tension de la dynamo.

2. `ADC_INIT()` initialise le module CAN (horloge, références, état interne) avant les lectures `adc_read`.

3. On lirait une autre voie (éventuellement non câblée) : la vitesse calculée serait fausse même si la formule 16M/102316M/1023 est correcte.

Méthode / Automatismes

Ordre type : config TRIS/ports → ADC ou TMR0 → `lcd_init` → boucle `while true` lecture/calcul/affichage.

Pièges classiques

Inverser ligne/colonne dans `lcd_out` ; oublier `ADC_INIT` avant `adc_read`.

Où ce scénario est tombé

Bac Technique — PIC (2019 comptage / 2022 ADC)· Partie B — Génie électriqueattestéTMR0, ADC, LCD mikroPascal