Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#define StartConvAdc() ADCSRA |= (1<<ADSC)
#define F_CPU 8000000
volatile short int VBuff = 0; //Буфер значения с АЦП входа 0
volatile short int LMBuff = 0; //Буфер значения с АЦА входа 1
unsigned char mode = 0; //Переменная режима работы устройства
float presc = 2.82960596; //Делитель значения АЦП для определения градусов цельсия
volatile short int sec = 0; //Счетчик секунд задержки
unsigned char adcan = 0; //Номер активного канала АЦП
ISR( TIMER1_OVF_vect )
{
TCNT1 = 57724;
sec++;
}
//Функция инициализации ражима работы устройства
void InitDev()
{
if (bit_is_clear(PINB,0)) //Замыкание первого свитча
{
mode = 1;
}
if (bit_is_clear(PINB,1)) //Замыкание второго свитча
{
mode = 2;
}
if (bit_is_clear(PINB,2)) //Замыкание третьего свитча
{
mode = 3;
}
}
//Подпрограмма режима дубления паяльной маски
void SolderMask()
{
unsigned char cool;
short int tmp;
cool = 0;
while(1)
{
tmp = VBuff/presc;
if (tmp < 144) //Если температура ниже условия, включаем тен
{
cool = 0;
PORTD = (1>>PD0);
}
if ((tmp >= 144) && (tmp < 148))
{
if (cool == 0)
PORTD = (1>>PD0);
}
if (tmp >= 148)
{
cool = 1;
PORTD = (0>>PD0);
}
}
}
//Подпрограмма режима термовоздушной пайки
void Paste()
{
short int tmp;
PORTD = (1<<PD6);
PORTD = (1<<PD0);
while(1)
{
tmp = VBuff;
if ((tmp/presc) >= 115)
{
PORTD = (0<<PD0);
break;
}
}
TIMSK = (1<<TOIE1); // разрешаем прерывание по переполнению таймера
TCNT1 = 57724;
while(sec != 3)
{
;
}
TIMSK = (0<<TOIE1);
PORTD = (1<<PD0);
while(1)
{
tmp = VBuff;
if ((tmp/presc) >= 205)
{
PORTD = (0<<PD0);
while(1);
}
}
}
//Подпрограмма режима сушки фоторезиста
void Resist()
{
PORTD = (1<<PD5);
unsigned char cool;
short int tmp;
cool = 0;
while(1)
{
tmp = VBuff;
if (tmp < 60)
{
cool = 0;
PORTD = (1>>PD0);
}
if ((tmp >= 60) && (tmp < 65))
{
if (cool == 0)
PORTD = (1>>PD0);
}
if (tmp >= 65)
{
cool = 1;
PORTD = (0>>PD0);
}
}
}
int main(void)
{
while(1)
{
short int tmp;
DDRD = 0xff;
PORTD = 0xff;
DDRB = 0x00;
PORTB = 0xff;
PORTD = (1>>PD1);
//инициализируем АЦП
//ион - напряжение питания, выравнивание влево, нулевой канал
ADMUX = (0<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
//вкл. ацп, режим одиночного преобр., разрешение прер., частота преобр. = FCPU/128
ADCSRA = (1<<ADEN)|(1<<ADSC)|(0<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//Делитель частоты таймера - 1024
TCCR1B = (1<<CS12)|(0<<CS11)|(1<<CS10);
//разрешаем прерывания и запускаем преобразование
sei();
//Запуск инициализации режима работы устройства
InitDev();
StartConvAdc();
//основной цикл программы - опрос кнопочного буфера
while(1)
{
tmp = VBuff;
if (mode == 1)
{
SolderMask();
}
if (mode == 2)
{
Paste();
}
if (mode == 3)
{
Resist();
}
}
}
return 0;
}
ISR (ADC_vect)
{
short int AdcBuf = ADCW;
VBuff = AdcBuf;
StartConvAdc();
}


