hi-tech C delay Sorunu

jackal183

Üye
Katılım
1 May 2009
Mesajlar
21
Puanları
1
Yaş
38
arkadaşlar merhaba, ben bir program yazmaya çalışıyorum 6 adet servo motor kontrolü ile ilgili. programın akışında alt fonksiyona üç değişken gönderiyorum. 1. hangi servo, 2. hangi yöne(+90,-90), 3. sü açı değeri.
bu fonksiyonda aldığım değişkenleri bazı işlemlere sokarak ne kadar Delay verileceğini hesaplıyorum. DelayUs(değişken) şeklinde yazdığımda bu işlemi gerçekleştirmiyor yani çok farklı ve çok daha uzun(10 kattan daha fazla ) bir delay işlemi gerçekleşiyor. ancak fonksiyona değişken yazmazsam yani DelayUs(150); yazarsam 150 us lik delay yapıyor. acaba diyorum benim hesaplamalarımda mı bir sorun var, bunun için de hesapladığım değeri direk LCD'ye yazdırıyorum hesap doğru. bu neden olabilir. kodları da ekliyorum bakmak isteyen olursa.
Kod:
#include <htc.h>
#include "delay.h"
#include "lcd.h"


#define Servo0 RD0 // master servo 
#define Servo1 RD1 // joint11
#define Servo2 RD2 // joint2
#define Servo3 RD3 // joint3
#define Servo4 RD4 // tong
#define Servo5 RD5

int i;
int time=0,division=0,difference=0;
int delayTime=0,delayDivision=0, delayDifference=0;


void initialPos(void)
{
	PORTD=0xFF;
	DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);
	DelayUs(250);DelayUs(250);
	PORTD=0x00;
	DelayMs(18);
	DelayUs(250);DelayUs(250);
}


void servoExecute(char servo, char direction, char angle)
{
	time=angle*5;
	division=time/250;
	difference=time-division*250;
	delayTime=500-time;
	delayDivision=delayTime/250;
	delayDifference=delayTime%250;
	Servo0=1;
	DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);
	if(direction){
		DelayUs(250);DelayUs(250);
		DelayUs(division*250);DelayUs(difference);
		Servo0=0;
		DelayMs(18);
		DelayUs(delayDivision*250);DelayUs(delayDifference);
	}else{
		Servo0=0;
		DelayUs(division*250);DelayUs(difference);
		DelayMs(18);DelayUs(250);DelayUs(250);
		DelayUs(delayDivision*250);DelayUs(delayDifference);
	}

}
void main(void)
{
	TRISB=0x00;
	TRISD=0x00; 	
	PORTD=0x00; 	
	ADCON1=0x07;		
	TRISC=0x00;
	
	DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);
	initialPos();
	DelayUs(250);DelayUs(250);DelayUs(250);DelayUs(250);
	
	lcd_init();

	while(1) 
	{	
		servoExecute(0,1,30);
		
		lcd_gotoxy(1,1);
		veri_yolla(division%10+48);
		lcd_gotoxy(2,1);
	/*	veri_yolla(difference/100+48);
		veri_yolla((difference%100)/10+48);
		veri_yolla(difference%10+48);*/
		veri_yolla(time/100+48);
		veri_yolla((time%100)/10+48);
		veri_yolla(time%10+48);

	
	}
	
	
}
 
DelayUs fonksiyonuna sadece 8 bitlik veri gönderebilirsiniz. Eğer DelayUs(1500) yazarsanız bu hatalı bir kod olacaktır. Gönderdiğiniz değişkenin 8 bit boyutunda tanımlandığını kontrol edin.
Hataya sebep olabilecek kodunuz :
DelayUs(delayDivision*250);
 

Forum istatistikleri

Konular
128,179
Mesajlar
915,658
Kullanıcılar
449,942
Son üye
Nzmtekin

Yeni konular

Geri
Üst