Олексій Фрунзе

Справжня стаття замислювалася як приклад реалізації розробки мікроконтролерного пристрою, керованого персональним комп’ютером по послідовному каналу. Вона призначена для тих, хто ще не має досвіду подібних розробок. Розібравшись з тим, як ПК управляє мікроконтролером, відображає, обробляє і зберігає отриману від нього інформацію, ви зможете застосувати ці знання для власних розробок. До того ж описане пристрій має ще й самостійну цінність: це керований цифровий вольтметр, результати вимірювання якого перед відображенням можуть бути оброблені комп’ютером за наперед заданим алгоритмом, а також збережені у файлі на вінчестері вашого ПК, переглянуті і роздруковані. Все це робить описане пристрій основою для простої системи збору, обробки та документування даних, корисної для електронників, які мають недостатній для самостійних розробок рівень знання микроконтроллерной техніки.

Введення

Метою даної роботи була розробка і створення найпростішого вимірювального пристрою на базі мікроконтролера все ще найпоширенішого на сьогоднішній день сімейства х51, яке могло б обмінюватися інформацією з персональним комп’ютером. У пристрої передбачалося реалізувати вимірювач напруги, який надалі міг бути доповнений різними приставками, що перетворюють інші безпосередньо вимірювані фізичні величини в напругу. Подібний пристрій дозволило б легко проводити серії вимірювань, будучи керованим комп’ютером, а також накопичувати результати і проводити їх комп’ютерну обробку. Піддане неважливим змінам, воно змогло б легко перетворитися на систему дистанційного контролю і управління обладнанням чи іншими приладами та пристроями.

Загальний опис пристрою. Електрична частина пристрою

Пристрій (рис.1), по суті, являє собою цифровий вольтметр. На вході вольтметра варто операційний підсилювач (DA1), що має високий вхідний опір. За операційним підсилювачем слід АЦП (DD2), що дозволяє оцифрувати цікавить нас напруга для подальшої передачі у мікроконтролер. Мікроконтролер DD3 є головним керуючим ланкою пристрою, так як він зчитує інформацію з АЦП і спілкується з персональним комп’ютером по послідовному каналу. У пристрій також входять перетворювачі харчування для вироблення +5 В для цифрової частини і для вироблення + / -10 В для операційного підсилювача, а також мікросхема перетворення рівнів (логічні <0> і <1> в -15: +15 В і назад) для обміну інформацією по послідовному каналу типу RS232.


Рис. 1.

Значення, що посилається в комп’ютер, лежить в діапазоні 0 … 4095 (що відповідає розрядності АЦП), 0 відповідає вхідного рівня 0В, 4095 – рівню 5В, залежність лінійна.

Швидкість обміну інформацією може бути вибрана як менше 9600 бод, так і вище – до 115 200 бод. На достатньо старих комп’ютерах, типу 386 і більш ранніх, верхня межа набагато нижче – 19200 бод. Це пов’язано з тим, що мікросхеми послідовного порту, встановлені в цих комп’ютерах, не були розраховані на більш високі швидкості.

Опис мікросхем

Перетворювач напруги живлення MAX680

Операційні підсилювачі зазвичай вимагають подачі на них двополярного харчування (наприклад, +10 В і -10 В відносно загального проводу). Радіоаматори, мало знайомі з сучасною елементною базою, використовують зазвичай для отримання такої напруги трансформатор з двома вторинними обмотками (або з одного, але з відведенням від середини), два фільтруючих конденсатора, два стабілізатора і т. д. Проте якщо у вас є в розпорядженні стабілізовану напругу 5В, а використовуваний операційний підсилювач, що вимагає двополярного живлення, може обійтися всього +7:10 В, споживаючи при цьому 1:2 мА, то згадані дві обмотки і два стабілізатора не знадобляться. Досить використовувати мікросхему MAX680 фірми Maxim (відзначимо, що подібні мікросхеми випускає Linear Technology і ряд інших відомих фірм). На вхід мікросхеми подається напруга Uвх величиною від 3:5 до 6:10 В (залежно від типу), на виходах її формуються напруги, рівні приблизно +2 Uвх. Чудово те, що, по-перше, для формування цих напруг крім 8-вивідних MAX680 або LT1026 потрібно всього лише 4 невеликих електролітичних конденсатора (див. рис. 1), а по-друге, при зміні вхідної напруги подвоєні вихідні змінюються синфазно, що практично не позначається на вихідному сигналі ОУ. Для більш детального ознайомлення з подібними мікросхемами автор рекомендує звернутися до відповідних фірмовим описам.

АЦП MAX1241

В останні роки в микроконтроллерной техніці отримали широкий розвиток мікросхеми, керовані по послідовному каналу. Однією з таких мікросхем є 12-розрядний АЦП МАХ1241. Як і у випадку з МАХ680, МАХ1241 має досить багато точних і наближених аналогів (МАХ187 від Maxim, LTC1286, LTC1298 від Linear Technology, AD7894 від Analog Devices і ряд інших).

МАХ1241 упакована в 8-вивідних корпус, харчується напругою від 2,7 до 5 В, споживає струм близько 5 мА. Вона вимагає застосування зовнішнього джерела опорного напруги (у даному випадку застосований прецизійний стабілітрон КР142ЕН19, формуючий напруга 2,50 В) і використовує для зв’язку з мікро всього 3 лінії.

Роботу МАХ1241 ілюструють часові діаграми, зображені на рис. 2. До початку перетворення і обміну вхід CS # МАХ1241 повинен підтримуватися мікроконтролером в одиничному стані. Для старту перетворення на цей вхід необхідно подати рівень логічного нуля. Процес перетворення в МАХ1241 займає трохи менше 8 мкс. Протягом усього часу перетворення МАХ1241 підтримує на своєму виході DOUT рівень логічного 0. Після завершення перетворення МАХ1241 переводить вихід DOUT в одиничний стан.


Рис. 2.

Перед початком перетворення мікроконтролер на вході SCLK МАХ1241 повинен встановити нульовий логічний рівень. Коли процес перетворення всередині АЦП завершиться, мікроконтролер повинен сформувати на вході SCLK послідовність не менше ніж з 12 позитивних імпульсів (рис. 2). Фронт першого імпульсу готує МАХ1241 до передачі даних. За спаду імпульсу на DOUT з’являється у вигляді логічного нуля або одиниці старший 12-й біт. Мікроконтролер зчитує цей біт, формує на SCLK фронт другого імпульсу, а через деякий час – його спад. За спаду другого імпульсу на DOUT з’являється зчитується потім мікроконтролером 11-й біт і т. д.

За спаду 12-го імпульсу на виході DOUT встановлюється молодший 1-й біт. Спад 13-го імпульсу переводить DOUT в нульовий стан, в якому він перебуває до установки в 1 входу CS #. Перекладом CS # в одиничний стан мікроконтролер інформує МАХ1241 про завершення процесу читання результату перетворення. Наступне перетворення МАХ1241 може здійснити приблизно через 1 мкс після установки CS # в 1.

Алгоритми роботи LTC1286, LTC1298 від Linear Technology і AD7894 від Analog Devices незначно відрізняються від описаного для МАХ1241. Більш докладно з ними можна ознайомитися, звернувшись до відповідних фірмовим описам.

Перетворювач рівнів MAX202Е

Мало для кого є секретом, що в стандартній логіці одиниця представляється рівнем напруги від 2,4 до 5 В, а нуль – від 0 до 0,8 В. Однак початківцям може бути невідомо, що при передачі по каналу RS-232 нуль і одиниця кодуються однаковими за величиною (від 5 до 12 В), але різними за знаком сигналами. У рамках цієї статті не передбачається пояснювати, чому прийнято робити так, а не інакше, – ми обмежимося лише констатацією цього факту.

