Cours:TP printempsM4209 TP 6c Corr : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m (Devoir surveillé de Novembre 2019)
m
Ligne 6 : Ligne 6 :
  
 
=Devoir surveillé de Novembre/Decembre 2019=
 
=Devoir surveillé de Novembre/Decembre 2019=
Vous allez partir de la correction qui est donnée en ressource juste au dessus.
+
Vous allez partir de la correction du TP6c qui est donnée : [http://moutou.pagesperso-orange.fr/TinyReveilLCDTP6C.zip TinyReveilLCDTP6C.zip].
 +
 
 +
Cette version est un peu améliorée pour l'occasion : vous avez la possibilité de suivre l'évolution de la machine d'états de la sonnerie du réveil à l'aide de trois leds vertes :
 +
* complètement à droite allumée quand on est dans l'état Off
 +
* deuxième led en partant de la droite allumée quand on est dans l'état Armed
 +
* troisième led en partant de la droite allumée quand on est dans l'état Ringing
 +
 
 
==Réalisation du projet et premières questions==
 
==Réalisation du projet et premières questions==
 
Le fichier C qui est compilé avec la correction est le suivant :
 
Le fichier C qui est compilé avec la correction est le suivant :
Ligne 44 : Ligne 50 :
 
   PORTA=0;
 
   PORTA=0;
 
   while(1) {  
 
   while(1) {  
  // echo simple
+
    // chenillard (non actif)
 
     //PORTA = ch;
 
     //PORTA = ch;
 
     ch >>= 1;  
 
     ch >>= 1;  
 
     if (ch == 0) ch = 128;
 
     if (ch == 0) ch = 128;
 +
// gestion incrementation heure réveil
 
     if (PINA & 0x01) {
 
     if (PINA & 0x01) {
 
         incrementHHMM(&hh_mmSonnerie);
 
         incrementHHMM(&hh_mmSonnerie);
 
         _delay_ms(10);
 
         _delay_ms(10);
 
     }
 
     }
    if (PINA & 0x02) {
+
// mise à jour heure courante
        decrementHHMM(&hh_mmSonnerie);
 
        _delay_ms(10);
 
    }
 
 
     hh_mmCourante = ADCH;
 
     hh_mmCourante = ADCH;
 
     hh_mmCourante <<= 8;
 
     hh_mmCourante <<= 8;
 
     hh_mmCourante += ADCL;
 
     hh_mmCourante += ADCL;
    if (PINA & 0x04) {
+
 
      if (hh_mmSonnerie == hh_mmCourante) PORTA = 1;
+
// sortie Heure sonnerie sur afficheur
    } else PORTA=0;
 
 
     PORTB = hh_mmSonnerie;
 
     PORTB = hh_mmSonnerie;
 
     DDRB = hh_mmSonnerie >> 8;
 
     DDRB = hh_mmSonnerie >> 8;
      // on défiler les valeurs   
+
         
 
   }  
 
   }  
 
   return 0;  
 
   return 0;  

Version du 26 novembre 2019 à 18:32

Il s’agit d’une page protégée.

Ceci est le corrigé du TP Réalisation du réglage de l'heure réveil par le processeur.

Voici une ressource complète de la correction du TP6c : TinyReveilLCDTP6C.zip

Devoir surveillé de Novembre/Decembre 2019

Vous allez partir de la correction du TP6c qui est donnée : TinyReveilLCDTP6C.zip.

Cette version est un peu améliorée pour l'occasion : vous avez la possibilité de suivre l'évolution de la machine d'états de la sonnerie du réveil à l'aide de trois leds vertes :

  • complètement à droite allumée quand on est dans l'état Off
  • deuxième led en partant de la droite allumée quand on est dans l'état Armed
  • troisième led en partant de la droite allumée quand on est dans l'état Ringing

Réalisation du projet et premières questions

Le fichier C qui est compilé avec la correction est le suivant :

#include "avr/io.h" 
#undef F_CPU 
#define F_CPU 16000000UL 
#include "util/delay.h" 

void incrementHHMM(uint16_t *hh_mm) {
  (*hh_mm)++;
      if ((*hh_mm & 0x000F) > 0x0009)
      *hh_mm += 0x0006;
      if ((*hh_mm & 0x00F0) > 0x0050)
      *hh_mm += 0x00A0;
      if ((*hh_mm & 0x0F00) > 0x0900)
      *hh_mm += 0x0600;
      if ((*hh_mm & 0xFF00) > 0x2300)
      *hh_mm = 0x0000;
}
 
void decrementHHMM(uint16_t *hh_mm) {
  (*hh_mm)--;
      if ((*hh_mm & 0x000F) == 0x000F)
      *hh_mm -= 0x0006;
      if ((*hh_mm & 0x00F0) == 0x00F0)
      *hh_mm -= 0x00A0;
      if ((*hh_mm & 0x0F00) == 0x0F00)
      *hh_mm -= 0x0600;
      if ((*hh_mm & 0xFFFF) > 0x2359)
      *hh_mm = 0x2359;
}

int main (void) {
   unsigned char ch=128; 
   uint16_t hh_mmSonnerie = 0x0123, hh_mmCourante=0;
   PORTA=0;
   while(1) { 
     // chenillard (non actif)
     //PORTA = ch;
     ch >>= 1; 
     if (ch == 0) ch = 128;
// gestion incrementation heure réveil
     if (PINA & 0x01) {
        incrementHHMM(&hh_mmSonnerie);
        _delay_ms(10);
     }
// mise à jour heure courante
     hh_mmCourante = ADCH;
     hh_mmCourante <<= 8;
     hh_mmCourante += ADCL;

// sortie Heure sonnerie sur afficheur
     PORTB = hh_mmSonnerie;
     DDRB = hh_mmSonnerie >> 8;
          
   } 
   return 0; 
 }

Répondre aux questions suivantes :

  • Faire le projet et constater le fonctionnement
  • si la ligne
     uint16_t hh_mmSonnerie = 0x0123, hh_mmCourante=0;
    
    est changée en
     uint16_t hh_mmSonnerie = 0x0645, hh_mmCourante=0;
    
    , pouvez vous donner l'heure de réveil (de sonnerie) qui apparaîtra sur l'écran LCD ?
  • quelle touche est responsable de l'incrémentation de l'heure réveil ?
  • quelle touche est responsable de la décrémentation de l'heure réveil ?
  • quelle touche est utilisée pour l'armement du réveil ?
  • comment fais-je pour arrêter le réveil de sonner ?

Modification matérielle

Le défaut de la réalisation de la solution présentée est la comparaison en C entre l'heure de sonnerie et l'heure courante :

 
if (PINA & 0x04) {
  if (hh_mmSonnerie == hh_mmCourante) 
    PORTA = 1;
} else 
  PORTA=0;

En effet la présence de _delay_ms pendant le réglage de l'heure réveil peut faire que l'on manque cette égalité : il suffit qu'elle arrive à un moment différent de l'exécution de cette instruction en C. Pour un réveil réel qui change son heure toutes les minutes, ce n'est pas un problème. Mais pour nous les minutes défilent à une vitesse qui s'approche de la seconde !

Si vous regardez attentivement le code de lcd16x2_ctrl_demo.vhd vous y verrez la présence d'un composant :

component SequSonnerie IS
  PORT(                  
        clock,Key,Trip,ena :IN std_logic;
        Ring :OUT std_logic
        );
  END component SequSonnerie;

Il s'agit de l'automatisme de la sonnerie. Nous allons profiter de sa présence pour gérer matériellement l'automatisme de sonnerie. En clair nous allons relier cet automatisme au processeur.