View Single Post
Old 02-05-2006, 01:52 AM   #11
ngohaibac
Đệ tử 9 túi
 
ngohaibac's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: BKHN
Bài gửi: 231
:
Send a message via Yahoo to ngohaibac
Giao tiếp USART điều khiển động cơ , thiết bị ngoại vi

Chương trình sau nhận lệnh từ PC truyền xuống. Các bạn dựa vào cấu trúc chương trình có thể tự lập cho mình chương trình để làm. Đây là một phần nhỏ trong chương trình thiết kế bộ PID điều khiển động cơ một chiều 12V của tôi:

Code:
/*========================================================
; Ten chuong trinh	: giao tiep USART voi PC, nhan duoc thi hien thi lai
; Nguoi thuc hien	: ngohaibac
; Ngay thuc hien	: 
; Phien ban	: 1.0
; Mo ta phan cung	: Dung PIC16F877A - thach anh 20MHz
;		chan RC7/TX noi voi chan R1OUT cua MAX232
;		chan RC6/RX noi voi chan T1IN cua MAX232
;----------------------------------------------------------------
; Ngay hoan thanh	: 
; Ngay kiem tra	: 
; Nguoi kiem tra	: 
;----------------------------------------------------------------
; Chu thich	: Chuong trinh dung giao tiep USART

;========================================================*/
#include<pic.h>

__CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS );

// ham init - khoi tao 
void initUART(void){
// Khoi tao cho USART
	TRISC = TRISC | 0b11000000;			// Bit 7,6 la RX va TX phai la Input
	SPEN = 1 ;		// Enable Serial Port communication.
	SYNC =	 0;		// che do khong dong bo Asynchronous
	// cho che do truyen
	TXEN = 1;		//enable truyen
	TX9 = 0 ;		// chon che do 8 truyen  bit du lieu
	BRGH = 1; 		// High - speed
	SPBRG = 129;	//Baud = 9600;	voi HS, Baud Rate = Fosc/(16(X+1))  
	TXIE = 0;		// khong dung ngat Truyen
	// Che do nhan du lieu
	RCIE  =  1;		// dung ngat nhan
	PEIE = 1;		// cho phep ngat ngoai vi
	GIE  = 1;			// cho phep ngat toan cuc
	RX9 = 0;			// nhan 8 bit
	CREN = 1;		// lien tuc nhan du lieu; = 0 k lien tuc nhan du lieu
	
}

// Chuyen doi
void Convert(unsigned char *a,unsigned char index, unsigned int number){
	unsigned char i;
	for(i=0;i< index; i++){
		*(a+i)  = number%10;
		number = number/10;
	};	
 }

// ham truyen du lieu
void putch(unsigned char byte) 
{
	/* output one byte */
	while(!TXIF);	/* set when register is empty */
	//	continue;
	TXREG = byte;
}

// ==== Ham ghi len tren mot gia tri cua so co 4 chu so
void puts(unsigned int number){	// truyen 4 so cua number
	unsigned char i;
	unsigned char a[] = {0,0,0,0};
	Convert(a,4,number);
	for(i= 0;i<2;i++) putch(a[i]+48);
	putch(0x2C);
	for(i= 2;i<4;i++) putch(a[i]+48);
	putch(0x20);
}

// ======= Ham ghi len tren mot vector gom 4 phan tu
void putsVector(unsigned char *a,unsigned char n){
	unsigned char i;
	for(i = 0;i<n;i++) putch(a[i]);
}


// Ham khoi tao chung
void init(void){
	initUART();
//================  Khoi tao cho Timer0
	GIE		= 1;
	T0IE = 1;
	TMR0 = 6;
	
}
// ham ngat
void interrupt MyInt(void){
	unsigned char temp, i,j;
	static volatile unsigned char counter4, allow;		// temp: bien dem nhan,allow: cho phep nhan du lieu
	static volatile unsigned char K[17];
	static volatile unsigned char Kp;
	static volatile unsigned char Ki;
	static volatile unsigned char Kd;
	static volatile unsigned char n;
	//Kp, Ki, Kd la tham so PID, n la toc do
	if(T0IF & T0IE){	
		TMR0 = 6;
		T0IF = 0 ;// xoa co ngat
	};
	if(RCIF){						// Neu co ngat nhan du lieu noi tiep
		temp = RCREG;
		RCIF = 0;					// Xoa co ngat RCIF
		switch(temp){
			case 'B': 		//  ===  Bat dau cho dong co chay 
				putch('B'); allow = 0;
				break;
			case 'K':			// ===	Tat dong co
				putch('K'); allow = 0;
				break;
			case 'A':			// === Nhap cac gia tri cho Kp,Ki,Kd
				putch('A');
				allow = 1;	// chuyen sang nhap cho cac tham so cua mang.
				break;
			};
		if (allow){
			K[counter4++] = temp;
			if(counter4 == 17) {
				allow = 0; 
				putsVector(K,17);
			};
		};	
	};
}

// ham chinh 
void main(void){
	//unsigned char a[] =" anh yeu em nhieu lam, em biet k?";
	unsigned char i = 0;
	init();
	//for(i= 0; i<33; i++) putch(a[i]);
	//for(i= 0; i<10; i++) putch(i+48);
	while(1);
}
Chương trình này và 2 chương trình ở trên đều được test và chạy ngon lành.

Chúc mọi người thành công.
ngohaibac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn