« Utiliser les PIC 16F et 18F/Exercices/Interruption timer0 en langage C » : différence entre les versions

Une page de Wikiversité, la communauté pédagogique libre.
Contenu supprimé Contenu ajouté
Ligne 2 : Ligne 2 :
Si vous voulez savoir comment est réalisé pratiquement ce qui est décrit dans cet exercice, visitez le chapitre [[Very High Speed Integrated Circuit Hardware Description Language#Embarquer un PIC 16F84|Embarquer un PIC 16F84]] d'un autre livre.
Si vous voulez savoir comment est réalisé pratiquement ce qui est décrit dans cet exercice, visitez le chapitre [[Very High Speed Integrated Circuit Hardware Description Language#Embarquer un PIC 16F84|Embarquer un PIC 16F84]] d'un autre livre.


Un PIC16F84 est enfoui dans un FPGA. Sa seule particularité est de fonctionner à 50MHz contre 10 (resp. 20 MHz) de fréquence maximale d'horloge pour les PIC 16F84 (resp. 16F84A). Il exécute le programme suivant (écrit avec le compilateur Hitech C) :
Un [[w:PIC_16F84_de_Microchip|PIC16F84]] est enfoui dans un [[w:FPGA|FPGA]]. Sa seule particularité est de fonctionner à 50MHz contre 10 (resp. 20 MHz) de fréquence maximale d'horloge pour les PIC 16F84 (resp. 16F84A). Il exécute le programme suivant (écrit avec le compilateur Hitech C) :
<source lang="c">
<source lang="c">
#include <pic1684.h>
#include <pic1684.h>

Version du 24 janvier 2011 à 14:12

Exercice 1 (Hitech C et Mikro C)

Si vous voulez savoir comment est réalisé pratiquement ce qui est décrit dans cet exercice, visitez le chapitre Embarquer un PIC 16F84 d'un autre livre.

Un PIC16F84 est enfoui dans un FPGA. Sa seule particularité est de fonctionner à 50MHz contre 10 (resp. 20 MHz) de fréquence maximale d'horloge pour les PIC 16F84 (resp. 16F84A). Il exécute le programme suivant (écrit avec le compilateur Hitech C) :

#include  <pic1684.h> 
void interrupt decalage(void);
unsigned char nb; 
main(void) { 
  TRISA = 0xF9; // 6 entrees, 2 sorties pour A 
  TRISB = 0x00; // 8 sorties pour B 
  OPTION = 0x07; // prescaler 256 , entree sur quartz 
  INTCON = 0xA0;  // autorise l'interruption timer 
  PORTB = 0x01; // une seule diode allumee		 
  TMR0 = 0x00 ; 
  nb=0; 
  while(1) { 
   // on ne fait rien que recopier sur 2 segments la valeur de SW1 
      if ((PORTA & 0x01) == 1) PORTA = 0x06; 
    } 
} 

void interrupt decalage(void) { 
  nb++; 
  //TMR0 = 0x00; //c'est fait car ici par overflow
  if (!(nb % 16)) 
  PORTB = (PORTB << 1) ; 
  if (PORTB == 0x00)   PORTB = 0x01; 
  T0IF = 0;  // acquittement interruption 
}

Remarquez comment est écrit une interruption avec ce compilateur. 1°) Repérer et modifier les lignes de ce programmes pour qu'il fonctionne avec le compilateur MikroC.

2°) Calculer si le chenillard réalisé par ce programme est visible à l'œil humain (fréquence de changement de position des LEDs inférieure à 20 Hz).

3°) Comment peut-on écrire l'instruction "if (!(nb % 16))" pour plus d'efficacité.

4°) Quelle est la suite des états (LEDs allumées) réalisée par ce programme.

Les deux questions suivantes sont issues du Devoir Surveillé de Juin 2010.

5°) Le programme suivant est donné comme exemple du compilateur MikroC et tourne dans un PIC 16F84 qui a un quartz de 4 MHz.

unsigned cnt; 
void interrupt() { 
  if (TMR0IF_bit) { 
    cnt++;                 // increment counter 
    TMR0IF_bit = 0;        // clear TMR0IF 
    TMR0   = 96; 
  } 
} 

void main() { 
  OPTION_REG = 0x84;       // Assign prescaler to TMR0 
  ANSEL  = 0;              // Configure AN pins as digital 
  ANSELH = 0; 
  C1ON_bit = 0;            // Disable comparators 
  C2ON_bit = 0; 
  TRISB = 0;               // PORTB is output 
  PORTB = 0xFF;            // Initialize PORTB 
  TMR0  = 96;              // Timer0 initial value 
  INTCON = 0xA0;           // Enable TMRO interrupt 
  cnt = 0;                 // Initialize cnt 

  do { 
    if (cnt >= 400) { 
      PORTB = ~PORTB;      // Toggle PORTB LEDs 
      cnt = 0;             // Reset cnt 
    } 
  } while(1); 
}

Quelle est la fréquence de clignotement des LEDs reliées au PORTB ?

6°) Modifier l'interruption pour qu'elle réalise un chenillard d'une LED se déplaçant vers les poids faibles.