Використання декількох зовнішніх переривань у PIC


9

Я використовував PIC16F877( технічний паспорт ) для декількох проектів. Для однієї зовнішньої перерви зміни штифта ви можете використовувати PORTB0переривання. Але зараз мені потрібно підтримати 8 незалежних зовнішніх переривань зміни контактів, в одному ланцюзі.

У листі даних сказано, що в ньому є 15 переривань PIC16F877, але я думаю, що вони враховуються, включаючи переривання переповнення таймера і т. Д., Які в даному випадку марні.

Це те, що говорить про INTCONреєстр.

введіть тут опис зображення

Чи можу я мати 4 незалежні переривання за допомогою bit0 RBIF,? Це являє собою зміни в PB7:PB4. Як я можу визначити, який PIN-код змінився, читання цього порту в режимі переривання?

Навіть я отримую позитивні відповіді на вище, мені потрібно 8 перерв? Звичайно, я все ще можу використовувати INTEдля PORTB0змін. Тоді 4 + 1 = 5, а як же інші 3? (Однак, якщо всі 8 подій переривання є однотипними, 4 + 1 + 3 = 8річ здається негарною, чи не так?)

Ніяких інших важких завдань, які не очікуються від мікроконтролера, крім того, щоб контролювати 8 контактів. (Якщо говорити про інші завдання, то доведеться підтримувати набір окремих змінних лічильників і часто послідовно передавати близько 4 байт на ПК)

Будь-які пропозиції вітаються. Навіть якщо мова йде про зміну мікроконтролера на більш підходящий (але е .. не кажіть мені йти від PICs).


2
Не використовуючи переривань, можливо, ви можете відстежувати шпильки в основній програмі. Але це не ідеально. Як альтернатива, ви можете поїхати на Arduino. Хоча це не PIC, він досить простий, ви легко зрозумієте, як ви вже знайомі з PIC.
Анубіс

1
Якщо ви використовуєте RBIE переривання, ви можете просто буфер попереднього значення кожен раз і XOR, щоб знайти те, що змінилося. Має бути досить швидким для виконання.
PeterJ

@PeterJ я цього не зовсім зрозумів. Буфер, яке значення?
Кодована назва SC

@PeterJ чудово! чекаю ...
Кодована назва SC

1
Один із способів - використовувати зовнішні 8-вхідні ворота (наприклад, 74LS30 за старих часів) для об'єднання зовнішніх сигналів на один штир переривання. Оскільки 74 (HC) 30 - це ворота NAND, вам знадобляться всі входи високо в спокійному стані - вони також повинні бути підключені до шпильок порту, щоб ви могли визначити, які переривання були активними, читаючи порт.
Брайан Драммонд

Відповіді:


3

Це псевдокод C для пояснення однієї ідеї. Він використовує і ексклюзивно АБО, щоб визначити, які штифти змінилися, і зателефонує вашим різним обробникам в межах одного переривання RBIE. Залежно від того, наскільки критично важливим є додаток, ви можете перевірити, як PIC обробляє такі ситуації, як зміна порту під час виконання переривання, щоб переконатися, що ви не пропустите жодних подій.

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();
}

Я розумію, дякую! але це не точна відповідь, яку я шукаю. Таким чином, ви можете контролювати RB7:RB4лише 4 штирі. Але я прошу способу відстежувати 8 контактів. будь-яка пропозиція?
Кодована SC

Думаю, є причина, по якій не можна використовувати RB0 - RB7, щоб вище працювало? В іншому випадку я не можу придумати спосіб, якщо тригерування коду швидко не є життєво важливим, ви можете використовувати вищевказаний стиль коду для переривання таймера (або просто основного циклу).
PeterJ

Для цього PIC, якщо вам потрібно використовувати переривання для цього, хитрість XOR на RB4: RB7 та чотири переривання для RB0: RB3 - це шлях. Якщо вам не потрібно переривання, просто запитайте весь порт у своєму коді або використовуйте таймер переривання для обробки опитування, якщо вам потрібен жорсткий показник вибірки
Скотт Сейдман

and four interrupts for the RB0:RB3? PIC16F877 не підтримує жодних перерв для RB1:RB3, так?
Кодована назва SC

Я пропустив, що в аркуші даних я вважав, що він охоплює весь порт. Але я бачив ваш інший коментар приблизно раз на секунду, тому я думаю, вам краще просто запустити це у своєму головному циклі. З перериваннями вам потрібно подбати про оновлення змінних у будь-якій точці під час виконання та про те, як обробляти зміни штифтів під час запуску переривання. Це дійсно звучить так, що це просто ускладнить це без реального виграшу. Єдиний виняток, про який я міг би придумати, - якщо ви хочете використовувати будильник від сну на перерві, то в такому випадку вам потрібно встановити їх MUX.
PeterJ

1

У цій частині є лише 4 переривання зміни штифта та кілька інших, які ви можете встановити на вибраних краях. Однією з стратегій було б виявити зміну 8-бітного значення зовні, а потім перервати невідповідність. Це стає безладним в апаратному забезпеченні, але вийде саме те, що вам потрібно.

Важливими параметрами, які ви не вказали, є те, наскільки швидко потрібно реагувати на зміну шпильки, і який мінімальний час збережеться зміна шпильки, щоб вона була дійсною. Залежно від відповідей, ви можете опитуватись на основі регулярного переривання програмного забезпечення. 16F877 може працювати зі швидкістю 5 МГц інструкцій, а для перевірки змін знадобиться лише кілька інструкцій. Скажімо, ви встановлювали переривання кожні 50 інструкцій. Це залишило б гарну частину часу процесора коду переднього плану. Частота переривання становитиме 100 кГц, а період - 10 мкс. Звичайно, перед кодом переднього плану все ж слід побачити прапор зміни та зробити щось із цим, тому час відповіді буде більше 10 мкс, але ви нічого не сказали про те, що вам потрібно зробити, коли виявлено зміну. Якщо на це просто потрібно реагувати в людський час,


Вибачте за відсутні дані. Оскільки очікувана швидкість відповіді once per secondбуде достатньою. Коли виявлена ​​зміна штифта (лише один край, скажімо, піднімається), лічильник (змінний) повинен бути збільшений. У головному циклі він повинен стежити за значеннями лічильників, і коли коефіцієнт вищий за певне значення, чотири байти повинні бути передані через USARTПК. Потім відновіть відповідне значення лічильника до нуля. Просто як це. Я здогадуюсь, варіант опитування піде добре?
Кодована SC

2
Раз на секунду ! То для чого все мука над перебоями? Це легко робиться за допомогою опитування періодично. У чому тоді проблема?
Олін Латроп

гм ... я хоч і буде найкращим, оскільки їх є 8, а також відповідь неможливо передбачити (але це значення можна вважати мінімальним). ей! люди можуть робити помилки, правда .. :(
Кодована SC

1

Ви можете використовувати 8-вхідні ворота NAND, як згадував @Brian Drummond, щоб підняти переривання через INT-контакт і також підключити джерела переривань до 8-бітового реєстру зсуву паралельного входу / послідовного виходу типу "74HC165N", тож вам знадобиться просто прочитати дані з цього реєстру Shift після того, як перерва піднялася, і це дасть вам інформацію про ваше фактичне джерело переривання ... це може бути не найшвидшим способом, але легко розширитись і використовуватиме не більше 5-ти контактів, і якщо ви додасте систему контролю адреси (MUX, LATCH, ...), вам знадобиться лише одна сосна для сповіщення про переривання, а інші штифти можуть бути використані в різний час для різних ресурсів;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.