Cours:Lo11Final : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m ({{Rouge|Notes de musique}})
m ({{Bleu|Compteur}})
Ligne 14 : Ligne 14 :
 
=={{Bleu|Compteur}}==
 
=={{Bleu|Compteur}}==
  
Commençons par réaliser un compteur 8 bits avec entrée '''enable''' et valeur '''maximum'''.
+
Commençons par réaliser un compteur 8 bits avec entrée valeur '''maximum''' et la sortie '''s' (décrite un peu plus loin).
  
 
<source lang=vhdl>
 
<source lang=vhdl>
Ligne 41 : Ligne 41 :
 
end Behavioral;
 
end Behavioral;
 
</source>
 
</source>
 
+
Remarquez le signal '''en''' qui est un signal interne. Il sera positionné à '1' pour les tests.
 
{{Todo|Décrire le process '''comptage''' en implémentant les fonctions valeurs maximum et enable synchone}}
 
{{Todo|Décrire le process '''comptage''' en implémentant les fonctions valeurs maximum et enable synchone}}
 
  
 
=={{Bleu|Prédivision}}==
 
=={{Bleu|Prédivision}}==

Version du 14 juin 2014 à 20:00

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

Gestion du temps par µcontrôleur

Les timers sont des périphériques matériels qui permettent à un µcontrôleur une gestion précise du temps.

Il s'agit tout simplement d'un compteur(avec plus ou moins de fonctions annexes) dont la période de comptage est connue.

Il suffit ensuite de jouer sur les valeurs du compteur pour obtenir le temps souhaité.

Le µcontrôleurAtmega8 que nous utilisons ne dispose pas de timer, aussi nous allons nous efforcer de lui en ajouter une version modeste !

Préparation du timer

Compteur

Commençons par réaliser un compteur 8 bits avec entrée valeur maximum et la sortie s' (décrite un peu plus loin).

library ieee;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity pseudoTimer is
Port ( clk : in STD_LOGIC;
max : in STD_LOGIC_VECTOR (7 downto 0);
s : out STD_LOGIC);
end pseudoTimer;

architecture Behavioral of pseudoTimer is
signal en : STD_LOGIC;

signal cpt : STD_LOGIC_VECTOR (7 downto 0);
begin

comptage:process(clk,en)
begin

end process comptage;

end Behavioral;

Remarquez le signal en qui est un signal interne. Il sera positionné à '1' pour les tests. Todo.jpg Décrire le process comptage en implémentant les fonctions valeurs maximum et enable synchone

Prédivision

Limitons maintenant la vitesse de comptage à l'aide du signal enable.

On utilise pour ce faire un prédiviseur de fréquence :

  • décrivez un compteur modulo N(en l'occurrence modulo 256)
  • le signal enable est à '1' toutes les N (ici 256) périodes d'horloge
prediv:process(clk)
begin

end process prediv;

Todo.jpg Décrire ce fonctionnement en utilisant le process prediv pour la partie comptage modulo N

Sortie

Le signal de sortie doit tout simplement : changer d'état à chaque débordement (passage à 0) du timer.

Remarque : pensez à utiliser le signal en.

Todo.jpg Compléter votre programme avec cette sortie

Tests

Question.jpg Vérifier le fonctionnement en utilisant les interrupteurs pour la valeur maximum et A6 comme sortie. Valider le fonctionnement à l'oscilloscope.

Ajoutons le au µcontrôleur

Modification du fichier io.vhd

C'est bien entendu dans l'entité io du fichier io.vhd que nous allons ajouter notre pseudoTimer.

Vous devrez déclarer les signaux et faire les modifications nécessaires pour :

  • que la valeur max du timer soit reliée au PORTC
  • que la sortie du timer corresponde à Q_LEDS(0)

Todo.jpg Faire ces modifications et compiler


Utilisons ce module

Question.jpg Ecrire un programme qui fait varier la valeur maximum du timer toute les 100ms.

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

int main(void)
{
   ....
}

Notes de musique

Le buzzer que nous utilisons et capable de jouer les notes suivantes :

Touche 0 1 2 3 4 5 6 7 8 9 * #
Note Do Do# Ré# Mi Fa Fa# Sol Sol# La La# Si
Fréquence (Hz) 261,63 277,18 293,66 311,13 329,63 349,23 369,99 392 415,3 440 466,16 493,88
Période (µs) 3822 3608 3405 3214 3037 2863 2703 2551 2408 2273 2145 2025

Bien entendu, à chaque note correspondra une valeur maximum du timer.

Question.jpg Déclarer un tableau avec la valeur maximum associée à chaque note

Question.jpg Utiliser ce tableau pour jouer une mélodie

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

#define Do   0
#define Dod  1
#define Re   2
#define Red  3
#define Mi   4
#define Fa   5
#define Fad  6
#define Sol  7
#define Sold 8
#define La   9
#define Lad  10
#define Si   11

#define Noire 100

uint8_t tabNotes[12]={....};