Chào mừng đến với Câu Lạc Bộ Sáng Tạo
Chia sẻ kinh nghiệm
Kết nối đam mê
Đang cập nhật thời gian...
BÀI VIẾT NỔI BẬT
Xin chào! Tôi là Ếch Sáng Tạo :-)
Chia sẻ trang




Chuyên mục
Bài mới
Xem nhiều
Thống kê
  • Bài viết: 334/334
  • Thành viên: 10.085
  • Đang online: 11
  • Khách hôm nay: 3.183
  • Khách hôm qua: 2.955
  • Tổng khách: 16.200.741
Bài viết
Bài 7: Lập trình ngắt vi điều khiển 8051 - SangTaoClub.Net
Bài 7: Lập trình ngắt vi điều khiển 8051
Đăng bởi: Vũ Văn Thái - Thời gian: 03-11-2013, 12:15
Chuyên mục: Học lập trình 8051 - Lượt xem: 24.688

Lập trình ngắt vi điều khiển 8051

Chào các bạn, do một thời gian bận làm mấy cái project lên hôm nay mình mới có thời gian viết bài, mong mọi người thông cảm.

Hôm nay chúng ta sẽ tìm hiểu về ngắt vi điều khiển, thực ra trên club đã có tài liệu rồi nhưng một số bạn vẫn còn bỡ ngỡ về viết code ntn thì hôm nay m sẽ hướng dẫn code và tìm hiểu xem ngắt là cái quái gì mà nó lại quan trọng vậy :)

Đầu tiên các bạn sẽ thắc mắc ngắt là gì.... nếu mà cứ theo cái định nghĩa của nó chắc chẳng ai hình dung rõ lên m sẽ chuẩn bị một ví dụ để minh họa cho cái định nghĩa thô cứng đó:

VD như bạn đang vặt rau sauđó rửa rau rùi cho vào luộc, công việc có vẻ rất trôi chảy nhưng trong lúc đang vặt rau bỗng nhiên mama gọi "Con ơi đi ra ngoài tạp hóa mua cho mẹ gói bột nêm" Thế là ngay lập tức bạn dừng công việc vặt rau lại cất gọn vào một chỗ nào đó rồi chạy ngay ra cửa hàng để mua đồ cho mẹ, khi bạn mua xong gói bột nêm về thì bạn lại quay lại công việc đang dang dở đó là vặt rau và cứ như vậy.......... =>> Đó chính là ngắt

Trong vi điều khiển cũng vậy, chương trình dc chạy từ trên xuống dưới trong hàm main() - Hàm ctr chính. Bình thường (đang vặt rau) thì như vậy nhưng khi có ngắt xảy ra (mẹ sai đi mua bột nêm), tức sẽ có ngoại lệ, sẽ ra lệnh cho VDK biết là đang có một ngắt xuất hiệu và yêu cầu VDK phải xử lý nó, thế là VDK bảo “Biết rồi khổ lắm nói mãi” rồi thực hiện xong nốt câu lệnh đang chạy dở =>> Cất dữ liệu địa chỉ của câu lệnh tiếp theo vào một chỗ nào đó gọi là ngăn xếp (ô nhớ trên RAM)  xong quay sang phục vụ chương trình ngắt (Chính là việc chạy đi mua bột nêm đó)  khi phục vụ xong rồi thì nó lại vào ngăn xếp lấy cái địa chỉ của ô nhớ tiếp theo cần được xử lý. Công việc của VDK là như vậy khi có ngắt xảy ra.

Bình thường thì vi điều khiển chỉ xử lý dc một lệnh duy nhất, thực hiện xong thì nhảy đến lệnh kế tiếp, ko có khái niệm 3 đầu 6 tay đâu nha chỉ làm dc duy nhất một việc trong 1 khoảng thời gian, đó chính là chu kì máy dc định bởi bộ dao động, thường thấy là thạch anh(như quả tim vậy nó mà ngừng đập là VDK sẽ chết), VDK sẽ chia 12 lần xung nhịp thạch anh để ra chu kì máy VD sd thạch anh 12Mhz thì ta có chu kỳ máy là 1us  (1/1.000.000 giây). Thế là đã hiểu sơ sơ rồi, thế là đủ cho ngôn ngữ C ko cần lắm quá nhiều về cấu trúc VDK lên việc học lập trình rất nhanh, tôi đảm bảo với bạn sẽ dễ hơn với ASM vì ASM là hợp ngữ còn C là ngôn ngữ bậc cao gần với con ng hơn.

Trước khi đi vào phần code ta sẽ tìm hiểu xem con VDK của ta có những gì để sài: Họ 8051 có tất cả 5 ngắt và 1 ngắt Reset và 2 bộ định thời Timer0 và Timer1, riêng chíp 8052 là có thêm Timer 2. Để lắm rõ hơn bạn vui lòng tải tài liệu về bộ định thời về ở trên club

