Розширення кількості портів мікроконтролера PIC18 через SPI-інтерфейс
Увага! Наведена стаття є авторським перекладом з німецької мови і не може використовуватися частково або повністю без дозволу автора-перекладача. Протиправне копіювання статті буде розглядатися як свідоме порушення авторських прав!
Передмова
Підключення додаткової периферії у вигляді додаткових кнопок, клавіатур, пристроїв виводу, екранів, світлодіодів тощо не завжди можливе через обмежену кількість портів введення-виведення мікроконтролера. Варіантів розширення в таких випадках достатньо багато, але в сучасних мікроконтролерах існує можливість підключення через послідовні периферійні інтерфейси стандартів SPI та I²C. У наведеній статті представлено варіант підключення периферії в режимах введення-виведення за протоколом SPI.
Дешевизна і широке поширення мікросхем, що підтримують цей протокол, дозволяє проектувати на їх основі різноманітні пристрої: перетворювачі послідовного коду в паралельний і навпаки, модулі зчитування з матричних клавіатур, годинників тощо.
Дана стаття може бути використана як посібник для вивчення основ мікропроцесорної техніки на допомогу школярам і студентам.
Поставлене завдання
У моєму випадку виникла необхідність підключення 12-клавішної клавіатури до мікроконтролера PIC18. Для цього я використав модуль MSSP мікроконтролера, попередньо налаштувавши його програмно в режим SPI. Передача даних повинна здійснюватися в режимі введення та виведення. Інформація про натиснуту клавішу виводиться на екран 7-сегментного індикатора. Виключається ситуація натискання кількох клавіш одночасно і їх неправильна інтерпретація мікроконтролером. Використовується мінімальна кількість портів самого мікроконтролера. Щодо вартості - використано масові ІС компанії Microchip.
Апаратура
Практична найпростіша реалізація прикладу представлена на малюнку 1.
Як видно на малюнку, використовуються всього 4 виходи мікроконтролера, які при цьому розширюються в 16 портів введення-виведення.
Для управління використано мікроконтролер PIC18F4520 та мікросхему MCP23S17 компанії Microchip. Мікроконтролер тактується частотою кварцевого резонатора 20МГц через порти RA6, RA7. Рекомендується для запуску кварца підключити два конденсатори ємністю 15-25 пФ між портами RA6, RA7 та GND, бажано різної ємності. За досвідом знаю, що деякі кварци схильні до незапускання через свої внутрішні особливості та особливості друкованої плати. У будь-якому випадку, в документації до конкретних кварців присутні рекомендовані параметри обв'язки. Порти MCLR та SDI, які працюють як входи, необхідно підключити через резистор до +5В для забезпечення на них логічної 1. Порти RC3, RC5 працюють як виходи і повинні бути відповідно програмно налаштовані. Мікросхема U3 призначена для перетворення бінарного коду в десятковий для коректного відображення на екрані індикатора. GPA0-GPA3, GPB0-GPB3 використовуються як виходи, GPB4-GPB7 - як входи з початковим станом логічної одиниці.
Слід сказати, що дана комбінація достатня для симуляції, на реальній платі необхідно встановити додатково токообмежувальні резистори між індикатором та U3, забезпечити фільтрацію по живленню.
Принцип роботи
Опрос стану клавіш відбувається динамічно, це означає, на нашому прикладі, на верхній рядок програмно подається логічна "1". Після цього йде опитування стовпців на наявність на їх виходах логічної "1". Далі "1" зміщується на другий рядок і опитування повторюється. Таким же чином опитуються клавіші спарені з рядами 3 і 4, і цикл повторюється. Наприклад, якщо натиснута клавіша 8, то при подачі на ряд 2 "1" виявиться, що у другому стовпці виявлено логічну "1" і це буде ознакою натискання кнопки.
Натискання кожної з клавіш формує 8 бітний код на виходах GPB мікросхеми U2. Для подальшої роботи необхідна правильна інтерпретація цього коду та виведення на індикатор.
Програма
Вихідний код був написаний на Сі в MPLAB IDE і симульований в Proteus. Вихідник містить файл Main.c, де здійснюється налаштування мікроконтролера в режимі SPI, встановлюється швидкість передачі даних, налаштування портів на вхід-вихід, установка первісних значень портів MCP23S17. Виклик функцій „Keyboard()“ і „SPI_Transmition“ здійснює опитування стану клавіатури і виведення інформації на індикатор відповідно.
Функція initISPI() налаштовує порти введення-виведення, режим SPI, частоту передачі (fOSZ/4) і власне дозволяє роботу модуля MSSP(SSPCON1bits.SSPEN).
Передача даних між мікроконтролером і MCP23S17 складається з 24 біт (3 байти). Перший байт містить інформацію про апаратну адресу та біт прийому-передачі інформації. У другому байті знаходиться інформація про регістр MCP23S17, для якого призначена інформація (регістр введення, виведення або регістр специфічних налаштувань). Третій байт містить власне дані (Малюнок 2).
Функція Keyboard() виводить послідовно +5В на рядки A,B,C,D і опитує при цьому стовпці 1,2 і 3. Визначені бітові значення порту інтерпретуються і повертаються значеннями 0-9,10 і 11 і виводяться через порти GPA0-GPA3 на індикатор у десятковій формі.
Підключення кількох пристроїв SPI
Наведенний варіант удосконалення схеми являє собою підключення двох мікросхем MCP23S17, підключених через інтерфейс SPI (Малюнок 3). Як видно з схеми, додаткове розширення портів не вимагає додаткових портів мікроконтролера. Більше того, апаратна адресація (А0-А2) мікросхем дозволяє підключати до 8 мікросхем MCP23S17, 128 додаткових портів введення-виведення відповідно. На схемі та в відео-прикладі (див. посилання) представлено варіант підключення додаткового ЖКІ індикатора та драйвера крокового двигуна в півкроковому режимі додатково до клавіатури та 7-сегментного індикатора.
Посилання
PIC18 Datasheet
MCP23S17_Datasheet
Рекомендації
Наведена стаття є симуляцією. У реальному пристрої рекомендується впровадити програмне виключення дребезжання контактів, наприклад:
char i,j; if(кнопка_нажата==true) { for (i=0;i<256;i++) { for (j=0;j<256;j++) } } if(кнопка_нажата==true) виконати_дію();
Приклад по суті є повторним опитуванням стану кнопки після затримки у вигляді подвоєного циклу і затухання дребезжання контактів.
- mc192.rar (2 Кб)