Код: Выделить всё
/*
* Project name:
акустичний вимикач
* Copyright:
(c) Mikroelektronika, 2011. Котик В. Львів
* Revision History:
20111014:
- initial release;
* Description:
//Порт А вхід порт С вихід
* Test configuration:
MCU: PIC16F676
http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf
dev.board: easypic6eds
http://www.mikroe.com/eng/products/view/297/easypic6-development-system/
Oscillator: RS, 4.0000 MHz
Ext. Modules: -
SW: mikroC PRO for PIC
http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/
* NOTES:
*/
//обьявляєм функции
void interrupt();
void port_OUT();
unsigned int temp_res0; // дані АЦП0 (фотодатчик)
unsigned int temp_res1; // дані АЦП1 (підпорка)
unsigned char Status_Foto; // прапорець фотодатчика
unsigned char Status_INT; // прапорець зовнішнього сигналу
unsigned char counter; //переменная таймера 0
unsigned char tmp_0; //переменная времени работы таймера 0
unsigned char Flag; // тоже нужен
void port_OUT() //выход
{
if (temp_res0 <= temp_res1) // проверка срабатывания компаратора
{PORTC |= (1<<4); // 1 -> C4
Status_Foto = 1;}
else {PORTC &= (~(1<<4));} //0 -> C4
if (Status_INT == 1) // проверка прерыв. по звуку и запуска таймера
{Flag =1;
PORTC |= (1<<3); // 1 -> C3
Status_INT =0;}
else {PORTC &= (~(1<<3));} //0 -> C3
if ((Status_INT == 0) && (tmp_0 != 0))
{Flag =0; }
if ((Flag == 1) && (Status_Foto != 1))//не сработал ли фотодатчик?
{
PORTC |= (1<<5); // 1 -> C5
}
else {PORTC &= (~(1<<5)); //0 -> C5
Status_Foto = 0;
}
if (tmp_0 == 2) // время срабатывания 30сек. (кратность 15 сек.)
{ PORTC |= (1<<1); // 1 -> C1
delay_ms(100);
tmp_0 = 0; }
else {PORTC &= (~(1<<1));} //0 -> C1
}
void interrupt() // прерывание по INT/RA2
{ delay_ms(20);
if ((INTCON.INTF) && (INTCON.RAIF))
{Status_INT = 1;
counter = 0;}
PORTA = PORTA.F2 |0;
INTCON.INTF = 0; //Сбошен флаг прерывания
INTCON.RAIF = 0;
if ((INTCON.T0IF) && (INTCON.T0IE))
{ counter++; // прибавление до 100 (в сумме 1 сек)
T0IF_bit = 0; // сброс флага прерывания по переполнению TMR0
if (counter == 250)
{ TMR0 = TMR0 + 250; // предзагрузка TMR0
counter = 0;
tmp_0 = tmp_0 + 1; // счетчик времени
}
}
}
void main() {
//==================
// Процедура настроки используемых ресурсов PIC16F676
//==================
TRISA = 0b111111; // PORTA is input
PORTA = 0b111111;
TRISC = 0b000000; // PORTС is output
PORTC = 0b000000;
CMCON = 0x07; //настройка внутреннего компаратора
ANSEL = 0b000000011; //настройка порта А как анналоговый вход
// Enable external interrupt
INTCON.GIE = 1; // разрешить все прерывания
INTCON.INTE = 1; // разрешить прерывание INT
INTCON.RAIE = 1; //Разрешение прерывания по изменению сигнала на входах PORTA
IOCA.IOCA2 = 1; //Разрешение прерывания на входе RA2: 1=разрешено
// Timer0 Registers:
// Prescaler=1:64; TMR0 Preset=6; Freq=250,00Hz; Period=4 000 000 ns
option_reg = 0b11010111; //коэфициента деления предделителя 1:256
//OPTION_REG.RAPU =1;
//OPTION_REG.INTEDG =1;
//OPTION_REG.T0CS = 0;// bit 5 TMR0 Clock Source Select bit:0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
//OPTION_REG.T0SE = 1// bit 4 TMR0 Source Edge Select bit: 1=high/0=low
//OPTION_REG.PSA = 0;// bit 3 Prescaler Assignment bit: 0=Prescaler is assigned to the Timer0
//OPTION_REG.PS2 = 1;// bits 2-0 PS2:PS0: Prescaler Rate Select bits
//OPTION_REG.PS1 = 0;
//OPTION_REG.PS0 = 1;
TMR0 = 6; // Timer0 initial value
T0IE_bit = 1; //Разрешение прерывания по переполнению TMR0
T0IF_bit = 0; // сброс флага прерывания по переполнению TMR0
while (1) {
temp_res0 = ADC_Read(0); // get ADC value from 4nd channel
temp_res1 = ADC_Read(1); // get ADC value from 1nd channel
Delay_ms(20);
port_OUT();
}
}

