Chào các bạn.
Không biết ai đã đọc bài viết của mình PIC16F887 – Điều khiển thời gian đóng cắt một led từ PC qua UART chưa. Trong này, mình có thực hiện đặt thời gian đóng cắt từ PC bằng lệnh với cú pháp.
Txyzt#: trong đó xyzt là thời gian tính theo hệ hexa.
Đây là đoạn chương trình xử lý ngắt UART:
| void RxIntFcn(void){ UART_Data = UART_Read(); UART_PrChar(UART_Data); // Detect set time command // as format: Txy# switch (progress){ case 0: //Initialize if(UART_Data == 'T') progress = 1; else progress = 0; switch(UART_Data){ case '1': //RB6 = 1; led1_cntL = 0x6F; // 1/9 s = 111 ms led1_cntH = 1; break; case '2': //RB6 = 1; led1_cntL = 0xDE; // 2/9 led1_cntH = 0; break; case '3': //RB5 = 1; led1_cntL = 0x4D; // 1s = 1000 = 0x03E8 led1_cntH = 0x1; break; case '4': //RB5 = 1; led1_cntL = 0xBC; // 5s = 5000 = 0x1388 led1_cntH = 0x01; break; case '5': //RB5 = 1; led1_cntL = 0x2B; // 5s = 5000 = 0x1388 led1_cntH = 0x02; break; case '6': //RB5 = 1; led1_cntL = 0x9A; // 5s = 5000 = 0x1388 led1_cntH = 0x02; break; case '7': //RB5 = 1; led1_cntL = 0x09; // 5s = 5000 = 0x1388 led1_cntH = 0x03; & #160; break; case '8': //RB5 = 1; led1_cntL = 0x78; // 5s = 5000 = 0x1388 led1_cntH = 0x03; break; case '9': //RB5 = 1; led1_cntL = 0xE7; // 5s = 5000 = 0x1388 led1_cntH = 0x03; break; case '0': //RB5 = 1; led1_cntL = 0xE8; // 5s = 5000 = 0x1388 led1_cntH = 0x03; break; default: PORTB &= 0x80; }; break; case 1: // Received 'T' character // Determind next state if (ishexa(UART_Data) == 1){ progress = 2; // Write data to acc1 acc1 = ascii2num(UART_Data); } else{ UART_PrString(" Command error"); progress = 0; }; break; case 2: // Received 'x' character if (ishexa(UART_Data) == 1){ progress = 3; // Write data to acc2 acc2 = ascii2num(UART_Data); } else{ UART_PrString(" Command error"); progress = 0; }; break; case 3: // Received 'x' character if (ishexa(UART_Data) == 1){ progress = 4; // Write data to acc2 acc3 = ascii2num(UART_Data); } else{ UART_PrString(" Command error"); progress = 0; }; break; case 4: // Received 'x' character if (ishexa(UART_Data) == 1){ progress = 5; ; // Write data to acc2 // On, off command |
Thuật toán mình sử dụng rất đơn giản: dùng một biến progress là biến quá trình. Mặc định giá trị này là 0, khi nhận dc đúng kí tự T thì biến sẽ có giá trị = 1. Khi đó, nó sẽ kiểm tra tiếp theo có phải gõ vào là chữ số từ 0 đến 9, và từ A đến F hay không.Mỗi trạng thái, khi nhận đúng đều chuyển từ giá trị string sang giá trị số, ví dụ: kí tự ‘0’ chuyển thành giá trị unsigned char là 1. Xem hàm này trong hàm system.h. Nếu đúng thì progress tiếp tục tăng đến trạng thái kiểm tra tiếp theo, nếu không nó sẽ báo lỗi “Command Error” gửi lên PC.
Tiếp tục, đến cuối cùng khi nhận xong kí tự # thì tức là đã nhận đúng lệnh và thực hiện gán dữ liệu để lấy ra byte cao và byte thấp của giá trị nhập vào.
Đây là hàm system.h
| bit ishexa(unsigned char a){ if ((a >= ‘0′ && a<= ‘9′) || (a>= ‘A’ && a<= ‘F’)) return 1; else return 0; }; // Convert from ASCII to number |
Hi vọng phân tích của mình làm các bạn hiểu được cách để thực hiện các lệnh điều khiển từ PC hiệu quả.
Chúc các bạn thành công.
Các bài viết liên quan:
- PIC16F887 Điều khiển thời gian đóng cắt một led từ PC qua UART Chào các bạn. Nay ngồi code cho con PIC16F887 để điều khiển đèn halogen, thực ra chính là điều khiển một chân rồi qua TIP122 và relay để điều khiển đèn thôi (vì dòng tải lên tới 10A). Mình thấy cách viết hay nên chia sẻ với các bạn. Dùng để lưu trữ luôn. Để [...]...
- Lập trình C cho vi điều khiển: vấn đề khai báo biến Chào các bạn. Như các bạn đã biết trong các lệnh ASM của vi xử lý thì thao tác với các toán tử là các thanh ghi sẽ tốn ít thời gian nhất và do đó tối ưu được chương trình chạy rất nhanh, thời gian thực hiện từng thuật toán sẽ giảm đi nhiều. [...]...
- Phương pháp quét Keypad ma trận dùng ngắt Timer Chào các bạn. Mình không biết phương pháp này các bạn biết chưa, hoặc đã ai post chưa. Nhưng đó là mình suy nghĩ và code ra chứ không hề copy ý tưởng hay code của ai khác . Phương pháp dựa trên dùng ngắt Timer0 dùng cho PIC16F887 do đó sẽ rất là tối [...]...
- Thư viện giao tiếp RS232 cho PIC18 bằng HTPIC18 Đây là thư viện viết cho vi điều khiển PIC dòng PIC18 bằ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 [...]...
- Phân tích ấn tượng về Ubuntu - Linux Bài phân tích này được bạn Xuanhy viết trên ddth.com tại box về Unix rất hay nên mình đăng lại để cho bạn nào chưa dùng Ubuntu/Linux có cái nhìn nhất định về nó. Bạn có thể đọc thêm bài viết và thảo luận này tại đây. Đây là bài viết của tớ bên ubuntu-vn.org. [...]...
- Thủ thuật Matlab - Lấy lại số liệu trên Scope và hiển thị trên đồ thị Chắc hẳn các bạn làm việc với Matlab - Simulink đã làm quen với khối Scope trong thư viện Sinks, khối này khi hiển thị mô phỏng với thời gian tương đối dài thì chúng ta khó lòng thu lại được đường đặc tính của nó. Khi chụp thẳng hình này thì sẽ toàn màu [...]...



{ 1 comment… read it below or add one }
Giúp mình quét led ma trận 8×8 với!Mình không biết làm sao để đưa ra một kí tự cả. Minh dùng quét theo cột. Dùng con atmega 16. Giúp mình với!