#include <12F683.h>
#device ADC=10
#fuses NOMCLR //Master Clear pin used for I/O
#use delay(internal=4MHz)
#use FIXED_IO( A_outputs=PIN_A0, PIN_A2 )
#define LED PIN_A0
#define SENSOR PIN_A1
#define PWM_OUT PIN_A2
//---------------------------------
#include <main.h>
#define TIMEOUT_SET 300 // 300 x 10ms kesme = 3000ms sonra dönme durdu
int16 my_timeout = 0;
int1 old_state = false; // kenar algılama
int1 donme_durum = false; // true: dönüyor false: durdu
#INT_TIMER2
void TIMER2_isr(void)
{
// bu kısımdaki kodlar her 10ms de bir çalışır
if (my_timeout > 0)
{
my_timeout--;
}
else
{
donme_durum = false; // süre doldu. dönme durdu
}
}
void main()
{
//port_a_pullups(0x02); // SENSOR (PIN_A2) girişi pullup yapılmak istenirse commenti kaldırın
setup_timer_2(T2_DIV_BY_4,250,10); //1,0 ms overflow, 10,0 ms interrupt
setup_ccp1(CCP_PWM); //
set_pwm1_duty((int16)200); // 10 bit pwm 0..1023 set aralığı verilebilir
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
while(TRUE)
{
if (input(SENSOR) && !old_state) // yükselen kenar
{
old_state = true;
my_timeout = TIMEOUT_SET; // geri sayma işlemini yeniden set et
donme_durum = true; // donme devam ediyor
}
if (!input(SENSOR) && old_state) // düşen kenar
{
old_state = false;
//donme_durum = true; // düşen kenardada dönme kontol devrede olsun
// my_timeout = TIMEOUT_SET; // istenirse bu iki satır aktif edilmeli
}
if (donme_durum)
{
// dönme var yapılacak işlemler
output_high(LED);
set_pwm1_duty((int16)200); // ~%20 duty pwm sinyali
}
else
{
// dönme durdu yapılacak işlemler
output_low(LED);
set_pwm1_duty((int1)0); // pwmi kapat
}
delay_ms(50); // kontrol peryodu
}
}