Код: Выделить всё
// !!! в main.h задати час в роботі !!! поточний час - 2 хвилини !!!
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> /*F_CPU = 4000000; _delay_ms max = 65,535ms; _delay_us max = 192us */
#include "main.h"
#include "pin_macros.h"
#define BCD_SIZEOF 5
#define LARGE_LIMIT_FI 145
#if defined (__AVR_ATmega8__)
#warning ATmega8 4Meg
//4 Meg
//1 1 The rising edge //1 0 The falling edge of INT1 generates an interrupt request.
//External Interrupt Request 0 Enable
# define EXT_ISR_ENABLE GICR=_BV(INT0); \
MCUCR=(1<<ISC01)|(0<<ISC00);
# define PRESCALER_RESET SFIOR|=_BV(PSR2)
# define OCR OCR2
# define TIMER2_COMPARE TIMER2_COMP_vect
# define EN_ISR_TIMER2_COMPARE TIMSK=_BV(OCIE2)
# define TCCR2_INIT TCCR2=(1<<CS22)|(1<<CS21)|(0<<CS20);// предделитель 256
# define R_TIFR TIFR
# define OCR1A_INIT OCR1A=4000;//время 1 милисекунда
#elif defined (__AVR_ATmega48__)
#warning ATmega48 1 meg
// 1 meg
//1 1 The rising edge //1 0 The falling edge of INT1 generates an interrupt request.
//External Interrupt Request 0 Enable
# define EXT_ISR_ENABLE EIMSK=_BV(INT0); \
EICRA=(1<<ISC01)|(0<<ISC00);
# define PRESCALER_RESET GTCCR|=_BV(PSRASY)
# define OCR OCR2A
# define TIMER2_COMPARE TIMER2_COMPA_vect
# define EN_ISR_TIMER2_COMPARE TIMSK2|=_BV(OCIE2A)
# define TCCR2_INIT TCCR2B=(1<<CS22)|(0<<CS21)|(0<<CS20);// предделитель 64
# define R_TIFR TIFR1
# define OCR1A_INIT OCR1A=1000;//время 1 милисекунда
#elif defined (__AVR_ATmega168P__)
#warning ATmega168p 8 meg
// 8 meg
//1 1 The rising edge //1 0 The falling edge of INT1 generates an interrupt request.
//External Interrupt Request 0 Enable
# define EXT_ISR_ENABLE EIMSK=_BV(INT0); \
EICRA=(1<<ISC01)|(0<<ISC00);
# define PRESCALER_RESET GTCCR|=_BV(PSRASY)
# define OCR OCR2A
# define TIMER2_COMPARE TIMER2_COMPA_vect
# define EN_ISR_TIMER2_COMPARE TIMSK2|=_BV(OCIE2A)
# define TCCR2_INIT TCCR2B=(1<<CS22)|(1<<CS21)|(0<<CS20);// предделитель 256
# define R_TIFR TIFR1
# define OCR1A_INIT OCR1A=4000;//время 1 милисекунда
#else
#error "device type not defined"
#endif
ISR(INT0_vect)//прерывание по падующему фронту.
{
PRESCALER_RESET;//SFIOR|=_BV(PSR2);// Bit 0 – PSR10: Prescaler Reset Timer/Counter1 and Timer/Counter0
TCNT2=255;//!!!!
OCR=TriacGate;
FlagIsr=1;
EnTriac=1;
}
ISR(TIMER2_COMPARE){//управляющий импульс на симистор
if (OCR<LARGE_LIMIT_FI){
if (EnTriac)
ON(TRIAC);
_delay_us(25);
OFF(TRIAC);
}
}
static void avr_init(void)
{
//TCCR0=_BV(CS00);
TCCR1B=(1<<CS10)|(1<<WGM12);// ctc mode
//MCUCR=(1<<ISC01)|(0<<ISC00);//1 1 The rising edge //1 0 The falling edge of INT1 generates an interrupt request.
//GICR=_BV(INT0);//External Interrupt Request 0 Enable
EXT_ISR_ENABLE;
EN_ISR_TIMER2_COMPARE;//TIMSK=_BV(OCIE2);
OCR1A_INIT;//OCR1A=4000;//время 1 милисекунда
OCR=220;//156 ~= 10mSek, 220 - за пределами полупериода, TCNT2 до этого значения не дойдет, будет сброшен в ISR(SIG_INTERRUPT0)
TCCR2_INIT;//TCCR2=(1<<CS22)|(1<<CS21)|(0<<CS20);// предделитель 256
DRIVER(TRIAC,OUT);
DRIVER(PIN_INT,PULLUP);
DRIVER(COM_DIG_0,OUT);
DRIVER(COM_DIG_1,OUT);
DRIVER(COM_DIG_2,OUT);
DRIVER(SEG_0,OUT);
DRIVER(SEG_1,OUT);
DRIVER(SEG_2,OUT);
DRIVER(SEG_3,OUT);
DRIVER(SEG_4,OUT);
DRIVER(SEG_5,OUT);
DRIVER(SEG_6,OUT);
DRIVER(SEG_7,OUT);
DRIVER(BUZZER,OUT);
sei();
return;
}
#if defined (__AVR_ATmega8__)
//-------------------EEPROM-------------------------
static inline unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEWE));
EEAR = uiAddress;
EECR |= (1<<EERE);
return EEDR;
}
static void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
if ( EEPROM_read(uiAddress)!=ucData){
while(EECR & (1<<EEWE));
cli();
//asm("wdr");//сброс сторожевого таймера
EEAR = uiAddress;
EEDR = ucData;
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
sei();
}
}
#else
static inline unsigned char EEPROM_read(unsigned int uiAddress)
{
while(EECR & (1<<EEPE));
EEAR = uiAddress;
EECR |= (1<<EERE);
return EEDR;
}
static void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
if ( EEPROM_read(uiAddress)!=ucData){
while(EECR & (1<<EEPE));
cli();
asm("wdr");//сброс сторожевого таймера
EEAR = uiAddress;
EEDR = ucData;
EECR |= (1<<EEMPE);
EECR |= (1<<EEPE);
sei();
}
}
#endif
static void save_struct_eep(void)
{
uint8_t * a= (uint8_t *)&Setting;
Setting.crc=0;
for(uint16_t j=0, i=EEP_ADR; j<sizeof(Setting); i++, j++, a++)
{
if (j<sizeof(Setting)-2) Setting.crc+=*a;
EEPROM_write( i, *a);
}
eeprom_eer=0;
}
static void read_struct_eep(void)
{
uint16_t crc=0;
uint8_t *a= (uint8_t *)&Setting;
for(uint16_t j=0, i=EEP_ADR; j<sizeof(Setting); i++, j++, a++)
{*a=EEPROM_read(i);
if (j<sizeof(Setting)-2) crc+=*a;
}
#warning правка 1 Setting.TimOff > 60 исправить максимальное значение на 255
if ( crc!= Setting.crc || Setting.TimOff > 255 || Setting.TimAlarm > 10 || Setting.TimAlarm == (Setting.TimOff*10)) {
eeprom_eer=1;
Setting.IncPower=1;
Setting.TimOff=1;
Setting.TimAlarm=1;
}
else
{
LargeLimitReg=100;
if (Setting.RegimFi) //if Fi
if (Setting.FiNumView) LargeLimitReg=LARGE_LIMIT_FI;// if Num
}
}
static void led_off(void)
{
//потушили цифру
OFF(COM_DIG_0);
OFF(COM_DIG_1);
OFF(COM_DIG_2);
OFF(SEG_0);
OFF(SEG_1);
OFF(SEG_2);
OFF(SEG_3);
OFF(SEG_4);
OFF(SEG_5);
OFF(SEG_6);
OFF(SEG_7);
}
//-------------------------------------
static void led_on(void)
{
if ( led_buffer[znmesto] & _BV(0) ) ON(SEG_0);
if ( led_buffer[znmesto] & _BV(1) ) ON(SEG_1);
if ( led_buffer[znmesto] & _BV(2) ) ON(SEG_2);
if ( led_buffer[znmesto] & _BV(3) ) ON(SEG_3);
if ( led_buffer[znmesto] & _BV(4) ) ON(SEG_4);
if ( led_buffer[znmesto] & _BV(5) ) ON(SEG_5);
if ( led_buffer[znmesto] & _BV(6) ) ON(SEG_6);
if ( led_buffer[znmesto] & _BV(7) ) ON(SEG_7);
if ( znmesto==0 ) ON(COM_DIG_0);
else
if ( znmesto==1 ) ON(COM_DIG_1);
else
if ( znmesto==2 ) ON(COM_DIG_2);
}
//-------------------------------------
static void skan_key(void){
// 4mSek
//Key=KEY_VOID;
#ifdef KATOD
PORT_BUTTON |= BTNS_PULLUP;
#else
PORT_BUTTON &= ~COM_BTN;
#endif
DDR_BUTTON &= ~BTNS_PULLUP;
_delay_us(15);
uint8_t pin=PIN_BUTTON;
#ifdef KATOD
PORT_BUTTON &= ~BTNS_PULLUP;
#else
PORT_BUTTON |= COM_BTN;
#endif
DDR_BUTTON |= BTNS_PULLUP;
//--------------------------------------
#define KEY_PRESS(Key) ((pin & (Key))==0)
//---------------------------------------------------------------------------------------
//static uint8_t antdr, count_press, povtor;
if ( KEY_PRESS(BTN_PLUS) || KEY_PRESS(BTN_MINUS) || KEY_PRESS(BTN_SET) ){// была нажата любая кнопка
if ( antdr>=pause_after_press[count_press] ) antdr=0;
if (++antdr==3){
//if ( KEY_PRESS(BTN_PLUS ) && KEY_PRESS(BTN_MINUS) )
// Key=KEY_OBE;
//else
if ( KEY_PRESS(BTN_PLUS) )
Key=KEY_PLUS;
if ( KEY_PRESS(BTN_MINUS ) )
Key|=KEY_MINUS;
if ( KEY_PRESS(BTN_SET ) ){
Key|=KEY_SET;
ViewReg=10;
Flag|=VIEWREG;
}
if (count_press<sizeof(pause_after_press)-1) count_press++;
if (++povtor>=sizeof(pause_after_press)+20) Inc=3;
TimeState=200;
}
}
else{
Key=KEY_VOID;
antdr=count_press=povtor=0;
Inc=1;
}
}
void inc_dec_param(uint8_t *p, uint8_t max, uint8_t min, uint8_t inc){
if (Key==KEY_PLUS){
if ( ((*p)+inc)<=max ) (*p)+=inc; else (*p)=min;
}
if (Key==KEY_MINUS){
if ( ((*p)-inc)>=min ) (*p)-=inc; else (*p)=max;
}
}
//-------------------------------------
void key_action(void){
if (Key) {//если экран мигает и нажата кнопка, то отменить таймер откл, и выйти из ф. без обработки кнопки
TimeOff=0;
if (Flag & MIGANIE) {
Flag &= ~MIGANIE;
Blank=0;
Key=0;
return;
}
}
if (regim==0){
if (Key&KEY_SET)
regim=ST_INPUT_REG;
else
inc_dec_param(&PowerTmp, LargeLimitReg, 0, Inc+(Setting.IncPower-1));
Key=0;
return;
}
if (regim==ST_INPUT_REG){
if (povtor>0){// povtor - кнопка удерживается (долгое нажатие)
if (povtor>2) {
regim=ST_INPUT_TIP_REG;
Var=ST_TIP_REG;
}
if ( (Key&(KEY_SET|KEY_MINUS)) == (KEY_SET|KEY_MINUS) ) {
PowerTmp=0;
regim=ST_INPUT_TIP_REG;
Var=0;
}
if ( (Key&(KEY_SET|KEY_PLUS)) == (KEY_SET|KEY_PLUS) ) {
PowerTmp=LargeLimitReg;
regim=ST_INPUT_TIP_REG;
Var=0;
}
}
else
{
if (Key==KEY_VOID) regim=ST_PRESET;
}
return;
}
if (regim==ST_INPUT_TIP_REG){
if (Key==KEY_VOID) {
Flag &= ~VIEWREG;
regim=Var;
}
return;
}
if (regim==ST_TIP_REG){
inc_dec_param(&Setting.RegimFi, 1, 0, 1);
if (Key==KEY_SET){
StepPreset=NUM_PRESET-1;//настраиваем счетчик пресетов, что бы при выходе по первому нажатию рег вкл на 1-е значение
PowerTmp=0;//выключаем управление симистором
save_struct_eep();
if (Setting.RegimFi) regim=ST_SET_VIEW_FI;
else {Var=0; regim=ST_SETTING_PRESET;}
}
Key=0;
return;
}
if (regim==ST_SET_VIEW_FI){
inc_dec_param(&Setting.FiNumView, 1, 0, 1);
if (Key==KEY_SET) {
save_struct_eep();
Var=0;
regim=ST_SETTING_PRESET;
}
Key=0;
return;
}
if ( Key & (KEY_PLUS|KEY_MINUS))//выход и обнуление(завершение) режима названия параметра
if (Flag & VIEWREG) {
Flag &= ~VIEWREG;
Key=0;
return;
}
if (regim==ST_SETTING_PRESET){
uint8_t P=0;
LargeLimitReg=100;
if (Setting.RegimFi){ //if Fi
if (Setting.FiNumView){
LargeLimitReg=LARGE_LIMIT_FI;
P=NUM_PRESET;
}
else
if (PowerTmp>100) PowerTmp=0;
}
else
if (PowerTmp>100) PowerTmp=0;
inc_dec_param(&Setting.Preset[Var+P], LargeLimitReg, 0, Inc);
if (Key==KEY_SET) {
if (++Var>=NUM_PRESET-1){
Setting.Preset[NUM_PRESET-1]=Setting.Preset[NUM_PRESET*2-1]=0;//обнуляем последние значения Preset, для OFF
regim=ST_INC_POWER;
}
save_struct_eep();
}
Key=0;
return;
}
if (regim==ST_INC_POWER){
inc_dec_param(&Setting.IncPower, 20, 1, 1);
// if (Setting.IncPower==0) Setting.IncPower=1;
if (Key==KEY_SET) {
save_struct_eep();
regim=ST_TIM_OFF;
}
Key=0;
return;
}
if (regim==ST_TIM_OFF){
#warning правка 2 Вместо 60 указать максимальное время работы
inc_dec_param(&Setting.TimOff, 255, 0, 1); // Ограничение максимального времени в 60*10 минут (10 часов)
if (Setting.TimOff==0) Blank=0;
if (Key==KEY_SET) {
save_struct_eep();
if (Setting.TimOff==0){
// Setting.TimAlarm=0;
regim=ST_END;
}
else{
regim=ST_TIM_ALARM;
}
}
Key=0;
return;
}
/*----------------------------
// Для отладки, Setting.TimOff еденицы минут
if (regim==ST_TIM_ALARM){
if (Setting.TimOff>10){ // Максимальное время не более времени отключение и не более 10 минут
inc_dec_param(&Setting.TimAlarm, 10, 1);
}
else{
if (Setting.TimOff <= Setting.TimAlarm) Setting.TimAlarm=Setting.TimOff-1;
inc_dec_param(&Setting.TimAlarm, Setting.TimOff-1, 1);
}
if (Setting.TimAlarm==0) Setting.TimAlarm=1;
if (Key==KEY_SET) {
save_struct_eep();
regim=ST_END;
}
Key=0;
return;
}
-----------------------------*/
#warning правка 3 Условие времени таймера старое
/*
if (regim==ST_TIM_ALARM){
if (Setting.TimAlarm == 0) Setting.TimAlarm=1;
if (Setting.TimOff==1){ // Максимальное время не более времени отключение и не более 10 минут
MaxVol=9;
if (Setting.TimOff*10 == Setting.TimAlarm) Setting.TimAlarm=MaxVol;
}
else{
MaxVol=10;
}
inc_dec_param(&Setting.TimAlarm, MaxVol, 1, 1);
if (Key==KEY_SET) {
save_struct_eep();
regim=ST_END;
}
Key=0;
return;
}
*/
if (regim==ST_END){
if ( Key || ((Flag&VIEWREG)==0) ) {
Flag &= ~VIEWREG;
regim=0;
Key=0;
}
return;
}
// Условие времени таймера новое
if (regim==ST_TIM_ALARM){
if (Setting.TimAlarm == 0) Setting.TimAlarm=1;
if ((Setting.TimOff <= Setting.TimAlarm) && (Setting.TimOff < 10)){
MaxVol = Setting.TimOff - 1;
}
else{
MaxVol=10;
}
inc_dec_param(&Setting.TimAlarm, MaxVol, 1, 1);
if (Key==KEY_SET) {
save_struct_eep();
regim=ST_END;
}
Key=0;
return;
}
// ---------------------------------------------------------------------------------------------
//------------PRESET-------------------------
if (regim==ST_PRESET){
if (++StepPreset>NUM_PRESET-1){
StepPreset=0;
}
uint8_t P=0;
if (Setting.RegimFi) //if Fi
if (Setting.FiNumView){
P=NUM_PRESET;
}
PowerTmp=Setting.Preset[StepPreset+P];
Flag &= ~VIEWREG;
regim=0;
Key=0;
return;
}
}
void itoa2(int16_t Val, uint8_t * Buf)
{
const uint16_t step[BCD_SIZEOF]={10000,1000,100,10,1};
#if BCD_SIZEOF != 5
#warning *** BCD_SIZEOF!=sizeof(step)! ***
#endif
int16_t Subtract, Value;
uint8_t i, Dig;
Value=Val;
for (i=0; i<BCD_SIZEOF; i++)
{
Subtract=step[i];
Dig=0;
while(Value >= Subtract)
{
Dig++;
Value-=Subtract;
}
Buf[i]=Dig;
}
}
void data_led(void){
uint8_t buf[BCD_SIZEOF];
led_buffer[0]=0;
led_buffer[1]=0;
led_buffer[2]=0;
if ((regim==0)||(regim==ST_PRESET)||(regim==ST_INPUT_REG)){
if (eeprom_eer){
led_buffer[0]=font[f_E];
led_buffer[1]=font[f_E];
led_buffer[2]=font[f_P];
}
else
{
if (EnTriac==0){
led_buffer[0]=font[f_n];
led_buffer[1]=font[f_o];
led_buffer[2]=font[f_C]|sH;
}
else
if (PowerTmp==0){
led_buffer[0]=sD;//font[0];
led_buffer[1]=sD;//font[f_F];
led_buffer[2]=sD;//font[f_F];
}
else{
if (Blank==0)
{
itoa2(PowerTmp, buf);
led_buffer[0]=font[buf[2]];
led_buffer[1]=font[buf[3]];
led_buffer[2]=font[buf[4]];
}
}
}
return;
}
if (regim==ST_INPUT_TIP_REG){
if ( (Key&(KEY_SET|KEY_MINUS)) == (KEY_SET|KEY_MINUS) ) {
led_buffer[0]=font[0];
led_buffer[1]=font[f_F];
led_buffer[2]=font[f_F];
}
else
if ( (Key&(KEY_SET|KEY_PLUS)) == (KEY_SET|KEY_PLUS) ) {
led_buffer[0]=0;
led_buffer[1]=font[f_o];
led_buffer[2]=font[f_n];
}
else{
led_buffer[0]=font[f_P];
led_buffer[1]=font[f_E];
led_buffer[2]=font[f_G];
// ON(BUZZER); // Звуковое оповещение о входе в настройки
}
return;
}
if (regim==ST_TIP_REG){
if (Setting.RegimFi){
led_buffer[1]=font[f_F];
led_buffer[2]=font[f_I];
}
else{
led_buffer[0]=font[f_P];
led_buffer[1]=font[f_A];
led_buffer[2]=font[f_U];
}
return;
}
if (regim==ST_SET_VIEW_FI){
if (Setting.FiNumView){
led_buffer[0]=font[4];
led_buffer[1]=font[f_U];
led_buffer[2]=font[f_C];//ЧИС
}
else{
led_buffer[0]=font[f_N];
led_buffer[1]=font[f_P];
led_buffer[2]=font[f_U]|sH;//ПРЦ
}
return;
}
if (regim==ST_SETTING_PRESET)//
{
if (Flag & VIEWREG)
{
led_buffer[0]=sG;
led_buffer[1]=font[Var+1];
led_buffer[2]=sG;
}
else{
uint8_t P;
if ((Setting.RegimFi) && (Setting.FiNumView)) P=NUM_PRESET; else P=0;
itoa2(Setting.Preset[Var+P], buf);
led_buffer[0]=font[buf[2]];
led_buffer[1]=font[buf[3]];
led_buffer[2]=font[buf[4]];
}
return;
}
if (regim==ST_INC_POWER)//
{
if (Flag & VIEWREG)
{
led_buffer[0]=font[f_i];
led_buffer[1]=font[f_n];
led_buffer[2]=font[f_c];
}
else{
itoa2(Setting.IncPower, buf);
//led_buffer[0]=font[buf[2]];
led_buffer[1]=font[buf[3]];
led_buffer[2]=font[buf[4]];
}
return;
}
if (regim==ST_TIM_OFF) // Таймер отключения нагрузки
{
if (Flag & VIEWREG)
{
led_buffer[0]=font[f_t];
led_buffer[1]=font[0];
led_buffer[2]=font[f_F];
}
else{
itoa2(Setting.TimOff, buf);
#warning правка 4 исправить индикацию для режима настройки таймера отключения
// led_buffer[0]=font[buf[3]];
// led_buffer[1]=font[buf[4]];
// led_buffer[2]=font[0];
// На вот такое
led_buffer[0]=font[buf[2]];
led_buffer[1]=font[buf[3]];
led_buffer[2]=font[buf[4]];
}
return;
}
if (regim==ST_TIM_ALARM) // Таймер предупреждения
{
if (Flag & VIEWREG)
{
led_buffer[0]=font[f_t];
led_buffer[1]=font[f_A];
led_buffer[2]=font[f_L];
}
else{
itoa2(Setting.TimAlarm, buf);
led_buffer[1]=font[buf[3]];
led_buffer[2]=font[buf[4]];
}
return;
}
if (regim==ST_END)//
{
led_buffer[0]=font[f_E];
led_buffer[1]=font[f_n];
led_buffer[2]=font[f_d];
return;
}
}
int main(void)
{
uint8_t TimeBlank=1;//Tim10msek=10,
uint8_t Tim100msek=10, TimLed=4,ChangePower=0;
avr_init();
read_struct_eep();
TriacGate=LARGE_LIMIT_FI;//выключен
OFF(BUZZER);//выключен по-умолчанию
while(1)
{
if (Setting.RegimFi==0)
{// Режим пропуска периодов
if (FlagIsr)
{
FlagIsr=0;
//u8 Power; //требуемое значение мощности
//Power = MyPower; //задаем требуемое значение мощности
#define MAXPOW 100; //число, соотв. макс. мощности
static uint8_t Phase = MAXPOW;//инициализация, делать 1 раз
static int8_t Delta;
//делать по вылавливанию перехода через 0:
Delta = Power + Delta;
if (Delta < 0)
{
TriacGate=LARGE_LIMIT_FI;//TriacOff();
}
else
{
TriacGate=0;//TriacOn();
Delta = Delta - MAXPOW;
/*
ON(TRIAC);
_delay_us(10);
OFF(TRIAC);*/
}
Phase = Phase - 1;
if (Phase == 0)
{
Phase = MAXPOW;
Delta = - (Phase / 2);
}
if (Power==0) { TriacGate=LARGE_LIMIT_FI;}
}
}
if (R_TIFR & _BV(OCF1A)) // 0.001 sek
{
R_TIFR = _BV(OCF1A);
if ( --TimLed==0 )//
{
TimLed=4;
led_off();// потушить цифру
//asm("wdr");//сброс сторожевого таймера
skan_key();
key_action();
led_on();// вкл. цифру
if (++znmesto>=3)
{
znmesto=0x00;
data_led();
}
}
if (ChangePower!=PowerTmp){
ChangePower=PowerTmp;
//TimeOff=0;
if (Setting.RegimFi) {//ФИ режим
if (Setting.FiNumView==0){// если в процентах
TriacGate=LARGE_LIMIT_FI-((LARGE_LIMIT_FI)*PowerTmp)/100;
}
else{
TriacGate=LARGE_LIMIT_FI-PowerTmp;
}
}
else{
Power=PowerTmp;// Режим пропуска периодов
}
}
{uint8_t tcnt2=TCNT2;
if ( tcnt2>LARGE_LIMIT_FI+30){
if ( tcnt2!=255)
EnTriac=0;
}
}
//if (Setting.RegimFi) TriacGate=Power;
//----------=-------------------0.1-Sek---------------------------------------
if ( --Tim100msek==0 ) //0.1sek
{
OFF(BUZZER);//выключен
Tim100msek=100;
TimeState--;
if (TimeState==0) regim=0;
if (--ViewReg==0) Flag&=~VIEWREG;
if (PowerTmp==0) StepPreset=NUM_PRESET-1;//настраиваем счетчик пресетов, что бы при выходе по первому нажатию рег вкл на 1-е значение
if (Setting.TimOff>0) // Если задержка отключения больше ноля, то отрабатываем таймер
{
//-------Мигание_и_выключение------------
if (PowerTmp)
{
#warning правка 5 В обоих строчках 600 заменить на 60
if (++TimeOff>((Setting.TimOff*60*10)-(Setting.TimAlarm*60*10))){ // Задержка на начало мигания
Flag|=MIGANIE;
if (TimeOff>(Setting.TimOff*60*10)) PowerTmp=0;//д.стоять ниже по коду if (ChangePower!=PowerTmp)
if (--TimeBlank==0)
{
#warning правка 6 вместо 300 указать за какое время должна включиться пищалка, время в секундах умноженное на 10
if ( Blank && TimeOff>((Setting.TimOff*60*10)-60*10) ) ON(BUZZER); else OFF(BUZZER);
if ( Blank )
{// параметр будет виден
Blank=0;
TimeBlank=5;//0.5sek
// ON(BUZZER); // 0.5sek
}
else
{
Blank=1;
TimeBlank=2;
// OFF(BUZZER); // 0.2 sec
}
}
}
}
else{
Blank=0;
TimeBlank=1;
}
}
}
}
}
}