Cours:TP printempsM4209 TP 6c Corr

De troyesGEII
Aller à : navigation, rechercher

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 : TinyReveilLCDStartTP6C.zip

Devoir surveillé de Novembre 2019

Vous allez partir de la correction qui est donnée en ressource juste au dessus.

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) { 
   // echo simple
     //PORTA = ch;
     ch >>= 1; 
     if (ch == 0) ch = 128;
     if (PINA & 0x01) {
        incrementHHMM(&hh_mmSonnerie);
        _delay_ms(10);
     }
     if (PINA & 0x02) {
        decrementHHMM(&hh_mmSonnerie);
        _delay_ms(10);
     }
     hh_mmCourante = ADCH;
     hh_mmCourante <<= 8;
     hh_mmCourante += ADCL;
     if (PINA & 0x04) {
       if (hh_mmSonnerie == hh_mmCourante) PORTA = 1;
     } else PORTA=0;
     PORTB = hh_mmSonnerie;
     DDRB = hh_mmSonnerie >> 8;
      // on défiler les valeurs     
   } 
   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 réveil :

 
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.