Bộ định thời cũng giống như hàm DELAY, để tạo ra một khoảng thời gian trễ chính xác nào đấy, tuy nhiên khác với hàm DELAY ở chỗ, hàm DELAY trễ là do CPU thực hiện một công việc không sinh công để sinh ra thời gian cần trễ, việc này làm tổn hao hiệu xuất của CPU và khơng thích hợp với các hệ thống u cầu thời gian thực, còn với chức năng định thời của các timer thì CPU vẫn có thể làm một việc khác trong khi việc định thời giao cho Timer thực hiện, hay nói cách khác CPU và timer lúc này cùng thực hiện song song.
Chức năng counter hay còn gọi là đếm sự kiện, lúc này bộ timer phải được cấu hình lấy nguồn xung đếm từ các chân ngoại vi, timer sẽ trở thành các bộ couter dùng cho việc đếm xác xung đầu vào được gửi về từ các sensor số.
Các hàm xử lý timer0:
1) setup_timer_0 (mode); // hàm cấu hình cho timer0
Trong đó : mode có thể là 1 hoặc 2 trong 2 nhóm tham số sau:
- RTCC_INTERNAL, RTCC_EXT_L_TO_H hoặc RTCC_EXT_H_TO_L - RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16,
RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256 - Nếu là PIC18 có thêm: RTCC_OFF, RTCC_8_BIT
Khi sử dụng 2 hằng số phải được ghép bằng phép hoặc “|”. VD: setup_timer_0 (RTCC_DIV_2|RTCC_EXT_L_TO_H);
2) set_timer0(value) ; // thiết lập giá trị đếm cho timer, lưu ý là tất cả các bộ timer
đều đếm tiến, khi bị tràn timer lại tiếp tục đếm từ 0. Value là giá trị nạp, cần lưu ý value là 8 bit nếu timer là 8bit, 16bit nếu timer là 16bit.
Ví dụ: Một ví dụ đơn giản sửu dụng ngắt timer1 #if defined(__PCM__) #include <16F877.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #elif defined(__PCH__) #include <18F452.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #endif
// This interrupt is used to output the waveforms. The interrupt // is automatically called ever 200us.
#INT_TIMER1 void wave_timer() { int i;
set_timer1(0xFC4F); // sets timer to interrupt in 200us //… cong viec muon thuc hien sau moi 200us }
void main() {
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // Chọn nguồn xung hệ thống enable_interrupts(INT_TIMER1); // cho phép ngắt timer1
enable_interrupts(GLOBAL);
while(TRUE); // chương trình chính khơng làm gì }
4.3.3. Truyền thơng chuẩn RS232a) Cấu hình cổng RS232 a) Cấu hình cổng RS232
Để cấu hình chế độ làm việc cho công RS232 trên PIC tối thiêu ta phải sử dụng hai hàm sau:
• #use delay (clock = xxxx ) // giá trị OSC hệ thống, tham số này cần chính xác để hệt thống tính tốn đúng tốc độ truyền thơng
• #use rs232 (option); // các tùy chọn cấu hình cho giao thức truyền thơng, option có thể là các giá trị sau (một số hằng số thông dụng):
o XMIT=pin: chân truyền
o RCV=pin: chân nhận
o PARITY=X: với x = N, E, hoăc O.
o STOP=X: X là số bit STOP
b) Một số hàm truyền thông thông dụng
1) printf ( string ) hoặc Printf ( cstring , values . . . ); //truyền một xâu ra cổng
RS232 Trong đó:
- string là 1 chuỗi hằng hay 1 mảng ký tự ( kết thúc bởi ký tự null ) .
- value là danh sách các biến , cách nhau bởi dấu phẩy .
Giống như hàm xuất ra màn hình trong ngơn ngữ C, ta phải cấu hình cho dữ liệu được gửi ra công RS232 như gửi ra màn hình. Cú pháp định dạng cho value theo kiểu %wt. Trong đó w có thể có hoặc khơng, chỉ số vị trí chứa giá trị. Cịn t là kiểu giá trị hiển thị. t có thể là :
- C : 1 ký tự
- S : chuỗi hoặc ký tự - U : số 8 bit không dấu
- x : số 8 bit kiểu hex ( ký tự viết thường ,VD : 1ef ) - X : số 8 bit kiểu hex ( ký tự viết hoa ,VD : 1EF ) - D : số 8 bit có dấu
- e : số thực có luỹ thừa VD : e12 - f : số thực
- Lx : số hex 16 /32 bit ( ký tự viết thường ) - LX : hex 16 /32 bit ( ký tự viết hoa ) - Lu : số thập phân không dấu
- Ld : số thập phân có dấu VD:
Int k =6 ;
Printf ( " hello " ); Printf ( " %u " , k );
2) KBHIT ( ); // hàm trả về 1 sẽ báo q trình nhận 1 ký tự thành cơng và sẵn sàng
cho việc đọc, bằng 0 nếu q trình nhận chưa hồn tất. Hàm này có thể dùng để hỏi vịng xác định thời điểm nhận thành cơng 1 ký tự trên đường truyền.
3) value=getch(); // hàm đọc 1 ký tự từ bộ đệm nhận, giá trị trả về là 1 byte 4) putc(data), getch(); hàm truyền và nhận một ký tự trên đường truyền
Ví dụ: Ví dụ lập trình cho PIC truyền liên tục đọc cổng B gửi ra công D và truyền qua
đường RS232 chp PIC nhân, PIC nhận liên tục đọc từ đương truyền RS232 và gửi ra cổng D
Chương trình trên PIC truyền #include <18F452.h >
#use delay(clock=40000000)
unsigned int8 data; void main ( ) { set_tris_B(0xFF); set_tris_D(0x00); while(1){ data=input_B(); putc(data); output_D(data); } }
Chương trình trên PIC nhận #include <18F452.h >
#use delay(clock=40000000)
#use rs232(baud=9600 , parity=n , xmit=pin_C6 , rcv=pin_C7 ) unsigned int8 data;
void main ( ) { set_tris_D(0x00); while(1){ while(!kbhit()); data=getch(); output_D(data); } }
4.4. Hệ điều hành nhúng
4.4.1. Khái niệm và yêu cầu chung
Nguồn gốc ra đời của hệ điều hành là để đảm nhiệm vai trò trung gian để tương tác trực tiếp với phần cứng của máy tính, phục vụ cho nhiều ứng dụng đa dạng. Các hệ điều hành cung cấp một tập các chức năng cần thiết để cho phép các gói phần mềm điều khiển phần cứng máy tính mà khơng cần phải can thiệp trực tiếp sâu. Hệ điều hành của máy tính có thể thấy nó bao gồm các drivers cho các ngoại vi tích hợp với máy tính như card màn hình, card âm thanh... Các cơng cụ để quản lý tài nguyên như bộ nhớ và các thiết bị ngoại vi nói chung. Điều này tạo ra một giao diện rất thuận lợi cho các ứng dụng và người sử dụng phát triển phần mềm trên các nền phần cứng đã có. Đồng thời tránh được yêu cầu và hiểu biết sâu sắc về phần cứng và có thể phát triển dựa trên các ngơn ngữ bậc cao. Hệ thống điều hành bản chất cũng là một loại phần mềm nhưng nó khác với các loại phần mềm thơng thường. Sự khác biệt điển hình là hệ thống điều hành được nạp và thực thi đầu tiên khi hệ thống bắt đầu khởi động và được thực hiện trực tiếp bởi bộ xử lý của hệ thống. Hệ thống điều hành được viết để
đảm nhiệm chức năng quản lý và lập lịch các quá trình sử dụng CPU và cùng chia sẻ tài nguyên.