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

📄 zigbee_test.c

📁 stk300 target Zigbee test module code.
💻 C
字号:
/* ========================================================================== */
/*	             zigbee_test.c : Zigbee test source                    	      */
/*	                                                           	              */
/*	             Program  : Quantumbase Inc.            	                  */
/*	                                                           	              */
/*	             Hardware : MCU(Atmel ATmega128 - 8MHz, 32.768kHz)            */
/*	                        LED(port : 4, bus : 8)                            */
/*	                        FND(bus : 4, 7-segment + DP)         			  */
/*	                        LCD(bus : 1, 16 x 2 line)                         */
/*	                        Key(port : 4, 2-polling, 2-interrupt)             */
/*	                        SPI EEPROM(port : 4, AT93C46)                     */
/*	                        RS232(port : 2, MAX232A, DB-9 pin)                */
/*	                        ISP(port : 4, DB-25 pin)                          */
/*	                                                                          */
/*	             Software : Simulation, Emulation(Atmel AVR Studio 4.0)       */
/*	                        C/C++ Complier(WINAVR AVR-GCC)                    */
/*	                        ISP(ponyprog2000 : parallel)                      */
/*	                                                                          */
/*	             Version  : 1.000 - 2007/07/02                                */
/*	                                                                          */
/* ========================================================================== */

#include <zigbee.h>
#include <zigbee_test.h>


/* Interrupt Service Routine */
/* USART1,Rx Complete */
SIGNAL(SIG_USART1_RECV)	
{
	uint8_t byte;

	byte  = UDR1;	// get UDR1

	if(system_mode == SYS_MODE_RX)		// USART RX
	{
		ZigbeeFrameGet(byte);		// Zigbee Frame Get
		
		if(rxStat == RXSTAT_OK)
		{
			system_mode = SYS_MODE_STANDBY;		// standby
		}
		else if(rxStat <= RXSTAT_ERR_FRAME)
		{
			system_mode = SYS_MODE_STANDBY;		// standby
		}
	}
}

/* USART1,Tx Complete */
SIGNAL(SIG_USART1_TRANS)
{
	if(system_mode == SYS_MODE_TX)		// USART TX
	{
		if(txDataIndex < txDataLength)
		{
			UDR1 = txData[txDataIndex];	// set UDR1 
			txDataIndex++;
		}
		else
		{
			system_mode = SYS_MODE_STANDBY;	// standby
		}		
	}	
}

/* Timer/Counter0 Overflow */
SIGNAL(SIG_OVERFLOW0)	
{
	rxTimeout = rxTimeout + 1;		// rx timeout count
}

int main(void)						// Main function
{
//	uint16_t Ret;
//	uint8_t posLED;
	
	system_init();		// system init
	
	zigbee_init();		// zigbee init
	
	//ledConfigSet();		// LED Configuration Set
	ledConfigClear();		// LED Configuration Clear
	
	ZBConfigLoad();		// Zigbee Configuration Load
	
	while(1)
	{
		
		if(system_mode == SYS_MODE_STANDBY)
		{
			if(txCmd == ZI_CMD_NONE)
			{
				if(rxStat == RXSTAT_IDLE)
				{
					//ZBConfigLoad();		// Zigbee Configuration Load
				}
			}
		}
		
		if(system_mode == SYS_MODE_STANDBY)
		{
			if((rxStat == RXSTAT_IDLE) || (rxStat == RXSTAT_STX))
			{
				system_mode = SYS_MODE_RX;		// USART RX
				
				//UartTxModeSet();		// Uart Tx Mode Set
				UartTxModeClear();		// Uart Tx Mode Clear
				UartRxModeSet();		// Uart Rx Mode Set
				//UartRxModeClear();		// Uart Rx Mode Clear				
			
				UartRxData();	// Uart Rx Data
			}	
			else if(rxStat == RXSTAT_OK)
			{
				UartRxSet();		// Uart Rx Set
			}
			else if(rxStat <= RXSTAT_ERR_FRAME)
			{
				UartRxStatusSet();    // Uart Rx Status Set
			}
		}		
		else if(system_mode == SYS_MODE_RX)
		{
			if(rxTimeout >= RX_TIMEOUT_VALUE)		// rx timeout value
			{
				//UartTxModeSet();		// Uart Tx Mode Set
				//UartTxModeClear();		// Uart Tx Mode Clear
				//UartRxModeSet();		// Uart Rx Mode Set
				UartRxModeClear();		// Uart Rx Mode Clear	
			
				timer0_stop();		// TIMER0 stop
				rxTimeout = 0;		// rx timeout count
				
				system_mode = SYS_MODE_STANDBY;		// SYS_MODE_STANDBY - standby
				
				rxStat = RXSTAT_ERR_UART;	
			}
		}
	}
	
	return 0;
}