Коль скоро для передачі по RS-232 стандартні логічні сигнали повинні бути перетворені в сигнали іншого рівня, необхідно передбачити в схемі відповідні засоби перетворення. Років 10 тому для цієї мети застосовувалися спеціально розроблені каскади з трьох-чотирьох транзисторів, пари діодів і майже десятка резисторів. Зараз ситуація значно змінилася: провідні виробники мікросхем випускають повністю закінчені перетворювачі, що вимагають мінімальної кількості додаткових елементів. До них відносяться МАХ202Е від MAXIM і повністю ідентична їй, аж до цоколевки, AD232 від Analog Devices. Усередині себе обидві мікросхеми містять перетворювач напруги +5 В у +10 В, ідентичний вищеописаному МАХ680, і каскади, що здійснюють перетворення логічних сигналів стандартного рівня в сигнали рівня по стандарту RS-232. Кожна зі згаданих мікросхем містить перетворювачі логічного рівня для двох приймачів і двох передавачів. Ми скористаємося тільки одним приемопередающим каналом.

Режим роботи МК з послідовним каналом

Як відомо (дивись, наприклад, номери 10 і 11 журналу «Радіо» за 1994 р.), у мікроконтролерів сімейства х51 існують чотири режими роботи прийомопередавача. Нас цікавитиме режим 1 як найбільш простий і прийнятний.

Режим 1 характеризується наступними параметрами:

  • обмін інформацією асинхронний;
  • передаються 10 біт за один акт обміну (старт-біт (0), 8 біт даних і стоп-біт (1));
  • швидкість прийому / передачі програмованими і задається таймером.

Це зручний режим для програмування: потрібно дуже небагато програмного коду для налаштування приймача-і роботи з ним. Хоча за бажанням можна використовувати і інші режими роботи. Метою ж даної статті є опис якогось пристрою, що має можливість спілкуватися з персональним комп’ютером.

Ми не будемо наводити тут опису того, як саме працює приймач. Цю інформацію можна буде почерпнути зі згаданих журналів «Радіо» або іншої літератури.

Основні підпрограми для МК

Основними підпрограмами для мікроконтролера будуть: зчитування даних з АЦП, ініціалізація УАПП, прийом байта і посилка байта.

Зчитування даних з АЦП

Налаштування ПК для обміну інформацією по послідовному каналу.

Для того щоб налаштувати ПК на обмін інформацією по послідовному каналу, необхідно зробити наступне:

  • заборонити всі переривання, так як в їх використанні необхідності немає;
  • налаштувати таймер 1 на роботу в режимі 2 з автоматичною перезавантаженням вмісту. Це необхідно для завдання швидкості обміну інформацією і підтримки її постійної;
  • завантажити в лічильник таймера початкові значення;
  • запустити таймер 1.

Приклад коду, розрахованого на швидкість обміну 9600 біт / с для кварцевогорезонатора з резонансною частотою рівною 11,059 МГц:

GET_VOLT:SETB DOUT; ДОЗВОЛИЛИ ВВЕДЕННЯ ДАНИХ ІЗ ADCSETB CS; ВСТАНОВИЛИ ПОЧАТКОВЕ СТАН ADCCLR SCLK; ВСТАНОВИЛИ ПОЧАТКОВЕ СТАН ADCCLR CS; ПОВІДОМИЛИ ПРО БАЖАННЯ ПРОЧИТАТИ ДАНІMUL AB; 4 МКС НА 12 MHZMUL AB; 4 МКС |MUL AB; 4 МКС} ДОЧЕКАЛИСЯ КІНЦЯ; | ОцифровкиMUL AB; 4 МКС /MOV R0, # 12; зчитуватися 12 БІТ
GET_VC:
   SETB  SCLK        ; 
   NOP               ; |
   NOP               ; |CLR SCLK;} сформував ІМПУЛЬС ДЛЯ ЧИТАННЯ БІТА
   NOP               ; |
   NOP               ; /MOV C, DOUT; ПРОЧИТАЛИ БІТ
   MOV   A,R2        ; 
   RLC   A           ; |
   MOV   R2,A        ; |MOV A, R3;} засунули БІТ У СЛОВО; | РЕЗУЛЬТАТУ - R3R2
   RLC   A           ; |
   MOV   R3,A        ; /DJNZ R0, GET_VC; зациклюється
   ANL   A,#0FHMOV R3, A; очистили старші біти R3R2SETB CS; БІЛЬШЕ НЕ ХОЧЕМО зчитуватися; (Інші біти = 0)MUL AB; 4 МКС НА 12 MHZ MUL AB; 4 МКС |MUL AB; 4 МКС |MUL AB; 4 МКС} MIN ВІДКЛАДІТЬ; | ПЕРЕД СЛІД.MUL AB; 4 МКС |MUL AB; 4 МКС /
   RET

Ця підпрограма викликається найпершою в основній програмі мікроЕОМ. В принципі її можна навіть і не оформляти як підпрограму.

Прийом і посилка байта

Підпрограми прийому та посилки байта по послідовному каналу дуже прості.

SERINIT:MOV IE, # 0; Заборонити всі перериванняMOV TMOD, # 20H; Встановити режим 2 для таймера 1MOV TH1, # REL96; Значення для автоперезагрузка лічильникаMOV TL1, # REL96; Початкове значення лічильника для 9600 біт / с; При SMOD = 0ANL PCON, # 7FH; Очистили SMODMOV SCON, # 50H; Режим для 8 біт даних і швидкості передачі,; Залежної від таймераSETB TR1; Старт таймера / сетчіка 1
RETде REL96 - константа, рівна 0FDh

Зчитувати байт з порту введення / виведення SBUF можна тільки при встановленому біті RI регістра керування / статусу SCON, що сигналізує про наявність байта в буфері прийому. Після зчитування цього байта біт RI необхідно скинути.

Після запису байта в порт введення / виведення потрібно дочекатися встановлення біта TI, який буде сигналізувати закінчення посилки байта в лінію. Потім біт TI також буде потрібно скинути.

Підпрограма прийому байта в акумулятор:

GETCH:
JNB           RI, GETCH
MOV           A, SBUF
CLR           RI
RET

Підпрограма посилки байта з акумулятора:

PUTCH:
MOV SBUF, A
SEND:
JNB          TI, SEND
CLR          TI
RET

Слід також відзначити, що ніяких засобів для виявлення помилок введення / виведення мікро-ЕОМ не має.

Для того щоб організувати перевірку програмно-апаратним чином, можна розширити кількість ліній введення / виведення, за якими будуть передаватися додаткові сигнали, і по них можна буде визначати стану, в яких знаходяться учасники діалогу, а також виявляти помилки.

Можна підвищити надійність прийому / передачі інформації й іншим шляхом: передавати з вісьмома бітами даних ще один біт – біт парності, обчислюється аналогічно прапору паритету в слові стану програми (Біт 0 PSW). Тільки обчислюватися він повинен для переданого або прийнятого байта. Після прийняття байта і біта парності необхідно порівняти їх на відповідність один одному. Якщо вони не відповідають, значить, мала місце помилка вводу / виводу. Для передачі додаткового 9-го інформаційного біта потрібно використовувати режим 2 або 3 роботи таймера / лічильника.

Загальна програма для МК. Діаграма станів пристрої

Загальна програма для мікроЕОМ базується на нижчеописаному алгоритмі. Алгоритм досить непростий, тому що все ж потрібно якимось чином, хоча б програмним методом, виявляти помилки введення / виводу і реагувати на їх появу.

Для більшої наочності до алгоритму, описаного звичайними словами, додається малюнок – так звана діаграма стану пристрою (рис.3), на якій наведено чотири основних стану пристрою з точки зору обміну інформацією з ЕОМ.


Рис. 3.

