çİZGİ İZLEYEN ROBOT

Başlatan bbs2006, 13 Haziran 2013, 10:40:07

bbs2006

merhaba
Çizgi izleyen robot yapıyorum. yazılımı ccs cde yazıyorum. yazılımda switch case yapısına giriyor. durum 10 da işlemi gerçekleştiriyor. ve ilgili sensörlere ait ledler yanıyor. ve motora pwm sinyali gönderiyor. ancak durum 20 gittigi zaman durum 10 daki ledler hala yanmaya devam ediyor. ve durum 20 deki led de yanıyor. ama işlemleri normal olarak gerçekleşiyor.benim istedigim durumla değiştigi anda değişimleri ledlerde görmek istiyorum. yazılımı veriyorum. 


#include <16f877.h>
#device ADC=10
#fuses xt,NOWDT,NOPROTECT
#use delay (clock=4000000)
#define sol   pin_a0
#define sol1  pin_a1   
#define orta1 pin_a2   
#define orta2 pin_a3   
#define sag1  pin_a4   
#define sag   pin_a5 
// sol  sol1 orta1  orta2 sag1  sag
// d0   d1    d2     d3    d4   d5
int dt;     //Ra0 çıkış bilgi değişkeni
int dt1;    //Ra1 çıkış bilgi değişkeni
int dt2;    //Ra2 çıkış bilgi değişkeni
int dt3;    //Ra3 çıkış bilgi değişkeni
int dt4;    //Ra4 çıkış bilgi değişkeni
int dt5;    //Ra5 çıkış bilgi değişkeni
int durum;  // Switch değişkeni
void sensor_oku(){
 
         set_adc_channel(0); //RA0 pini
         delay_us(10);
         dt=read_adc();
     
         set_adc_channel(1); //RA1 pini
         delay_us(10);
         dt1=read_adc();
         
         set_adc_channel(2); //RA2 pini
         delay_us(10);
         dt2=read_adc();
         
         set_adc_channel(3); //RA3 pini
         delay_us(10);
         dt3=read_adc();
         
         set_adc_channel(4); //RA4 pini
         delay_us(10);
         dt4=read_adc();
         
         set_adc_channel(5); //RA5 pini
         delay_us(10);
         dt5=read_adc();  return; }

void kontrol(){
          // sol      sol1    orta1     orta 2      sag2      sag
         if(dt<70 && dt1<70 && dt2 >70 && dt3>70 && dt4<70 && dt5<70) {durum=10;}
         if(dt>70 && dt1<70 && dt2 <70 && dt3<70 && dt4<70 && dt5<70) {durum=20;}

return;}
    /*     
         
         if(dt1>70) {output_high(pin_d1);} else output_low(pin_d1);
         if(dt2>70) {output_high(pin_d2);} else output_low(pin_d2);
         if(dt3>70) {output_high(pin_d3);} else output_low(pin_d3);
         if(dt4>70) {output_high(pin_d4);} else output_low(pin_d4);
         if(dt5>70) {output_high(pin_d5);} else output_low(pin_d5);*/


// ANA PROGRAM //
void main ()
{
setup_adc(adc_clock_div_32);
setup_adc_ports(ALL_ANALOG);
setup_ccp1(ccp_pwm);
setup_ccp2(ccp_pwm);
setup_timer_2(T2_DIV_BY_16,127,1);
output_high(pin_c4); //pwm1 enable etkin
output_high(pin_c5); //pwm2 enable etkin


while(true){
sensor_oku();
kontrol();
switch(durum){
case 10:
output_high(pin_d2);
output_high(pin_d3);
set_pwm1_duty(255);   //Sag motor
set_pwm2_duty(255);   //Sol motor
output_high(Pin_c2);  //Sag motor ileri
output_low (pin_c0);   
output_high(Pin_c1);  //sol motor ileri 
output_low (pin_c3);

break;


case 20:
output_high(pin_d0);
set_pwm1_duty(255);
set_pwm2_duty(10);
output_high(Pin_c2);  //Sag motor ileri
output_low (pin_c0);   
output_high(Pin_c1);  //sol motor ileri 
output_low (pin_c3);
break;

default: output_low(pin_d0);
         output_low(pin_d1);
         output_low(pin_d2);
         output_low(pin_d3);
         output_low(pin_d4);
         output_low(pin_d5);
break;
}}
         
}

         

Nedenler

Case 10 durumunda high yaptığın bazı çıkışları ne case 20 durumunda ne de default durumunda low yapıyorsun. Aynı şey case 20 için de geçerli. Bu yüzden devamlı çıkışlar aktif oluyor. Hangi çıkışları high yaptığını kontrol edip high olmayacak durumlarda lowa çekmelisin.

Ya da switch'in bir üst satırında tüm çıkışları tek tek ya da ilgili portları output_D(0x00); şeklinde sıfırla switch ondan sonra karar versin hangisinin aktif olacağına.