#include <pic.h>
#include <osa.h>
#ifdef _10F222
__CONFIG (OSC_4MHZ & MCPUDIS & WDTDIS & MCLRDIS);
#else
__CONFIG (WDTDIS & MCLRDIS);
#endif
#define TRIS_CONST 0x08
#define GPIO_CONST 0x00
// 汪複蒐 閎��� 熱 鋼� 詭 瘟詻發, 餾� � 篛綏蝠慘煬.
#define pin_RED_LED GP0
#define pin_GREEN_LED GP1
#define pin_BLUE_LED GP2
#define pin_RED_BUTTON GP0
#define pin_GREEN_BUTTON GP1
#define pin_BLUE_BUTTON GP2
#define pin_MODE_BUTTON GP3
// 互� 12-擋鼓�準慢蝴 綁靦 滂� 溜頡颱摘粱贛贖 菊錶, 蜻錙橢憂 頡鼻麂鈇鋼鼻
// 憐詭� 影璃餓鞅曉鈇靦. 圭綁� 衝� 頜慟粵���� 溫� 縊盤曉璃頑甕� 頑滓�.
#define bRunTaskWork OS_Flags.bUser0
#define bRunTaskButtons OS_Flags.bUser1
/****************************************************************************/
// 青擇慮瘩灘 溫� 鍊痢粵�� 慚鋼瘡弊瘟羲筮
char cRed;
char cBlue;
char cGreen;
// 姻詬� 擋菔靜 篛綏蝠慘溜�
struct {
char cState:4; // 杠蒐� 篛綏蝠慘煬 頑廈擋��� (縣. ChangeIntensity() )
char reserved:4;
} Mode;
// 青擇慮瘩��, 複擇滇����� 縈褒褓靦 擋菔靜
union {
char cValue;
struct {
char cPrs:5; // 俏窟滇鞅鋼鼻 溫� 順麂隆� 縯蜜甕� 愿慮獗璃� 慚鋼瘡弊瘟羲�
char bTimeout:1; // =1, 鳩皓摘 頡擋 愿慮��靦 慚鋼瘡弊瘟羲�
char cSpeed:2; // 柞褒褓靦 愿慮獗璃� 慚鋼瘡弊瘟羲� (縣. 影罹弊 SpeedConst[4])
} bits;
} Speed;
/****************************************************************************/
const char SpeedConst[4] = {1, 4, 16, 32}; // 柞褒褓靦, � 蜻錙曉� 愿慮��綏�� 頜窟滇鞅鋼鼻 � Mode
/****************************************************************************/
void ChangeIntensity (void);
void Task_Leds (void);
void Task_Work (void);
void Task_Buttons (void);
/****************************************************************************/
/* */
/****************************************************************************/
void main (void)
{
OPTION = 0xC5; // tmr0 period 16 ms, pull-ups disable
TRIS = TRIS_CONST;
#ifdef _10F222
ADCON0 = 0; // GP0, GP1 - digital
#endif
#ifdef _10F206
CMCON0 = 0; // GP0, GP1 - digital
#endif
OSCCAL &= ~1; // GP2 - digital
GPIO = 0x00;
Mode.cState = 0;
cBlue = 0xFF;
//..................................................
// 位摟廓鞅飾樽粳 閱擇慮瘩灘 縊羲粳�
OS_Init();
//..................................................
// 柢頌琯� 頑滓鞣, 蜻錙橢� 蛭溴� 擋菔錶靦 鋒擋領粱贛�
OS_CreateTask(0, Task_Leds);
OS_CreateTask(0, Task_Work);
OS_CreateTask(0, Task_Buttons);
//..................................................
// 囝餓縈琯� 鞍痢截蝴孃�
OS_Run();
}
/****************************************************************************/
/* 囝滓闐 縴整截蝴痢�� 軏� 溫� 3� 篛綏蝠慘溜� */
/****************************************************************************/
void Task_Leds (void)
{
char temp;
for (;;) {
//..............................................................
// 汁粳 閱擇錨滓 錶瘍綑� 雛擇� 0
OS_WaitCondition(!(TMR0 & 0x80));
TRIS = 0;
TMR0 = 0;
//..............................................................
// 囝詭魎 隄� 擋菔鞣� 篛綏蝠慘煬
if (cRed) pin_RED_LED = 1;
if (cGreen) pin_GREEN_LED = 1;
if (cBlue) pin_BLUE_LED = 1;
//..............................................................
// 軏始� 曙擋隋�粳 �擔褓靦� 篛綏蝠慘溜�
do {
if (TMR0 >= cRed) pin_RED_LED = 0;
if (TMR0 >= cGreen) pin_GREEN_LED = 0;
if (TMR0 >= cBlue) pin_BLUE_LED = 0;
} while (GPIO & 7);
if (!(TMR0 & 0x80)) OS_WaitCondition(TMR0 & 0x80);
//..............................................................
// 囝餓縈琯� 頑滓鞣 螂擋菔錦� 滓瘩贖
bRunTaskWork = 1;
bRunTaskButtons = 1;
}
}
/****************************************************************************/
/* 囝滓闐 愿慮獗璃� 慚鋼瘡弊瘟羲� 蒙誅蝶� 篛綏蝠慘滓. */
/* 俠骯闐綏 曙擋隋粵徹 蒙誅癮 擋� 頡縛� 褕擋菔錦� 蝠瘟廈 閱撿蝠� 軏� */
/* � 頑滓雛 Task_Leds */
/****************************************************************************/
void Task_Work (void)
{
for (;;) {
//..............................................................
OS_WaitCondition(bRunTaskWork);
bRunTaskWork = 0;
//..............................................................
// 迭粱摺弊琯� 頜窟滇鞅鋼鼻 � 頑滓瘩蝗 縈褒褓靦�. 杠� 錙鼻蜻 衝 閱擇頡颱摘��,
// 檀錶瘟閎隨� 菊� bTimeout
Speed.cValue += SpeedConst[Speed.bits.cSpeed];
if (!Speed.bits.bTimeout) continue; // 凸� 擋瘟 慮��靦
// 柩擋興鈇粳 頜窟滇鞅鋼鼻 � 錶瘍痠�
Speed.bits.cPrs = 0;
Speed.bits.bTimeout = 0;
// 妾��粳 縈鈇豢褓靦 慟餓鼻縝�
ChangeIntensity();
}
}
/****************************************************************************/
/* 囝滓闐 螂擋菔錦� 蓊琵廓雕橢. */
/* 俠骯闐綏 曙擋隋粵徹 蒙誅癮 擋� 頡縛� 褕擋菔錦� 蝠瘟廈 閱撿蝠� 軏� */
/* � 頑滓雛 Task_Leds */
/****************************************************************************/
void Task_Buttons (void)
{
char temp;
for (;;) {
TRIS = 0x0; NOP(); GPIO = 0;
//..............................................................
// 汁粳 縊盤曉璃頑甕�
OS_WaitCondition(bRunTaskButtons);
// 拔 陲粳� 複曉築 蜜複蝌 隄� 瘟詻� 熱 集蝠
TRIS = 0xF;
bRunTaskButtons = 0;
NOP();
// 俏蝴綑�粳, 綁靦 鞅 熱詼靜� 蜜複蒐
if (!GPIO) continue; // 拇 蝠熱 蜜複蒙 獗 熱詼錶
//--------------------------------------------------------------
// 洌滓 頡鋒鞅, 鳩皓摘, 蒙蒙�-錙 蜜複蒙 熱詼錶.
//..............................................................
// 俠 閱撼籠 隧粳 蜜複蒙� 滇閤粳 蒙蜻�-錙 篛綏蝠慘� 甦錚隅籠
if (pin_RED_BUTTON) {
cRed = 0xFF;
cGreen = 0;
cBlue = 0;
Mode.cState = 1;
}
//..............................................................
if (pin_GREEN_BUTTON) {
cRed = 0x00;
cGreen = 0xFF;
cBlue = 0x00;
Mode.cState = 2;
}
//..............................................................
if (pin_BLUE_BUTTON) {
cRed = 0x00;
cGreen = 0x00;
cBlue = 0xFF;
Mode.cState = 0;
}
//..............................................................
// 俠 雛錳綑錙� 蜜複蒸 慮��粳 縈褒褓靦 擋菔靜
if (pin_MODE_BUTTON) Speed.bits.cSpeed += 1;
//..............................................................
// 汁粳 褕餓縈痢�� 蜜複蒐
do {
TRIS = 0x0; NOP(); GPIO = 0;
OS_WaitCondition(bRunTaskButtons);
TRIS = 0xF;
bRunTaskButtons = 0;
NOP();
} while (GPIO);
}
}
/********************************************************************************/
/* � 縯璀甕� ChangeIntensity - 畫廈撿錕 愿慮獗璃� �擔縝鋼�. */
/* 丘� 蒙誅癮 憐詭� 熱震築靦 築�. 狀, 縝蛟錳粵瘟, 褕瘟羅璃� �