Заздалегідь обмовимо той факт, що наша мікро-ЕОМ є веденої, а персональний комп’ютер – провідним при обміні даними. Іншими словами, пристрій сам по собі, без наказу від ПК, нічого робити не повинно. Воно цілком підкоряється керуючого комп’ютера. Персональний комп’ютер обраний провідним з тієї простої причини, що він володіє більшою потужністю і здатний без особливих проблем управляти пристроєм. Крім того, він може дати користувачеві більше сервісних функцій.

Стан перше – Wait

У цьому стані пристрій виявляється відразу ж після включення напруги живлення. Тут воно очікує від комп’ютера запиту на ініціалізацію, який виражається в посилці комп’ютером символу NUL. Пристрій ж, у свою чергу, повинно у відповідь на отриманий запит включити і налаштувати, якщо потрібно, додаткові модулі та ресурси, а потім, якщо все пройшло нормально, послати в ЕОМ символ ACK. У разі ж помилки воно має послати NAK. Таким чином, відбувається перше «спілкування» двох «співрозмовників». Якщо хочете, вони повинні «обмінятись вітаннями» або «потиснути один одному руки ».

При вдалій ініціалізації пристрою з подальшою посилкою символу ACK, воно автоматично переходить у наступний стан. Цей перехід позначений стрілкою 1 на діаграмі.

Стан Ready

У цьому стані наша мікро-ЕОМ очікує запиту ПК на посилку виміряного значення, ліченого з АЦП. Запитом є символ XON. За прийняття цього символу пристрій переходить у новий стан – Sending. Переходу відповідає стрілка 2.

Стан Sending.

Потрапляючи сюди, мікроконтролер зчитує двійкове дванадцятирозрядний число з АЦП раніше зазначеним методом і посилає частинами в ЕОМ. У даній реалізації відбувається перетворення двійкового числа в трьохсимвольний шістнадцятковий еквівалент, наприклад, в <1FF> для десяткового числа 511. Спочатку надсилається <1>, потім і ще один.

По закінченні передачі значення в комп’ютер мікро-ЕОМ переходить у наступний стан по стрілці 4.

Стан Sent

Цей стан є останнім і як би замикає коло одиничного акту спілкування пристрою з комп’ютером. Тут від комп’ютера очікується підтвердження того, що він правильно прийняв значення, яке було йому адресовано.

Тут можливими є декілька варіантів відповіді ПК на надіслане число: він може відповісти про успішне прийомі символом XOFF, який означатиме, що більше поки не потрібно інших значень, а може відповісти символом XON, що означає, що потрібно ще одне значення. Якщо прийнятий XOFF, то пристрій повертається в стан готовності Ready (перехід 7 на діаграмі). Якщо ж прийнятий символ XON, то пристрій знову опиняється в стані Sending (перехід 5) і повторює зчитування з АЦП з подальшою передачею числа в лінію. Не розглянутим виявився лише той випадок, коли ПК не сподобалося те, що він отримав: наприклад, замість символів діапазону <0> … <9>, …, Він отримав дещо інше, або < ,>. У цій ситуації він посилає нашому влаштуванню символ NAK, який повинен трактуватися як запит на повторну посилку останнього значення, що і відбувається: пристрій знову переводиться в стан Sending (перехід по стрілці 6).

Залишилися не описаними переходи, позначені стрілками 3 і 8 діаграми. Якщо комп’ютер виявить серйозну помилку введення / виводу або йому знадобиться припинити обмін з пристроєм, то він просто пошле ініціалізаційний NUL, за яким відбудеться ініціалізація пристрою і воно опиниться в стані готовності Ready.

Тобто в якому б стані не знаходилося наш пристрій, воно зобов’язане відповісти на ініціалізаційний запит, таким же чином, як і при первинній ініціалізації (див. Пункт стан Wait). Якщо ж мікро-ЕОМ отримала якийсь несподіваний або невірний символ або запит, то воно завжди повинно відповісти на нього символом NAK.

