Bonjour à tous. J'ai besoin d'utiliser un timer en mode compteur. En effet, je cherche à calculer l'intervalle de temps qui sépare une transmission d'une autre.
Exemple:
début de la transmission --> fin de la transmission & lancement du compteur --> attente d'une nouvelle transmission --> début d'une nouvelle transmission & arrêt du compteur
Le µC est un Renesas M16C/62P cadencé à 10MHz.
Voici mon programme principale:
Et la routine d'interruption:unsigned int testimer=0;
void main void {
TA3MR=0x40; /*mode timer et source f8*/
TA3=1249; /*détermination du temps pour l'interruption*/
TA3IC=4; /*interruption de priorité 4*/
TABSR=0x08; /*Timer A3 lancé*/
}
Je veux une interruption toute les 1ms. Donc d'après la doc Renesas j'ai calculé comme cela:interrupt [TA3_INTV] void timer_irq (void) {
lcdout(testimer); /*affichage de la valeur de testimer sur un écran LCD*/
testimer++; /*+1ms*/
}
Le prédiviseur est déterminé par le registre TA3MR.
B7 B6
0 | 0 => f1 donc 10MHz
0 | 1 => f8 donc 10MHz/8
1 | 0 => f32 donc 10MHz/32
Je choisis le prédiviseur par 8.
10MHz/8 = 1 250 000
T = 1/f = 1/1 250 000 = 0.0000008 soit 800ns
Nous voulons 1ms alors:
n = 1ms/T => n = 1ms/800ns = 1250
je mets donc 1250-1 dans le registre TA3
Jusque la j'ai bon?
Je lance le programme. Ça semble fonctionner. je vois bien la valeur de testimer qui s'incrémente à chaque interruption mais la base de temps n'est pas bonne.
J'ai chronométré pour 1min et la variable testimer = 1313. Là est mon problème... Je devrais avoir environ 60000 non?
J'ai effectué plusieurs tests en choisissant un prédiviseur différent et une valeur dans TA3 différente voici les résultats (pour un chrono de 1min):
1) TA3MR = 0x40, TA3=1250 => testimer = 1313 cela devrait être 60000
2) TA3MR = 0x80, TA3=1250 => testimer = 1309 cela devrait être 15000 car normalement nous avons une interruption toutes les 4ms
3) TA3MR = 0x40, TA3=50000 => testimer = 1311 cela devrait être 1500 car normalement nous avons une interruption toutes les 40ms
4) TA3MR = 0x80, TA3=50000 => testimer = 376 cela devrait être 375 car nous avons une interruption toutes les 160ms. Ici le résultat correspond à la théorie. 375~376.
La je ne comprend pas trop. Pour l'exemple du 4 ça fonctionne mais si je veux toutes les 1ms ben...c'est pas bon....
Des idées?
-----