PIC Vietnam

Go Back   PIC Vietnam > Robotics > Cảm biến

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cảm biến Camera, siêu âm, hồng ngoại, gyro, la bàn...

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 23-11-2007, 12:10 AM   #3
ahchu
Đệ tử 1 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 23
:
C code của bạn em đây ạ

Code:
/*

Filename: CC5G.c

Generate a PWM signal with 40% duty cycle

on pulse-width = 5us

off pulse-width = 20ms

on CCP1 (RC2 pin) compare

and configure CCP2 (RC1 pin) for capture

*/







#include <p18cxxx.h>

#include <p18f452.h>

#include <timers.h>

#include <capture.h>



#pragma config WDT = OFF



#define	PER1_LIMIT	0x0E10

#define PER2_LIMIT	0x0E10





/*

Speed of sound in air = 1130 ft/sec

TMAX = 18.5ms; TMIN = 115us



FOSC = 8MHz; Processor Clock = 2MHz

CCP Clock = 1MHz

Period = Forward + Backward Trip time



0x0E10 -> 1.8ms

0x8CA0 -> 18ms



*/





unsigned int ov_cnt1, cap1_val1, cap1_val2;

unsigned int ov_cnt2, cap2_val1, cap2_val2;

unsigned int period1, period2;					//	16-bit value

unsigned int count = 0;					//	counter used for waiting to turn relays ON

unsigned int count2 = 0;					//	counter used for waiting to turn relays ON





void high_ISR( void );

void low_ISR( void );



#pragma code high_vector = 0x08			//	force the following statement to

void high_interrupt( void ) {			//	start at 0x08

	_asm

	goto high_ISR

	_endasm

}



#pragma code low_vector = 0x18			//	force the following statement to

void low_interrupt( void ) {			//	start at 0x18

	_asm

	goto	low_ISR

	_endasm

}



#pragma code 

#pragma interrupt high_ISR

void high_ISR( void ) {

	if( PIR2bits.TMR3IF ) {

		PIR2bits.TMR3IF = 0;

		ov_cnt2++;

	}

	if( PIR1bits.TMR1IF ) {

		PIR1bits.TMR1IF = 0;

		ov_cnt1++;

	}

	

	

}



#pragma code

#pragma interrupt low_ISR

void low_ISR( void ) {

	_asm

	retfie 0

	_endasm

}





void vDelay( void ) {

	

	unsigned const int MAX = 45450;

	unsigned int i = 0;

	

	for( i=0; i<MAX; i++ ) ;

	

}



void vDelay10us( void ) {

	

	unsigned int i = 0;



	

}



void vDelay5ms( void ) {

	

	unsigned const int MAX = 1150;

	unsigned int i = 0;

	

	for( i=0; i<MAX; i++ ) ;

	

}





//	Delay calculations based on 8MHz crystal, 1:1 prescalar for Timer3