/* --- LED --- */
uint8_t NumToPosConv(uint8_t Number)	// Number to Position Conversion
{
	uint8_t pos;
	
	pos = 0b00000001;
	pos = pos << Number;
	
	return pos;
}

void ledConfigSet(void)		// LED Configuration Set
{
	ledSet(0b10000000);		// LED Set
}

void ledConfigClear(void)		// LED Configuration Clear
{
	ledClear(0b10000000);		// LED Clear
}

void ledListSet(uint8_t posLED)		// LED List Set
{
	posLED = posLED & 0b00011111;
	
	ledClear(0b00011111);		// LED Clear
	ledSet(posLED);				// LED Set
}

void ledSet(uint8_t posLED)		// LED Set
{
	PORTB = PORTB & ~ posLED;
}

void ledClear(uint8_t posLED)		// LED Clear
{
	PORTB = PORTB | posLED;
}


/* --- uart --- */
void ZBConfigLoad(void)		// Zigbee Configuration Load
{
	//uint16_t Ret;
	int16_t Ret;

	uint8_t Cmd;
	uint8_t Data[TX_BUF_SIZE];
	uint16_t DataSize;

	if (rxStat == RXSTAT_IDLE)
	{
		// Command
		Cmd = ZI_CMD_GET_STATUS;

		// Data
		DataSize = 0;

		// Zigbee Command Send
		Ret = ZigbeeCmdSend(Cmd, Data, DataSize);
		if (Ret > RXSTAT_ERR_FRAME)
		{
			UartTxData();	// Uart Tx Data		
		}
	}
}

void UartRxStatusSet(void)	// Uart Rx Status Set
{
	txCmd = ZI_CMD_NONE;

	rxStat = RXSTAT_IDLE;       // Uart Rx Stat
}

void UartRxSet(void)		// Uart Rx Set
{
	// uint16_t Ret;

	uint8_t Cmd;
	uint8_t posLED;	

	// No Error
	if (rxStat == RXSTAT_OK)
	{
		Cmd = zbfRx.cmd;

		if (Cmd == ZI_CMD_STATUS_ACK)
		{
			if (txCmd == ZI_CMD_GET_STATUS)
			{
				ZigbeeLoad();
				MyZigbeeLoad();
				
				ledConfigSet();		// LED Configuration Set
				//ledConfigClear();		// LED Configuration Clear
				
				posLED = NumToPosConv((uint8_t)ledListIndex);	// Number to Position Conversion
				ledListSet(posLED);		// LED List Set				
			}

			UartRxStatusSet();    // Uart Rx Status Set
		}
		else if (Cmd == ZI_CMD_STATUS_NAK)
		{

		}
		else if (Cmd == ZI_CMD_COMM_ERR)
		{

		}
		else if (Cmd == ZI_CMD_DATA)
		{
			ZBDataSet();		// Zigbee Data Set
		}
	}
}


void ZBDataSet(void)		// Zigbee Data Set
{
	//uint16_t Ret;
	int16_t Ret;
	uint8_t posLED;

	uint8_t dataCmd;
	uint8_t dataBody[ZI_FRM_DATA_MAX];

	uint16_t dataBodyLength;

	uint16_t dataIndex;
	uint16_t dataLength;

	uint16_t Tid;

	uint8_t byteTemp;
	uint16_t intTemp;

	dataIndex = ZBF_DATA_POS_SUBDATA;

	dataLength = zbfRx.data[dataIndex];
	dataIndex++;

	dataCmd = zbfRx.data[dataIndex];
	dataIndex++;

	switch (dataCmd)
	{
		case ZBD_CMD_LIST_UP:
			if (ledListIndex > 0)
			{
				ledListIndex--;
			}
			else
			{
				ledListIndex = CTRL_LED_SIZE - 1;
			}

			posLED = NumToPosConv((uint8_t)ledListIndex);	// Number to Position Conversion
			ledListSet(posLED);		// LED List Set
			
			byteTemp = zbfRx.data[ZBF_DATA_POS_DID];
			Tid = (uint16_t)((zbfRx.data[ZBF_DATA_POS_DID + 1] << 8) | (uint16_t)(byteTemp));
			byteTemp = ZBD_CMD_LIST_STAT;

			dataBody[0] = (uint8_t)(ledListIndex);
			dataBodyLength = 1;

			Ret = ZigbeeStatusDataSend(Tid, byteTemp, dataBody, dataBodyLength);			
			if (Ret > RXSTAT_ERR_FRAME)
			{
				UartTxData();	// Uart Tx Data
			}
			break;
		case ZBD_CMD_LIST_DOWN:
			if (ledListIndex < (CTRL_LED_SIZE - 1))
			{
				ledListIndex++;
			}
			else
			{
				ledListIndex = 0;
			}

			posLED = NumToPosConv((uint8_t)ledListIndex);	// Number to Position Conversion
			ledListSet(posLED);		// LED List Set

			byteTemp = zbfRx.data[ZBF_DATA_POS_DID];
			Tid = (uint16_t)((zbfRx.data[ZBF_DATA_POS_DID + 1] << 8) | (uint16_t)(byteTemp));
			byteTemp = ZBD_CMD_LIST_STAT;

			dataBody[0] = (uint8_t)(ledListIndex);
			dataBodyLength = 1;

			Ret = ZigbeeStatusDataSend(Tid, byteTemp, dataBody, dataBodyLength);
			if (Ret > RXSTAT_ERR_FRAME)
			{
				UartTxData();	// Uart Tx Data
			}			
			break;
		case ZBD_CMD_LIST_STAT:
			intTemp = (uint16_t)(zbfRx.data[dataIndex]);
			if ((intTemp >= 0) && (intTemp <= (CTRL_LED_SIZE - 1)))
			{
				ledListIndex = intTemp;
			}
			
			posLED = NumToPosConv((uint8_t)ledListIndex);	// Number to Position Conversion
			ledListSet(posLED);		// LED List Set			
			
			break;
		default:
			break;
	}
}