Така стратегія є виграшною, так як при подібна організація програми для пристрою полегшує виконання відразу кількох завдань: мікро-ЕОМ і ПК не гратимуть в зіпсований телефон, по-перше, а, по-друге, вони зможуть просто і ефективно «спілкуватися» один з одним.

Переходимо до ПК. Загальна програма для ПК. Діаграма станів ПК.

Принципово загальна програма для комп’ютера не буде ні чим відрізнятися від використовуваної в мікроконтролері. Алгоритм буде аналогічним, схожою буде і діаграма станів.

Перший стан Initialization

Сюди комп’ютер потрапляє, коли користувач натискає на його клавіатурі клавішу, відповідну прийняттю єдиного значення. У цьому стані комп’ютер посилає символ ініціалізації NUL в пристрій і очікує відповіді на нього символом ACK або NAK. Якщо був отриманий ACK, значить ініціалізація пройшла нормально і можна продовжити роботу – перейти в наступний стан по стрілці 2 на діаграмі. У разі отримання NAK робота повинна припинитися і комп’ютера слід перейти в заключний стан Done по стрілці 1.

Стан Ready

У цьому стані комп’ютер готується до прийому символів, з яких складатиметься запитане з мікро-ЕОМ значення. Запитів на посилку значення існує два. Перший – це звичайний запит значення, йому відповідає символ XON.

Другий же запит – це запит на повторну посилку останнього значення. Це необхідно в тому випадку, якщо значення не було прийнято повністю за якийсь об’єктивний час або були прийняті невірні символи, які не потрапляють в діапазони від <0> до <9> і від до. Для запиту на повторну посилку відводиться символ NAK.

Далі, після підготовки до прийому символів значення відбувається один з двох вищевказаних запитів до нашого пристрою, потім комп’ютер переходить по стрілці 4 в стан прийому значення.

Cостояние Receiving

Тут ПК просто зчитує три символи значення, виміряного і перетвореного за допомогою АЦП. Як було сказано раніше, існує деякий об’єктивне час очікування символу комп’ютером. Якщо символ НЕ був лічений за цей час, то така ситуація інтерпретується як помилкова, тобто мала місце помилка вводу / виводу.

До речі кажучи, при досить високих швидкостях обміну інформацією (більше 19200 біт / с) або при роботі в операційній системі MS-Windows (будь-якої версії) часто буває, що комп’ютер з посиланих йому трьох символів приймає тільки два, а іноді й того менше – один. Щоб комп’ютер «не висів» – очікував нескінченно довго відсутнього або пропущеного символу – вводиться деякий час, обмежує це очікування. На жаль, ці пропуски апаратним методом ніяк не виявляються.

У даній реалізації визначено два типи часу очікування, які можуть бути задані користувачем з клавіатури. Перший тип – це час очікування 1-го з 3-х символів. Він дозволяє пристрою спокійно, ні куди не кваплячись, виміряти, оцифрувати необхідне нам число і перетворити його в символьний еквівалент. А другий тип – це часовий ліміт на посилку другого і третього символів.

Перейдемо тепер до можливих переходах зі стану Receiving в інші стани.

Якщо так і не було прийнято всіх 3-х символів значення за відведений час, то комп’ютер повинен попросити наш пристрій послати йому значення повторно. Цієї ситуації відповідає перехід по стрілці 5, тобто комп’ютер робить запит символом NAK і переходить назад у стан Ready.

Якщо в процесі прийому комп’ютером була зафіксована помилка вводу / виводу (а у ПК є така можливість досить проаналізувати регістр стану послідовного порту), то краще привести і комп’ютер і мікро-ЕОМ в початковий стан, тобто повторити ініціалізацію. Тому на діаграмі також присутній і стрілка 3.

І, нарешті, якщо комп’ютер отримав від пристрою всі три символи, то він переходить у стан аналізу отриманого значення – в стан Received по стрілці 8.

Джерело: rtcs.ru