Sử dụng nhiều ngắt ngoài trong PIC


9

Tôi đã sử dụng PIC16F877(biểu dữ liệu ) cho một số dự án. Đối với một ngắt thay đổi pin bên ngoài duy nhất, bạn có thể sử dụng PORTB0ngắt. Nhưng bây giờ tôi cần hỗ trợ 8 ngắt thay đổi pin độc lập bên ngoài, trong một mạch đơn.

Trong biểu dữ liệu có ghi 15 ngắt PIC16F877, nhưng tôi đoán chúng được tính bao gồm cả ngắt tràn bộ đếm thời gian, v.v ... vô dụng trong trường hợp này.

Đây là những gì datasheet nói về INTCONđăng ký.

nhập mô tả hình ảnh ở đây

Tôi có thể có 4 ngắt độc lập bằng bit0 RBIFkhông? Nó đại diện cho sự thay đổi trong PB7:PB4. Làm thế nào tôi có thể xác định pin nào đã thay đổi, bằng cách đọc giá trị cổng trong thói quen ngắt?

Ngay cả tôi nhận được câu trả lời tích cực ở trên, tôi cần 8 ngắt? Tất nhiên tôi vẫn có thể sử dụng INTE, để PORTB0thay đổi. Sau đó 4 + 1 = 5, nhưng 3 người khác thì sao? (Tuy nhiên, tất cả 8 sự kiện ngắt đều cùng loại, 4 + 1 + 3 = 8điều này có vẻ xấu, phải không?)

Không có nhiệm vụ nặng nề nào khác được mong đợi từ bộ điều khiển vi mô khác giám sát 8 chân. (Nói về các tác vụ khác, nó sẽ phải duy trì một tập hợp các biến đếm riêng biệt và thường xuyên truyền khoảng 4 byte cho PC một cách an toàn)

Mọi góp ý đều được chào đón. Ngay cả khi đó là về việc thay đổi bộ điều khiển vi mô cho phù hợp hơn (nhưng uh .. đừng bảo tôi tránh xa PICs).


2
Không sử dụng ngắt, có thể bạn có thể theo dõi các chân trong chương trình chính. Nhưng điều đó không hoàn hảo mặc dù. Thay thế, bạn có thể đi cho Arduino. Mặc dù nó không phải là PIC, nhưng nó khá đơn giản, bạn sẽ dễ dàng hiểu vì bạn đã quen thuộc với PIC.
Anubis

1
Nếu bạn sử dụng ngắt RBIE, bạn chỉ có thể đệm giá trị trước đó mỗi lần và XOR để tìm những gì đã thay đổi. Nên khá nhanh để thực hiện.
PeterJ

@PeterJ tôi không hiểu lắm. Bộ đệm nào có giá trị?
Tên mã SC

@PeterJ tuyệt vời! chờ đợi ...
Tên mã SC

1
Một cách là sử dụng cổng 8 đầu vào bên ngoài (chẳng hạn như 74LS30 ngày xưa) để kết hợp các tín hiệu bên ngoài vào một chân ngắt. Vì 74 (HC) 30 là cổng NAND, bạn sẽ cần tất cả các đầu vào ở trạng thái không hoạt động - chúng cũng cần được kết nối với các chân cổng để bạn có thể xác định các ngắt nào đang hoạt động bằng cách đọc cổng.
Brian Drumond

Câu trả lời:


3

Đây là mã giả C để giải thích một ý tưởng. Nó sử dụng và HOẶC độc quyền để tìm ra các chân đã thay đổi và sẽ gọi các trình xử lý khác nhau của bạn trong một ngắt RBIE. Tùy thuộc vào mức độ quan trọng của ứng dụng, bạn có thể muốn kiểm tra cách PIC xử lý các tình huống như cổng thay đổi trong khi ngắt được thực thi để đảm bảo bạn sẽ không bỏ lỡ bất kỳ sự kiện nào.

int old_port_b;

void isr_handler()
{
    int new_port_b, changed_pins;
    new_port_b = read_port_b();
    changed_pins = new_port_b ^ old_port_b;
    if (changed_pins | 1)
        rb0_hander();
    if (changed_pins | 2)
        rb1_hander();
        // ... etc
    old_port_b = new_port_b;
}

int main()
{
    old_port_b = read_port_b();
    enable_interrupt();
}

Tôi hiểu rồi, cảm ơn! nhưng đó không phải là câu trả lời chính xác mà tôi đang tìm kiếm. Bằng cách đó, bạn chỉ có thể theo dõi RB7:RB44 chân. Nhưng tôi đang yêu cầu một cách để theo dõi 8 chân. bất cứ đề nghị nào?
Tên mã SC

Tôi đoán có một lý do bạn không thể sử dụng RB0 - RB7 ở trên nên hoạt động? Mặt khác, tôi thực sự không thể nghĩ ra một cách nào, nếu việc chuyển mã nhanh chóng không quan trọng, bạn có thể sử dụng kiểu mã trên trong một bộ đếm thời gian (hoặc chỉ vòng lặp chính).
PeterJ

