Cours:TP printempsM4209 TP 6c Corr
Révision datée du 22 novembre 2019 à 19:00 par SergeMoutou (discussion | contributions) (→Modification matérielle)
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 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 est changée en
uint16_t hh_mmSonnerie = 0x0123, hh_mmCourante=0;
, pouvez vous donner l'heure de réveil (de sonnerie) qui apparaîtra sur l'écran LCD ?uint16_t hh_mmSonnerie = 0x0645, hh_mmCourante=0;
- 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.