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
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?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
-
Mình bỏ thằng 89 của ATMEL lâu rồi , nên không nhớ rõ ... cái địa chỉ đó chỉ là định địa chỉ cho chương trình ngắt làm việc thôi ( trong 1 số trường hợp chẳng cần nó cũng chạy tốt - Ví dụ như ta không trồng cây ( trồng rau sạch) ở dưới đất mà mang lên Nóc nhà trồng chẳng hạn ).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
để thực hiện một bài toán đơn giản ví dụ như bấm nút lần thứ nhất thì 1 cổng ra có tín hiệu, bấm lần thứ 2 thì cổng khác có tín hiệu chảng hạn. Với PIC + CCSC thì em làm được rồi, với thằng này em thử cắt ghép mà vẫn chưa thành công.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:
Các bác có thể bớt chút thời gian chỉ giúp em cách thực hiện được không ạ! Em xin cảm ơn các bác rất nhiều!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
-
Em đã 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ỉ?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
-
Chạy loạn lên có thể nó nhảy vào ngắt quá nhiều , bạn phải khống chế ngắt , chống rung phím, khi cần mới cho ngắt hoạt động trở lạiNguyê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
-
Trả lời cho Giúp mình vẽ sơ đồ và phân tích nguyên lý làm việc của khảo sát các mạch nguồn ổn áp vớibởi davidcopyMạch 3 dùng để tạo ra nguồn đôi -/+( 5V, 6V, 9V, 12V, ...) nên ngõ ra biến áp cách ly thường là nguồn đối xứng.
Như trong mạch 3, ngõ ra biến áp là 9VAC đôi và 12VAC đôi. Khi đo 2 đầu 9V hoặc 12V thì điện áp sẽ là 18VAC hoặc 24VAC....-
Channel: Hỗ trợ học tập
hôm nay, 19:20 -
-
Trả lời cho Giúp mình vẽ sơ đồ và phân tích nguyên lý làm việc của khảo sát các mạch nguồn ổn áp vớibởi Tuyenvc345Dạ mình muốn tìm hiểu nguyên lý của mạch 3 ạ đặc biệt là 2 con IC 7806 ở trên và 7905 ở dưới nhiệm vụ của nó làm ạ
-
Channel: Hỗ trợ học tập
Hôm qua, 15:34 -
-
bởi ittcChào các bác, sau thời gian tìm hiểu về máy khoan dùng cho gia đình thì em chốt được gần chục model máy như dưới đây, nhờ các bác tư vấn chốt hạ giúp em nên lấy con nào. Nhu cầu gia đình thì loanh quanh khoan lên sắt, vd sắt V sắt hộp, khoan...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 07:37 -
-
bởi dinhthuong92Cần chờ một vài giây, thời gian trễ cho mạch tính toán đáp ứng đã bác. Mà phải hàng đắt tiền xíu mới thựcsu75 có MPPT, đa phần dối gạt. Ngay hãng khá lớn, chuyên là SRNE mà còn có 4 5 model nói láo!...
-
Channel: Đánh giá sản phẩm DTVN
Hôm qua, 05:32 -
-
bởi chinhnguyen9Sản phẩm không có thương hiệu rõ ràng gồm 3 kiểu 30A;60A và 100A có vẽ ngoaài khá bắt mắt. Tôi đã tin và mua 1 con 30A
Lắp vào hệ thống thấy dấu hiệu:
Phận hiển thị điện áp pin lưu trữ và dòng sạc ổn
Sau khi lắp pin lưu trữ , khi hở mach điên...-
Channel: Đánh giá sản phẩm DTVN
29-03-2026, 03:30 -
-
bởi Abril9Chào mọi người, động cơ bước có hộp số (https://www.oyostepper.es/category-2...eductores.html) trên thiết bị của tôi đã được sử dụng khoảng sáu tháng. Gần đây, tôi nhận thấy dầu rò rỉ từ trục đầu ra. Mỡ bôi trơn đã bị chảy và nhỏ giọt...
-
Channel: Các hệ thống tự động hóa khác
27-03-2026, 13:26 -
-
bởi AbirChào mọi người, gần đây tôi có một ý tưởng mới.
Tôi muốn nâng cấp thiết bị của mình để tăng tốc độ, vì vậy tôi đã thay đổi nguồn cấp cho mạch điều khiển từ 24V lên 48V. Động cơ vẫn giữ nguyên và dòng điện định...-
Channel: Điện tử công nghiệp
27-03-2026, 09:49 -
-
bởi nguyendinhvanCó một chi tiết sai cơ bản trong kỹ thuật điện tử....
-
Channel: Tâm tình dân kỹ thuật
26-03-2026, 19:31 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Bài hát mới, nhạc Phật: Về Giữa Chiêm Bao, sáng tác: Hoàng Đình Thường.
[Verse 1] Nhân gian bao thay đổi
ĐỜI là giấc CHIÊM BAO
Người mê lầm tranh đấu
KHỔ ĐAU mãi LUÂN HỒI.
VÔ THƯỜNG nào ai thấu
THAM vơ...-
Channel: Tâm tình dân kỹ thuật
25-03-2026, 19:01 -
........................................

Comment