⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proto11_a.c

📁 MSP430F1610 generates a sine wave from a look up table using timer interrupt.
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
IMPLEMENTATIONS:
    *Acquires from the ADS8343 and transmits to PC through UART1 115200 bps
    *Packs the samples in 256 bytes with the DMA0 tied to UART1
    *Main system clock is 8MHz crystal.
    *Reception and collection of commands with help of the DMA1 tied to "URXIFG1".
*/
#include  <msp430x16x.h>
#include  "H_PROTO11_A.h"


//=================================================================================================
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog
//  WDTCTL = WDT_ARST_1000;      // (WDTPW+WDTCNTCL+WDTSSEL)                 1000ms 
//  WDTCTL = WDT_ARST_250;       // (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)           250ms
//  WDTCTL = WDT_ARST_16;        // (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)            16ms
//  WDTCTL = WDT_ARST_1_9;       // (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)     1.9ms

  int k = 0;
//------- INIT VARIABLES
  orden   = 1;
  comando = Running = 1;
  Rampa   = 0;
  result  = TimerA_IntFlag = SampleNumber = NrResetCommands = WatchdogCounter = 0;
  result  = 32767-1500;
  channel = CURRENT_CHANNEL;
  BT_PairingResetCounter = KeepPairing = 0;
  BT_KeepPairingCounter = StartBTPairingCounter = 0;

  for(k=0 ; k<COMMAND_PACKET_LENGHT ; k++)                             
      {  commands[k] = 0;   }//End of for
//------- CONFIGURATIONS
  config_MainCLK();                     // Sets uC main system clock.
  init_vectors();                       // Init vectors to control ADC & MUXs
  IO_control_lines();                   // Prepare all the Port-lines
  //set_USART0_UART();
  set_USART0_SPI();  
  set_USART1_UART();
  config_DMA();
  config_Timer_A();                     // Configs Timer A.
//  config_Timer_B();                     // Configs Timer B.

//----- Enable Global Interrupts-----------------------------------------
  _EINT();
//--------Prepare Analog MUXs -------  
  Signal_State  = ExG_DATA;
//  MUXs_Port4();

//--- If the watchdog resets => then the por twill be toggled
  P4OUT ^= 0x40 ; // 0100 0000
  //P4OUT &= 0xBF; // 1011 1111

//--- MAIN LOOP ---
  while(1)
  {
    if(TimerA_IntFlag > 1)
    { TimerA_IntFlag=0;

/*
      if(Running)
          {
                adc_convert(CURRENT_CHANNEL);
                delay_time(20);
                make_PACKET();
                SampleNumber++;
                //  Enable DMA0 for transmitting a block of data
                if(SampleNumber >= Nr_Samples)
                  {
                     DMA0CTL |= DMAEN;                         // Enable 
                     SampleNumber = 0;
                  }
          }
*/
    }// End of  " if(TimerA_IntFlag > 0) "
  }// End of  " while(1) "
}// End of  " main() "
//=======================================================================
//=======================================================================
//=========================INTERRUPTS  ==================================
//=======================================================================
//=======================================================================

//====================== TIMER A Interrupt===============================
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{  
  TimerA_IntFlag++;
  P4OUT ^= 0xFF ; // TOGGLE ALL
}
//=======================================================================
//=======================================================================
//==========================  APPLICATIONS  =============================
//=======================================================================
//=======================================================================

