2012-06-14 6 views
2

J'utilise MSP430F5418 avec IAR EW 5.10. Je souhaite utiliser la minuterie B en mode haut.Minuterie en mode Up

Je souhaite utiliser deux interruptions. TimerB0 (1 ms) et TimerB1 (1 seconde).

Ma configuration est

TBCTL = MC__UP + TBSSEL__ACLK + TBCLR; 
TB0CCTL0 = CCIE; 
TB0CCR0 = 32; 

TB0CCTL1 = CCIE; 
TB0CCR1 = 32768; 

Sur ISR Je viens basculée deux broches. Mais seule la broche pour TB0CCR0 est en train de basculer. Mes configurations de broches sont correctes. Quelqu'un peut-il me dire pourquoi? Je suppose que votre problème est la période de la minuterie

Répondre

2


MC__UPUp mode: Timer counts up to TBxCL0

Ainsi, votre minuterie TBxR sera remise à 0 quand il atteint TBxCL0 qui semble être la valeur TB0CCR0.

Il ne peut jamais atteindre la valeur de 32768.

Vous pouvez changer TB0CCR0 avec TB0CCR1, de sorte que votre période sera de 1 seconde.
Et pour obtenir votre interruption 1ms, vous devez incrémenter votre TB0CCR1 à chaque fois.

INTERRUPT ISR_1MS() 
{ 
    TB0CCR1 = (TB0CCR1 + 32) & 0x7FFF; 
} 

Mais normalement, vous n'avez pas besoin d'un second temporisateur pour un second intervalle.
Vous pouvez simplement compter 1000 fois votre intervalle de 1ms.

INTERRUPT ISR_1MS() 
{ 
    ms_count++; 
    if (ms_count >= 1000) 
    { 
    ms_count=0; 
    // Do your second stuff 
    } 
} 

Et si vous avez besoin de plus et de différentes intervales, vous pouvez changer pour un autre modèle.
À l'heure de l'horloge système et contrôlez uniquement cette heure.

volatile unsigned int absolute_time=0; 

INTERRUPT ISR_1MS() 
{ 
    absolute_time++; 
} 

unsigned int systime_now(void) 
{ 
    unsigned int result; 
    di(); 
    result = absolute_time; 
    ei(); 
    return result; 
} 

uint8_t systime_reached(unsigned int timeAt) 
{ 
    uint8_t result; 
    result = (systime_now() - timeAt) < 0x1000; 
    return result; 
} 
+0

Nous vous remercions de votre réponse – Harikrishnan