Bonjour,
Ma réponse va te sembler banale
mais beaucoup lecture,
décortiquer des codes ça et là.
Je revenais sans cesses sur des explications,
ou doc, lue et relue sur le net.
Je code sous MikroC, je regardais également,
les exemples livrés avec le compilateur.
Et bizarrement, en revenant sur un
PDFque j'avais pourtant lu et relu, cette fois-ci la formule
qui est inscrite pour déterminer le temps
à commencé à me parler.
Donc, papier et stylo (je crois que c'est ce qui a commencé à me faire comprendre)
et j'ai essayé de mettre par écrit cette formule avec un exemple.
Une fois que j'ai pu associer la formule
avec des exemples concrets,
je voyais enfin la lumière.
J'ai donc pris la peine de regarder mieux le datasheet du pic sur lequel
je travaillais (là un pic 16f84) pour voir comment configurer les bits
pour activer le timer0, déterminer le diviseur(scaler)
activer et desactiver le timer0.
toujours en comparant avec les codes en C que j'avais sous la main,
notamment ceux de MikroC.
Concretement:
Je voulais faire une minuterie pour ma deuxième version d'insoleuse à LED UV.
il me fallait un tic toutes les 1 seconde,
-----------
FB Aka Hearty - mai 2010
µControleur PIC16F84A
Quartz: HS, 04.0000 MHz
Formule pour le temps :
Temps=(256-valeur Décimale chargée TMR0) * 4 * (prescaler OPTION_REG) * 1/Oscillateur en Hz
Ce qui donne:
T=(256-0)*4*64*(1/4000000)= 0,016384 >> pour avoir 0,999424 sec à multiplier par cnt=61
en début de la fonction main ()
j'ajoute donc :
Code:
OPTION_REG = 0x85; // Assigner prescaler sur TMR0 valeur 64 = 101 (pour quartz 4Mz)
--------------
Ici ma fonction d'interruption
Code:
//******************
//Interruption
void interrupt() {
cnt++; // Incrémenter la valeur de cnt à chaque interruption
TMR0 = 0; // Valeur décimale préchargée à soustraire à 256 pour Quartz 4Mhz O.
INTCON = 0x20; // Set T0IE, clear T0IF (Met à 1 le bit TMROIE , Efface(0) le Flag TMROIF de débordement d'interruption)
}
ici mes fonctions pour activer le Timer0 ou le desactiver
Code:
//********************
// fonction activation /desactivation Interruption
void setInt(){
INTCON = 0xA0; // active l'interruption TMRO
}
void resetInt(){
INTCON = 0x20; //désactive le TMR0
}
Et ici ma fonction pour utiliser le l'interruption
Code:
//*******************
//comptage
void compte(){ // cnt = 61 interruption pour faire ~1sec 61 x 0,016384
if (cnt==61){ // Condition du lancement de comptage
led1 = ~led1; // Inverse etat PORTB LEDs
seconde--; // décrémenter les secondes
cnt = 0; // Reset cnt
}
}
Donc quand j'ai besoin de compter,
avant je lance ma fonction setint
et quand j'ai fini de compter
je lance resetint.
J'espère que cela aidera à enlever, au moins
un peu le voile, pour certains.
