?? anglesensor.c
字號:
/********************************************************************************************************
**
** AngleSensor
**
** V2.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: AngleSensor.c
**創(chuàng) 建 人: 呂江波
**最后修改日期: 2006年12月25日
**描 述: 角度傳感器源代碼。
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 呂江波
** 版 本: V1.0
** 日 期: 2006年11月2日
** 描 述: 配套助推機(jī)芯(I/O中斷控制)
**
**------------------------------------------------------------------------------------------------------
** 創(chuàng)建人: 呂江波
** 版 本: V2.0
** 日 期: 2006年12月22日
** 描 述: 配套電動機(jī)芯(I/O中斷控制)
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include <STC12C2052AD.H>
#include <INTRINS.H>
/********** Port define ***********/
#define DIR P3_7
#define NUM2 P1_7
#define NUM1 P1_6
#define NUM0 P1_5
#define IRQ P1_4
#define LEFT 0x55
#define RIGHT 0xaa
#define RESET 0x5a
#define STATE1 2
#define STATE2 3
#define STATE3 10
#define OTHER 4
#define ZERO 0
#define ERROR1 2
#define ERROR2 3
#define WARN1 254
#define WARN2 253
/********** Common variable **********/
uint8 OS_Q_MEM_SEL angleSet [ 32 ] ;
uint8 OS_Q_MEM_SEL angleOut [ 32 ] ;
/*************************************/
void AppInit ( void ) ;
void AngleSet_task ( void ) ;
void AngleOut_task ( void ) ;
void main(void)
{
OSInit() ;
OSQCreate ( angleSet , 32 ) ;
OSQCreate ( angleOut , 32 ) ;
OSTaskCreate ( AngleSet_task , NULL , 0 ) ;
OSTaskCreate ( AngleOut_task , NULL , 1 ) ;
AppInit () ;
while(1)
{
WDT_CONTR |= 0x10 ;
}
}
//ID : 0
void AngleSet_task( void )
{
static uint8 angleValue = 0 ;
uint8 setData ;
while (1)
{
OSQPend ( &setData , angleSet , 0 ) ;
switch ( setData )
{
case LEFT :
angleValue++ ;
break ;
case RIGHT :
angleValue-- ;
break ;
case RESET :
angleValue = 0 ;
OSQPost ( angleOut , ZERO ) ;
break ;
default :
continue ;
break ;
}
switch ( angleValue )
{
/*
case ZERO :
OSQPost ( angleOut , ZERO ) ;
break ;
*/
case STATE1 :
OSQPost ( angleOut , STATE1 ) ;
break ;
case STATE2 :
OSQPost ( angleOut , STATE2 ) ;
break ;
case STATE3 :
OSQPost ( angleOut , STATE3 ) ;
break ;
case WARN1 :
OSQPost ( angleOut , WARN1 ) ;
break ;
case WARN2 :
OSQPost ( angleOut , WARN2 ) ;
break ;
case OTHER :
OSQPost ( angleOut , OTHER ) ;
break ;
default :
break ;
}
}
return ;
}
//ID : 1
void AngleOut_task ( void )
{
uint8 outData ;
while ( 1 )
{
OSQPend ( &outData , angleOut , 0 ) ;
switch ( outData )
{
case ZERO :
NUM2 = 0 ; NUM1 = 0 ; NUM0 = 0 ;
break ;
case STATE1 :
NUM2 = 0 ; NUM1 = 0 ; NUM0 = 1 ;
break ;
case STATE2 :
NUM2 = 0 ; NUM1 = 1 ; NUM0 = 0 ;
break ;
case WARN1 :
NUM2 = 0 ; NUM1 = 1 ; NUM0 = 1 ;
break ;
case WARN2 :
NUM2 = 1 ; NUM1 = 0 ; NUM0 = 0 ;
break ;
case OTHER :
NUM2 = 1 ; NUM1 = 0 ; NUM0 = 1 ;
break ;
case STATE3 :
NUM2 = 1 ; NUM1 = 1 ; NUM0 = 0 ;
break ;
default :
continue ;
break ;
}
_nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ;
IRQ = 0 ;
_nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ; _nop_() ;
IRQ = 1 ;
}
return ;
}
/******** System initialize *********/
void AppInit ( void )
{
/* ========== IO define =========== */
P3M1 = 0x42 ; P3M0 = 0xBD ;
P1M1 = 0xff ; P1M0 = 0x00 ;
IRQ = 1 ;
NUM2 = 0 ; NUM1 = 0 ; NUM0 = 0 ;
/* ========== WDT define ========== */
AUXR = 0x00 ;
/* ========== SIO define ========== */
SCON = 0x50 ;
ES = 0 ;
/* ========== INT define ========== */
IT0 = 1 ;
EX0 = 1 ;
IT1 = 1 ;
EX1 = 1 ;
/* ========= TIMER define ========= */
TMOD = 0x21 ;
TH1 = 0xfa ; TL1 = 0xfa ;
TR1 = 1 ;
ET1 = 0 ;
TH0 = 0x70 ; TL0 = 0x00 ;
TR0 = 1;
ET0 = 1;
/* ======== GLOBAL define ========= */
IPH = 0x05 ; IP = 0x03 ;
EA = 1 ;
/* ========== WDT define ========== */
WDT_CONTR = 0x25 ;
return ;
}
/******** Interrupt server *********/
#pragma disable
void AngleChange ( void ) interrupt IE0_VECTOR
{
OS_INT_ENTER() ;
//ISR
if ( DIR == 1 )
OSQIntPost ( angleSet , LEFT ) ;
else if ( DIR == 0 )
OSQIntPost ( angleSet , RIGHT ) ;
OSIntExit() ;
return ;
}
#pragma disable
void AngleReset ( void ) interrupt IE1_VECTOR
{
OS_INT_ENTER() ;
//ISR
OSQIntPost ( angleSet , RESET ) ;
// angleValue = 0 ;
// OSQIntPost ( angleOut , ZERO ) ;
OSIntExit() ;
return ;
}
/*
#pragma disable
void ErrorISR_SIO ( void ) interrupt SIO_VECTOR
{
_nop_() ;
_nop_() ;
ES = 0 ;
return ;
}
*/
/*
#pragma disable
void ErrorISR_T1 ( void ) interrupt TF1_VECTOR
{
_nop_() ;
_nop_() ;
ET1 = 0 ;
return ;
}
*/
/********* Timer 0 reset **********/
void UserTickTimer ( void )
{
TH0 = 0x70 ; TL0 = 0x00;
return ;
}
/**************************************************************************************
End Of File
**************************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -