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

m
 
{{Solution|contenu=
1°) Pas grand chose de changé :
1°)
<source lang="c">
void interrupt decalage(void) {
PORTB = (PORTB << 1) ;
if (PORTB == 0x00) PORTB = 0x01;
TMR0IF_bit = 0; // acquittement interruption (** changé ici **)
}
unsigned char nb;
TRISA = 0xF9; // 6 entrees, 2 sorties pour A
TRISB = 0x00; // 8 sorties pour B
OPTION_REG = 0x07; // prescaler 256 , entree sur quartz (** changé ici **)
INTCON = 0xA0; // autorise l'interruption timer
PORTB = 0x01; // une seule diode allumee
 
N'oubliez pas la division par 16 qui est réalisée avec le if (!(nb % 16)) dans l'interruption.
 
<u>Calcul précis</u> : 50 MHz / 4*(256*256*16) = 11,92 Hz (la division par 4 a toujours lieu).
 
3°) "if (!(nb % 16))" est une façon pas très efficace de calculer le reste de la division par 16. J'ignore la technique utilisé par le compilateur, mais ce calcul est forcément long puisqu'il n'y a pas d'instruction de division sur le 16F84.
</source>
4°) Décalage tout simple d'une LED vers les poids forts.
 
5°) OPTION_REG = 0x84; = 1000 0011 => poids faible = 3 => division par 2 puissance 4 = 16
 
4 000 000 / 4*16*(256-96)*400 = 0,9765625 Hz Soit pratiquement 1 Hz
 
Un meilleurs calcul serait :
 
4 000 000 / 4*16*(256-98)*400 = 0,988924051 Hz (à cause des temps de latence) Cette connaissance n'est pas demandée aux étudiants.
 
16°)
<source lang="c">
#include <pic1684.h>
//#include <htc.h> serait-il mieux ?
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) ; // *** changé ici ****
if (PORTB == 0x00) PORTB = 0x80; // *** changé ici ****
T0IF = 0; // acquittement interruption
}
</source>
}}
 
10 144

modifications