Rev 135 | Go to most recent revision | Blame | Last modification | View Log | Download
#include "laser.h"
#include "16F88_Reg.H"
#define SERVO PIN_B5 // Vystup pro rizeni serva
#define LASER PIN_B4 // Vstup pro cteni laseru
// kroutitka
#define CERVENA 0 // AN0
#define CERNA 1 // AN1
//#define ZELENA 3 // AN3
//#define MODRA 4 // AN4
//#define OFFSET 100 // Predni kolecko vprostred pri care vprostred
//#define HYSTERESE 3 // Rozdil mezi behem tam a zpet
boolean edge;
int8 uhel;
#int_EXT
EXT_isr()
{
int n, t1, t2, t;
set_timer0(0); // Vynulovani casovace pro 2ms
output_high(SERVO);
while(get_timer0()<(1000/256)); // Ceka 1ms
for(n=uhel; n>0; n--) delay_us(3); // Sirka impulzu podle uhlu
output_low(SERVO);
while(get_timer0()<(3000/256)); // Ceka do 3ms, nez zacne scanovat
set_timer0(0); // Vynulovani casovace pro zjisteni polohy cary
if(edge) // Zrcatko prejizdelo tam nebo zpet?
{
edge=false;
ext_int_edge(H_TO_L); // Pristi inerrupt bude od opacne hrany
INT0IF_1=0; // Povoleni dalsiho preruseni
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// do
{
while(0==input(LASER)); // Ceka na detekci cary
// output_high(SERVO);
t1=get_timer0(); // Poznamena cas nabezne hrany
while(1==input(LASER)); // Ceka az zkonci cara
// output_low(SERVO);
t2=get_timer0(); // Poznamena cas sestupne hrany
t=t2-t1;
} //while((t<5) || (t>7)); // Cara je detekovana, kdyz trva mezi xx ms
if ((t>3) && (t<8)) uhel=(160-(read_adc()>>2))-t1;
set_adc_channel(1);
}
else
{
edge=true;
ext_int_edge(L_TO_H);
INT0IF_1=0; // Povoleni dalsiho preruseni
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
// do
{
while(0==input(LASER)); // Ceka na detekci cary
t1=get_timer0(); // Poznamena cas nabezne hrany
while(1==input(LASER)); // Ceka az zkonci cara
t2=get_timer0(); // Poznamena cas sestupne hrany
t=t2-t1;
} //while((t<5) || (t>7)); // Cara je detekovana, kdyz trva mezi xx ms
if ((t>3) && (t<8)) uhel=((read_adc()>>2)+32)+t1;
set_adc_channel(0);
}
while(true);
}
void main()
{
setup_adc_ports(sAN0|sAN1|VSS_VDD); // AD pro kroutitka
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(False);
delay_ms(100);
set_adc_channel(0);
Delay_ms(1);
ext_int_edge(L_TO_H);
edge=true;
uhel=((read_adc()>>2)+32)+30;;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
}