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

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche
Ligne 35 : Ligne 35 :
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include <util/delay.h>
#define SFTSER_PIN PB0
#define SFTSER_PIN PB0
#define SFTCLK_PIN PD7
#define SFTCLK_PIN PD7
#define SFTLTC_PIN PD4
#define SFTLTC_PIN PD4
void shift_set(unsigned char b1,unsigned char b2) {
void shift_set(unsigned char b1,unsigned char b2) {
  PORTD &= ~(1 << SFTLTC_PIN);
  PORTD &= ~(1 << SFTLTC_PIN);
   unsigned char tab[2]={b1,b2};
   unsigned char tab[2]={b1,b2};
for(int i=0; i<2; i++){
for(int i=0; i<2; i++){
   unsigned char b=tab[i];
   unsigned char b=tab[i];
Ligne 52 : Ligne 48 :
     else PORTB &= ~(1<< SFTSER_PIN);
     else PORTB &= ~(1<< SFTSER_PIN);
     PORTD |= (1<< SFTCLK_PIN);
     PORTD |= (1<< SFTCLK_PIN);
 
     }
     }
   }
   }
PORTD |= (1 << SFTLTC_PIN);
PORTD |= (1 << SFTLTC_PIN);
}
}
void affiche_chiffre (int position , char ascii){
void affiche_chiffre (int position , char ascii){
   static int initialisation = 0 ;
   static int initialisation = 0 ;
   if (! initialisation){
   if (! initialisation){
Ligne 66 : Ligne 59 :
     initialisation = 1 ;  
     initialisation = 1 ;  
   }
   }
  unsigned char digits[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
  unsigned char digits[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
  0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
  0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
unsigned char pos_mask = (1<< position);
unsigned char pos_mask = (1<< position);
int index=0;   
int index=0;   
Ligne 85 : Ligne 76 :
   }
   }
   return 0;
   return 0;
}
}
''
''


= Documents Rendus =
= Documents Rendus =

Version du 7 mars 2026 à 20:51

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.

Travail réalisé

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.

Modifications apportées à shift_set :

1.La fonction vérifie elle-meme si les broches DDR sont configurées (vie une variable static), cela évite d'oublier l'initialisation dans le main .
2.j'ai créé un tableau digits qui contient les codes héxadécimaux pour les chiffres de 0 à F en logique inversée (anode commune).
3.La fonction reçoit désormuis une position (0 à 3) et un caractère ascii , elle calcule l'index et active le bon digit .

Code réalisé :

#include <stdio.h>

  1. include <avr/io.h>
  2. include <util/delay.h>
  3. define SFTSER_PIN PB0
  4. define SFTCLK_PIN PD7
  5. define SFTLTC_PIN PD4

void shift_set(unsigned char b1,unsigned char b2) {

PORTD &= ~(1 << SFTLTC_PIN);
  unsigned char tab[2]={b1,b2};

for(int i=0; i<2; i++){

 unsigned char b=tab[i];
 for(int j=7; j>=0; j--){
   PORTD &= ~(1 << SFTCLK_PIN);
   if (b & (1 << j)) PORTB |= (1<< SFTSER_PIN);
   else PORTB &= ~(1<< SFTSER_PIN);
   PORTD |= (1<< SFTCLK_PIN);
   }
 }

PORTD |= (1 << SFTLTC_PIN); } 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 ; 
 }
unsigned char digits[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};

unsigned char pos_mask = (1<< position); int index=0; if (ascii >='0' && ascii <='9') {

    index = ascii - '0' ; 

}else if (ascii >= 'A' && ascii <= 'F')

    index = ascii - 'A' + 10 ;

shift_set(digits[index], pos_mask); } int main(void){

 while(1){
// Test simple : affiche 'A' sur le digit 0 
 affiche_chiffre(0,'A');
 _delay_ms(5);
 }
 return 0;

}

Documents Rendus