Cours:TP printempsM4209 TP 6c Corr : Différence entre versions
m |
m (→Modification matérielle) |
||
Ligne 80 : | Ligne 80 : | ||
==Modification matérielle== | ==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 | + | 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 : |
<source lang=c> | <source lang=c> | ||
if (PINA & 0x04) { | if (PINA & 0x04) { |
Version du 22 novembre 2019 à 19:00
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.