877a ile servo kontrolü

Başlatan durmus, 29 Mart 2014, 03:35:33

durmus

merhaba arkadaşlar elimde 16F877a var 20 mhz lik osilatör ile   servo motor  kontrol etmek istiyorum ama    dereceli   döndürme yapamıyorum.. if else komutu ile   sürekli  döndürebiliyorum   sadece.. serdar çiçeğin kitabındaki   örneği proteusda  çalışıyor fakat uygulamada bir  hata  yapıyorum  sanırım  yardımcı olursanız sevinirim.

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#fuses HS,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.

// 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(113);  // TMR0 kaydedicisine 113 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_4); // Timer0 ayarları belirtiliyor
   set_timer0(113);  // TMR0 kaydedicisine 113 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; // 1. R/C servo PWM görev saykılı
      duty_1=servo_derece_2; // 2. R/C servo PWM görev saykılı
      duty_2=servo_derece_3; // 3. R/C servo PWM görev saykılı
   }
}

SAKINCALI

#1
aşşağıda verdiğim komutu bi dene istersen RC SERVO MOTORU SÜREBİLİRSİN pic basic 4 mhz kristal kullan servo sinyal çıkış portu ve buton giriş portlarını istediğin gibi ayarlayabilirsin.

pozisyon    Var Word     ' SERVONUN POZİSYONU
servo1 Var PORTC.1       ' SERVONUN SİNYAL ÇIKIŞ PORTU


   Low servo1       
   Gosub center     

' ANA PROGRAM BAŞLANGICI
ANADONGU:
   PORTB = 0        ' PORTB GİRİŞ
   TRISB = $fe     

   ' BUTON KONTROLÜ
   If PORTB.4 = 0 Then 
      Gosub SOL
   Endif
   If PORTB.5 = 0 Then 
      Gosub ORTA
   Endif
   If PORTB.6 = 0 Then 
      Gosub SAG
   Endif


   servo1 = 1      ' SERVOMUZ HAREKET ETSİN
   Pauseus 1000 + pozisyon
   servo1 = 0      ' SERVOMUZ BEKLESİN
   Pause 16         
   Goto ANADONGU   

' SOL HAREKET
SOL:
   If pozisyon < 1000 Then
      pozisyon = pozisyon + 1
   Endif
   Return

' SAĞ HAREKET
SAG:
   If pozisyon != 0 Then
      pozisyon = pozisyon - 1
   Endif
   Return

' ORTA KONUM
ORTA:
   pozisyon = 500
   Return

   End

Recep METE

Arkadaşım tamamen donanımsal bir sorun yaşıyorsun.Yazılımsal bir sorun yok gözüküyor.Pcb veya breadboarda kurduğun devrede olay bitecek.Serdar Hocanın kitabında belirtilen servo motorlar sendeki ile aynı mı acaba?
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d