Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
29.02.2016
Размер:
191.54 Кб
Скачать

5. Разработка программного обеспечения

#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");

}

}

}

Соседние файлы в папке Курсовой