servo motor*rezil oldum :(

Başlatan gambit1244, 27 Eylül 2011, 21:27:01

gambit1244

arkadaşlar merhaba öncelikle,
dün hevesle bitane servo motor aldım internette 1.5 dolar fiyatı var hobbyrc de 15 tl verdim neyse onu geçtim
eve aldım geldim ccs deneme kartım var üzerindede pic18f4580
hemen serdar çiçeğin servo uygulamasını aldım üzerindeki device bölümünü değiştirip uygula dedim ve uyguladım
compile edip yükledim bigüzel fakat ne yaptıysam olmadı logic analyzer ile portlara bakıyorum hiçbi hareket yok
işte kod burada 16 f den 18 f e bicok kod geçirdim hepsi düzgün çalıştı burda nerede hata yapıyorum gören bilen varmı anlayamadım lütfen yardım edin zaten 5 katı pahalıya aldım motoru bide çalıştıramazsam hevesim kaçıcak, kendimi beceriksiz hissetmeye başladım:(
acaba kesme ayarlarımı farklı bilemedim bilenler bi göz atarsa çok mutlu olurum saygılar..

/******************************************************
      PIC16F877 İle R/C Servo Motor Uygulaması
******************************************/
#include <16f877.h>   //  burasını 18f4580 yapıyorum

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları

#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
//CLOCK DOĞRU!!!
// R/C Servo motor dönme açı değerleri
const int8 servo_derece_1[]={8,9,10,11,12,13,14,15,16,17,18};
const int8 servo_derece_2[]={18,17,16,15,14,13,12,11,10,9,8};
const int8 servo_derece_3[]={8,13,18,8,13,18,8,13,18,8,13};

int i=0,pwm=0,duty_0=0,duty_1=0,duty_2=0;
int16 zaman=0; // 16 bitlik değişken tanımlanıyor

#int_timer0  // Timer0 taşma kesmesi
void kesme ()
{
   set_timer0(217);  // TMR0 kaydedicisine 217 değeri yükleniyor
   if (pwm==0)       // Eğer PWM değişkeni 0 ise
   {
      output_high(pin_b0); // RB0 çıkışı lojik-1
      output_high(pin_b1); // RB1 çıkışı lojik-1
      output_high(pin_b2); // RB2 çıkışı lojik-1
   }

   if (pwm>=duty_0) output_low(pin_b0);
   if (pwm>=duty_1) output_low(pin_b1);
   if (pwm>=duty_2) output_low(pin_b2);

   zaman++; // zaman değişkenini 1 arttır

   // Servo motor dönüş adımları arası bekleme süresi için
   if (zaman>17350) // Yaklaşık 115us*17350 = 1,995,250us yaklaşık 2msn
   {
      zaman=0;  // zaman değişkenini sıfırla
      i++;      // i değişkeni değerini 1 arttır
      if(i==11) // Eğer i değeri 11 ise-Tüm adımlar bitti ise
         i=0;   // i değişkenini sıfırla
   }

   pwm++;       // pwm değişkenini 1 arttır
   if (pwm>173) // pwm değeri 173'den büyük ise
      pwm=0;    // pwm değişkenini sıfırla
}

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı


   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2); // Timer0 ayarları belirtiliyor
   set_timer0(217);  // TMR0 kaydedicisine 217 değeri yükleniyor

   enable_interrupts(int_timer0); // Timer0 taşma kesmesi aktif
   enable_interrupts(global);     // Aktif edilen tüm kesmelere izin ver

   output_b(0x00);  // İlk anda B portu çıkışı sıfırlanıyor

   while(1)  // Sonsuz döngü
   {
      duty_0=servo_derece_1[i]; // 1. R/C servo PWM görev saykılı
      duty_1=servo_derece_2[i]; // 2. R/C servo PWM görev saykılı
      duty_2=servo_derece_3[i]; // 3. R/C servo PWM görev saykılı
   }
}
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

volkii

kodunu incelemedim, ezbere de gitmek istemiyorum. daha öncesinde hiç yazılımsal pwm ürettin mi? 

esensoy

portlarda hareket yok diyorsun, 877 den farklı olarak portb ile alakalı NOPBADEN diye bir fuse var, ondan kaynaklanabilir mi acaba? (#fuses satırına , ve NOPBADEN eklenecek)
ayrıca portb yi çıkış olarak ayarladığını da göremiyorum, (set_tris_b(0x00);)
Bir de palsleri özellikle yazılımsal olarak üretmek gerekmiyorsa donanımsal pwm kullan, daha az tırmalatır
En tehlikeli an "zafer" anıdır.

gambit1244

#3
yok arkadaşlar yapamadım pwm yerine sürekli 5 v geliyor logic analyzer ile izliyorum tık yok :(

portları çıkış ayarladım
(ben ayarlama yapmadıgımız zaman zaten çıkış olarak kalıyor diye biliyordum oyüzden eklemedim serdar çiçek ten öğrendiğimiz kadarıyla ama bundan sonra ne olur ne olmaz ekliycem)
denedim ama olmadı set tris yapıncada, nopbaden ekleyincede :(
donanımsal olarak nasıl yapabilirim hemen kitaba bakıyorum bulamazsam buraya yazarım
ilginiz için teşekkürler

***************************************************************************************************************************************************
evet en azından dondürmeyi başardım!! motor sağlammış
#include <18F4580.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)


void main() {

set_tris_b(0x00);

while(true){
output_b(0x00);
delay_us(18500);
output_b(0xff);
delay_us(1500);

neyse yukarıya yazdığım basit kod ile döndürmeyi başardım şuan için değerler doğru oldugu halde motor tam yarım tur atmıyor 90 derece dönmesi gerekirken 60 70 derece dönüyor
ama en azından rahat bi uyku uyuyabilcem :)
sanırım pwm cıkışları farklı oldugu için 16 ile 18 in problem yaşadım yarın bol bol datasheet inceleyip 18f4580 in pwm bölümünü kavrarım
saygılar
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

atioky_216

arkadaslar çok konu ile alakalı değil ama #fuses ve #use deklarasyonları nasıl kullanılıyor? Ansi-C bildiğim için sadece #define kullandım bugune kadar . (evet pic ile hiç uygulama yapmadım sadece msp430 ile yaptım...)

GreeN

#5
Sanırım problem osilatörde. Yukarıdaki kodda XT olarak seçtiğin osilatörü kısa kodda HS olarak belirlemişsin.
Normalde kodda problem yok. Yinede #fuse registerlerini 18F için tekrar elden geçirmek daha sağlıklı olur.(16F serisi için yazılan kodu 18F'de çalıştırırken)
Terörü Lanetliyoruz.

GreeN

Alıntı yapılan: atioky_216 - 28 Eylül 2011, 10:28:56
arkadaslar çok konu ile alakalı değil ama #fuses ve #use deklarasyonları nasıl kullanılıyor? Ansi-C bildiğim için sadece #define kullandım bugune kadar . (evet pic ile hiç uygulama yapmadım sadece msp430 ile yaptım...)

#fuses için şöyle söyleyeyim PIC konfigirasyon bilgileri bu satırda yazılıyor. Bunlar, farklı PIC'ler için farklı isimler alabilen konfigirasyon registerlerinin kısaltmaları. Hangi PIC için hangi ayarların gerektiğini  datasheetlerde  "Configuration Bit" gibi başlıklarda bulabilirsin.
Configuration Bit  CSS C için hangi kısaltmaları kullanmış bunun için ya o PIC için oluşturulmuş header dosyasını karıştır yada PIC wizard kullan.
PIC wizard bazen hata veren CONFIG satırlarıda atabiliyor. Bunada dikkat et.

#use için önce help'ten yardım al. #Use rs232 , spi , i2c gibi hazır fonksiyonları projede kullanmak için yazılıyor.
Terörü Lanetliyoruz.

gambit1244

#7
green konuyu çok iyi gördün inan aklımın ucundan geçmemişti
örnek koddaki start bilgilerini benim kitin bilgilerinden aldım
serdar çiçek örneklerde 4mhz kullanıyordu
benimki 20mhz
demekki hs yapmam gerekiyormuş akşam deneyip sonucu paylaşıcam çok ince gördüğün için teşekkürler.

edit: evet sorun xt yi hs yapınca düzeldi çok teşekkür ederim
ben ordaki xt yi hep xtal yani external kristal ayarı olarak düşünürdüm bişey daha ogrendim sayenizde
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.