karahankaan
Üye
- Katılım
- 14 May 2012
- Mesajlar
- 2
- Puanları
- 1
selam arkadaşlar bitirme projem için yapmış olduğum 3 eksenli robot kol'un programında sorun yaşıyorum elimde bir program var ama pic 16f877 ye göre bende ise pic16f877a var ccs c ile yazılmış bunu çevirmek istiyorum ve servoların dönüş açısını değiştirmek istiyorum yardımcı olursanız sevinirim. şimdiden teşekkürler
program
#include <16f877.h> // Kullanılacak denetleyicinin baÅlık dosyası tanıtılıyor.
#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.
// 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; // 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ı
}
}
program
#include <16f877.h> // Kullanılacak denetleyicinin baÅlık dosyası tanıtılıyor.
#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.
// 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; // 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ı
}
}