PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 29-09-2008, 11:32 AM   #1
mbk
Nhập môn đệ tử
 
mbk's Avatar
 
Tham gia ngày: Oct 2007
Bài gửi: 9
:
Smile Sử dụng nhiều ngắt trong Pic

Chào mọi người.
Mình đang học lập trình với Pic, có một thắc mắc về ngắt trong Pic, mong mọi người chỉ giúp.
Mình định dùng nhiều ngắt trong 1 chương trình, kiểu như là đang move dữ liệu từ chuyển đổi ADC sang 1 bộ đệm trung gian thì có ngắt truyền tin chẳng hạn. Mình có đọc ở đâu đó trên diễn đàn nói về vấn đề này (không nhớ cụ thể ở đâu, nội dung là: trong 1 ngắt mà cho vẫn phép các ngắt khác (set GIE = 0) thì các giá trị đã lưu của ngắt cũ sẽ bị đè lên bởi ngắt mới và chương trình không thể quay trở lại chương trình chính khi đã thoát ngắt ---> ctr bị lỗi.
Vậy thì không có cách nào để thực hiện ngắt trong ngắt được, đúng không?
mbk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-09-2008, 01:32 AM   #2
nguyenquoctoan
Đệ tử 6 túi
 
Tham gia ngày: Nov 2007
Nơi Cư Ngụ: BK TP HCM
Bài gửi: 136
:
sư huynh xem lại phần ưu tiên ngắt thử coi, thứ tự cho phép các ngắt
tài liệu này hi vọng giúp đuợc huynh
File Kèm Theo
File Type: rar CCS tieng Viet-update I.rar (233.2 KB, 754 lần tải)
nguyenquoctoan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-09-2008, 09:23 AM   #3
mbk
Nhập môn đệ tử
 
mbk's Avatar
 
Tham gia ngày: Oct 2007
Bài gửi: 9
:
Smile

Trích:
Nguyên văn bởi nguyenquoctoan View Post
sư huynh xem lại phần ưu tiên ngắt thử coi, thứ tự cho phép các ngắt
Mình quên không nói là mình dùng Pic 16F874A, với dòng Pic 16 thì không có ưu tiên ngắt 2 cấp như ở Pic18, khái niệm ưu tiên mà txt đề cập trong tài liệu của bạn đưa thực chất là hỏi vòng cờ ngắt khi xử lý ngắt, cờ ngắt nào đc hỏi trước thì có mức ưu tiên cao hơn...
Ý mình muốn hỏi là không dùng kiểu hỏi vòng đó mà vẫn đáp ứng được ngắt ưu tiên cao khi đang thực hiện một ngắt ưu tiên thấp hơn?
mbk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-09-2008, 05:05 PM   #4
mbk
Nhập môn đệ tử
 
mbk's Avatar
 
Tham gia ngày: Oct 2007
Bài gửi: 9
:
Smile

Tìm trên dientuvietnam.net thấy có bài nói về cái này của bác CHIBANG nhưng đọc mà vẫn chưa hiểu:
http://dientuvietnam.net/forums/show...p?t=831&page=3
Cho 3 ngắt 1,2,3; làm thế nào để nếu đang thực hiện ngắt i mà có ngắt j <i xẩy ra thì phải phục vụ ngắt j ngay, CHIBANG cho đáp án là:
Trong hàm ngắt, viết như sau:
Ngắt_1()
{
//Chèn mã lệnh: disable ngắt 1,2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 1
}

Ngắt_2()
{
//Chèn mã lệnh: disable ngắt 2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 2
}

Ngắt_3()
{
//Chèn mã lệnh: disable ngắt 3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 3
}

Như ở trong ngắt 1, đầu tiên cấm ngắt 1,2,3; sau đó cho phép tất cả các ngắt (GIE = 1), rồi thực hiện ngắt 1. Nếu đang thực hiện ngắt 1 mà có ngắt 2 hoặc 3 nhảy vào thì điều j sẽ xảy ra???
Mong các cao thủ chỉ cho con đường sáng!
Lưu ý là áp dụng cho Pic16 mọi người nhé!

thay đổi nội dung bởi: mbk, 30-09-2008 lúc 05:21 PM.
mbk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-10-2008, 05:46 PM   #5
mbk
Nhập môn đệ tử
 
mbk's Avatar
 
Tham gia ngày: Oct 2007
Bài gửi: 9
:
Trời!
Không ai vào chỉ giúp mình ah?
mbk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-10-2008, 06:18 PM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi mbk View Post
Tìm trên dientuvietnam.net thấy có bài nói về cái này của bác CHIBANG nhưng đọc mà vẫn chưa hiểu:
http://dientuvietnam.net/forums/show...p?t=831&page=3
Cho 3 ngắt 1,2,3; làm thế nào để nếu đang thực hiện ngắt i mà có ngắt j <i xẩy ra thì phải phục vụ ngắt j ngay, CHIBANG cho đáp án là:
Trong hàm ngắt, viết như sau:
Ngắt_1()
{
//Chèn mã lệnh: disable ngắt 1,2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 1
}

Ngắt_2()
{
//Chèn mã lệnh: disable ngắt 2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 2
}

Ngắt_3()
{
//Chèn mã lệnh: disable ngắt 3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 3
}

Như ở trong ngắt 1, đầu tiên cấm ngắt 1,2,3; sau đó cho phép tất cả các ngắt (GIE = 1), rồi thực hiện ngắt 1. Nếu đang thực hiện ngắt 1 mà có ngắt 2 hoặc 3 nhảy vào thì điều j sẽ xảy ra???
Mong các cao thủ chỉ cho con đường sáng!
Lưu ý là áp dụng cho Pic16 mọi người nhé!
Vì đã cấm ngắt 1, 2, 3 nên khi ngắt 2 hoặc ngắt 3 xảy ra thì ngắt 1 vẫn được tiếp tục xử lý. Sau khi trở về từ ngắt 1 thì trình xử lý ngắt lại được kích hoạt, vì có ngắt 2 hoặc ngắt 3 đang chờ xử lý. Do đó, ngắt đang chờ xử lý này sẽ được phục vụ.

Tất nhiên là kỹ thuật này được đưa ra để giải quyết vấn đề ưu tiên ngắt cho các PIC 8-bit (kể cả PIC18, vì chúng cũng chỉ có 2 mức ưu tiên, nên vẫn xảy ra trường hợp có nhiều ngắt cùng mức cần được phân biệt xử lý).

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-08-2009, 09:17 PM   #7
vandat07
Đệ tử 1 túi
 
Tham gia ngày: Nov 2007
Bài gửi: 20
:
Em đang định viết chương trình điều khiển đèn led nháy nhiều chế độ dùng 1 button nhưng mà chưa biết làm thế nào? Có phải phải dùng ngắt ngoài không?

Ai biết thì cho em code.

Thank!
vandat07 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-08-2009, 09:12 AM   #8
vaa_pic
Nhập môn đệ tử
 
Tham gia ngày: Jul 2009
Bài gửi: 10
:
Trích:
Nguyên văn bởi vandat07 View Post
Em đang định viết chương trình điều khiển đèn led nháy nhiều chế độ dùng 1 button nhưng mà chưa biết làm thế nào? Có phải phải dùng ngắt ngoài không?

Ai biết thì cho em code.

Thank!
Cái này bạn dùng ngắt ngoài để đếm số lần nhấn nút, mỗi lần nhấn nút sẽ thay đổi kiểu nháy đèn giống như mấy dây đèn nháy bán ngoài chợ phải ko? Kiểu nháy thì do bạn tự cái đặt sẵn. Hình như trên diễn đàn có một chương trình mẫu kiểu này, bạn thử dùng chức năng tìm kiếm của diễn đàn xem.
vaa_pic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-09-2009, 12:14 AM   #9
tienchuan
Đệ tử 4 túi
 
tienchuan's Avatar
 
Tham gia ngày: Oct 2008
Bài gửi: 71
:
Trích:
Nguyên văn bởi vandat07 View Post
Em đang định viết chương trình điều khiển đèn led nháy nhiều chế độ dùng 1 button nhưng mà chưa biết làm thế nào? Có phải phải dùng ngắt ngoài không?

Ai biết thì cho em code.

Thank!
bài này của A Linhnc308,bạn lấy về edit lại theo ý mình nếu thích: "sory A Linh "
Code:
#include <16f877a.h>
#include <def_877a.h>
#device *=16
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)

