|
发表于 2012-12-5 11:48:44
|
显示全部楼层
下面是用在sonix 上的一个智能家居控制上的例子:
/********************************************
Title : main
McuBody : SN8F26E611
RAM : 128*8Bit
ROM : 2K*16Bit
STACKS : 8 level
I/O PORT : 11
PWM PORT : 3(P17/16/P15)
T0 : 8bit base timer
T1 : 16bit
TC0-2 : 3* 8bit timer/count with pwm/cout_out(auto load)
EXINT : 2(INT0/INT1)
ADC : 8 channel(12bit)
INTS : 11(INT0/T0/T1/TC0/TC1/TC2/CMP/URX/UTX/SIO/WAKEUP)
OPTION : Security-------Enable
High Fcpu------Fosc/2
High_clk-------IHRC_16M
Low Fcpu-------FLosc/1
Watchdog-------Enable
LVD------------LVD_L
Resetpin-------P02
WDT_CLK--------Flosc/4
WDT TIME : about 512ms_3v/256ms_5v
WORK_VCC : 3.3V
IDE : SN8 C Studio_V146(572.015)
Author : Eddie
Updata : 2012-12-04
Verison : A/01
********************************************/
/*
Note:
(1).debug:Confirm Communication() 0x02 to 0x03
(2).change: nTask.h to pTask[v13].h
;--------------------------------------------
;P00 ----- [O]TEST1
;P01 ----- [I]TEST2
;P02 ----- [I]NC2
;P10 ----- [O]UTX
;P11 ----- [I]URX
;P12 ----- [I]URTS
;P13 ----- [O]UCTS
;P14 ----- [I]NC3
;P15 ----- [I]NC4
;P16 ----- [I]NC5
;P17 ----- [I]TRIG_IN
;--------------------------------------------
*/
#include <SN8F26E611.h>
#include "SN26E611_USER.h"
#include "typedef.h"
#include "pTask[v13].h"
//====================================================================
//---------------------------uart rx/tx------------------------------
volatile u8 RxBuf[12],TxBuf[12],RxIndex,TxCnt,TxWaitT2ms,WdtT2ms;
volatile u8 __ROM *TxPrt;
volatile u8 TxCodeNum;
volatile bit RxPackageOK_F,TxPackage_F;
volatile bit RxConnectOK_F;
volatile bit Task0Runing_F,Task1Runing_F,Task2Runing_F;
volatile bit beTrig_F;
/********************************************************************************
Interrupts Program Zone
********************************************************************************/
//===============================================================================
void __interrupt [0x08] ISR_WakeInt(void) {}
void __interrupt [0x09] ISR_INT0 (void) {}
void __interrupt [0x0A] ISR_T0 (void) {}
void __interrupt [0x0C] ISR_TC1 (void) {}
void __interrupt [0x0D] ISR_TC2 (void) {}
void __interrupt [0x0E] ISR_T1 (void) {}
void __interrupt [0x0F] ISR_CM0 (void) {}
void __interrupt [0x10] ISR_SIO (void) {}
//===============================================================================
void __interrupt [0x0B] ISR_TC0(void)
{
static u8 T60msBase = 10;
static bit TrigInOld_F;
FTC0IRQ = 0u;
//---------------------------------------
TxWaitT2ms++;
WdtT2ms++;
//-------------trig in check------------
if(!(--T60msBase))
{
T60msBase = 30;
if(!beTrig_F)
{
if(TrigInOld_F && (!TRIG_IN))
{
beTrig_F = 1;
Ints_event_send(D_Task1_ID);
}
}
TrigInOld_F = TRIG_IN;
}
//------------task time check------------
Task_tick();
}
void __interrupt [0x11] ISR_UART_RX(void)
{
u8 FccSum ,i;
//-------------------------Uart process-------------------------
//if((FUFMER == 0)&&(RxPackageOK_F == 0))
if(RxPackageOK_F == 0)
{
RxBuf[RxIndex++] = URXD;
if(RxIndex > 12) {RxIndex = 0;} //rx burrer size max as 12
else
{
if(RxBuf[0] == D_Frame_STX)
{
if((RxBuf[1] == 0x00)&&(RxBuf[2] >= 0x6)&&(RxBuf[2] <= 0x0A)&&(RxIndex == RxBuf[2]+2))
{
FccSum = 0x00;
for(i = 1;i < RxIndex;i++) {FccSum += RxBuf[i];}
if(FccSum == 0)
{
Disable_Rx();
RxIndex = 0;
RxPackageOK_F = 1;
Ints_event_send(D_Task0_ID);
}
else {RxIndex = 0;}
}
}
else {RxIndex = 0;}
}
}
//---------Clear signs on the last-----------
FURXIRQ=0;
//-------------------------------------------
}
void __interrupt [0x12] ISR_UART_TX(void)
{
FUTXIRQ = 0;
if(TxCnt > 0)
{
UTXD = *TxPrt;
TxPrt++;
TxCnt--;
}
else
{
TxPackage_F = 0;
} //TxCnt == 0 mains the last byte trans completed}
}
/********************************************************************************
Sub Program Zone
********************************************************************************/
/************************************************
Function : IO_Init
Input :
Output :
Return :
Stacks : 1
Note : IO initalization
"1"----output
"0"----input
Updata : 2012-11-07
************************************************/
void IO_Init(void)
{
P0CR = (1<<P_TEST1)|(1<<P_TEST2);
P1CR = (0<<P_URX)|(1<<P_UTX)|(0<<P_URTS)|(1<<P_UCTS)|(0<<P_TRIG_IN);
//---------------
P0PHCR = 0xffu; //
P1PHCR = 0xffu ^ (1<<P_TRIG_IN);
//---------------
PORT0 = (0<<P_TEST1)|(0<<P_TEST2);
PORT1 = (1<<P_UTX)|(0<<P_UCTS); //disable Uart sent frist
}
/************************************************
Function : Timer_Init
Input :
Output :
Return :
Stacks : 1
Note : Fcpu =HIRC(16MHz)/2 = 8MHz
tc0 timeout period as 2ms
Updata : 2012-11-06
************************************************/
void Timer_Init(void)
{
//disable all interrutps first,and clr all irq flag
DISI();
//--------------enable t0 for delay()-------------
T0CR = T0Prescale_128; //t0clk period as 8us
FT0IEN = 0; //disable t0 interrupt
FT0ENB = 1;
//--------------enable tc1 timerover interrupt-------
TC0CR = (TCxPrescale_128 | AS_TIMER | TCxCLK_AS_FCPU | DS_TCxOut | DS_PWMx);
TC0 = TC0R = D_TC0_Preset;
FTC0IEN = 1; //enable tc0 interrupt
FTC0ENB = 1; //enable use tc0
}
/************************************************
Function : Uart_Init
Input :
Output :
Return :
Stacks : 1
Note : Fhosc =HIRC(16MHz)
Fcpu = Fhosc/2 = 8MHz
9.6K baud rate
Updata : 2012-11-08
************************************************/
void Uart_Init(void)
{
FUTXPEN = 0; // Disable UART TX parity bit check function
FURXPEN = 0; // Disable UART RX parity bit function.
URRX = D_URS_BR_9600;
URCR = D_URC_BR_9600; // Set UART baud rate as 9600bps.
FUTXEN = 1; // Enable UART TX
FURXEN=1; // Enable UART RX
FUTXIEN=1; // Enable UART TX interrupt function.
FUTXIRQ = 0; // Clear UART TX interrupt flag.
FURXIEN = 1; // Enable RX interrupt
FURXIRQ =0; // clear RX interrupt request flag
}
/************************************************
Function : Delay2Ms
Input :
Output :
Return :
Stacks : 2
Note : Fosc = 16MHz
Fcpu = Fosc/1=16MHz
Updata : 2012-11-05
************************************************/
void Delay2Ms(u8 ms)
{
while(ms--)
{
WDTC();
T0 = 0x06;
while(T0);
}
}
/************************************************
Function : Commun_Response
Input :
Output :
Return :
Stacks : 1
Note : fire alerm
Updata : 2012-12-04
************************************************/
u8 __ROM Commun_Response[11] = { //0x02,
0x00,
0x0a,
0x43,
0x4e,
0x4e,
0x54,
0x0b,
0x03,
0x00,
0x00,
0xb6};
/************************************************
Function : State_Normal
Input :
Output :
Return :
Stacks : 1
Note :
Updata : 2012-10-08
************************************************/
u8 __ROM State_Normal[9] = { //0x02, //STX
0x00, //LenghtH
0x08, //LenghtL
'R', //0x52
'G', //0x47
'A', //0x41
'L', //0x4C
'N', //0x4E
'A', //0x41
0x43}; //fcc
/************************************************
Function : State_Ringing
Input :
Output :
Return :
Stacks : 1
Note :
Updata : 2012-11-05
************************************************/
u8 __ROM State_Ringing[9] = { //0x02, //STX
0x00, //LenghtH
0x08, //LenghtL
'R', //0x52
'G', //0x47
'A', //0x41
'L', //0x4C
'O', //0x4F
'N', //0x4E
0x35}; //fcc
/************************************************
Function : State_RxError
Input :
Output :
Return :
Stacks : 1
Note :
Updata : 2012-10-08
************************************************/
u8 __ROM State_RxError[9 ] = { //0x02, //STX
0x00, //LenghtH
0x08, //LenghtL
'R', //0x52
'G', //0x47
'A', //0x41
'L', //0x4C
'E', //0x45
'1', //0x31
0x5C}; //fcc
/************************************************
Function : Prefix_Body_Check
Input :
Output :
Return :
Stacks : 1
Note : prefix_body bytes[10:3]
Updata : 2012-11-07
************************************************/
u8 Prefix_Body_Check(char __ROM *string,u8 length)
{
u8 i;
length = length +3;
for(i = 3;i < length;i++)
{
if(RxBuf[i] != (u8)*string) break;
string++;
}
if(i < length) {i = 0x00;}
return i;
}
/************************************************
Function : TrigInLevelChk
Input :
Output :
Return :
Statcks : 1
Note :
Updata : 2012-11-07
************************************************/
u8 TrigInLevelChk(u8 times)
{
u8 i = 0;
while(times--)
{
if(!TRIG_IN) i++;
}
return i;
}
/************************************************
Function : Tx_SenMsg
Input :
Output :
Return :
Stacks : 1
Note :
Updata : 2012-11-08
************************************************/
void Tx_SenMsg(u8 CodeNum)
{
switch(CodeNum)
{
case 0:
{
TxPrt = Commun_Response;
TxCnt = 11;
break;
}
case 1:
{
TxPrt = State_Ringing;
TxCnt = 9;
break;
}
case 2:
{
TxPrt = State_Normal;
TxCnt = 9;
break;
}
case 3:
{
TxPrt = State_RxError;
TxCnt = 9;
break;
}
}
//---------------trans code-----------
if(CodeNum < 4)
{
TxWaitT2ms = 0;
while((URTS == 0)||(TxPackage_F == 1)) //wait reqest to send singal
{
if(TxWaitT2ms >= 150) return; //timeover as 300ms
}
TxPackage_F = 1;
UTXD = D_Frame_STX; //STX
}
//------------------------------------
}
/************************************************
Function : Task_Start
Input :
Output :
Return :
Stacks : 2
Note :
Updata : 2012-12-04
************************************************/
void Task_Init(void)
{
Delay2Ms(250);
Enable_Rx();
}
/************************************************
Function : Task0_Rxdecoded
Input :
Output :
Return :
Stacks : 2
Note :
Updata : 2012-12-04
************************************************/
void Task0_Rxdecoded(void)
{
PTK_BEGIN
while(1)
{
Task_event_wait(D_wait_ever);
//-----------Confirm Communication-------
if(Prefix_Body_Check("CNNT",4))
{
Enable_Rx();
TxCodeNum = D_Commun_Response;
Tx_SenMsg(TxCodeNum);
RxConnectOK_F = 1;
}
//-----------Command send from RF---------
else if(Prefix_Body_Check("SGAL0000",8))
{
Enable_Rx();
if(TrigInLevelChk(20) >= 5)
{
TxCodeNum = D_State_As_Ringing;
Tx_SenMsg(TxCodeNum);
}
else
{
TxCodeNum = D_State_As_Normal;
Tx_SenMsg(TxCodeNum);
}
}
//-----------Command Reply from RF---------
else if(Prefix_Body_Check("CGWLOK",6))
{
Enable_Rx();
}
else if(Prefix_Body_Check("CGWLE1",6))
{
Enable_Rx();
Tx_SenMsg(TxCodeNum);
}
//------------Communication Error ---------
else
{
Enable_Rx();
Tx_SenMsg(D_State_RxError);
}
}
PTK_END
}
/************************************************
Function : Task1_TxTrigsigle
Input :
Output :
Return :
Stacks : 2
Note : task perid as 50ms
Updata : 2012-12-04
************************************************/
void Task1_TxTrigsigle(void)
{
PTK_BEGIN
while(1)
{
Task_event_wait(25);
if(task_Wait_flag)
{
beTrig_F = 0;
TxCodeNum = D_State_As_Ringing;
Tx_SenMsg(TxCodeNum);
}
}
PTK_END
}
/********************************************************************************
Main Program Zone
********************************************************************************/
void main(void)
{
DISI();
WDTC();
IO_Init();
Uart_Init();
Timer_Init();
Task_Init();
Task_create(Task0_Rxdecoded, D_Task0_ID);
Task_create(Task1_TxTrigsigle,D_Task1_ID);
Task_start(D_Task0_ID);
//----------------------------main loop-----------------------------------
while(1)
{
Task_schedule();
WDT_Clear();
}
}
|
|