case yapısı çalışmaması

Başlatan bbs2006, 20 Mart 2016, 16:46:24

bbs2006

merhaba
çizgi izleyen robotta siyah zemni ve beyaz zemin için case yapısı oluşturdum. ancak cas 0 için yazılım çalışıyor case 5 için çalışmıyor. yardımlarınızı bekliyorum.

  
// 2015-2016 Robot yılı için Robot Yarışmalarına Katılım (21.11.2015)
#include <18f4550.h>
#fuses hs,nowdt,noprotect
#use delay(clock=20000000)
#define sag1   pin_d0          //19 nolu pin   pin_b0   yeşil led
#define sag2   pin_d1          //20 nolu pin   pin_b1   yeşil led    
#define sag3   pin_d2          //21 nolu pin   pin_b2   yeşil led
#define orts1  pin_d3          //22 nolu pin   pin_b3   beyaz led
#define orts2  pin_d4          //27 nolu pin   pin_b4   beyaz led
#define sol1   pin_d5          //28 nolu pin   pin_b5   kırmızı led
#define sol2   pin_d6          //29 nolu pin   pin_b6   kırmızı led 
#define sol3   pin_d7          //30 nolu pin   pin_b7   kırmızı led
#define sagm_in1   pin_a1      //3 nolu pin  sürücü devre ain1   sag motor için
#define sagm_in2   pin_a2      //4 nolu pin  sürücü devre ain2   sag motor için
#define solm_in1   pin_c6      //25 nolu pin  sürücü devre bin1   sol motor için 
#define solm_in2   pin_c7      //26 nolu pin  sürücü devre bin2   sol motor için 
#define PWM_A      pin_c2      //17 nolu pin  sag motor pwm girişi  
#define PWM_B      pin_c1      //16 nolu pin  sol motor pwm için
#define stdby      pin_c0 
#define baslama    pin_a3
// değişken tanımlaması yapılıyor.

int oku_sen;                 // okunan sensör bilgisi   

int fren_bekleme=1200;
int zemin_oku;

void motor_surme(){
          
                     Output_high(sagm_in1);             // sürücü 1. giriş H
                     Output_low(sagm_in2);              // sürücü 2. giriş L
                     Output_high(solm_in1);             // sürücü 1. giriş H
                     output_low(solm_in2);              // sürücü 2. giriş L
return;}
void motor_ikili_fren(){
          
                     Output_high(sagm_in1);             // sürücü 1. giriş H
                     Output_high(sagm_in2);             // sürücü 2. giriş L
                     Output_high(solm_in1);             // sürücü 1. giriş H
                     output_high(solm_in2);             // sürücü 2. giriş L
return;}

void sag_fren(){

                     Output_high(sagm_in1);             // sürücü 1. giriş H
                     Output_high(sagm_in2);             // sürücü 2. giriş L
                     Output_high(solm_in1);             // sürücü 1. giriş H
                     output_low(solm_in2);              // sürücü 2. giriş L
return;}

void sol_fren(){ 
                     Output_high(sagm_in1);             // sürücü 1. giriş H
                     output_low(sagm_in2);              // sürücü 2. giriş L
                     Output_high(solm_in1);             // sürücü 1. giriş H
                     Output_high(solm_in2);             // sürücü 2. giriş L
                     
return;}

