1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

giúp đỡ về ngắt ngoài khi lập trình 8051

Chủ đề trong 'Điện - Điện tử - Viễn thông' bởi spiritnguyen, 13/05/2004.

  1. 1 người đang xem box này (Thành viên: 0, Khách: 1)
  1. spiritnguyen

    spiritnguyen Thành viên mới

    Tham gia ngày:
    10/09/2003
    Bài viết:
    37
    Đã được thích:
    0
    giúp đỡ về ngắt ngoài khi lập trình 8051

    em lập trình cho 8051 bằng ASM. khi du`ng ngắt ngoài
    ORG 0
    LJMP MAIN
    ORG 0003H
    LJMP TRAI
    ORG 0030H
    MAIN:
    MOV IE,#085H
    ...........
    SJMP $
    TRAI: ..............
    RETI
    END

    nhưng em muốn ngắt này chỉ xảy ra trong 1 số lần nhất định( ví dụ 5 lần) sau đó làm công việc khác thì chèn đoạn lệnh khác vào đâu?
  2. huyphuc1981_nb

    huyphuc1981_nb Thành viên mới Đang bị khóa

    Tham gia ngày:
    05/05/2002
    Bài viết:
    4.356
    Đã được thích:
    165
    Không hiểu??????
    Có lẽ thêm một biến đếm trong vector.
  3. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Hi!
    Theo tui nghĩ thì bác cần thêm một biến đếm, mỗi lần ngắt xảy ra thì bác tăng lên 1. Trước khi thoát khỏi ngắt, bác kiểm tra biến này xem đã đủ số lần mong muốn chưa. Nếu đủ thì bác xoá cờ cho phép ngắt này đi. Tui chưa làm cái này nhưng tui nghĩ cách đó có thể giải quyết được. Chúc thành công.
  4. nmtbk

    nmtbk Thành viên mới

    Tham gia ngày:
    23/08/2003
    Bài viết:
    114
    Đã được thích:
    0
    Theo kinh nghiệm của các bác thì viết code bằng Asm thì có ưu việt gì nổi trội hơn C không (ngoài việc hình như chương trình chạy nhanh hơn và dung lượng nhỏ hơn).
    Em toàn viết bằng C, hix còn Asm thì 1 lệnh bẻ đôi không biết thế mới gay nhưng vẫn chưa thấy có vấn đề gì...
  5. spiritnguyen

    spiritnguyen Thành viên mới

    Tham gia ngày:
    10/09/2003
    Bài viết:
    37
    Đã được thích:
    0
    Xin hỏi tiếp, ví dụ như khi ngắt INT0 xảy ra và chương trình nhảy đến dia chỉ 0003h và chạy đến chổ RETI thì chương trình trở lại main hay trở chổ lai SJMP $ vậy
  6. spiritnguyen

    spiritnguyen Thành viên mới

    Tham gia ngày:
    10/09/2003
    Bài viết:
    37
    Đã được thích:
    0
    Xin hỏi tiếp, ví dụ như khi ngắt INT0 xảy ra và chương trình nhảy đến dia chỉ 0003h và chạy đến chổ RETI thì chương trình trở lại main hay trở lại chổ SJMP $ vậy?
    Được spiritnguyen sửa chữa / chuyển vào 21:30 ngày 14/05/2004
  7. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Chương trình main của bạn đang chạy, khi int0 xảy ra tại 1 thời điểm bất kỳ nào đó, khi đó giả sử thanh ghi PC của c51 đang mang địa chỉ hhll thì hhll lần lượt được push vào stack, sp tăng lên 2 lần. Đồng thời hàm thi hành TRAI của bạn thi hành, khi gặp lệnh reti thì hh và ll được pop ra khỏi stack vào thanh ghi PC và c51 sẽ thi hành lệnh tại địa chỉ hhll.
    Mình chưa bao giờ sử dụng opcode $, hình như sjmp $ nó chính là thì hành duy nhất lệnh sjmp tại địa chỉ của lệnh sjmp.
    Còn nếu bạn muốn chèn đoạn code khác ngay trong hàm TRAI thì đơn giản :
    TRAI:
    inc counter
    cjne counter,#number_be_counted, _exit
    mov dptr,#"địa chỉ của lệnh cần thi hành"
    mov a, dph
    push acc
    mov a,dpl
    push acc
    _exit: reti
    Bạn chú ý cần thêm 1 lệnh ret ở đâu đó sau khi lệnh bạn cần chèn thi hành xong, nếu không sẽ bị tràn stack.
    Mà hình như bạn chưa khai báo stack trong chương trình.
    Nếu vậy bạn phải thêm vào: mov sp,#giá trị khởi đầu của stack tại đầu chương trình main.
    OK?
  8. huyphuc1981_nb

    huyphuc1981_nb Thành viên mới Đang bị khóa

    Tham gia ngày:
    05/05/2002
    Bài viết:
    4.356
    Đã được thích:
    165
    Chán chả buồn nói.
    Viét chương trình cho MP có một điều thú vị là tự mình xây dựng lên các tài nguyên của một máy tính. Từ các interrup vector, In- out runtime hay đoạn khởi động (POST). Tiếp theo tự xây dựng protocol và ứng dung. Bạn làm thế này thì tự đánh mất thú vị đó.
  9. eHard

    eHard Thành viên mới

    Tham gia ngày:
    28/04/2004
    Bài viết:
    71
    Đã được thích:
    0
    Hi!
    Bác làm theo như bác Opendoors là được rồi nhưng nếu bác biết byte thấp và byte cao của địa chỉ của câu lệnh cần thực hiện thì move vào A và push luôn khỏi cần qua dptr. Chúc thành công.

Chia sẻ trang này