quarta-feira, 5 de junho de 2013

[3] - MSP430 - Exemplos (Comparador)

Sem dúvidas, uma das maneiras mais eficientes para se construir soluções em programação, é analisar códigos-exemplo. Para nossa sorte a própria IDE possui uma aba dedicada a exemplos (Project >> CCS Example Projects).

Escolha a família do micro que você possui , eu no caso escolhi conforme a imagem:
Eu escolhi o primeiro exemplo, segue o código original:
Podemos dividir o código exemplo em três partes:
1) Copyright
2) Descrição
3) Código Funcional


Copyright
Basicamente a Texas Instruments vai explicar que você pode usar o código fonte dos exemplos, bem como editá-los. Mas em caso de uso deve explicitar os autores. Também que ela não tem qualquer responsabilidade com o uso destes códigos, e com os danos do mau uso destes.

Descrição
Explica o funcionamento do código exemplo:
"Output Comparator_A reference levels on P1.1. Program will cycle through the on-chip comparator_A reference voltages with output on  P1.1. Normal mode is LPM0, TA0_ISR will interrupt LPM0. ACLK = n/a, MCLK = SMCLK = default DCO"
O intuito deste blog não é ensinar inglês nem eletrônica básica, portanto não irei destrinchar o funcionamento de cada componente da descrição. A grosso modo podemos dizer que o port P1.1 sairá com o valor trazido do Comparator_A.

Código

  1. #include <msp430.h>
  2. void delay(void);                           // Software delay
  3. int main (void)
  4. {
  5.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  6.   CACTL2 = P2CA4;                           // CA1/P1.1 = +comp
  7.   CCTL0 = CCIE;                             // CCR0 interrupt enabled
  8.   TACTL = TASSEL_2 + ID_3 + MC_2;           // SMCLK/8, cont-mode
  9.   _EINT();                                  // enable interrupts
  10.   while (1)                                 // Loop
  11.   {
  12.     CACTL1 = 0x00;                          // No reference voltage
  13.     _BIS_SR(LPM0_bits);                     // Enter LPM0
  14.     CACTL1 = CAREF0 + CAON;                 // 0.25*Vcc, Comp. on
  15.     _BIS_SR(LPM0_bits);                     // Enter LPM0
  16.     CACTL1 = CAREF1 + CAON;                 // 0.5*Vcc, Comp. on
  17.     _BIS_SR(LPM0_bits);                     // Enter LPM0
  18.     CACTL1 = CAREF1 + CAREF0 + CAON;        // 0.55V, Comp. on
  19.     _BIS_SR(LPM0_bits);                     // Enter LPM0
  20.   }
  21. }
  22. // Timer A0 interrupt service routine
  23. #pragma vector=TIMER0_A0_VECTOR
  24. __interrupt void Timer_A (void)
  25. {
  26.     _BIC_SR_IRQ(LPM0_bits);                 // Clear LPM0 bits from 0(SR)
  27. }



Este é o código original do exemplo, do jeito que está é difícil verificar o que está acontecendo pino do seu kit de desenvolvimento. E a função delay não está implementada. Eu misturei o código do primeiro exemplo, com o código do segundo exemplo... e conferi com o multímetro. Uma opção bastante interessante é ir passo a passo na função debug, verificando a tensão no P1.1.


Meu código modificado:

Vídeo do código em execução na placa (com meu código). Note que no início eu estava medindo a tensão no pino errado!

Nenhum comentário:

Postar um comentário