430_4. Генератор секундных импульсов на MSP430G2231 (LaunchPad).


  Я думаю, что все помнят школьные часы. Они очень просто работали. Генератор минутных импульсов  (один на всю школу) подвигал стрелки каждую минуту. В домашних часах, которые работают от одной батарейки, внутренний генератор вырабатывает секундные импульсы. Подобный генератор легко реализуется на MSP430, впрочем как и на любом другом контроллере.

  Можно отремонтировать старые часы, заменив неработающую микросхему на микроконтроллер. И это будет работать. Но это не цель проекта. Хотелось бы просто сделать точный генератор секундных импульсов и убедиться, что это работает.

  Идея программы очень простая.

1. Запустить таймер "на счет" до 32767, от генератора 32768 Гц и ждать переполнения.

2. Когда переполнение наступит, включить и выключить два светодиода.

3. Запустить таймер "на счет", снова.

4. Так делать до бесконечности (вернуться на 2) и наблюдать за светодиодами. 

  Сложность заключается только в том, какие сигналы вырабатывают внутренние тактовые генераторы и за какой из них можно "зацепиться" таймеру.

  Итак, если верить документации, то после сброса должно произойти следующее.

1. После сброса микроконтроллер должен «запустить» генератор на кварцевом резонаторе. Если это произошло успешно, то частота 32768 Герц будет использована в качестве сигнала ACLK.

2. Если по каким то причинам генератор не запустился, то автоматически, для сигнала ACLK, будет выбран низкочастотный генератор VLO (~12кГц).

  Если коротко, то при исправном кварцевом резонаторе, после вкючения питания или сигнала "RESET", на внутреннем тактовом сигнале ACLK должна присутствовать частота 32 кГц. Ее и будем использовать.

  В программе мы не будем использовать прерывания. Когда таймер досчитает до определенного значения в регистре TACTL изменится состояние флага TAIFG с "0" на "1". Это событие мы будем ждать в бесконечном цикле, постоянно проверяя состояние флага TAIFG (TACTL, Bit 0). Как только это произойдет, очистим флаг, записав значение "0" в Bit 0 TACTL, зажгем и потушим светодиоды и снова будем ждать переполнения таймера.

  Программа вырабатывающая секундные импульсы, на выходах P1.0 и P1.6, выглядит так:

_____________________________________________________________________________

#include <msp430g2231.h>                           // 18 Dec 2012, SKoots.

#define LED 0x41        
// LED = 41h = 01000001b, for LEDs on LaunchPad.

void main(void)
{
    int i;                                                                 
// Internal counter.
    WDTCTL = WDTPW + WDTHOLD;                
//  WDT, turn off.
         P1OUT = 0x00;
         P1DIR  = LED;
            BCSCTL3 |= XCAP_1;           
// Add 6 pF caps.
    TACCR0 = 32767;                
// Count to 32768-1 (for 1 sec interval)
                                                    
// The value "32740" gives exactly 1 second.
    TACTL = TASSEL_1 + ID_0 + MC_1 + TACLR; 
                      
//ACLK + Divider=1 + Up Mode + Clear timer.
                              //   TASSELx - Timer_A clock source select:
                              // TASSEL_0-TACLK,1-ACLK,2-SMCLK,3-INCLK.
                              // IDx - input pulse divider. ID_0-:1,1-:2,2-:4,3-:8.
                              // MC_0-Stop, 1-Up, 2-Continuous, 3-Up/down.
                              // TACLR (Timer_A clear, Bit_2=04h).
      for (;;)
      {
          while ((TACTL & BIT0) == 0) {}
// Steep in a loop "while(){}" until
                                                      // Timer A reach TACCR0.
          // TACTL - 16bit register : ( Unused(15-10),TASSELx(9,8),IDx(7,6),
            
// MCx(5,4),Unused(3),TACTR(2),TAIE(1),TAIFG(0) ).
 
          TACTL &= ~BIT0;                 
// Reset TAIFG.
              P1OUT |= LED;                      
// LEDs on.
              for (i=0; i<0x7FF; i++) {} 
// Short delay (0x7FF -> ~0,01 sec.).
              P1OUT &= ~LED;                  
// LEDs off.
      }
                             //End of for(;;).
}
                                  //End of main().

 
_____________________________________________________________________________
// Программа работает, проверено.
// Все комментарии в теле программы.
// Можно копипастить прямо в CCSv5.
// Частота зависит от значения в
TACCR0 и состояния пред-делителя IDx.
// * Частота =
(32768-1) / ( (значение в TACCR0) * (значение пред-делителя IDx) ).
// Длина импульсов определяется только задержкой в цикле for (...).
// * Константа 07FFh формирует импульсы длиной 10 msec.



12.06.2012  SKootS

_

Make a Free Website with Yola.