ama proteusta çalışıyor pic18f452

Başlatan delice71, 02 Mayıs 2015, 01:47:27

delice71

Merhabalar,
Pic 18f 452 kullanarak uzaklık sensoru ile motor sürme devresi yapmaya calısıyorum.
Yani uzaklık azaldıkca motor yavaslıcak arttıkca hızlanıcak. Ve lcd de mesafeyi yazdırmaya calısıyorum.
Gelin görün ki devre proteusta simulasyonda doğru çalışırken boardda çalıştıramıyorum. Elimde 3 tane pic var 3 üyle de denedim.Bi göz atabilir misiniz?
Not. Proteus 8 kullanıyorum, Kodlar CCS C kodları.
Gerekli tüm dosyalar ektedir.

Teşekkürler


http://www.megafileupload.com/AYm/proje.rar


#include<18f452.h>
#device ADC=8
#include<math.h>
/*#fuses LP, XT, HS, RC, EC, EC_IO, H4, RC_IO, NOOSCSEN, NOPUT, NOBROWNOUT, NOWDT, NOSTVREN, NOLVP, NODEBUG, NOPROTECT, NOCPB, NOCPD, NOWRT, NOWRTC, NOWRTB, NOWRTD, NOEBTR, NOEBTRB*/
#FUSES NOWDT                    //No Watch Dog Timer
/*#FUSES WDT1                     //Watch Dog Timer uses 1:1 Postscale*/
#FUSES HS                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#use delay (clock=20000000)
#use fast_io(a)
#use fast_io(c)
#use fast_io(d)

#define speed_8 170
#define speed_7 135
#define speed_6 100
#define speed_5 80
#define speed_4 55
#define speed_3 35
#define speed_2 15
#define speed_1 8
#define speed_0 0

#define dist_10cm 2.30
#define dist_12cm 1.87
#define dist_14cm 1.66
#define dist_16cm 1.49
#define dist_18cm 1.36
#define dist_20cm 1.25
#define dist_22cm 1.16
#define dist_24cm 1.08
#define dist_26cm 1.02

#define use_portb_lcd TRUE
#include<lcd.c>

unsigned long int bilgi, i;
float voltaj, uzaklik;
float y=-1.267, x=26.707;
void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_CCP2(CCP_OFF);
set_tris_a(0x01);
set_tris_c(0x00);
set_tris_d(0x00);
/*output_c(0x00);*/
output_d(0x00);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_1,128,1);
set_pwm1_duty(i);
setup_adc(adc_clock_div_32);
setup_adc_ports(ALL_ANALOG);  
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL); 
lcd_init();
set_adc_channel(0);
delay_us(20);
printf(lcd_putc,"Uzaklik=");
while(true)
{
bilgi=read_adc();
voltaj=(0.0048828125*bilgi);
uzaklik=x*pow((voltaj),(y));
lcd_gotoxy(10,1);
printf(lcd_putc,"%5.1fcm",uzaklik);
delay_ms(100);
        
        if(voltaj > dist_10cm){
        i=speed_0;
        set_pwm1_duty(i);
        delay_ms(20);
        }
        
        else if(voltaj < dist_10cm && voltaj > dist_12cm){
        i=speed_6;
        set_pwm1_duty(i);
        output_d(0x01);
        delay_ms(20);
        
        }
      
        else if(voltaj < dist_12cm && voltaj > dist_14cm){ 
        i=speed_5;
        set_pwm1_duty(i);
        output_d(0x03);
        delay_ms(20);
        
        }
        
        else if(voltaj < dist_14cm && voltaj > dist_16cm){
        i=speed_4;
        set_pwm1_duty(i);
        output_d(0x07);
        delay_ms(20);
        
        }
        
        else if(voltaj < dist_16cm && voltaj > dist_18cm){
        i=speed_3;
        set_pwm1_duty(i);
        output_d(0x0F);
        delay_ms(20);
        
        }
        
        else if(voltaj < dist_18cm && voltaj > dist_20cm){
        i=speed_2;
        set_pwm1_duty(i);
        output_d(0x1F);
        delay_ms(20);
        
        }
        
        else if(voltaj < dist_20cm && voltaj > dist_22cm){
        i=speed_1;
        set_pwm1_duty(i);
        output_d(0x3F);
        delay_ms(20);
        }
        
        else if(voltaj < dist_22cm && voltaj > dist_24cm){
        i=speed_1;
        set_pwm1_duty(i);
        output_d(0x7F);
        delay_ms(20);
        }
        
        else if(voltaj < dist_24cm && voltaj > dist_26cm){
        i=speed_1;
        set_pwm1_duty(i);
        output_d(0xFF);
        delay_ms(20);  
        }
        
        else if(voltaj < dist_26cm){        
        i=speed_0;
        set_pwm1_duty(i);
        delay_ms(20);
        }
        delay_ms(100);
}
}


