📄 main.c
字号:
{
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 + -