Курсовой / 5
.docx5. Разработка программного обеспечения
#include <tiny2313a.h>
#include <delay.h>
#define INPORT PIND.3
interrupt [PC_INT2] void pin_change_isr2(void)
{
}
void GlassUp()
{
//Работа приводов отмечена желтым светодиодом;
PORTA.1 = 0;
// Первый подъёмник
PORTB.0 = 1;
delay_ms(800);
PORTB.0 = 0;
delay_ms(2000);
// Второй подъёмник
PORTB.1 = 1;
delay_ms(800);
PORTB.1 = 0;
delay_ms(2000);
// Третий подъёмник
PORTB.2 = 1;
delay_ms(800);
PORTB.2 = 0;
delay_ms(2000);
// Четвёртый подъёмник
PORTB.3 = 1;
delay_ms(800);
PORTB.3 = 0;
delay_ms(2000);
// Выключим светодиод.
PORTA.1 = 1;
}
void main(void)
{
unsigned timeout;
char signalIsDown, signalIsUp;
unsigned wait;
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
DDRA=(0<<DDA2) | (1<<DDA1) | (0<<DDA0);
PORTA=(0<<PORTA2) | (1<<PORTA1) | (0<<PORTA0);
Bit0=Out
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
DDRD=(0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (1<<DDD0);
PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (1<<PORTD0);
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
TIMSK=(0<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (0<<OCIE0A);
// Когда биты SM1-0 установлены в 11, команда SLEEP заставляет МК перейти в режим Power-down.
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00) | (1<<SM0) | (1<<SM1) | (1<<SE);
PCMSK2=(0<<PCINT17) | (0<<PCINT16) | (0<<PCINT15) | (0<<PCINT14) | (1<<PCINT13) | (0<<PCINT12) | (0<<PCINT11);
GIMSK=(0<<INT1) | (0<<INT0) | (0<<PCIE0) | (1<<PCIE2) | (0<<PCIE1);
GIFR=(0<<INTF1) | (0<<INTF0) | (0<<PCIF0) | (1<<PCIF2) | (0<<PCIF1);
USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
DIDR=(0<<AIN0D) | (0<<AIN1D);
#asm("sei")
PORTD.0 = 0;
delay_ms(1000);
PORTD.0 = 1;
PORTA.1 = 0;
delay_ms(1000);
PORTA.1 = 1;
wait = 0;
while (1)
{
// Красный светодиод "Активен" горит
PORTD.0 = 0;
// Ожидание первого сигнала
if (INPORT == 1)
{
delay_ms(30);
if (INPORT == 1)
{
//Ожидание когда пропадет сигнал
timeout = 0;
signalIsDown = 0;
while (signalIsDown == 0 &&
timeout < 3000)
{
delay_ms(50);
timeout += 50;
signalIsDown = (INPORT == 0);
}
if (signalIsDown)
{
//Ожидание второго сигнала
timeout = 0;
signalIsUp = 0;
while (signalIsUp == 0 &&
timeout < 60*1000)
{
delay_ms(50);
timeout += 50;
signalIsUp = (INPORT == 1);
}
if (signalIsUp)
{
GlassUp();
// Второй сигнал закончится после подъема стекол
// Возврат в главный цикл.
}
}
}
}
// Цикл повторяется 5 раз.
wait += 1;
delay_ms(10);
if (wait > 500)
{
wait = 0;
// Красный светодиод "Активен" гаснет.
PORTD.0 = 1;
// Ожидается прерывание
#asm("SLEEP");
}
}
}