void motor_sag_ters(){                       //90 derece dönüşte sag motor ters yön
          
                     Output_low(sagm_in1);              // sürücü 1. giriş H
                     Output_high(sagm_in2);             // sürücü 2. giriş L
                     Output_high(solm_in1);             // sürücü 1. giriş H
                     output_low(solm_in2);              // sürücü 2. giriş L
return;}
void motor_sol_ters(){                    //90 derece dönüşte sol motor ters yön
          
                     Output_high(sagm_in1);             // sürücü 1. giriş H
                     Output_low(sagm_in2);              // sürücü 2. giriş L
                     Output_low(solm_in1);              // sürücü 1. giriş H
                     output_high(solm_in2);             // sürücü 2. giriş L
return;}
/*
void saga_doksan(){
                                                //beyaz zemin kesikli 1. çakışma.
                       
                   motor_ikili_fren();
                       set_pwm1_duty(255);
                       set_pwm2_duty(255);
                       delay_ms(fren_bekleme);
                   sag_fren();
                       set_pwm1_duty(0);
                       set_pwm2_duty(50);
                       delay_ms(5);return;}

void sola_doksan(){

                     motor_ikili_fren();
                       set_pwm1_duty(255);
                       set_pwm2_duty(255);
                       delay_ms(fren_bekleme);
                    sol_fren();
                       set_pwm1_duty(50);
                       set_pwm2_duty(0);
                       delay_ms(5);return;}  */

  void siyah_zemin(int oku_sen){
if(oku_sen==0b10000000)
  
   {
                    output_high(pin_a4);
                    delay_ms(100);
                    output_low(pin_a4);
                    delay_ms(100);
                    
                    output_b(0b01111111);
                    motor_ikili_fren();
                    delay_ms(fren_bekleme);
                    sag_fren();
                    delay_ms(10);}
           
if(oku_sen==0b00000001)
         
    {   
                     output_b(0b11111110);
                     motor_ikili_fren();
                     delay_ms(fren_bekleme);
                     sol_fren();
                     delay_ms(10);}
              
                       
if(oku_sen==0b11000000)

    {            
                    output_b(0b00111111);
                    motor_ikili_fren();
                    delay_ms(fren_bekleme);
                    sag_fren();
                    delay_ms(10);}
          
                       
if(oku_sen==0b00000011)

           
    {                      
                   output_b(0b11111100);
                   motor_ikili_fren();
                   delay_ms(fren_bekleme);
                   sol_fren();
                      delay_ms(10); }
                      
 if(oku_sen==0b11111110)
 
           
    {                  output_b(0b00000001);
                       motor_surme();
                       set_pwm1_duty(15);
                       set_pwm2_duty(80);  }        
        
if(oku_sen==0b01111111)                           // 127 degeri
              {                            
                      output_high(pin_b7);
                   
                      motor_surme();
               
                     set_pwm1_duty(80);
                     set_pwm2_duty(15);}
          
if(oku_sen==0b11111100)                          //252 degeri
   
    {                
           output_b(0b00000011);
                   
                     motor_surme(); 
                
                     set_pwm1_duty(15);
                     set_pwm2_duty(80);
 
                     delay_ms(10);}
          
if(oku_sen==0b00111111)                          //63 degeri

    {         
    
                    output_b(0b11000000);
                 
                    motor_surme(); 
                   
                     set_pwm1_duty(80);
                     set_pwm2_duty(15);
                     
      
                     delay_ms(10);}
          
  if(oku_sen==0b11111000)                        //248 

           
    {                                
                   output_b(0b00000111);
                
                     motor_surme();
                
                     set_pwm1_duty(20);
                     set_pwm2_duty(65);}
          
 if(oku_sen==0b00011111)                            //31 
 
    {         
                     output_b(0b11100000);
                
                     motor_surme();
                
                     set_pwm1_duty(65);
                     set_pwm2_duty(20);}
      
 if(oku_sen==0b11110000)                              //240 
 
    {                 
                       output_b(0b00001111);
                       motor_ikili_fren();
                       delay_ms(fren_bekleme);
                       sag_fren();
                         
                       delay_ms(10);} 
                
  if(oku_sen==0b00001111)                              //15 
             
    {                         
                     output_b(0b11110000);
                     motor_ikili_fren();
                     delay_ms(fren_bekleme);
                       sol_fren();   
                    delay_ms(10);}
 
 if(oku_sen==0b11100000)                              //224


           
    {                    
                       output_b(0b00011111);
                  
                       motor_ikili_fren();
                       
                       delay_ms(fren_bekleme);
                       sag_fren(); 
                       delay_ms(10);}
                     
 if(oku_sen==0b00000111)                              //7
                 
                    
                  {     output_b(0b11111000);
                     
                        motor_ikili_fren();
                       
                       delay_ms(fren_bekleme);
                       sol_fren();
                       
                       delay_ms(10);}
                       
if(oku_sen==0b11111001)                               //249
    
                    
                  {    output_b(0b00000110);
                
                     motor_surme();
                   
                     set_pwm1_duty(70);  //70
                     set_pwm2_duty(75);  //75 
                     
   
                     delay_ms(5); }           
                  
if(oku_sen==0b10011111)                                   //159
                   
                    
                  { output_b(0b00100000);
                  
                    motor_surme();
              
                     set_pwm1_duty(75);   //75
                     set_pwm2_duty(70);   //70
                     
       
                     delay_ms(5); }
      
if(oku_sen==0b11110011)                                  //243  
          
                    
                  {  output_b(0b00001100);
                     motor_surme();
                     
                     set_pwm1_duty(65);         //65
                     set_pwm2_duty(70);         //70  
                     
   
                     
                    delay_ms(5);}
 
if(oku_sen==0b11001111)                              //207
 
                 
                    
                  {   output_b(0b00110000);
                      motor_surme();
        
           
                     set_pwm1_duty(70);             //70
                     set_pwm2_duty(65);             //65 
     
                     delay_ms(5);    }        
                     
if(oku_sen==0b11100111)                            //231
               
                    
                  {  
                  
                  output_b(0b00011000);
                     motor_surme();
                     set_pwm1_duty(70);      //eski degeri 70 
                     set_pwm2_duty(70);
                     delay_ms(5);}return; }


// beyaz zemin siyah kesikli çizgi

void beyaz_zemin(int oku_sen){
                  
                    output_b(0b00111111);
                     
                     motor_surme();
                     set_pwm1_duty(60);
                     set_pwm2_duty(60);
                     if(input(oku_sen)==0b00011000){    //siyah çizgi görme
                      motor_surme();
                     set_pwm1_duty(60);
                     set_pwm2_duty(60);}
                     if(input(oku_sen)==0b00000110){
                      motor_surme();
                     set_pwm1_duty(15);
                     set_pwm2_duty(70);}                   
                     if(input(oku_sen)==0b01100000){
                     motor_surme();
                     set_pwm1_duty(40);
                     set_pwm2_duty(60);}
                     if(input(oku_sen)==0b00000001){
                     motor_surme();
                     set_pwm1_duty(15);
                     set_pwm2_duty(70);}
                     if(input(oku_sen)==0b10000000){
                     motor_surme();
                     set_pwm1_duty(70);
                     set_pwm2_duty(15);}
                     if(input(oku_sen)==0b00000011){
                      motor_surme();
                     set_pwm1_duty(30);
                     set_pwm2_duty(70);}
                     if(input(oku_sen)==0b11000000){
                      motor_surme();
                     set_pwm1_duty(70);
                     set_pwm2_duty(30);}
                     if(input(oku_sen)==0b00110000){
                     motor_surme();
                     set_pwm1_duty(60);
                     set_pwm2_duty(40);}
                     if(input(oku_sen)==0b00001100){
                     motor_surme();
                     set_pwm1_duty(40);
                     set_pwm2_duty(60);}
                     if(input(oku_sen)==0b00000000){
                     motor_surme();
                     set_pwm1_duty(40);
                     set_pwm2_duty(40);}return;}   

void main(){               // Ana fonksiyon.
setup_ccp1(ccp_pwm);       //sag motor için kullanılacak
setup_ccp2(ccp_pwm);       //sol motor için kullanılacak
setup_timer_2(T2_DIV_BY_4,124,4);         //Timer2 ayarları yapılıyor.
                                          //zaman=0.0001  Fr=10 Khz.  
                                                                                    
output_high(stdby);        //motor sürücü entegresi stanby  HIGH olmalı.                                     
                                          
while(True){

oku_sen=input_d();// d portundan sensör degerleri okunup oku_sen ata.
zemin_oku=input_e();
zemin_oku=0b0101&&zemin_oku;



switch(zemin_oku){


case 5:                                 //cny70 sen zemin 1(siyah) okudu.
           output_high(pin_a0);
       siyah_zemin(oku_sen);break;

case 0:                                 //cny70 sen zemin 0(beyaz) okudu.
   
       beyaz_zemin(oku_sen);break;}
         
}
}



pea

zemin_oku=0b0101&&zemin_oku;

Yaparak sadece LSB/küçük değerli 4 bit'in değerini değiştiriyorsunuz. MSB/Yüksek değerli 4 bit aynen kalıyor.
Ayrıca "&&" lojik operatördür. Sonucu true/false(1/0)dır.

Öncelikle maskeleme işlemini "0b00000101" ile yapacaksınız.
Switch içinse ya operatörü "&(bitwise and) ile değiştireceksiniz ya da case'leri 0 ve 5 yerine true ve false yapacaksınız.

Ayrıca burada sorun çıkarmaz ama doğru veri tipini kullanmaya özen gösterin. "int" normalde işaretli veri tipidir. Başınıza iş açabilir. Unsigned int kullanın.

bbs2006

#2
ben e portunun sadece 4 bit olduğu için sadece 4 bit almıştım. maskelemede sadece &  operatörünü mü kullanmam gerekiyor. söylediklerinizi bir yapayım.  sonucu geri dönüş yaparım.

mesaj birleştirme:: 20 Mart 2016, 19:05:06

verdiğim program çalışıyor gözüküyor.  programda if yapısının içinde iken if yapısının son  kısmına  c portunun çıkışını sıfırlarsak devamlı döngüde kalmasını engellemiş olur muyuz.

pea

Hangi if yapısı hangi döngü?
Sürekli portu sıfırlarsanız ya motor ya da devre yanar. Yanmasa bile çok kötü çalışır.

Ayrıca "siyah_zemin" fonksiyonu çok kötü gözüküyor. "If" değil de "else-if" kullansanız daha iyiydi. Hatta "switch-case". Daha da güzeli tek tek durum oluşturmak yerine bir fonksiyon, algoritma uydurmak ya da look-up table tarzı bir şeyler yapmak.

dursuncemal

Alıntı yapılan: pea - 21 Mart 2016, 10:39:06
Hangi if yapısı hangi döngü?
Sürekli portu sıfırlarsanız ya motor ya da devre yanar. Yanmasa bile çok kötü çalışır.

Ayrıca "siyah_zemin" fonksiyonu çok kötü gözüküyor. "If" değil de "else-if" kullansanız daha iyiydi. Hatta "switch-case". Daha da güzeli tek tek durum oluşturmak yerine bir fonksiyon, algoritma uydurmak ya da look-up table tarzı bir şeyler yapmak.
bu konuya cok fazla kafa yoramaddim ama mevcut yazilimda onca benzer sorgu yerine look-up table  cok daha hizli ve kolay mudahale edilir bir kod olusturur kanatindeyim.pea < katiliyorum.
bu arada merak etigim bir konuda su bu pistlerin olculeri ve yol istikametleri onceden yayinlaniyor.dolayisi ile her yazilim piste ozel yapiliyor.bu aslinda cok buyuk kolaylik bu uygulamada encoder kullanma sansi var midir olsa cok daha kolaylasir isler
:=

bbs2006

#5
Sayın Pea hocam. ben portu sıfırlamadığım zaman önceki konumu devam ettiriyor ve sensör okumama sıkıntısı oluyor. ayrıca  önceden case yapısı kullanmıştım ondan döndüm çünkü sağ ve sol sensörler algılama yaptığı zaman sola ve ya sağa dönmem gerekecek o zaman da case içine giremiyorum.  şuan program düzgün çalışıyor gözüküyor.

ayrıca sizden bir isteğim olacaktı. ben düz giderken sağ ve sol  mesafe sensörleri  ikisi beraber engeli algıladığı zaman sola döndüreceğim  ve sola döndükten sonra tekrar çizgiyi yakalayıncaya kadar dönmesini istiyorum. çizgiyi yakaladığında  tekrar çizgiyi takip ettirmek istiyorum.

mesaj birleştirme:: 21 Mart 2016, 23:40:42

ayrıca look ap table mantığı hakkında biraz bilgi verebilir misiniz.