« SE3 2025/2026 EC2 » : différence entre les versions

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
Ligne 47 : Ligne 47 :
* La fontion affiche_chiffre permet d'afficher un caractère à une position  
* La fontion affiche_chiffre permet d'afficher un caractère à une position  
  - si le caractère est entre '0' et '9' on utilise directement l'index correspond.
  - si le caractère est entre '0' et '9' on utilise directement l'index correspond.
  -si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )
  - si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )
Cela permet de convertir la lettre en index dans le tableau .
Cela permet de convertir la lettre en index dans le tableau .



Version du 13 avril 2026 à 01:11

Objectifs

Réaliser le programme du devoir surveillé concernant la programmation en C sur microcontrôleur AVR :

  • vous disposez de la fonction init_minuteur du cours ;
  • vous devez déjà écrire une version améliorée de la fonction shift_set donnée en cours/TP :
    • la version améliorée doit s'appeller affiche_chiffre,
    • cette fonction se charge de l'initialisation des registres à décalage du bouclier multifonction au premier appel,
    • à chaque appel, affiche_chiffre n'affiche qu'un seul chiffre hexadécimal sur l'afficheur 7 segments,
    • le premier paramètre de la fonction donne la position où afficher le chiffre (les nombres valides vont de 0 à 3),
    • le second paramètre donne le code ASCII du chiffre à afficher (les valeurs valides vont des caractères 0 à 9, et des caractères A à F) ;
  • vous écrirez ensuite un programme affichant les nombres de 0 à 9999 (en base 10), un par seconde, puis cyclant en revenant à 0 :
    • il vous est imposé d'utiliser une variable globale char nombre[4]; qui contiendra les valeurs ASCII des nombres qui seront affichés sur le 7 segments,
    • écrivez d'abord la fonction principale main, initialisant ce qui est nécessaire, puis affichant à tour de rôle (et à l'infini) chaque chiffre sur le 7 segments,
    • donnez ensuite le code de l'ISR, incrémentant les valeurs contenues dans nombre (attention ce sont des valeurs ASCII, pour rappel les valeurs sont contiguës de 0 à 9, et de A à F).

Matériel nécessaire

  • Arduino Uno avec câble USB ;
  • bouclier multi-fonctions.
PhotoProjet1.jpg

Documents Rendus

Pour cette première étape , je me suis concentré sur la communication avec le 74HC595 du Multi-function Shield. J'ai repris la base de la fonction shift_set vue en TP pour créer une fonction plus robuste nommée affiche_chiffre.

1- Principe de Fonctionnement

Le système utilise un registre à décalage pour envoyer les données à l'afficheur. Trois signaux sont utilisés :

  • SER (serial)
  • CLK (clock)
  • LTC (Latch)

Les données ne sont pas envoyées en parallèle, mais bit pas bit (communication série).

2- Description du programme

  • Le programme configue les broches utilisées comme sorties :
- PB0 pour les données (SER)
- PD7 pour l'horloge (CLK)
- PD4 pour la validation (LTC)
  • Un tableau nommé digits contien les codes binaires nécessaires pour afficher les chiffre et les lettres sur l'afficheur 7 segments.
  • La fontion affiche_chiffre permet d'afficher un caractère à une position
- si le caractère est entre '0' et '9' on utilise directement l'index correspond.
- si le caractère est entre 'A' et 'F' on utilise la formule (ascii - 'A' + 10 )

Cela permet de convertir la lettre en index dans le tableau .

  • LA position de l'afficheur est sélectionnée à l'aide d'un masque binaire .
  • Les données (motif +position) sont envoyées au regitre à décalage bit par bit et du bit de poinds fort au bit de poinds faible .
  • une fois tous les bits envoyés , le signale LTC est activé pour afficher les données sur l'afficheur .
  • Dans la fontion main une boucle infinie affiche en continu la lettre 'C' à la position 2 avec un petit délai de 5ms .
#include <avr/io.h>
#include <util/delay.h>

#define SFTSER_PIN PB0
#define SFTCLK_PIN PD7
#define SFTLTC_PIN PD4

static const unsigned char digits[]={
  0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

void affiche_chiffre(int position, char ascii){
  static int initialisation = 0;
  if (!initialisation){
    DDRB |= (1<<SFTSER_PIN);
    DDRD |= (1<<SFTCLK_PIN) | (1<<SFTLTC_PIN) ;
    initialisation = 1;
  }
  // calcul de motif 
  unsigned char motif = 0xFF;
  if(ascii >= '0' && ascii <= '9'){
    motif = digits[ascii - '0'];
  }else if (ascii >= 'A' && ascii <= 'F'){
    motif = digits[ascii - 'A' + 10];
  }

  unsigned char pos_mask = (1<<position);
  unsigned char tab[2]={motif, pos_mask};

  PORTD &= ~(1<< SFTLTC_PIN); //Latch Low 

  for(int i= 0; i<2 ; i++){
    unsigned char b = tab[i];
    for (int j=7; j>=0;j--){
      PORTD &= ~(1<<SFTCLK_PIN); // clock Low

      if (b & (1<<j)) {
        PORTB |= (1<<SFTSER_PIN);
      }else{
        PORTB &= ~(1<<SFTSER_PIN);
      }
      PORTD |=(1<<SFTCLK_PIN); // Clock High
    }
  }
  PORTD |=(1<<SFTLTC_PIN); // Latch High

}
int main(void){
  while(1){ 
// test / afficher sur la deuxième position
    affiche_chiffre(2, 'C');
    _delay_ms(5);
  }
  return 0; 
}

Ressources et Documentation