Ngắt reset là ngắt phần cứng khi ta kích mức cao vào chân Reset, còn 5 ngắt kia gồm: Ngắt Timer0, Timer 1, Ngắt ngoài 0, Ngắt ngoài 1, Ngắt UART ta sẽ xét từng ngắt một:

-Ngắt timer: Cơ bản timer0 và timer1 như nhau chỉ khác khai báo lên nhóm chung vào một mục

Ta xét thanh ghi hoạt động của timer: Thanh ghi 8bit TMOD:

 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |

 Bôi đỏ là của Timer1 và còn lại là của Timer0, nhưng ta chỉ quan tâm tới bit M0 và M1 – đây là bit set chế độ hoạt động cho timer

M1 M0 Chế độ
0 0 Định thời 13bit
0 1 Định thời 16bit
1 0 Định thời 8bit tự nạp lại
1 1 Định thời chia sẻ

Nhưng để cho nhanh ta có thể khai báo tắt như sau:

TMOD=0x01; Tương đương TMOD=0000 0001 là chọn timer0 và chế độ 16bit

TMOD=0x10; Tương đương TMOD=0001 0000 là chọn timer1 và chế độ 16bit

TMOD=0x21; Tương đương TMOD=0010 0001 là chọn timer0 chế độ 16bit và timer1 chế độ 8bit nạp lại tự động

.v.v..

Thanh ghi TH0, TL0(timer0), TH1,TL1(timer1) nạp giá trị ban đầu để đếm, bộ định thời sẽ đếm lên 1 với mỗi chu kì máy, như vậy ta phải tính toán giá trị nạp vì khi bộ định thời tràn tức đã đếm đủ 8bit, 16bit thì ngắt mới xảy ra

Chú ý thanh ghi TH0, TH1 có tác dụng khi ở chế độ 16bit vì nó lưu 8bit cao 

Thanh ghi IE(thanh ghi khai báo ngắt) có 2 bit ET0 và ET1 tương ứng ngắt timer0 và ngắt timer1

Bảng vector ngắt:

0 - Ngắt ngoài 0

1 - Ngắt timer 0

2 - Ngắt ngoài 1

3 - Ngắt timer 1

4 - Ngắt UART truyền thông nối tiếp, sẽ nói ở bài sau

Khai báo ctr phục vụ ngắt trong C: void ten_ctr() interrupt "vector_ngắt" { //code ctr }

CODE mẫu ngắt timer:

sbit led=P3^0; //Khai bao chan gan led
void INT_Timer1()interrupt 3 {
          //ctr phuc vu ngat
          led=!led; //Dao bit
}
void main(){//ctr chinh
          TMOD=0x20;//Sd Timer1 che do 8bit tu nap lai (ngat timer)
          TH1=TL1=0x00;//Nap gia tri bat dau 8bit
          TR1=1;//Khoi dong timer1
          ET1=1;//Ngat timer1
          EA=1;//Cho phep ngat
          while(1){//vong lap vo tan
                    //code ctr
          }
}

Với timer0 tương tự nhưng phải khai báo lại TMOD, TH0, TL0, TR0, ET0

- Ngắt ngoài: Khác với ngắt timer, ngắt ngoài cho phép tác động từ bên ngoài cho lên ta sẽ có thêm một bit điều khiển đó là bit IT, IT0(chỉ ngắt ngoài 0) và IT1(chỉ ngắt ngoài 1)

+Khi IT0=1 ngắt sườn lên (logic 0 lên logic 1)

+Khi IT0=0 ngắt sườn xuống ( logic 1 xuống logic 0)

+IT1 tương tự

Thanh ghi ngắt IE có 2 bit EX0 và EX1 tương ứng với chọn ngắt ngoài 0 hay ngắt ngoài 1

Để sử dụng ngắt ngoài ta cần phải kết nối vào 2 chân cho phép ngăt là P3.2(INT0) và P3.3(INT1)

Code mẫu cho ngắt ngoài:

sbit led=P3^0; //Khai bao chan gan led
void INT0() interrupt 0 {
          //ctr phuc vu ngat ngoai 0, nhan nut de bat led
          led=1; //bat led
}
void main(){//ctr chinh
          led=0;//tat led
          EX0=1;//ngat ngoai 0
          EA=1;//Cho phep ngat
          while(1){//vong lap vo tan
                    //code ctr
          }
}

 Nếu bạn chưa hiểu về các thanh ghi trên thì vui lòng tải tài liệu về bộ định thời về để hiểu rõ hơn

http://sangtaoclub.net/tai-lieu.html

Chúc bạn học tốt!!!!!


Bài viết sửa lúc 13-08-2014, 11:53 bởi Vũ Văn Thái
  • Bạn chưa đăng nhập, không thể viết bình luận!
    Bấm vào đây để Đăng nhập hoặc Đăng ký!
  • Vũ Văn Thái lúc 03-11-2013, 20:47
    còn cái khái niệm như bạn nói nếu m ko chú thích tthì chắc b cũng chẳng bjt nó là cái gì
    • volinh2309 lúc 15-11-2013, 10:27
      thanks a nhìu!! bài viết hay lắm.
  • lowpass lúc 03-11-2013, 20:35
    Đụng đến cái hàm ngắt, mình đọc không hiểu gì cả, toàn những khái niệm, ngắt time0, time1, ngắt ngoài, bảng vector ngắt,...., mình thấy loạn cả lên, mình đã tải tài liệu về bộ định thời đọc mãi củng không hiểu, có lẽ phải bổ đôi con 89S52 ra mà xem nó có gì bên trong thôi..., vậy admin có thể hướng dẫn mình cách học phần này cho nó thật dễ dàng hơn không vậy?
    • volinh2309 lúc 15-11-2013, 10:24
      theo mình thì muốn học cái này nhanh chỉ có cách là học thầy thôi....lên mạng chỉ là cách tự học khi mình đã biết /"nó/" là gì rồi!...
  • Trang 1/1: 1

    Bài viết cùng chuyên mục
    Điều khiển tốc độ động cơ Motor DC sử dụng PWM Điều khiển tốc độ động cơ Motor DC sử dụng PWM
    Đăng bởi: kienvuce - Thời gian: 04-11-2021, 22:40
    Chuyên mục: Học lập trình 8051 - Lượt xem: 3.126
    Chia sẻ bộ thư viện Driver chuẩn cho LCD Gphone và Home Phone Chia sẻ bộ thư viện Driver chuẩn cho LCD Gphone và Home Phone
    Đăng bởi: Vũ Văn Thái - Thời gian: 22-02-2017, 14:54
    Chuyên mục: Học lập trình 8051 - Lượt xem: 6.631
    Led 7 thanh 4 số điều khiển bằng nút bấm Led 7 thanh 4 số điều khiển bằng nút bấm
    Đăng bởi: HoangQuan69 - Thời gian: 09-10-2016, 15:08
    Chuyên mục: Học lập trình 8051 - Lượt xem: 5.938
    Chia sẻ Code đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307 Chia sẻ Code đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307
    Đăng bởi: Vũ Văn Thái - Thời gian: 13-05-2015, 09:00
    Chuyên mục: Học lập trình 8051 - Lượt xem: 28.702
    Bài 15: Lập trình quét phím matrix 4x4 hiển thị lên LCD 16x2 Bài 15: Lập trình quét phím matrix 4x4 hiển thị lên LCD 16x2
    Đăng bởi: Vũ Văn Thái - Thời gian: 20-11-2014, 08:57
    Chuyên mục: Học lập trình 8051 - Lượt xem: 31.809
    [Share] Code giao tiếp Graphic LCD 12864 SPI của máy GPHONE ZTE [Share] Code giao tiếp Graphic LCD 12864 SPI của máy GPHONE ZTE
    Đăng bởi: Vũ Văn Thái - Thời gian: 12-11-2014, 22:06
    Chuyên mục: Học lập trình 8051 - Lượt xem: 19.278
    [Share] Code C đo nhiệt độ dùng DS18B20 hiển thị lên LED 7 thanh [Share] Code C đo nhiệt độ dùng DS18B20 hiển thị lên LED 7 thanh
    Đăng bởi: Vũ Văn Thái - Thời gian: 12-11-2014, 09:02
    Chuyên mục: Học lập trình 8051 - Lượt xem: 19.603
    Bài 14: Đo nhiệt độ dùng cảm biến DS18B20 với 8051 Bài 14: Đo nhiệt độ dùng cảm biến DS18B20 với 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 19-10-2014, 10:11
    Chuyên mục: Học lập trình 8051 - Lượt xem: 25.432
    Bài 13: Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051 Bài 13: Đo nhiệt độ dùng LM35 kết hợp IC ADC0808 với 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 22-08-2014, 22:18
    Chuyên mục: Học lập trình 8051 - Lượt xem: 46.032
    Bài 12: Tạo xung PWM dùng ngắt timer 8051 Bài 12: Tạo xung PWM dùng ngắt timer 8051
    Đăng bởi: Vũ Văn Thái - Thời gian: 02-03-2014, 20:45
    Chuyên mục: Học lập trình 8051 - Lượt xem: 24.133
    
    Chào mừng hieutrang đã tham gia câu lạc bộ sáng tạo!
    Vũ Văn Thái - vuthai
    Hôm nay là sinh nhật của doinhugiobayxa, bangguong84, thaivande, haidong0212, quynang, ocbieu3636, skytnut, soidonghoangtd94, vuquocdungmta, khangdlk123, thanh7780, ngovanson, tuananhckd2504, lybang, splendid2504, Lesondt, thucduyen2604, hanhbe, tuanngocly95, anhhungsg, anhkhoa951, ← Gửi tin nhắn chúc mừng
    Múi giờ: UTC+07:00 - Asia/Ho Chi Minh ***** IP của bạn: 18.116.13.113 ***** Status: Cache Update thành công!