Đối với PIC đó, nếu bạn cần sử dụng các ngắt để thực hiện việc này, thủ thuật XOR trên RB4: RB7 và bốn ngắt cho RB0: RB3 là cách tốt nhất. Nếu bạn không cần ngắt, chỉ cần thăm dò toàn bộ cổng trong mã của bạn hoặc sử dụng ngắt hẹn giờ để xử lý việc bỏ phiếu nếu bạn cần tỷ lệ mẫu cứng
Scott Seidman

and four interrupts for the RB0:RB3? PIC16F877 không hỗ trợ bất kỳ ngắt cho RB1:RB3, hả?
Tên mã SC

Tôi đã bỏ lỡ điều đó trong bảng dữ liệu, tôi đã cho rằng nó bao phủ toàn bộ cổng. Nhưng tôi đã thấy nhận xét khác của bạn về một lần mỗi giây vì vậy tôi nghĩ rằng bạn nên chạy nó trong vòng lặp chính của mình. Với các ngắt, bạn sẽ cần quan tâm đến các biến cập nhật tại bất kỳ thời điểm nào trong khi thực hiện và cách xử lý các thay đổi pin trong khi ngắt đang chạy. Nó thực sự có vẻ như nó sẽ chỉ làm phức tạp nó không có lợi ích thực sự. Ngoại lệ duy nhất tôi có thể nghĩ là nếu bạn muốn sử dụng thức dậy khi bị gián đoạn, trong trường hợp đó bạn cần phần cứng MUX chúng.
PeterJ

1

Phần đó chỉ có 4 ngắt thay đổi pin và một vài phần khác bạn có thể thiết lập trên các cạnh đã chọn. Một chiến lược sẽ là phát hiện ra một sự thay đổi trong giá trị 8 bit bên ngoài, sau đó làm gián đoạn sự không phù hợp. Điều đó trở nên lộn xộn trong phần cứng, nhưng sẽ chính xác những gì bạn muốn.

Các tham số quan trọng mà bạn chưa nêu là bạn cần phản ứng nhanh như thế nào với thay đổi mã pin và thời gian tối thiểu mà thay đổi pin sẽ duy trì để nó có hiệu lực. Tùy thuộc vào câu trả lời, bạn có thể thăm dò ý kiến ​​dựa trên phần ngắt thông thường trong phần sụn. 16F877 có thể chạy ở tốc độ lệnh 5 MHz và việc kiểm tra thay đổi sẽ chỉ mất một vài lệnh. Giả sử bạn thiết lập ngắt sau mỗi 50 hướng dẫn. Điều đó sẽ để lại một phần thời gian của bộ xử lý cho mã tiền cảnh. Tốc độ ngắt sẽ là 100 kHz và 10 giai đoạn. Tất nhiên, mã tiền cảnh sau đó vẫn cần xem cờ thay đổi và làm gì đó với nó, vì vậy thời gian phản hồi sẽ là hơn 10 Lời, nhưng bạn chưa nói gì về những gì bạn cần làm khi phát hiện thay đổi. Nếu điều này chỉ cần đáp ứng trong thời gian của con người,


Xin lỗi về các chi tiết còn thiếu. Vì tỷ lệ đáp ứng dự kiến once per secondsẽ là đủ. Khi một thay đổi pin (chỉ có một cạnh, giả sử tăng) được phát hiện, một bộ đếm (biến) phải được tăng lên. Trong vòng lặp chính, nó phải giám sát các giá trị bộ đếm và khi một giá trị cao hơn một giá trị nhất định, bốn byte phải được truyền qua USARTPC. Sau đó đặt lại giá trị bộ đếm có liên quan về không. Đơn giản như vậy. Tôi đoán các tùy chọn bỏ phiếu sẽ đi tốt phải không?
Tên mã SC

2
Mỗi giây một lần ! Vì vậy, tất cả những gì đau đớn trên các ngắt cho? Điều này dễ dàng được thực hiện với bỏ phiếu định kỳ. Có vấn đề gì vậy?
Olin Lathrop

Ừm ... tôi mặc dù sẽ tốt nhất vì có 8 người trong số họ và cũng không thể dự đoán được câu trả lời (nhưng giá trị đó có thể được coi là tối thiểu). Chào! mọi người có thể phạm sai lầm, phải không .. :(
Tên mã SC

1

Bạn có thể sử dụng NAND cổng 8 đầu vào như được đề cập bởi @Brian Drumond để tăng ngắt qua chân INT và cũng kết nối các nguồn ngắt của bạn với Đăng ký thay đổi song song 8 bit song song như "74HC165N", do đó bạn sẽ cần chỉ đọc dữ liệu từ Đăng ký thay đổi đó sau khi ngắt tăng và sẽ cung cấp cho bạn thông tin về nguồn ngắt thực sự của bạn ... nó có thể không phải là cách nhanh nhất, nhưng dễ mở rộng và sẽ sử dụng không quá 5 chân và nếu bạn thêm hệ thống kiểm soát địa chỉ (MUX, LATCH, ...), thì bạn sẽ chỉ cần một cây thông để thông báo ngắt và các chân khác có thể được sử dụng lại vào các thời điểm khác nhau cho các tài nguyên khác nhau;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.