3

Click here to load reader

TP_TIMER0

Embed Size (px)

DESCRIPTION

???????????????

Citation preview

Page 1: TP_TIMER0

Travaux pratiques : TMR0

Dans ce TP nous allons mettre en pratique l’exercice précédent. Comme tache synchronisée par le TIMER0 nous avons choisis une simple incrémentation du contenu du port B, mais on peut choisir des tache beaucoup plus compliqués :

void tachex(void) { PORTB = PORTB++; }

Le registre INTCON sera initialisé à : 10100000 donc on autorisera les interruptions globale ainsi que les interruptions du TIMER0 :GIE = 1T0IE = 1

On va aussi choisir l’oscillateur interne comme source d’horloge (TOCS = 0), Assigner le pré-diviseur au TIMER0 (PSA = 0).

O sait aussi que le registre TMR0 est un registre 8 bits (R/W), donc au début du programme et après chaque interruption on va l’initialiser à 5 pour diviser exactement par 250 (comptage de 5 à 255).

Donc le nombre d’interruption par seconde est :

(8 000 000 x ¼ ) x 1/16 (Pré-diviseur) x 1/250 (Division du TMR0) = 500

D’où il ne reste qu’à faire une division logicielle par 500 à l’aide d’un compteur.

Donc le registre OPTION_REG doit avoir la valeur suivante :OPTION_REG = 0b00000011

RBPU = 0 pas de résistance PULL UP, INTEDG = 0 peut importe puisque la source externe d’interruption n’est utilisé, T0CS = 0 source d’horloge interne, T0SE = 0 peut importe puisque la source externe d’horloge n’est utilisé, PSA = 0 assignement du pré-diviseur au TIMER0, PS0=PS1=1 et PS2=0 rapport du pré-diviseur est programmé à 1/16.

A l’aide de la configuration précédente on va avoir 500 interruptions par seconde, ces interruption vont incrémenter un compteur (logicielle) et àà chaque fois où le compteur va atteindre 500 on déclenchera notre tache, et on initialise le compteur à 0, d’où une tache par seconde :

Page 2: TP_TIMER0

do {

if (compteur == 500) { tachex(); compteur = 0 ; } } while(1);

Dans notre cas la simple fonction qui incrémentera le compteur PORTB. D’où le programme :Saisissez le code suivant et exécutez le :

NB : le contenu des registres OPTION_REG et INTCON sont affiché sur les port C et D.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++unsigned compteur; // Definition de la varibale compteur

void tachex(void) { // Fonction tachex, ici c'est la tache // à executer d'une façon synchrone (1fois/s) // on peut inserer le code qu'on veut (dans // notre cas nous avons chois d'incrementer PORTB = PORTB++; // le PORTB)}

void interrupt() { compteur++; // L'interruption incrementera le compteur, TMR0 = 5; // Initialisera le registre TMR0 et INTCON.T0IF = 0; // initialisera le flag du TIMER0.}

void main() {

OPTION_REG = 0b00000011; // Prediviseur programmé à 1/8 ANSEL = 0; // Tout les E/S sont numerique ANSELH = 0; TRISB = 0; TRISC = 0; TRISD = 0; // Les Port B,C,D programés en sortie PORTB = 0x00; // Initialisation du port B TMR0 = 5; // Le TIMER0 contera de 5 à 255 (250 pas) INTCON = 0b10100000; // Autorisation des interruption TIMER0 compteur = 0; // Initialisation du compteur PORTC = OPTION_REG; // On visualise le contenu des registres PORTD = INTCON; // INTCON et OPTION_REG sur les ports C et D do { // Boucle infinie if (compteur == 500) // Division logicielle par 2 * 500 = 1000 { tachex(); // Execution de la tache tachex() compteur = 0; // Initialisation du compteur } } while(1);}++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Pouvez vous trouver d’autres combinaison pour obtenir les même résultat (PS0,PS1,PS2, compteur) ?

Page 3: TP_TIMER0