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 dinhthuong80"Các chuyên gia đưa ra lời giải thích
Theo các chuyên gia về quạt máy, về cơ bản số lượng cánh quạt không ảnh hưởng nhiều tới hiệu quả làm mát của thiết bị. Tuy nhiên vẫn có một số sự khác biệt nhỏ, đó là quạt nhiều cánh hơn (5 cánh) thường sẽ cho ra nhiều gió...-
Channel: Điện tử gia dụng
Hôm qua, 16:32 -
-
bởi appongthoMã lỗi H-27 và lỗi H-43 tủ lạnh Panasonic là gì?
https://appongtho.com/khac-phuc-loi-...anh-panasonic/
Mã lỗi H-27 và H-43 trên tủ lạnh Panasonic thường xuất hiện khi hệ thống điều khiển phát hiện sự cố nghiêm trọng liên quan đến cảm biến...-
Channel: Điện tử gia dụng
Hôm qua, 10:35 -
-
Trả lời cho Công thức tính công suất biến áp xung ?bởi NGULAUở tần số 50 Hz diện tich lõi sắt S (cm2) có B = 12.000 Gauss được tính bằng công thức S=1,2x căn bậc 2 của P (W)
Nếu có lõi sắt tốt có thể bỏ 1,2 đi
còn ở tần số cao hơn tôi không biết và xin anh em cho biết, đang rất cần-
Channel: Điện tử công suất
14-04-2025, 23:00 -
-
bởi dinhthuong80Một số kết quả test với mô-tơ quạt khác.
Kết luận cá nhân người mở chủ đề: Quạt dân dụng 47-65W không nên dùng cánh 7 lá lớn vì hiệu suất thấp, lưu lượng gió không cao như NSX công bố!
[Video test các loại cánh quạt chứng tỏ loại 7 cánh hiệu...-
Channel: Điện tử gia dụng
11-04-2025, 15:07 -
-
Trả lời cho Load buffer là gì?bởi pia2k1Thêm kiến thức mới cho thuật ngữ mới nè
-
Channel: Thuật ngữ chuyên ngành
10-04-2025, 17:07 -
-
bởi dinhthuong80Xin upload kết quả thí nghiệm, mọi người sẽ tự hiểu và biết phân tích đúng sai hợp lí hay không. Ai không biết kĩ thuật thì chẳng dám tin vào cảm giác của bản thân, chỉ tin những gì nsx nói, dù họ có nói phét thế nào!!!
Còn...-
Channel: Điện tử gia dụng
09-04-2025, 22:10 -
-
bởi nguyendinhvanEm rất là quý bac, nhưng hôm nay em thấy bác sai đấy.
Cái sai của bác là đem cái cơ sở lý luận kỹ thuật công nghệ của Tư bản Chủ nghĩa để trao đổi với người theo Chủ Nghĩa Kinh Nghiệm.
...
-
Channel: Điện tử gia dụng
08-04-2025, 20:54 -
-
bởi nguyendinhvanTốn wifi 4G quá !
Nào là lưu lượng , nào là tốc độ, nào là đường kính, nào là diện tích, nào là vòng quay, nào là hiệu suất, nào là dụng cụ, nào là thiết bị nào là máy đo, nào là phương pháp....
Cộng với một bản số liệu...-
Channel: Điện tử gia dụng
08-04-2025, 20:45 -
-
bởi tuyennhanCánh nhỏ là của tàu đem qua giờ mình copy theo mà tàu thì chuyên ăn bớt vật liệu để giảm giá thành từ cánh cho đến mô tơ mới thành ra vậy .
Cách thử của dinhthuong có đúng thì chỉ đúng với cái quạt Senko còn với quạt khác mô tơ...-
Channel: Điện tử gia dụng
08-04-2025, 20:28 -
-
bởi nhathung1101Lão Phàm có biết lịch sử cái quạt không?
Ngày xưa chỉ có 1 cánh vẫn chạy tốt.
Sau này thêm 2 thành 3 cánh, chạy tốt.
Đến khi ông Cờ Rít Tóp Mỡ muốn buôn quạt sang châu Phi, để được tai tiếng ngang với...-
Channel: Điện tử gia dụng
08-04-2025, 18:42 -
Comment