/***************************************************** This program was produced by the CodeWizardAVR V2.03.4 Standard Automatic Program Generator © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 22.01.2012 Author : Company : Comments: Chip type : ATtiny2313 Clock frequency : 8.000000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 32 *****************************************************/ #include #include // Declare your global variables here unsigned char begin_p; // флаг начала прихожей unsigned char begin_k; // флаг начала коридора unsigned char end_p; // флаг конца прихожей unsigned char end_k; // флаг конца коридора unsigned char lower_p; // флаг уменьшения яркости прихожей unsigned char lower_k; // флаг уменьшения яркости коридора unsigned char zav_k; // флаг зависимости коридора unsigned long max_p; // максимальная яркость прихожей * 100 те в OCR0A пишется max_p/100 unsigned long max_k; // максимальная яркость кордидора * 100 unsigned long timer_p; // счетчик таймера прихожей unsigned long timer_k; // счетчик таймера коридора unsigned long timer_akt_p; // счетчик таймера активности прихожей unsigned long timer_akt_k; // счетчик таймера активности коридора unsigned char step_p; // текущий шаг прихожей unsigned char step_k; // текущий шаг коридора unsigned long tim_ocr_p; // текущее значение таймера для записи в шим прихожая unsigned long tim_ocr_k; // текущее значение таймера для записи в шим коридор #define TP 18000 // длительность горения света в прихожей в тиках. 1тик=10мс #define TK 18000 // длительность горения света в прихожей #define TBEP 500 // время выхода на рабочий режим / выключения #define TBEK 500 // время выхода на рабочий режим / выключения #define LEV_P 1200 // порог активности для выхода из ночного режима #define LEV_K 1200 // порог активности для выхода из ночного режима // яркости #define day_p 25500 // значение дня прихожей #define day_k 25500 // значение дня коридора #define night_p 8500 // значение ночи прихожей #define night_k 8500 // значение ночи коридора void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port A initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=0 State1=T State0=T PORTB=0x00; DDRB=0x04; // Port D initialization // Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In // State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x60; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 8000.000 kHz // Mode: Fast PWM top=FFh // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // TCCR0A=0xA3; // fastpwm TCCR0A=0xA1; // fasepwm TCCR0B=0x01; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // Universal Serial Interface initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; // инициализация переменных begin_p=0; begin_k=0; end_p=0; end_k=0; timer_p=0; timer_k=0; tim_ocr_p=0; tim_ocr_k=0; timer_akt_p=0; timer_akt_k=0; zav_k=0; while (1) { // опрос // установка флагов начала - проход есть только при первом пуске! if (PIND.2==0 && timer_p==0) { begin_p=1; end_p=0; // устанавливаем флаг начала и сбрасываем флаг конца асинхронно if (PIND.4==0) // день/ночь {max_p=day_p;} else { max_p=night_p; } // отработаем зависимость if (begin_k==0 && timer_k==0) // включим 50% от режима в коридоре если там все выключено {begin_k=1 ; end_k=0; timer_k=TK/2; zav_k=1; if (PIND.4==0) // день/ночь {max_k=day_k/2;} else {max_k=night_k/2;} } } if ( (PIND.3==0 && timer_k==0) || (PIND.3==0 && zav_k==1)) { begin_k=1 ; end_k=0; // устанавливаем флаг начала и сбрасываем флаг конца асинхронно zav_k=0; if (PIND.4==0) // день/ночь {max_k=day_k;} else { max_k=night_k; } // зависимость с корридора на прихожую не делаем } // проход при любом нажатии if (PIND.2==0) // прихожая { timer_p=TP; timer_akt_p++; // инкрементируем активность if (PIND.4==1 && timer_akt_p>LEV_P) // ночь и таймер активности превышает порог {max_p=day_p;} // активность выше порога } if (PIND.3==0) // кордидор { timer_k=TK; timer_akt_k++; // инкрементируем активность if (PIND.4==1 && timer_akt_k>LEV_K) // ночь и таймер активности превышает порог {max_k=day_k;} // активность выше порога } // пересчет шага step_p=max_p/TBEP; step_k=max_k/TBEK; // отработка переключения день/ ночь при включеном свете // алгоритм универсальный и рассчитан на любое увеличение-уменьшение if (begin_p==0 && end_p==0 && timer_p>0 && OCR0A0 && OCR0A>max_p/100 ) // уменьшение яркости { lower_p=1;} if (begin_k==0 && end_k==0 && timer_k>0 && OCR0B0 && OCR0B>max_k/100 ) // уменьшение яркости { lower_k=1;} // завершаем опрос PORTD=0x40; // мигаем светодиодом работы delay_ms(2); PORTD=0x00; delay_ms(7); // опрос закончен // включаем свет // прихожая // блок плавного включения if (timer_p>0 && begin_p==1 && OCR0A0 && begin_p==1 && OCR0A==max_p/100 ) // те это конец конца { begin_p=0; } // основной режим if (timer_p>0 && begin_p==0 && lower_p==0 ) { OCR0A=max_p/100; timer_p--; tim_ocr_p=max_p; } // отслеживание конца if (timer_p==0 && OCR0A>0 ) {end_p=1;} if (OCR0A>0 && end_p==1) {tim_ocr_p=tim_ocr_p-step_p; OCR0A=tim_ocr_p/100; } if (OCR0A==0 && end_p==1) // конец конца {end_p=0; tim_ocr_p=0; timer_akt_p=0;} // отслеживание уменьшения яркости if (lower_p==1) {tim_ocr_p=tim_ocr_p-step_p; OCR0A=tim_ocr_p/100; } if (lower_p==1 && tim_ocr_p>max_p ) // конец уменьшения {lower_p=0;} // коридор // блок плавного включения if (timer_k>0 && begin_k==1 && OCR0B0 && begin_k==1 && OCR0B==max_k/100 ) // те это конец конца { begin_k=0; } // основной режим if (timer_k>0 && begin_k==0 && lower_k==0) { OCR0B=max_k/100; timer_k--; tim_ocr_k=max_k; } // отслеживание конца if (timer_k==0 && OCR0B>0 ) {end_k=1;} if (OCR0B>0 && end_k==1) { tim_ocr_k=tim_ocr_k-step_k; OCR0B=tim_ocr_k/100; } if (OCR0B==0 && end_k==1) // конец конца {end_k=0; tim_ocr_k=0; timer_akt_k=0;} // отслеживание уменьшения яркости if (lower_k==1) {tim_ocr_k=tim_ocr_k-step_k; OCR0B=tim_ocr_k/100; } if (lower_k==1 && tim_ocr_k>max_k ) // конец уменьшения {lower_k=0;} }; }