//================== process_comand ( void) =============================
void process_comand(void)
{
   unsigned char temp_orden, confirmation;
   int L = 0;
   if(commands[COMMAND_PACKET_LENGHT-1]!=0)         // DETECT IF THERE IS A NEW COMMAND
   {  temp_orden    = commands[0];
      confirmation  = commands[1];
      switch(temp_orden)
       {  
           //------------
          case  BTpairing: 
          {  if(confirmation==BTpairing)
             {   if(StartBTPairingCounter == 0)	//1st keep pairing command of this session
		 {	//With this, the BT_KeepPairingCounter starts counting time before another bean.
		    StartBTPairingCounter = 1;
		 }
		 else 
		 {  KeepPairing = 1;
		 }		 
             }
             Rampa = 0;
             //orden = 1;
             break;
          }
          //------------
          case  EEG: 
          {  if(confirmation==EEG)
             {    Signal_State  = ExG_DATA;
                  MUXs_Port4();
                  Rampa = 0;
                  orden = 1;
                 //  P4OUT |= 0x40 ; // 0100 0000
                 //  P4OUT ^= 0x40 ; // 0100 0000
             }
             break;
          }
          case  Zpos:
          {  if(confirmation==Zpos)     
             {    Signal_State  = ExG_Zpos;
                  MUXs_Port4();
                  Rampa = 0;
                  orden = 2;
//                  P4OUT |= 0x40 ; // 0100 0000
             }
             break;
          }
          case  Zneg:
          {  if(confirmation==Zneg)     
             {    Signal_State  = ExG_Zneg;
                  MUXs_Port4();
                  Rampa = 0;
                  orden = 3;
                  //P4OUT &= 0xBF; // 1011 1111 
             }
             break;
          }
          case  Z_DRL:
          {  if(confirmation==Z_DRL)
             {    Signal_State  = ExG_DRL;
                  MUXs_Port4();
                  Rampa = 0;
                  orden = 4;
                  //P4OUT &= 0xBF; // 1011 1111 
             }
             break;
          }
           case  BATTERY:
          {  if(confirmation==BATTERY)
             {    comando = BATTERY;                //
                  Rampa = 1;
                  orden = 1;
             }
             break;
          }
          case  RESET:
          {  if(confirmation==RESET)
             {    //comando = RESET;
                  //NrResetCommands ++;       
                  Signal_State  = ExG_DATA;
                  MUXs_Port4();
                  Rampa = 0;
                  orden = 1;
             }
             break;
          }
          case  START:
          {  if(confirmation==START)    
             {    Running = 1;               //
                  orden = 1;
             }
             break;
          }
          case  STOP:
          {  if(confirmation==STOP)     
             {    Running = 0;               //
                  orden = 1;
             }
             break;
          }
          case  SET_GAIN:
          {  //if(confirmation==SET_GAIN)     
             //{
                 orden = 1;
             //}
             //set_gain(confirmation);
             break;
          }
          default:
             //orden = 1;
             break;
        }//End of switch
      //CLEAR THE COMMANDS VECTOR
      for(L=0 ; L<COMMAND_PACKET_LENGHT ; L++)                             
           {  commands[L] = 0;   }
      DMA1CTL |= DMAEN;         //ENABLE DMA1 DATA COLLECTION
   }//End of " if(commands[COMMAND_PACKET_LENGHT-1]!=0) "
}
//================== set_gain(unsigned char gain_level)==================
void set_gain(unsigned char gain_level)
{
  unsigned int TEMPO1 = 0;
  TEMPO1 =  MuxByte[Signal_State]; //CONTROL BYTE SEARCH
  TEMPO1 &= 0xF9;  // SET TEMPO1 BITs 1 y 2 TO 0 BEFORE "OR"
  TEMPO1 |= 0x01;     // SET TEMPO1 BIT 0 TO 1 BEFORE "&"
  P4OUT &= TEMPO1; // SET THE ZEROS

  switch(gain_level)
         { 
             case  GAIN_LEVEL_1:
             {  TEMPO1 |= GAIN_CODE_1;
                break;
             }
             case  GAIN_LEVEL_2:
             {  TEMPO1 |= GAIN_CODE_2;
                break;
             }
             case  GAIN_LEVEL_3:
             {  TEMPO1 |= GAIN_CODE_3;
                break;
             }
             case  GAIN_LEVEL_4:
             {  TEMPO1 |= GAIN_CODE_4;
                break;
             }
            default:
               break;
        }//End of switch
  P4OUT |= TEMPO1; // SET THE ONES.
}
//================== delay_time (int cycles) ============================
void delay_time(int cycles)
{ int i,j;
  i=j=0;
  for (i = cycles ; i > 0 ; i--)
     {   for (j = 5; j > 0; j--);   
     }
}
//==================== adc_convert (int chann) ============================
//  Description :  This prototype does the adc conversion
void adc_convert(int chann)
{ 
  byte0=byte1=byte2=byte3=byte4=0;
  P3OUT &= ADC_CS_0;          //Put P3.0 = 0 (1111 1110)=0xFE. Select ADC, switching CS to 0. 
  U0TXBUF =  ADC_control[chann];//Send 1st 8 clocks along with the ADC control byte.
  U0TXBUF = 0x00;             // Send clocks to the ADC, to shift  1st 7 BITs in.
  //THE FOLLOWING DATA RECEPTION IS NOT USEFUL
  RX_complete();              // Wait until all bits have been received.
  byte0 = U0RXBUF;            // Store this data in this byte variable.
  //Send 3rd 8 clocks
  U0TXBUF = 0x00;             // Send clocks to the ADC, to shitf 2nd 8 BITs in.
  //THE FOLLOWING RECEPTION IS THE 1ST DATA BYTE
  RX_complete();              // Wait until all 8 bits have been received.
  byte1 = U0RXBUF;            // Store this data in this byte variable.
  //Send 4th 8 clocks
  U0TXBUF = 0x00;             // Send clocks to the ADC.
  //THE FOLLOWING RECEPTION IS THE 2ND DATA BYTE
  RX_complete();              // Wait 8 clock cycles.           
  byte2 = U0RXBUF;		         
  //THE FOLLOWING RECEPTION IS THE 3RD DATA BYTE
  RX_complete();              // Wait 8 clock cycles.           
  byte3 = U0RXBUF;		         
  //De-Select ADC, switching CS to 1:
  P3OUT |= ADC_CS_1;           // Put P3.0 = 1 (0000 0001)=0x01
  byte1 = byte1 << 9; // Left-shift the 1st 7 bits
  byte2 = byte2 << 1;              
  byte3 = byte3 >> 7;              
  adc_data[0] = 0;
  adc_data[0] = (byte1 | byte2 | byte3);
  byte0 = 0;
  byte0 = adc_data[0];
//------ Normal code  sends EEG
  if(!Rampa)
  {
    byte0 += 32767; 
    result = (unsigned int) byte0;
  }
//------ Code generating a ramp
  else
  { 
 /*
    result = result + 10;
    if (result >= (32767+1500) )
        result = 32767-1500; 
*/

    result = result + 100;
    if (result >= 65400)
    result = 0; 
  }
}
//==================== make_PACKET ( ) ==================================
void make_PACKET(void)
{ 
  unsigned int tempo, tempo1, tempo2, index_For, i, PatientCableIn;
  tempo = tempo1 = tempo2 = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -