/* ------------------------------------------------------------------------------------------- */ /* под игрушку-поделку "ракета" */ /* ------------------------------------------------------------------------------------------- */ #include /* ------------------------------------------------------------------------------------------- */ //Определение скорости #define ___brgPeriod 67 //65 58-59 #define ___maxBright 128 //128 #define ___workFreq (1000000/___maxBright/___brgPeriod) /* ------------------------------------------------------------------------------------------- */ __CONFIG(PROTECT & BOREN & MCLRDIS & PWRTEN & WDTEN & INTIO); /* ------------------------------------------------------------------------------------------- */ /* История версий: 1.0 (от 09 декабря 2009 г.) Первоначальный релиз 1.1 (от 24 сентября 2009 г.) Переделка под контроллер clockCTR.01 1.2 (от 20 декабря 2010 г.) Переделка под отдельную плату контроллера, добавление функции работы с кнопкой (замораживание\смена эффекта), изменение принципа случайного эффекта 1.3 Добавление таблицы фиксированных цветов */ /* ------------------------------------------------------------------------------------------- */ //описание портов ввода-вывода //порты для управления основными светодиодами (сигнал инверсный, по умолчанию включена подтяжка на +5) //порты для управления звуковой анимацией #define LED1 GPIO0 //R #define LED2 GPIO1 //G #define LED3 GPIO2 //B #define LED4 GPIO4 //Y #define _LED_ON 1 //включить сегмент #define _LED_OFF 0 //выключить сегмент /* ------------------------------------------------------------------------------------------- */ #define _null 0xFF #define false 0 #define true 1 //unsigned int progTime; //#define _sceneTime 36058 //время выполнения одной сцены 5 минут //near unsigned char freezeProg; //=true, если программа остановлена, иначе выполняется //переменные для управления яркостью сегментов near volatile unsigned char _intBright; //текущий шаг яркости (0..63) near volatile unsigned char bright1; //яркость сегмента 1 (0..63) near volatile unsigned char bright2; //яркость сегмента 2 (0..63) near volatile unsigned char bright3; //яркость сегмента 3 (0..63) near volatile unsigned char bright4; //яркость сегмента 3 (0..63) near bit dirBright1; //направление яркости: 0 инкремент, 1 декремент near bit dirBright2; near bit dirBright3; near bit dirBright4; near int _brg1X; near int _brg2X; near int _brg3X; near int _brg4X; #define deltaY 128 #define deltaX1 128+1 #define deltaX2 128+3 #define deltaX3 128+5 #define deltaX4 256+7 //для управления скоростью нарастания\спада near volatile bit speedSync; //примерно 120 раз в сек. /* ------------------------------------------------------------------------------------------- */ //прерывание void interrupt HI_ISR(void){ //переменные для управления яркостью near static unsigned char _tmpBright1, _tmpBright2, _tmpBright3, _tmpBright4; T0IF = 0; TMR0 -= ___brgPeriod; _intBright = (_intBright+1)&(___maxBright-1); if(_intBright==0){//перезагружаем внутренние счётчики яркости _tmpBright1 = bright1&0x7F; _tmpBright2 = bright2&0x7F; _tmpBright3 = bright3&0x7F; _tmpBright4 = bright4&0x7F; if(_tmpBright1!=0)LED1 = _LED_ON; else LED1 = _LED_OFF; if(_tmpBright2!=0)LED2 = _LED_ON; else LED2 = _LED_OFF; if(_tmpBright3!=0)LED3 = _LED_ON; else LED3 = _LED_OFF; if(_tmpBright4!=0)LED4 = _LED_ON; else LED4 = _LED_OFF; //управляем скоростью speedSync = true; } else{ if((--_tmpBright1)==0)LED1 = _LED_OFF; if((--_tmpBright2)==0)LED2 = _LED_OFF; if((--_tmpBright3)==0)LED3 = _LED_OFF; if((--_tmpBright4)==0)LED4 = _LED_OFF; }; } /* ------------------------------------------------------------------------------------------- */ //выполнение т.н. "фоновых п.п." void background(void){ //unsigned char temp; if(speedSync){ speedSync = false; //пограмма цветового микса //управляем яркостью светодиода 1 _brg1X += deltaY; if((2*_brg1X)>=deltaX1){ _brg1X -= deltaX1; //inc-dec bright if(dirBright1==false){//inc if(bright1<0x7F)bright1++; if(bright1<0x7F)bright1++; if(bright1<0x7F)bright1++; if(bright1<0x7F)bright1++; if(bright1<0x7F)bright1++; if(bright1<0x7F)bright1++; if(bright1>=0x7F){ dirBright1=true; } } else{ if(bright1>0)bright1--; if(bright1>0)bright1--; if(bright1>0)bright1--; if(bright1>0)bright1--; if(bright1>0)bright1--; if(bright1>0)bright1--; if(bright1==0){ dirBright1 = false; } } CLRWDT(); } //управляем яркостью светодиода 2 _brg2X += deltaY; if((2*_brg2X)>=deltaX2){ _brg2X -= deltaX2; //inc-dec bright if(dirBright2==false){//inc if(bright2<0x7F)bright2++; if(bright2<0x7F)bright2++; if(bright2<0x7F)bright2++; if(bright2<0x7F)bright2++; if(bright2<0x7F)bright2++; if(bright2<0x7F)bright2++; if(bright2>=0x7F){ dirBright2=true; } } else{ if(bright2>0)bright2--; if(bright2>0)bright2--; if(bright2>0)bright2--; if(bright2>0)bright2--; if(bright2>0)bright2--; if(bright2>0)bright2--; if(bright2==0){ dirBright2 = false; } } } //управляем яркостью светодиода 3 _brg3X += deltaY; if((2*_brg3X)>=deltaX3){ _brg3X -= deltaX3; //inc-dec bright if(dirBright3==false){//inc if(bright3<0x7F)bright3++; if(bright3<0x7F)bright3++; if(bright3<0x7F)bright3++; if(bright3<0x7F)bright3++; if(bright3<0x7F)bright3++; if(bright3>=0x7F){ dirBright3=true; } } else{ if(bright3>0)bright3--; if(bright3>0)bright3--; if(bright3>0)bright3--; if(bright3>0)bright3--; if(bright3>0)bright3--; if(bright3==0){ dirBright3 = false; } } } //управляем яркостью светодиода 4 _brg4X += deltaY; if((2*_brg4X)>=deltaX4){ _brg4X -= deltaX4; //inc-dec bright if(dirBright4==false){//inc if(bright4<0x7F)bright4++; if(bright4>=0x7F){ dirBright4=true; } } else{ if(bright4>0)bright4--; if(bright4==0){ dirBright4 = false; } } } //отслеживаем нормальную работу схемы if(((bright1&0x7F)!=0)||((bright2&0x7F)!=0)||((bright3&0x7F)!=0)||((bright4&0x7F)!=0)){//сбрасываем сторожевой таймер только при горящем светодиоде!!! CLRWDT(); }; }; } /* ------------------------------------------------------------------------------------------- */ void hardwareInit(void){ //unsigned char temp; di(); OPTION = 0b00001111; PCON = 0b00000011; //порты GPIO = 0; CMCON = 0x07; ANSEL = 0b00110000; TRISIO = 0b00101000; GPIO = 0b00000000; WPU = 0b00100000; IOCB = 0b00000000; PEIE = 1; T0IE = 1; T1CON = 0b00000000; VREN = 0; //настраиваем рабочие переменные _intBright = -1; bright1 = 0; bright2 = 0; bright3 = 0; bright4 = 0; _brg1X = 0; _brg2X = 0; _brg3X = 0; _brg4X = 0; dirBright1 = 0; dirBright2 = 0; dirBright3 = 0; dirBright4 = 0; ei(); } /* ------------------------------------------------------------------------------------------- */ void main(void){ //unsigned char temp, temp2; di(); //обнуляем сторожевой таймер CLRWDT(); hardwareInit(); //формируем систему прибора for(;;){ background(); }; } /* ------------------------------------------------------------------------------------------- */