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

📄 main.c

📁 CodevisionAVR 开发环境。 用AVR控制TI/Chipcon非常常用的CC1000射频收发芯片。
💻 C
📖 第 1 页 / 共 2 页
字号:
   {
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
      {
      rx_counter0=0;
      rx_buffer_overflow0=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+   

char getchar(void)
{
char data;
while (rx_counter0==0);// 接收缓冲区为空
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif


/***************************************************************************** 
         USART Transmitter interrupt service routine 
         Uart发送中断服务程序. 当???时候出发执行. 
******************************************************************************/ 
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter0)// 如果发送缓冲区不为空, 则从缓冲区中读取数据,发送
   {
   --tx_counter0;
   UDR0=tx_buffer0[tx_rd_index0];
   if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0; //调整读取指针
   };
}
   

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+


void putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0); // 如果在Putchar的时候,发送缓冲区满,则循环等待直到缓冲区有空位.
#asm("cli") //禁止中断,  因为 tx_counter0等有可能被外部改变.
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) //tx_counter0 =0 且 DATA_REGISTER_EMPTY=1则 跳到else直接送UDR0
   { //否则要发送的字符c送缓冲区
   tx_buffer0[tx_wr_index0]=c;
   if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0; //如果发送缓冲区满, 则重新从缓冲区底部开始放数据
   ++tx_counter0;  //tx_counter0 用来指示缓冲区已有的数据,若tx_counter0=0,表示缓冲区空
   }
else
   UDR0=c;
#asm("sei") //恢复中断1  

} 


#pragma used-
#endif

// Standard Input/Output functions
// Declare your global variables here  

/***************************************************************************** 
uart 字符串发送函数
******************************************************************************/ 
void writeln(char flash*str)
{
  while (*str!='\0') {
    putchar(*str++);
  }
  putchar('\n');
  putchar('\r');
}


void mega48_Initialization(void) 
{
//Initialize the ATMega48, so that it can start working. 
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80; 
CLKPR=0x00;     //修改时钟预分频寄存器的要求规则. Clock Division factor==1  here! so fsoc=8/1=8Mhz
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization       // input=0, output=1
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=P State4=T State3=T State2=T State1=T State0=T 
PORTB=0x20;
DDRB=0x00;  //portb bit5 ==ID_EN

// Port C initialization
// Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=Out Func0=In 
// State6=T State5=0 State4=P State3=0 State2=0 State1=0 State0=T 
PORTC=0x10;
DDRC=0x2E;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: On
// Interrupt on any change on pins PCINT16-23: Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x02;
PCMSK1=0x00;//PCMSK1=0x10; //PCINT12/DCLK/27 引脚电平变换中断使能, 不在这里使能, 而在开始发送RF 数据的时候使能
PCIFR=0x02; // PICIF1位通过写1来清除!!  PCINT12 / PC4/27 脚上的电平变化将引发中断, 执行中断服务程序

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00; //开始不使能, 需要的时候执行下列指令
//TIMSK2=0x02; // Timer/Counter2 Output Compare Match A Interrupt Enable


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud rate: 9600 
  
/*UCSR0B==
RXCIE0 + TXCIE0 + UDRIE0 + RXEN0 + TXEN0 + UCSZ02 + RXB80 + TXB80  
  1        1        0        1   +    1       0        0       0 
  – RXCIEn: RX Complete Interrupt Enable n
  – TXCIEn: TX Complete Interrupt Enable n
  – UDRIEn: USART Data Register Empty Interrupt Enable n
  – RXENn: Receiver Enable n  
  -
  – TXENn: Transmitter Enable n
  – UCSZn2: Character Size n
  – RXB8n: Receive Data Bit 8 n
  – TXB8n: Transmit Data Bit 8 n
*/ 

/*UCSR0C==
UMSELn1 UMSELn0 UPMn1 UPMn0 + USBSn UCSZn1 UCSZn0 UCPOLn
  0        0      0     0   +   0      1       1      0
Bits 7:6 – UMSELn1:0 USART Mode Select   00 Asynchronous
Bits 5:4 – UPMn1:0: Parity Mode          00 Disabled

Bit 3    – USBSn: Stop Bit Select        0 1bit
Bit 2:1  – UCSZn1:0: Character Size      UCSZ02=0 11  8bits
Bit 0 – UCPOLn: Clock Polarity         时钟极性, 采样上升沿,下降沿
*/
/*
UCSR0A=0x00;
UCSR0B=0xD8;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;
*/ 
/*
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud rate: 9600
UCSR0A=0x00;
UCSR0B=0xD8;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x33;  */

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART0 Mode: Asynchronous
// USART Baud rate: 19200
UCSR0A=0x00;
UCSR0B=0xD8;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x19;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
ADCSRB=0x00;

}

/**************************************************************************
The Main Function 
***************************************************************************/

void main(void)
{
  //char test1;
 unsigned char csleep=0; 
  unsigned int i;
 for(i=0;i<1000;i++);
 mega48_Initialization(); 
 #asm("sei") //之前或之后要使CC1000进入发送状态.  

/*******************************   Begin   ****************************************
*********************************************************************************/ 
  for(i=0;i<1000;i++);
  writeln("Normal state.");
  PORTC|=(1<<PALE); //PALE=1 
  SetupCC1000PD();
  ResetCC1000(); 
   
  SetupCC1000All(); 

  WakeUpCC1000ToTX(TX_CURRENT,TXPLL);

  if (SetupCC1000TX(TX_CURRENT,TXPLL)==LOCK_NOK) 
      { writeln("SetupCC1000TX failed!");}
  //else    
  //    { writeln("SetupCC1000TX OK!");} 

  SET_DIO_OUTPUT;  
  if (!CalibrateCC1000())
    {writeln("TX Calibration failed!"); }
  else 
   {writeln("TX Calibration succeeded!");}


 if( SetupCC1000RX(RX_CURRENT,RXPLL)==LOCK_NOK)
     { writeln("SetupCC1000RX failed!");}
 //else
 //   { writeln("SetupCC1000RX OK!");}          

  
  SET_DIO_INPUT;
  if (!CalibrateCC1000())
    {writeln("RX Calibration failed!"); }
  else
    {writeln("RX Calibration succeeded!");} 

  Init_Wr1000_Buffer(); 
  Wr1000_Buffer_Index=0;
  ShiftReg=Wr1000_Buffer[Wr1000_Buffer_Index]; //要发射的信息的移位寄存器的初始化
/*******************************     END      ************************************
*********************************************************************************/
  //PCMSK1=0x10; //PCINT12/DCLK/27 引脚电平变换中断使能, //这一句起,数据RF已经开始进行了!
      AverageFreeRunCC1000();     // 可能的问题!!! 
      SET_DIO_OUTPUT;  
      State=WR1000_STATE; 
      PCMSK1=0x10; //PCINT12/DCLK/27 引脚电平变换中断使能, //这一句起,数据RF已经开始进行了!  
      if(SetupCC1000TX(TX_CURRENT,TXPLL)==LOCK_NOK) // 可能的问题!!! 
         { writeln("SetupCC1000TX failed!");}
      else
         { writeln("Working...");}  
      
   // 并不是一句"sleep" 指令就可以简单进入MCU休眠的, 之前要配置好CC1000为Power down 状态.然后MCU进入Sleep,
   //MCU醒来之后也要唤醒CC1000, 这样才能事整个模块更省电.    
   /*                                                                              
                 SET_DIO_INPUT;  
                 State=Rd1000_STATE; 
                 ShiftReg=0; //add
                 // Start_TC1_L();   
                 if(SetupCC1000RX(RX_CURRENT,RXPLL)==LOCK_NOK) // ?????!!! 
                    { writeln("SetupCC1000RX failed!");}
                 else
                    { writeln("R...");}  
 
                   while(1){putchar(readchar());}     */
 
 
 
 
 while(1) {    
            if (Send_TD_Times_count>=REQ_Send_ID_Times)
            {    
                 for(i=0;i<1000;i++); //TX DATA latency 2 bits. See datasheet Page 46.
                 // while(tx_counter0);  
                 //after sending is finished , change to Receive Mode. 
                 
                 //added 16 night  initialize all the receving variables when switching to RX mode
                 PreambleCount=0;
                 ByteCounter=0;
                 BitCounter=0;
                 PreambleError=0;
                 UI1_Found=FALSE;
                 PreambleFound=FALSE;
                 PreambleBitCount=0;
                 //added 16 night
                 
                 SET_DIO_INPUT;  
                 State=Rd1000_STATE; 
                 ShiftReg=0; //add
                 Start_TC1_L();   
                 if(SetupCC1000RX(RX_CURRENT,RXPLL)==LOCK_NOK) // ?????!!! 
                    { writeln("SetupCC1000RX failed!");}
                 else
                    { writeln("R.");} //是不是这儿的问题???进入了Uart的中断服务程序,屏蔽了第一次的接收??
                    
                 // PRR_Open_TC1();  // add when sleep is enabled
                 //#asm("cli")
                 //TC1_interrupt_count=0; 
                 //#asm("sei")
                
                 
                 while(TC1_interrupt_count==0) //before the TC1 overflow, do nothing.
                      {                 
                        if(Rd1000_counter!=0)
                       { putchar(readchar());
                       }                 
                      }   
                 while(Rd1000_counter!=0)
                      { putchar(readchar());
                      }  
                 
                 //while(Rd1000_counter==0);
                // while(Rd1000_counter!=0)
                   //    { putchar(readchar());
                   //    }                 
           /*      
                 //while(tx_counter0);  
                 SetupCC1000PD();        
                 #asm("cli")
                 PRR_Close_all();       // PowerReservation Steps 
                 PRR_Open_TC2(); 
                 //Send_TD_Times_count=0; // Prepare for the next time.l                        
                 LowFreq_62dot5KHz();    // ChangetoLow Frequency
                 #asm("sei")                                             
 
                 #asm("cli")
                 Start_TC2(); 
                 #asm("sei") 
                 SET_SLEEP_MODE;        // Sleep mode select 
                 ENABLE_SLEEP;          //仅在SLEEP 指令的前一条指令置位SE。                
                 #asm("SLEEP");         // Now Sleep really0 begins. Sweet Dreams!  
                 
                UCSR0A=0x00;
                UCSR0B=0xD8;
                UCSR0C=0x06;
                UBRR0H=0x00;
                UBRR0L=0x19;
         
               
                 writeln("Wakeup!"); 
                //  while(tx_counter0);  */
                 SET_DIO_OUTPUT;  
                 State=WR1000_STATE;  
               // WakeUpCC1000ToTX(TX_CURRENT,TXPLL);
                 BitCounter=0;
                 Wr1000_Buffer_Index=0;                  //? here is the problem for missing one reply
                 ShiftReg=Wr1000_Buffer[Wr1000_Buffer_Index];
                 SetupCC1000TX(TX_CURRENT,TXPLL); 
                //WakeUpCC1000ToRX(RX_CURRENT,RXPLL);
                //SetupCC1000RX(RX_CURRENT,RXPLL); 
                //SetupCC1000TX(TX_CURRENT,TXPLL); 
                
                #asm("cli")
                 Send_TD_Times_count=0; // Prepare for the next time.l                                    
                 TC1_interrupt_count=0; 
                #asm("sei")                                             
            } //if (Send_TD_Times_count>=REQ_Send_ID_Times)
 
        
          if(Rd1000_counter!=0)
                { putchar(readchar());
                }
          
         
  
  
     } // while(1)
       
         
} //Main()

⌨️ 快捷键说明

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