int8 mode,i;
byte temp;

#INT_EXT
EXT_ISR() 
{

mode++;
if (mode==9) mode = 0;
}
// End of INT

void program1();
void program2();
void program3();
void program4();
void program5();
void program6();
void program7();
void program8();

void main()
{

   trisd = 0x00;
   trisb = 0xFF;
   portd=0xff;
   enable_interrupts(int_EXT);
   ext_int_edge(L_TO_H);
   enable_interrupts(GLOBAL);
   mode = 0;
while (1) {
   switch(mode) {
      case 1: program1(); break;
      case 2: program2(); break;
      case 3: program3(); break;
      case 4: program4(); break;
      case 5: program5(); break;
      case 6: program6(); break;
      case 7: program7(); break;
      case 8: program8(); break;
   }
}
}

void program1() 
{
   PortD = 0x00;
   delay_ms(10);
   Portd = 0xFF;
   delay_ms(100);
}
void program2() {
   temp = 0xFF;
   for (i=0;i<=8;i++) 
   {
      portd = temp;
      delay_ms(100);
      temp >>= 1;
   }
}
void program3()
{
    temp = 0xFF;
   for (i=0;i<=8;i++) 
   {
      portd = temp;
      delay_ms(100);
      temp <<= 1;
   }
}
void program4() {
   portd = 0xAA;
   delay_ms(100);
   portd = 0x55;
   delay_ms(100);
}
void program5() 
{
   Portd = 0x7E;
   delay_ms(150);
   Portd = 0xBD;
   delay_ms(250);
   Portd = 0xDB;
   delay_ms(150);
   Portd = 0xE7;
   delay_ms(150);
   Portd = 0xDB;
   delay_ms(150);
   Portd = 0xBD;
   delay_ms(150);
   Portd = 0x7E;
   delay_ms(150);
}
void program6() 
{
  temp = 0xFF;
   for (i=0;i<=8;i++) {
      portd = temp;
      delay_ms(250);
      temp = temp >> 1;
   }
}
void program7()
{

   Portd = 0xFE;
   delay_ms(150);
   Portd = 0xFD;
   delay_ms(150);
   Portd = 0xFB;
   delay_ms(150);
   Portd = 0xF7;
   delay_ms(150);
   Portd = 0xEF;
   delay_ms(150);
   PortD = 0xDF;
   delay_ms(150);
   Portd = 0xBF;
   delay_ms(150);
   Portd = 0x7F;
   delay_ms(150);
}

void program8() {
   Portd = 0x7F;
   delay_ms(150);
   Portd = 0xBF;
   delay_ms(150);
   PortD = 0xDF;
   delay_ms(150);
   Portd = 0xEF;
   delay_ms(150);
   Portd = 0xF7;
   delay_ms(150);
   Portd = 0xFB;
   delay_ms(150);
   Portd = 0xFD;
   delay_ms(150);
   Portd = 0xFE;
   delay_ms(150);
}
tienchuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 11:24 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam