Дипломная работа: Разработка устройства автоматического регулирования света на микроконтроллере
}
return;
}
//нажатие
"+"
if(on_old && off_old && !on_new
&& off_new)
{
enable_count=1;
if(++press_plus>7)
{
mode=5;//режим
запоминания посылки ДУ "+"
goto
l1;
}
return;
}
//нажатие
"-"
if(on_old && off_old && on_new
&& !off_new)
{
enable_count=1;
if(++press_minus>7)
{
mode=6;//режим
запоминания посылки ДУ "-"
l1:
clock=0;
}
return;
}
//
if(enable_count) ++press_key;
if(press_key>press_time*2)
{
enable_count=0;
press_key=0;
press_plus=0;
press_minus=0;
}
//если
при медленном изменении яркости ничего не нажато, то остановить изменение
яркости.
if(mode==1 || mode==2) mode=7;
//обнуляем
счетчик
zader=0;
}
#include
"faza.c"
//==========================================================
//обработка
прерывания от положительного перепада полуволны.
//==========================================================
#pragma
savereg-
interrupt [EXT_INT0] void ext_int0_isr(void)
{
s_reg=SREG;
#asm
PUSH R30
#endasm
second_half_period=0;//предустановка
на двойную обработку прерывания timer1.
TCNT1H=0xFF;//выдержка
timer1
TCNT1L=ofa;
TIMSK=0x82;//разрешение
прерывания по переполнению timer1.
#asm
POP R30
#endasm
SREG=s_reg;
}
#pragma savereg+
#include "timer0.c"
//==========================================================
//обработка
прерывания таймера0.
//==========================================================
#pragma
savereg-
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if(closed)
#asm("RETI");
//сохраняем
используемые регистры
#asm
PUSH R24
PUSH R25
PUSH R26
PUSH R27
PUSH R28
PUSH R29
PUSH R30
PUSH R31
IN R30,SREG
ORI R30,0x80
PUSH R30
#endasm
//опросим
пульт
ДУ
infra_old=infra;
infra=PINB.0;
if(ir_plus_old && !ir_plus &&
!in_home && (mode!=1) && (mode!=2)) ir_p_otp=1;
if(ir_minus_old && !ir_minus &&
!in_home && (mode!=1) && (mode!=2)) ir_m_otp=1;
ir_plus_old=ir_plus;
ir_minus_old=ir_minus;
//разрешаем
прерывания
#asm("SEI");
//обработаем
пульт
ДУ
infrared();
//опрашиваем
кнопки
keyboard();
if(++tic>=7813)//ждем
0,5сек
{
tic=0;
clock++;//0 to 4294967295
second=~second;
}
//восстанавливаем
использованные регистры и возвращаемся.
#asm
POP R30
OUT SREG,R30
POP R31
POP R30
POP R29
POP R28
POP R27
POP R26
POP R25
POP R24
#endasm
closed=0;
#asm
RET
#endasm
}
#pragma savereg+
#include
"timer1.c"
//==========================================================
//обработка
прерывания таймера1 (включение симистора).
//==========================================================
#pragma savereg-
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
//сохраняем
регистры
s_reg=SREG;
#asm
PUSH R30
#endasm
//формируем
импульс зажигания.
PORTB=0x00;
//delay_us(7);
#asm
LDI R30,9
__DELAY:
DEC R30
BRNE __DELAY
#endasm
PORTB=0b00011110;
//выдержка
10мсек для второго прохода.
TCNT1H=0xFF;
TCNT1L=0x64;
if(second_half_period) TIMSK=0x02;//запрещаем
прерывания
таймера1.
second_half_period=1;
//восстанавливаем
регистры
#asm
POP R30
#endasm
SREG=s_reg;
}
#pragma savereg+
void main(void)
{
begin:
#asm("cli");
#include "init.c"
// Input/Output Ports initialization
// Port B initialization
// Func0=In Func1=Out Func2=Out Func3=Out Func4=Out
Func5=In Func6=In Func7=In
// State0=T State1=1 State2=1 State3=1 State4=1
State5=T State6=T State7=T
DDRB =0b00011110;
PORTB=0b00011110;
// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=Out
Func5=Out Func6=In
// State0=P State1=T State2=T State3=T State4=0 State5=1
State6=P
DDRD =0b00110000;
PORTD=0b01000001;
// Timer/Counter 0 initialization
// Clock source: System Clock
TCCR0=0x01;
TCNT0=0x02;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
// Mode: Normal top=FFFFh
// OC1 output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1B=0x04;
TCCR1A=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1H=0x00;
OCR1L=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
GIMSK=0x00;
MCUCR=0x03;
GIFR=0x40;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter
1: Off
// Analog Comparator Output: Off
ACSR=0x80;
//подготовка
данных
second_half_period=closed=0;
on_old=off_old=infra=infra_old=in_home=1;
mode=0;
ofa=ofa_min;
#asm("sei");
while (1)
{
switch(mode)
{
case 0: #include
"mode_0.c";//хозяин дома
//хозяин
дома
red=second;//моргаем
красным и зеленым светодиодами
green=second;
//4 часа
if(clock==28800) mode=4;//быстро
включить
//еще
полчаса
if(clock>32400)
{
mode=3;//быстро
погасить
clock=0;
}
break;
case 1: #include
"mode_1.c";//медленно снижать
яркость
//медленно
снижать яркость
if(GIMSK==0x00)
{
mode=7;
break;
}
if(++timer_ofa>7500)
{
timer_ofa=0;
if(ofa>ofa_min) ofa--;
else GIMSK=0x00;
}
break;
case 2: #include
"mode_2.c";//медленно повышать
яркость
//медленно
повышать яркость
if(GIMSK==0x00)
{
ofa=ofa_min;
GIMSK=0x40;
timer_ofa=0;
}
if(++timer_ofa>7500)
{
timer_ofa=0;
if(ofa<ofa_max) ofa++;
else mode=7;
}
break;
case 3: #include
"mode_3.c";//быстро погасить
//быстро
погасить
if(GIMSK==0x00)
{
if(in_home) mode=0;
else mode=7;
break;
}
if(++timer_ofa>21000)
{
timer_ofa=0;
if(ofa>ofa_min) ofa--;
else GIMSK=0x00;
}
break;
case 4: #include
"mode_4.c";//быстро включить
//быстро
включить
if(GIMSK==0x00)
{
ofa=ofa_min;
GIMSK=0x40;
timer_ofa=0;
}
if(++timer_ofa>330)
{
timer_ofa=0;
if(ofa<ofa_max) ofa++;
else
{
if(in_home) mode=0;
else mode=7;
}
}
break;
case 5: #include
"mode_5.c";//запомнить ДУ
"+"
//запомнить
ДУ
"+"
red=0;
green=second;
//если
за 10 сек не приняли сигнал программирования, то выход из программирования
if(clock>20) mode=7;
break;
case 6: #include
"mode_6.c";//запомнить ДУ
"-"
//запомнить
ДУ
"-"
green=0;
red=second;
//если
за 10 сек не приняли сигнал программирования, то выход из программирования
if(clock>20) mode=7;
break;
case 7: #include
"mode_7.c";//просто ждем
//просто
ждем
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 |