void main( void ) {

	

	unsigned int i = 0;

	unsigned int odd = 0;

	unsigned int flag = 1;					//	flag for determining boat direction

	int num1 = 0;	

	int num2 = 1;





	//	Configure registers for Output Compare -- a 5us trigger pulse

	TRISCbits.TRISC2 = 0;					//	configure CCP1 pin for output

	T1CON = 0x81;							//	turn on Timer1 in 16-bit mode, prescalar = 1

//	CCP1CON = 0x09;							//	configure CCP1 pin to set high initially but pull low on match

//	CCPR1 = TMR1H + 0x0020;					//	start CCP1 compare with delay equals 10

//	PIR1bits.CCP1IF = 0;					//	clear CCP1IF flag to prevent false interrupt

	

	OpenTimer1( TIMER_INT_OFF & 

		T1_16BIT_RW & 

		T1_PS_1_1 & 

		T1_OSC1EN_OFF & 

		T1_SYNC_EXT_OFF & 

		T1_SOURCE_INT );





	OpenTimer3( TIMER_INT_OFF & 

			T3_16BIT_RW & 

			T3_SOURCE_INT & 

			T3_PS_1_1 & 

			T3_SYNC_EXT_OFF & 

			T1_CCP1_T3_CCP2 );



	T1CON = 0x81;							//	turn on Timer1 in 16-bit mode, prescalar = 1

	

	TRISD = 0;								//	set PORTD for output

	TRISCbits.TRISC1 = 1;					//	configure CCP2 pin for input

	TRISCbits.TRISC2 = 1;					//	configure CCP1 pin for input

	INTCONbits.GIE = 0;						//	Disable global interrupts

	RCONbits.IPEN = 1;						//	enable priority interrupts

	PIR2bits.TMR3IF = 0;	

	IPR2bits.TMR3IP = 1;					//	promote Timer1 rollover interrupt to high priority

	INTCONbits.PEIE = 1;					//	enable preipheral interrupt

	PIE2bits.TMR3IE = 0;					//	disable Timer3 rollover interrupt

	

	PIR1bits.TMR1IF = 0;

	IPR1bits.TMR1IP = 1;

	PIE1bits.TMR1IE = 0;

	

	TRISB = 0x00;							//	configure PORTB as output

				

	while( 1 ) {



		vDelay5ms();		



//		if( !odd )

		PORTD = 0x01;

		vDelay10us();

		PORTD = 0x00;

//		vDelay10us();

			







		

//		PORTD = 0x00;

		

		PIE2bits.CCP2IE = 0;

		CCP2CON = 0x05;

		PIE2bits.CCP2IE = 1;

		

//		PORTD = 0x00;

	

		PIE2bits.CCP2IE = 1;				//	disable CCP2 capture interrupt

		PIR2bits.CCP2IF = 0;			

		IPR2bits.CCP2IP = 1;				//	high priority



	

		



			

			while( !( PIR2bits.CCP2IF ) ) ;		

			cap2_val1 = ReadCapture2();			//	save the first captured edge

			PIR2bits.CCP2IF = 0;

			PIR2bits.TMR3IF = 0;

			PIE2bits.TMR3IE = 1;				//	enable Timer3 rollover interrupt

			

			PIE2bits.CCP2IE = 0;		

			CCP2CON = 0x04;

			PIE2bits.CCP2IE = 1;

			

			PORTD = 0x00;

			

			while( !( PIR2bits.CCP2IF ) ) ;		//	wait for interrupt

			CloseCapture2();					//	disable CCP2 capture

			cap2_val2 = ReadCapture2();

			PIR2bits.TMR3IF = 0;

			PIE2bits.TMR3IE = 0;				//	disable Timer3 rollover interrupt

			

			if( cap2_val2 < cap2_val1 ) {				//	if timer overflows, decrease overflow count by one

				ov_cnt2--;

				period2 = ov_cnt2*65536 + cap2_val2 + ( 65536 - cap2_val1 );

			}

			else {

				period2 = ov_cnt2*65536 + cap2_val2 - cap2_val1;

			}

			

			ov_cnt2 = 0;				//	Reset overflow counter

	



//		vDelay5ms();		





		PORTD = 0x02;

		vDelay10us();

		PORTD = 0x00;

		vDelay10us();

			







		

//		PORTD = 0x00;

		

		PIE1bits.CCP1IE = 0;

		CCP1CON = 0x05;

		PIE1bits.CCP1IE = 1;

		

//		PORTD = 0x00;

	

		PIE1bits.CCP1IE = 1;				//	disable CCP2 capture interrupt

		PIR1bits.CCP1IF = 0;			

		IPR1bits.CCP1IP = 1;				//	high priority



	

		



			

			while( !( PIR1bits.CCP1IF ) ) ;		

			cap1_val1 = ReadCapture1();			//	save the first captured edge

			PIR1bits.CCP1IF = 0;

			PIR1bits.TMR1IF = 0;

			PIE1bits.TMR1IE = 1;				//	enable Timer3 rollover interrupt

			

			PIE1bits.CCP1IE = 0;		

			CCP1CON = 0x04;

			PIE1bits.CCP1IE = 1;

			



			

			while( !( PIR1bits.CCP1IF ) ) ;		//	wait for interrupt

			CloseCapture1();					//	disable CCP2 capture

			cap1_val2 = ReadCapture1();

			PIR1bits.TMR1IF = 0;

			PIE1bits.TMR1IE = 0;				//	disable Timer3 rollover interrupt

			

			if( cap1_val2 < cap1_val1 ) {				//	if timer overflows, decrease overflow count by one

				ov_cnt1--;

				period1 = ov_cnt1*65536 + cap1_val2 + ( 65536 - cap1_val1 );

			}

			else {

				period1 = ov_cnt1*65536 + cap1_val2 - cap1_val1;

			}

			

			ov_cnt1 = 0;				//	Reset overflow counter

	

			



			if( period1 > PER1_LIMIT & period2 > PER2_LIMIT & flag ) {

				count++;

				count2 = 0;

				num1 &= 0;

				num2 = 0;

				if( count > 20 ) {

					PORTB = 0x0C;		//	Forward

				}

			}

			

			if( period1 > PER1_LIMIT & period2 > PER2_LIMIT & !flag ) {

				count++;

				num2 = 0;

//				num1 = 0;

				count2 = 0;

				if( count > 20 ) {			

					PORTB = 0x03;		//	Reverse				

				}

			}

			

			if( period1 > PER1_LIMIT & period2 < PER2_LIMIT ) {

				PORTB = 0x00;

				flag = 1;

				count = 0;

				count2++;

				if( count2 > 20 )

					PORTB = 0x0C;		//	Forward

			}

			

			if( period1 < PER1_LIMIT & period2 > PER2_LIMIT ) {

				PORTB = 0x00;

				flag = 0;

				count = 0;

				num2++;

				num1+=num2;	

						

				if( num1 > 20 ) {

					PORTB = 0x03;	//	Reverse	

				}

			}

			

			if( period1 < PER1_LIMIT & period2 < PER2_LIMIT ) {

				PORTB = 0x00;		//	Shut down 

				count = 0;

				count2 = 0;

				

				

			}

			

	

	}

	

}
File Kèm Theo
File Type: txt Code.txt (6.8 KB, 28 lần tải)

thay đổi nội dung bởi: falleaf, 23-11-2007 lúc 08:02 AM.
ahchu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 05:04 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam