📄 zigbee_test.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 + -