• Đây là thư viện viết cho vi điềukhiểnPIC dòng PIC18bằng HTPIC. Thư viện
được tạo dựa vào Datasheet của PIC18.
Đã test với PIC18F4680, PIC18F4431
File Header: UART.h
// UART.h
//============================
#ifndef _UART_H
#define _UART_H
//=============================
#include "pic18.h"
#include "sysdef.h"
//=============================
// Declare sosme functions
void UART_Init(unsigned int BaudRate); // Initialize for UART
void UART_PrChar(unsigned char a);
void UART_PrString(const char* str);
unsigned char UART_Read(void); // Read data from UART
Port
void UART_detectBaudRate(void); // Auto detect baud rate
#endif
Giải thích các hàm:
o UART_Init: Khởi tạo module giao tiếp UART, tham số là tốc độ truyền
BaudRate. Ví dụ: UART_Init(9600)
o UART_PrChar: Gửi một kí tự ra cổng RS232. Ví dụ: char x = ‘a’;
UART_PrChar(x);
o UART_PrString(const char* str): gửi 1 xâu kí tự ra cổng RS232. Ví dụ:
UART_PrString(”Anh yeu em”);
o unsigned char UART_Read(void) : Đọc 1 byte từ cổng COM
o UART_detectBaudRate(void): Tự động xác định tốc độ baudrate được
truyền xuống PIC18, Master phải truyền kí tự ‘U’ để PIC18 tự xác định và
thiết lập tốc độ (cái này có trong datasheet nhá )
File thực thi: UART.c
// UART.C
# include "UART.h"
# include "pic18.h"
# include "sysdef.h"
// Initialize UART
void UART_Init(unsigned int BaudRate){
unsigned int n;
// Configure BaudRate
BRGH = 0; // Low speed.
BRG16 = 1; // 16-Bit Baud Rate
Generator - SPBRGH and SPBRG
// Baudrate = Fosc/[16(n+1)] => n =
((Fosc/Baudrate)>>4) - 1; n = SPBRGH: SPBRG;
n = ((Fosc/BaudRate)>>4) - 1;
SPBRG = n;
SPBRGH = n>>8;
// Enable the asyncchronous serial port.
SYNC = 0 ; // Asynchronous mode
SPEN = 1; // Serial port enable.
TRIS_TX = 0;
TRIS_RX = 1;
//Configure for Transmitter mode.
TXEN = 1; // Transmit enable
//Configure for Receiver mode
CREN = 1; // Enable the reception
//Interrupt
RCIF = 0;
RCIE = 1; // Reception Interrupt
Enable
GIE = 1; // Global Interrupt Enable
PEIE = 1; // Perapheral Interrupt
Enable
}
//===========================
void UART_PrChar(unsigned char a){
while(!TRMT);
TXREG = a;
}
//====================================
void UART_PrString(const char* str){
while(*str)
UART_PrChar(*str ++);}
//=================================================
unsigned char UART_Read(void){
return (RCREG);
}
//===============================================
void UART_detectBaudRate(void){
TXSTA = 0b00100100;
RCSTA = 0b10010000;
#if defined(_18F4680)
BAUDCON = 0b00001001;
#endif
#if defined(_18F4431)
BAUDCTL = 0b00001001;
#endif
while(ABDEN){
#if defined(_18F4680)
if(ABDOVF == 1) ABDOVF = 0;
#endif
};
}
Tất cả tham số của bộ UART được định nghĩa trong SysDef.h của mình:
// SysDef.h
//
// System Defination for specific IC
//
#ifndef SYSDEF_H
#define SYSDEF_H
// Crystal
#define Fosc 20000000
// UART Module
#define TX RC6
#define RX RC7
#define TRIS_TX TRISC6
#define TRIS_RX TRISC7
#define UART_Data TMR1H // UART Data temporary
#endif // EOF
Tải thư viện về: PIC18_UART_LIb (82)
Cách dùng thư viện
Copy các file thư viện này vào trong thư mục Project của bạn, ở file nào muốn
dùng thư viện thì thêm header vào:
#include "UART.h"
Chúc các bạn thành công.
Các bài viết liên quan:
o Lập trình C cho viđiều khiển
o Cơ bản về PIC và dsPIC, các phần mềm liên quan
o Vài video demo về dsPIC khá ấn tượng
o Microcontroller Based Applied Digital Control
o Phương pháp quét Keypad ma trận dùng ngắt Timer
o Phan tich thuat toan: thuc hien lenh dieukhien tu PC qua RS232
o Quản lý và build Project với trình dịch HTPICbằng Visual C++.Net 2005
View ngohaibac's Profile
Subscribe via RSS
2 Comments
1. #1 nguễn văn bách says:
May 18th, 2009 at 10:19 am
anh bắc cho em hỏi bài này cái.em mới vào nghề.em đang đọc về ngắt của con
dspic,thử lập trình ngắt cho nháy đèn led từ 0-9 cho nó.chương trình của em gặp
vấn đề thì phải,vì khi em thay đổi giá trị của PR1 thì thời gian nháy vẫn thế.nó
vẫn nháy loạn lên.vậy mong các anh sửa giúp em với,và tư vấn cho em chút it về
ngắt,khi nao` su dung ngat trong va khi nao su dung ngat ngoai.sau đây là đoạn
chương trình của em:
#define __dsPIC33FJ12MC202__
#include
int led[10]={0×3F,0×06,0×5B,0×4F,0×66,0×6D,0×7D,0×07,0×7F,0×6 7};
int i;
void _ISR _T1Interrupt(void)
{
_T1IF = 0;
}
main()
{
TMR1=0;
PR1=0×2625A; //cho phep ngat sau 1 giay
T1CON=0×8030; //chon ti le dem trc la 256
_T1IF=0; //xoa co ngat TMR1
_T1IE=1; //cho phep ngat
TRISB=0xff00;
while(1)
{
for (i=0;i<10;i++)
{
PORTB=led[i];
}
}
Rating: 0.0/5 (0 votes cast)
Reply
o #2 ngohaibac says:
May 18th, 2009 at 8:38 am
Em thay PR1 thì có ảnh hướng gì ở đây đâu hả em. Em phải viết lệnh thay
đổi PORTB ở trong hàm xử lý ngắt chứ em. Em viết trong while(1) thì
PORTB luôn luôn sáng rồi :).
Chúc em thành công.
Rating: 0.0/5 (0 votes cast)
. • Đây là thư vi n vi t cho vi điều khiển PIC dòng PIC1 8 bằng HTPIC. Thư vi n
được tạo dựa vào Datasheet của PIC1 8.
Đã test với PIC1 8F4680, PIC1 8F4431
File. thành công.
Các bài vi t liên quan:
o Lập trình C cho vi điều khiển
o Cơ bản về PIC và dsPIC, các phần mềm liên quan
o Vài video demo về dsPIC khá ấn tượng
o