void UartTxData(void)	// Uart Tx Data
{
	txDataIndex = 0;
	
	if(txDataLength == 0)
	{
		return;
	}

	system_mode = SYS_MODE_TX;		// SYS_MODE_TX - USART TX	

	UartTxModeSet();		// Uart Tx Mode Set
	//UartTxModeClear();		// Uart Tx Mode Clear
	//UartRxModeSet();		// Uart Rx Mode Set
	UartRxModeClear();		// Uart Rx Mode Clear	
	
	UDR1 = txData[txDataIndex];	// set UDR1
	txDataIndex++;
}

void UartRxData(void)	// Uart Rx Data
{
	timer0_start();		// TIMER0 start
	rxTimeout = 0;		// rx timeout count
}

void UartTxModeSet(void)		// Uart Tx Mode Set
{
//	UCSR1B = (_BV(RXCIE1) | _BV(TXCIE1) | _BV(RXEN1) | _BV(TXEN1));	// RXCIE(7), TXCIE(6), RXEN(4), TXEN(3)	
//	UCSR1B = UCSR1B | (_BV(RXEN1));	// RXEN(4) : RX enable
//	UCSR1B = UCSR1B & ~(_BV(RXEN1));	// RXEN(4) : RX disable
	UCSR1B = UCSR1B | (_BV(TXEN1));	// TXEN(3) : TX enable
//	UCSR1B = UCSR1B & ~(_BV(TXEN1));	// TXEN(3) : TX disable			
}

void UartTxModeClear(void)		// Uart Tx Mode Clear
{
//	UCSR1B = (_BV(RXCIE1) | _BV(TXCIE1) | _BV(RXEN1) | _BV(TXEN1));	// RXCIE(7), TXCIE(6), RXEN(4), TXEN(3)	
//	UCSR1B = UCSR1B | (_BV(RXEN1));	// RXEN(4) : RX enable
//	UCSR1B = UCSR1B & ~(_BV(RXEN1));	// RXEN(4) : RX disable
//	UCSR1B = UCSR1B | (_BV(TXEN1));	// TXEN(3) : TX enable
	UCSR1B = UCSR1B & ~(_BV(TXEN1));	// TXEN(3) : TX disable					
}

void UartRxModeSet(void)		// Uart Rx Mode Set
{
//	UCSR1B = (_BV(RXCIE1) | _BV(TXCIE1) | _BV(RXEN1) | _BV(TXEN1));	// RXCIE(7), TXCIE(6), RXEN(4), TXEN(3)	
	UCSR1B = UCSR1B | (_BV(RXEN1));	// RXEN(4) : RX enable
//	UCSR1B = UCSR1B & ~(_BV(RXEN1));	// RXEN(4) : RX disable
//	UCSR1B = UCSR1B | (_BV(TXEN1));	// TXEN(3) : TX enable
//	UCSR1B = UCSR1B & ~(_BV(TXEN1));	// TXEN(3) : TX disable	
}

void UartRxModeClear(void)		// Uart Rx Mode Clear
{
//	UCSR1B = (_BV(RXCIE1) | _BV(TXCIE1) | _BV(RXEN1) | _BV(TXEN1));	// RXCIE(7), TXCIE(6), RXEN(4), TXEN(3)	
//	UCSR1B = UCSR1B | (_BV(RXEN1));	// RXEN(4) : RX enable
	UCSR1B = UCSR1B & ~(_BV(RXEN1));	// RXEN(4) : RX disable
//	UCSR1B = UCSR1B | (_BV(TXEN1));	// TXEN(3) : TX enable
//	UCSR1B = UCSR1B & ~(_BV(TXEN1));	// TXEN(3) : TX disable	
}


/* --- system init --- */
void system_init(void)		// system init
{
	cli();									// global interrupt disable	

	mcu_init();			// MCU init
	port_init();		// PORT init
	timer_init();		// TIMER init
	uart_init();		// uart int
	
	system_mode = SYS_MODE_STANDBY;			// standby
	
	sei();									// global interrupt enable	
}

void mcu_init(void)		// MCU init
{
	
}

void port_init(void)		// PORT init
{
	// Port B
	DDRB = DDRB | (LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7 | LED8);		// Port B IO mode : b7-0(out)
	PORTB = PORTB | (LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7 | LED8);		// Port B value : b7-0(high)
}

void timer_init(void)		// TIMER init
{
//	TCCR0 = 0b11111111;		// FOC0(7), WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
	TCCR0 = 0b00000000;		// WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
							// WGM : Normal mode, Output mode : Normal port, Clock Select : stop
//	TCCR0 = 0b00000111;		// WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
							// WGM : Normal mode, Output mode : Normal port, Clock Select : f/1024
	
//	TIMSK = 0b11111111;		// OCIE2(7), TOIE2(6), TICIE1(5), OCIE1A(4), OCIE1B(3), TOIE1(2), OCIE0(1), TOIE0(0)
	TIMSK = 0b00000001;		// TOIE0(0) : Timer0 overflow interrupt enable	
	
//	TIFR = 0b11111111;		// OCF2(7), TOV2(6), ICF1(5), OCF1A(4), OCF1B(3), TOV1(2), OCF0(1), TOV0(0)
	TIFR = 0b00000000;		// OCF2(7), TOV2(6), ICF1(5), OCF1A(4), OCF1B(3), TOV1(2), OCF0(1), TOV0(0)
	
	TCNT0 = 0;				// Timer/Counter Register
	OCR0 = 0;				// Output Compare Register
}

void uart_init(void)		// uart int
{
	uint8_t byte;

	/* USART initialize */
	UBRR1H = 0x00;							// UBRRnH - 19200 baud at 8.0 MHz
	UBRR1L = 0x19;							// UBRRnL - 19200 baud at 8.0 MHz		

	UCSR1A = 0b00000000;					// asynchronous normal mode
	UCSR1B = 0b11011000;					// RXCIE(7), TXCIE(6), RXEN(4), TXEN(3)
	UCSR1C = 0b00001110;					// Reserved(7), UMSEL(6):Async, UPM(5-4):none parity,
											// USBS(3):2stop, UCSZ(2-1):8bit

	byte = UDR1;							// dummy read
}

/* --- timer part --- */
void timer0_start(void)		// TIMER0 start
{
//	TCCR0 = 0b11111111;		// FOC0(7), WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
//	TCCR0 = 0b00000000;		// WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
							// WGM : Normal mode, Output mode : Normal port, Clock Select : stop
	TCCR0 = 0b00000111;		// WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
							// WGM : Normal mode, Output mode : Normal port, Clock Select : f/1024
	
//	TIFR = 0b11111111;		// OCF2(7), TOV2(6), ICF1(5), OCF1A(4), OCF1B(3), TOV1(2), OCF0(1), TOV0(0)
	TIFR = 0b00000000;		// OCF2(7), TOV2(6), ICF1(5), OCF1A(4), OCF1B(3), TOV1(2), OCF0(1), TOV0(0)
	
	TCNT0 = 0;				// Timer/Counter Register
	OCR0 = 0;				// Output Compare Register	
}

void timer0_stop(void)		// TIMER0 stop
{
//	TCCR0 = 0b11111111;		// FOC0(7), WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
	TCCR0 = 0b00000000;		// WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
							// WGM : Normal mode, Output mode : Normal port, Clock Select : stop
//	TCCR0 = 0b00000111;		// WGM00(6), COM01(5), COM00(4), WGM01(3), CS02(2), CS01(1), CS00(0)
							// WGM : Normal mode, Output mode : Normal port, Clock Select : f/1024
	
//	TIFR = 0b11111111;		// OCF2(7), TOV2(6), ICF1(5), OCF1A(4), OCF1B(3), TOV1(2), OCF0(1), TOV0(0)
	TIFR = 0b00000000;		// OCF2(7), TOV2(6), ICF1(5), OCF1A(4), OCF1B(3), TOV1(2), OCF0(1), TOV0(0)
	
	TCNT0 = 0;				// Timer/Counter Register
	OCR0 = 0;				// Output Compare Register								
}


⌨️ 快捷键说明

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