Mình thấy với KeilC thì lập trình ngắt cho 89C51 khá đơn giản (chắc tại có nhiêu code mẫu), nhưng khi dùng MikroC khì không biết phải làm như thế nào, nhất là khởi tạo ngắt. Đọc trong phần hướng dẫn cũng không thấy nói nhiều về phần này, tìm trên mạng cũng rất ít ví dụ cụ thể. Bác nào làm việc nhiều với MikroC có thể cho mình một ví dụ về lập trình ngắt ngoài được không? Thanks!
Thông báo
Collapse
No announcement yet.
Lập trình ngắt ngoài trong MikroC như thế nào?
Collapse
X
-
Đây là ví dụ ngắt ngoài cho AT89S8253 của mikroC ( Lấy trong mục Mẫu Ví dụ của nó ). Chắc AT89C51 cũng tương tự !!!
Code:/* Project name: External Interrupt on Port0 (Simple 'Hello World' project) * Copyright: (c) Mikroelektronika, 2010. * Revision History: 20101007: - initial release; 20110224(TL): - adapted for PRO version * Description: This is a simple 'Hello World' project. It counts presses on PORT3.2 and shows result on diodes connected to PORT0. * Test configuration: MCU: AT89S8253 http://www.atmel.com/dyn/resources/prod_documents/doc3286.pdf Dev.board: Easy8051 v6 http://www.mikroe.com/easy8051/ Oscillator: HS, 10.0000 MHz Ext. Modules: - SW: mikroC PRO for 8051 http://www.mikroe.com/mikroc/8051/ * NOTES: - Make sure you turn ON the PORT0 LEDs (SW7.1), set Pull up PORT3.2 (SW4.3) and set jumper J4 in GND position */ int tmp = 0, cnt = 0xFF; // Global variable cnt and tmp with starting values void External_ISR()org 0x0003 ilevel 0 { // Interrupt rutine EA_bit = 0; // Disable Interrupts tmp = 1; // Increment variable cnt EA_bit = 1; // Enable Interrupts } void main() { // Main program P0 = 0xFF; // Set P0 as output P3 = 0xFF; // Set P3 as input IE = 0x81; // Setting the Interrupts: while(1){ // Unending loop if (tmp) { // tmp is temporary variable that enables us to control Interrupt counting cnt = cnt - 1; // Decreasing cnt variable (negative logic) tmp = 0; // Deleting tmp variable } P0 = cnt; // Write on Port0 value of varibale cnt delay_ms(250); // This is needed for button debounce } }
Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
-
Em thấy KeilC khởi tạo ngắt ngoài INT0 bằng đoạn code
P3_2=1; // khai báo chân lấy tín hiệu
EA=1; // cho phép ngắt toàn cục
EX0=1; // cho phép ngắt ngoài 0
Comment
-
Nguyên văn bởi tmtm Xem bài viếtEm thấy KeilC khởi tạo ngắt ngoài INT0 bằng đoạn code
Trong ví dụ của MikroC, em không nhìn ra nó khai báo INT0 hay INT1 bằng câu lệnh nào anh nhỉ hay chính là đoạn org 0x0003 ilevel 0?
--- Còn Ngắt ngoài 0 hay 1 ( INT0 , INT1 ... đều do thanh ghi IE quản lý :
IE = 0x81 ===> tương đương với EA_bit = 1 , EX0_bit =1 , Cũng vậy IE = 0x84 thì hoạt động trên INT1 ( EX1_bit =1)
Có thể xem datasheet để hiểu về thanh ghi này .
Trong chương trình : thay vì viết cả thanh ghi IE = 0x81 ;
cũng có thể viết :
EA_bit =1 ;
EX0_bit =1;
hoặc IE=0x84
EA_bit =1;
EX1_bit =1;
CÓ THỂ đều cho kết quả là như nhau . MikroC rất " dễ tính " ... Các cách viết của các trình dịch khác đều có thể viết được bằng mikroC , bạn có thể thử xem có được không !?Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
Em đang tìm hiểu cách viết dùng cấu trúc
switch(mode)
{
case 1:mode1();break;
case 2:mode2();break;
}
Em mới chỉ viết được theo cách thông thường để mỗi khi bấm nút thì ngắt xảy ra, ví dụ như điều khiển 1 LED nhấp nháy tại P1^0 như sau:
int tmp = 0;
void External_ISR()org 0x0003 ilevel 0
{
EA_bit = 0;
tmp = 1;
EA_bit = 1;
}
void main() {
P1 = 0xFF;
P3 = 0xFF;
IE = 0x81;
while(1)
{
if (tmp) {
P1 = 1;
delay_ms(1000);
P1 = 0;
delay_ms(1000);
tmp = 0;
}
P1 = 0; }
}
Comment
-
không được là thế nào, có phải thế này không.
VD:
Code:int tmp = 0; void External_ISR()org 0x0003 ilevel 0 { EA_bit = 0; if(++ tmp >= 3)tmp = 1; EA_bit = 1; } void main() { P1 = 0xFF; P3 = 0xFF; tmp = 0; IE = 0x81; // nhớ là dùng ngắt sườn nhé while(1) { switch(tmp){ case 1 : P1 = 1;break; case 2 : P1 = 0;break; default break; } } }
Comment
-
Nguyên văn bởi thientanvt Xem bài viếtkhông được là thế nào, có phải thế này không.
void External_ISR()org 0x0003 ilevel 0
{
EA_bit = 0;
if(++ tmp >= 3)tmp = 1;
EA_bit = 1;
}
void main() {
P1 = 0xFF;
P3 = 0xFF;
tmp = 0;
IE = 0x81;
IT0_bit = 0;// nh? là dùng ng?t su?n nhé
while(1)
{
switch(tmp){
case 1 : P1 = 1;break;
case 2 : P1 = 0;break;
default : break;
}
}
}Attached Files
Comment
-
Nguyên văn bởi tmtm Xem bài viếtEm đã sửa như thế sau, nhưng nó chạy loạn lên. Mà em thấy biến tmp được dùng để kiểm tra nút bấm có được bấm không chứ sao lại ''if(++ tmp >= 3)'' nhỉ?
Code:void External_ISR()org 0x0003 ilevel 0 { EA_bit = 0; if(++ tmp >= 3)tmp = 1; // quay lại từ đầu : 1 2 3 1 2 3 1 2 3 ...... } void main() { P1 = 0xFF; P3 = 0xFF; tmp = 0; IE = 0x81; IT0_bit = 0;// nh? là dùng ng?t su?n nhé while(1) { switch(tmp){ case 1 : P1 = 1; delay_ms(200); EA_bit = 1; break; // sau khi làm xong việc mới bật ngắt lên case 2 : P1 = 0; delay_ms(200); EA_bit = 1; break; // delay để chống rung phím đơn giản . default : break; } } }
Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
Không biết sao chứ em thử mô phỏng vẫn vậy anh ạ. Em thử nhồi thêm mấy trạng thái vào thì nó vẫn không cải thiện hơn chút nào.
int tmp = 0;
void External_ISR()org 0x0003 ilevel 0
{
EA_bit = 0;
if(++ tmp >= 5)tmp = 1; // quay l?i t? d?u : 1 2 3 1 2 3 1 2 3 ......
}
void main() {
P1 = 0xFF;
P3 = 0xFF;
tmp = 0;
IE = 0x81;
IT0_bit = 0;
while(1)
{
switch(tmp){
case 1 : P1 = 0b00000001; delay_ms(200); EA_bit = 1; break;
case 2 : P1 = 0b00000010; delay_ms(200); EA_bit = 1; break;
case 3 : P1 = 0b00000100; delay_ms(200); EA_bit = 1; break;
case 4 : P1 = 0b00001000; delay_ms(200); EA_bit = 1; break;
default : break;
}
}
}Attached Files
Comment
-
Thế này được chứ ?
case 1 : P1 = 0b00000001; while(!P3.F2) delay_ms(200);EA_bit = 1; break;
case 2 : P1 = 0b00000010; while(!P3.F2) delay_ms(200);EA_bit = 1; break;
case 3 : P1 = 0b00000100; while(!P3.F2) delay_ms(200);EA_bit = 1; break;
case 4 : P1 = 0b00001000; while(!P3.F2) delay_ms(200);EA_bit = 1; break;Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
Bài viết mới nhất
Collapse
-
bởi nhathung1101Muốn đặt gì thì cũng phải có thông tin cơ bản. Việc nhỏ thế này mà phải dấu giếm thì người lớn không thèm làm đâu.
Cho bạn 3 ngày, không là sẽ xóa.-
Channel: Đặt hàng
22-12-2024, 22:02 -
-
Trả lời cho Hỏi cách điều chế xungbởi nhathung1101Schmit Trigger là chuẩn với điều kiện rise > 0,8V.
Bí thì dùng vi với tích gì đó, miễn đừng nói phân kẻo chó ở đây lại sủa nhặng.-
Channel: Kỹ thuật điện tử tương tự
22-12-2024, 21:57 -
-
bởi trungautMình cần đặt hàng thiết kế chế tạo mạch nghịch lưu 3 pha để cài đặt các thuật toán điều khiển động cơ FOC, DTC, ... Xin liên hệ trungaut@gmail.com để bàn chi tiết. Xin cảm ơn diễn dàn đăng tin!
-
Channel: Đặt hàng
22-12-2024, 14:27 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi tuyennhanCách ly dây điện vào , bộ nguồn và đèn khỏi khung xe thì có rò thật cũng không lo bị giật .
-
Channel: Điện tử dành cho người mới bắt đầu
21-12-2024, 08:56 -
-
Trả lời cho Hỏi cách điều chế xungbởi thetungBạn cho qua cái Tờ ri gơ Sờ mít ấy ......
-
Channel: Kỹ thuật điện tử tương tự
16-12-2024, 11:26 -
-
Trả lời cho Hỏi cách điều chế xungbởi nguyendinhvanCó gì mà khó ?
Răn cưa vuông đây
...-
Channel: Kỹ thuật điện tử tương tự
15-12-2024, 23:36 -
-
Trả lời cho hỏi về tụ điệnbởi ndp62Chữ " VENT" không phải là tên hãng sx tụ đâu ,vó thế là 1 ký hiệu liên quan tụ lowesr ?
-
Channel: Điện thanh
15-12-2024, 18:24 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi bqvietTrừ trường hợp công suất (rất) thấp, hầu như tất cả các loại nguồn xung thông thường đều có tụ nhỏ 1 - 10nF nối giữa sơ cấp và thứ cấp, để thoát nhiễu và để chống hiện tượng tương tự tĩnh điện. Vụ này đã thảo luận vài...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 22:02 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi namlangnhoE thử 3 cái nguồn nó đều giống nhau. Nên e làm tiếp địa luôn.
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 19:58 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi mèomướpDạ chú sắm con át chống giật và thay nguồn tổ ong khác cho an toàn ạ. Đa phần nguồn xung đều xả nhiễu của bên thứ cấp về điện lưới qua 1 con tụ nên cảm giác tê sẽ khó xác định rõ ràng là do rò điện hay là nó vốn vậy...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 18:51 -
Comment