blacklogic

Merhaba, bugün facebook gruplarında para karşılığında pic'e program yazacak birini arayan kişi siz misiniz? Bu projenin aynı söylenmişti de.

muhendisbey

voltaj'ı float yerine double yap, verdiğin değer float'ın alabileceğinden daha fazla haneye sahip en azından öyle saydım.

Bir de neden sürekli else if kullandığını anlayamadım. Bence bu noktada da bir mantık hatan var. şununla şunun arasındaysa duty cycle'ı şuna ayarla yapmak istemişsin ama biraz garip bir yol izlemişsin. Bütün if'ler yukarıda kullandığın if'e bağlanmış. Neden? Ne yapmak istedin?
Proteus'ta çalışan simülasyon gerçekte çalışacak diye bir kaide yok. Tasarladığınız kartın önemi bu noktada oldukça önemli. Verdiğiniz beslemenin, kristalin devre yolu uzunluklarının çalışılan ortamın çok büyük etkisi var. Proteus bunların simülasyonunu  yapmaz.

Bir diğeri yanlış anlamayın ama Türkçe kullanımına dikkat etseniz iyi olur.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

delice71

hocam facebook gruplarında bu projeyi ücretli olarak yaptırmak isteyen kişi ben değilim.

delice71

hocam verdiğiniz cevap için teşekkürler. ben ccs c kullanımına yeni başladım. ders bazlı bir proje nedeniyle bununla uğraşmak durumundayım.
projeyi şu siteden temin ettim;
http://www.pyroelectro.com/tutorials/proximity_motor_control/theory.html
ancak burada olan c18 derleyicisini internette bir türlü bulamamdan dolayı ccs c ile yazmaya çalışıyorum. while döngüsü içerisinde if ile başlayıp sürekli else if kullnmak mantıklı geldi c derslerinden :) dediğim gibi yeniyim.

ayrıca Türkçe me takılmışsın, program içerisinde config ayarlarında olan ingilizce açıklamalardan bahsediyorsan onlarıda başka bir yerden alıntı yaptım. konu başlığından bahsediyorsanız yaklaşık olarak 2 haftadır bu projeyle uğraşıyorum ve inanın çok yoruldum. donanımsal olarak herşeyi kontrol ediyorum herşey on numara ancak koda geldiğimizde anca bu kadarını yapabildim. yani uzun lafın kısası işi biraz makaraya vurmazsam kafayı yiyecem. bu şekilde konu açmam dalga geçmemden değilde bıkkınlığımdandır.

eğer biraz daha yardımcı olabilirseniz sevinirim, teşekkürler...

RaMu

RC2 ye 100ohm bağladıysan
ve ledleride dirençsiz bağladıysan,
picin ilgili pinlerini veya pici
özellikle RC2 yi bozmuş olma ihtimalin çok yüksek.

Gerçek devrenin fotolarınıda görmek lazım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

sadogan

ADC kesmesi aktif edilmis ama kesme rutini yazılmamış. Bu kitlenmeye neden olur.
floating sayıları if içinde kullanmak doğru deyil.
mesafeleri cm yerine mm cinsinden gerilimleride mv cinsinden kullanmak daha iyi.



delice71

RaMu hocam dirençsiz bağlantı yapmadım breadboard üzerinde ondan yana eminim, devre ufaktan çalışmaya başladı gibi :)

sadogan hocam sizin dediklerinize farklı yerlerdede karşılaştım ancak öncelikle kesme rutininin nasıl yazılacağını bilmiyrm bide bu if , else if döngülerinden nasıl kurtarabilirim??