Re: Програмування мікроконтролерів MCS-51 (Intel 8051 сумісних)
у мене зіпсувався настрій, коли я дізнався, що лише 2 наявних у мене пульти працюють у цьому стандарті.
унiверсальний декодер
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Системне програмування → Програмування мікроконтролерів MCS-51 (Intel 8051 сумісних)
у мене зіпсувався настрій, коли я дізнався, що лише 2 наявних у мене пульти працюють у цьому стандарті.
унiверсальний декодер
Доброго дня, громадяни слухачі))
Інколи буває так, що кнопок потрібно більше 3-4, а виводів більше немає. І клавіатуру матричну не зробиш, а клавіатуру на базі АЦП мій контроллер зробити не дозволяє. За мотивами https://www.youtube.com/watch?v=_NySIlQAVXA#t=14 було вирішего зробити свій варіант. Купляти нічого не хотілося, і з якогось гімна було добуто 2 сдвигових регістри комуністичного періоду під назвами К1533ИР9 та К555ИР10 (закордонні аналоги відповідно 74НС165 та 74НС166). Погугливши виявив, що вони обидва підходять під мої цілі, але ИР10 дещо "навороченіший", тому було вирішено залишити його для майбутніх експериментів.
Схема підключення 74HC165 прикріплена, для 74HC166 схема зовсім інша, гугліть.
Код аж смішно було під спойлер ховати, такий об'ємний. Я схему паяв 2 дні, а писав його 3 хвилини))) Але може комусь згодиться. 74HC165 особлива тим, що має 2 виходи, звичайний та інверсний (виводи 9 та 7), відповідно можна при усіх потушених світлодіодах 1 запалити, або при усіх запалених 1 потушити. А можна і не 1, схема підтримує одночасні натискання будь-яких комбінацій клавіш. Алгоритм погашення брязкоту кнопок не закладено, кому потрібно - реалізуйте самі. У мене й без нього нормально працює (поки кнопки новенькі).
кнопок потрібно більше 3-4, а виводів більше немає. І клавіатуру матричну не зробиш, а клавіатуру на базі АЦП мій контроллер зробити не дозволяє
рішень схемотехнiчних безліч. Завжди можна підключити кнопки у вигляді RC подільника до генератора, керованого напругою - ГКН (на тій же 555). Вимірювати відповідно період/частоту на цифровому вході.
А ще АЦП можна зімітувати на цифровому вході, використовуючи заряд-розряд ємності до рівня лог.1 і 0 на RC-ланцюжках.
Дякую за варіанти, можливо колись стануть у нагоді))
Рівно місяць минув з тих пір, як я тут останній раз щось писав. Час виправляти ситуацію. Публікую свою власну розробку. Сенсорну клавіатуру з виводом інформації по UART. Впринципі нічого особливого, якщо не брати до уваги те, що під MCS-51 я не знаходив нічого подібного, усе під ПІК-и або АВР-и. Отже код:
Писав я його давненько, і зараз, дивлячись на нього, бачу, що можна було написати набагато краще, але публікую як є, може комусь і таке згодиться.
Одразу кажу, що на мікроконтролерах даної архітектури можливо зробити сенсорну клавіатуру лише використовуючи порт Р0, бо він, при звичайному режимі роботи, не має вбудованих підтягуючих резисторів, які б шунтували наші зовнішні мегаомні резистори. У АВР-ах наприклад ці вбудовані підтягуючі резистори є на всіх портах, але там їх можна відключати.
Виглядає це все діло ось так:
До посту #23 підкину ще один варіант розширення портів мінімальними засобами - чарліплексування. Є така фірма-виробник Maxim (драйвери MAX232 адже всім знайомі), так ось працював у них такий Аллен Чарлі. І 20 років тому подумав він, подумав і вирішив використовувати біполярні властивості сучасних драйверів в МС. По суті метод зводиться до комутації шляхів для струму. Отже...
Варіант для керування 6-ю світлодіодами трьома портами:
Зворотний варіант iз клавіатурою:
У класичному матричному включенні на це треба було б: 2х3 лінії, або тупо 6.
А у мене прогрес йде потихеньку. У ході розробки своїх проектів почав помічати поступове збільшення "кількості коду" із кожним новим проектом. Той проект що роблю зараз, уже займає близько 1000 строк коду, а це моїм підрахункам тільки половина, від того що має бути. А вже важко читається. Почав шукати як правильно будувати свої програми. І ось до чого дійшов. Якщо взяти спрощену класифікацію, то є наступні щаблі еволюції програміста-розробника мікроконтролерних систем:
1. Суперцикл
2. Суперцикл+переривання
3. Флаговый автомат
4. Диспетчер
5. Пріорітетний диспетчер
6. Кооперативна RTOS
7. Витісняюча RTOS
Донедавна я знаходився на 2 сходниці еволюції)), але як написав вище, це почало стримувати мене.
Розкуривши флаговий автомат я здавалося б знайшов щастя, тим більше що архітектура 8051 ідеально підходить для цього підходу (пробачте за тавтологію). Але цікавість взяла своює, і я поперся далі, і за кілька вечорів написав свій власний диспетчер (майже зі всім, що казав Бендер). Поки що правда без пріорітетів, але може колись прикручу. Проект складається із 2 файлів: файлу власне диспетчеру, та файлу таймерної служби. На додачу я виділив маленький файл включення для макросів загального вжитку, який планую тепер поступово наповнювати та ліпити до кожного проекту. У даному проекті диспетчер незалежно мигає 8 світлодіодами (кожним зі своєю частотою). Дискретність часових інтервалів = 1 мс. Точність трохи залежить від завантаженості, але зараз при 8 задачах вкладається у 1 відсоток. Проект носить назву "Nedo_OS" і наразі має версію 1.9 (починається із 1.0). Таймерна служба розвивається окремо і уже доросла до версії 1.5)))
Дякую, мені надзвичайно приємно стежити за вашою еволюцією.
Інколи буває так, що кнопок потрібно більше 3-4, а виводів більше немає. І клавіатуру матричну не зробиш,
...
Схема підключення 74HC165 прикріплена
На цій же 165-тій можна і матричну :-)
Просто додати три (для 3*5=15-ти кнопок) або 4 (для 4*4=16-ти кнопок) транзистори.
Опитувати регістр так само, але потім декодувати.
А найхардкорніший варіант клавіатури до 64 кнопок на одну ніжку мікроконтролера, який я бачив (але сам не робив ;-) ) — це мікросхема від телевізійного пульта, але вихід через транзистор напряму на мікроконтролер, на тій же платі трасовано. Без інфрачервоного світлодіода та TSOP17xx.
До речі, про Keil. У частині C-компілятора у нього є така гарна річ, як збирання статистики по використанню регістрів, точніше, по зміні їх вмісту. Компілятор до кожної функції прикладає перелік регістрів, які безпосередньо вона змінює. Лінкер будує дерево викликів і збирає маски нагору, видає файл, у якому для кожної функції 16-бітна маска модифікованих регістрів з урахуванням вкладених підпрограм. На наступному кроці компіляції враховується цей файл для оптимізації розміщення тимчасових змінних по регістрах.
У змішаних проектах для власних підпрограм на асемблері спеціальною директивою можна задати ці переліки модифікованих регістрів.
У результаті для
nibble_to_ascii(buf, len);
print(buf, len);
може скластися так, що компілятор аргументи buf та len занесе у регістри для передавання параметрів один раз, а потім поставить підряд два виклики функцій. На 10…20-кілобайтній прошивці на 300-500 байтів економії може набігти.
51-ше ядро досі живе в Silabs-сівських контролерах та Cypress-івських USB-шних FX-чіпах, то ця тема ще може бути цікавою.
Сам я вже років 12-15 не маю справ з MCS-51, але якщо комусь треба, то можу поритися по старих дисках і спробувати згадати достатньо, щоб написати рекомендації.
Доброго дня. Я люблю прості речі, тому не міг обійти стороною спосіб вводу інформації за допомогою енкодера.
Виконуючи побажання корифеїв форуму, даю посилання на Вікіпедію
https://uk.wikipedia.org/wiki/%D0%94%D0 … 1%82%D1%83
Нас цікавить найпростійший варіант - механічний інкрементний енкодер із вихідним кодом Грея https://uk.wikipedia.org/wiki/%D0%9A%D0 … 0%B5%D1%8F
Сьогодні розглянемо найпростійший спосіб обробки інформації від енкодера - у зовнішньому перериванні.
Алгоритм роботи при цьому заключається у тому, що ми підключаємо один із каналів енкодера до зовнішнього переривання, і при його спрацюванні всередині обробника переривання дивимось на стан другого каналу, і на основі цього робимо висновок про напрям обертання.
Схема намальована не мною, а взята з мережі. Можливе підключення як із зовнішнімі підтягуючими резисторами (надійніше), так із використанням внутрішніх (простіше). Конденсатори потрібні для апаратного подавлення брязкоту контактів енкодера, їх номінал близько 0,1 мкФ (100 нФ), більше не потрібно, бо при розряді конденсаторів великої ємності будуть псуватися контакти енкодера. А взагал без конденсаторів даний алгоритм працює дуже погано, є дуже багато хибних спрацювань, майте це на увазі. Номінал підтягуючих резисторів, якщо вони використовуються, від 4,7 до 100 кОм.
У даному прикладі я просто ганяю туди-сюди вогник по світлодіодній лінійці, але практичне застосування залежить лише від Вашої фантазії: контроль положення крокового двигуна, пересування пунктами меню на LCD, банальний лічильник обертів тощо.
Хоча вже більше граюся із С та АРМами.
Простенька асмоліба для світлодіодної матриці 16*32 (P10 led matrix panels 16x32). На всяких ОЛХ по 250-300 грн, якщо ліньки чекати із Китаю.
Відео для наочності.
https://www.youtube.com/watch?v=uJ6eXrHAV2w
П.С. Робіть, і у вас все вийде.
Доброго часу доби. Викладаю свої простенькі "бібліотеки" для радіокомплекту із передавача FS1000A та приймача XY-MK-5V. Посилання на перше, що надибав на AliExpress: https://www.aliexpress.com/i/32960644995.html
З комплекту бібліотек зібрано 2 проекти, які являють собою міст UART-радіоканал-UART.
Вся система апаратно сладається із 2 модулів, 1 із передавачем, і 1 з приймачем.
Швидкість UART, як приймальної, так і передавальної частини, налаштовується окремо, що дає можливість створити систему, яка крім передачі даних через радіоканал буде ще й конвертувати швидкість: приймати дані по UART наприклад на швидкості 57600 бод, а віддавати на 9600 бод, або навпаки.
Я приципово поставив перед собою "спортивне" завдання створити бібліотеки для найменш потужних 8051 мікроконтролерів, тому у проекті використовується AT89C1051. Це найменш потужна, відома мені версія 8051. Вона має лише 1 КБ пам'яті програм, та 64 байти ОЗП, відсутній апаратний UART (тому був написаний програмний, і включений у кожний проект як окрема бібліотека) Самі бібліотеки (приймача і передавача) займають пару сотень байт, ще пару сотень байт займає програмний UART, так що місця для вашого коду ще лишилося. Єдине, що майте на увазі, я виділив під буфер максимально можливий для приймача розмір памяті - 48 (із 64) байт, декілька байт знадобилося для роботи самих бібліотек приймача/передавача та програмного UART, і ще декілька байт лишилося для стеку. Все прораховано до 1 байту, у тому якщо захочете дописати щось своє - зменшуйте розмір буферу на необхідну вам кількість ОЗП.
Під час розробки системи з настільки обмеженими ресурсами стикнувся з кількома проблемами, деякі з яких було успішно вирішено:
Для роботи приймача необхідні флаги, але навіть 1 флаг із бітового сегменту даних призводить до втрати цілого байту ОЗП, і через свою адресацію автоматично призводить до фрагметаціїї наявної пам'яті на 2 шматки (до флагу, і після), що є дуже незручним, особливо при загальному обсязі памяті у 64 байти.
Було вирішено обмежетися 2 флагами (ознака успішного прийому преамбули, та ознака успішного прийому всього пакету), обидва розміщені у регістрі стану системи PSW. Один загальновідомий флаг F0 (PSW.5), інший - PSW.1, майже ніколи ніким не використовується, недокументований, і автори деяких підручників не радять його використовувати. Я використав, і проблем не помітив. Використання 2 цих флагів у приймачі вмикається опцією USE_PSW_BITS. Можете вимкнути її, але це обмежить максимальний розмір прийомного буферу до 31 байту (для АТ89С1051).
Програмний UART погано працює на прийом при дуже високих швидкостях. Максимальна швидкість при 12 МГц складає 57600 бод (при кварці 24 МГц можна досягти 115200 бод), але при таких швидкостях довелося вимкнути перевірку стоп-біту (старт біт перевіряється завжди), інакше система встигала прийняти лише декілька байт. У себе проблем не помітив, але хто прагне 100% надійності, обмежтеся швидкістю 38400 бод для проекту передавача, при такій швидкості перевірка стоп-біту ще увімкнена.
Оскільки система перевіряє довжину кожного прийнятого біту даних на валідність, було вирішено обмежитися використанням простої checksum, а не робити CRC8. Жодних хибних прийомів не було помічено.
На кварцах 22-24 МГц система не тестувалася, і теоретично, обмеженням може бути лише пропускна можливість приймача, але згідно даних звідси https://radiolis.pp.ua/arduino/49-bespr … a-mx-rm-5v
вона складає "5 кб/сек", чого ще достатньо (при 12 Мгц наша система має приблизно 1,5 кб/сек, значить при 24 МГц стане 3 кб/сек). Це не означає, що можна кидати у передавач пакети по 1500/8=187 байт на секунду. Майте на увазі розмір буфера (максимально 48 байт для АТ89С1051), і час, необхідний приймачу, щоб видати отримане по радіоканалу, у UART (програмний, без переривань). На практиці, у мене на швидкості 57600 бод з обох кінців, успішно передається по 48 байт кожні 400 мс (десь 1/60 цього часу - видача приймачем отриманих даних по програмному UART, протягом цього часу приймач не реагує на пакети. Тому, якщо будете зменшувати швидкість програмного UART, збільшиться час між прийомами пакетів, а значить і зменшиться пропускна можливість каналу, майте це на увазі). 48*8=384 біти за 400мс, це 960 біт/сек. Майже 1 кб/сек, це фінальна швидкодія усього радіомоста при 12 МГц. При 24 Мгц можна досягти 2 кб/сек. Дальнобійність на відкритій місцевості заявлена до 100м, я у полях не перевіряв, але через 1-2 цегляних стіни дані передаються впевнено, з першого разу. Буду дуже вдячний, якщо хтось повторить проект на кварці 24 Мгц із швидкістю 115200 бод, і скаже, що все працює.
Правильно взаємно розташовуйте антени передавача та приймача. Неправильно взаємне розташування антен веде до того, що якість прийому погіршується. Мною помічено, що при дуже малих відстанях (до 5 м, у межах однієї кімнати) краще взагалі без антен, ніж із неправильно розташованими антенами.
Під спойлером трохи теорії з роботи цієї системи, для того, щоб ви могли зрозуміти, чи достойне моє рішення вашої уваги.
Деякі теоретичні основи, викладені тут, висловлені не мною, і я просто використав їх під час розробки алгоритму
Ви б це кудись у відкритий репозиторій на гітлабі чи що.
Бо от чесно — ліньки качати архів і розпаковувати, щоб якщо схочеться щось прокоментувати, то потім знову писати сюди з цитатами коду.
... відкритий репозиторій на гітлабі чи що...
Гітхаб підійде ? Тільки я там коменти гуглтранслейтом перевів у інгліш, але там не UTF, а ще я полюбляю таби замість пробілів, тому місцями "вирвиоко" вийшло.
https://github.com/AssmoFun/8051_projec … ransmitter
Доброго дня MCS-51!
Я щойно зареєструвався - і ще одним мотивом було те, що я також розробляю мікроконтролерний пристрій на ядрі 8051(зараз це чіпи фірми Wisbond W78c32cp, далі планую перейти на AT89). Цей пристрій призначений для розробки софту та заліза наступних мікроконтролерних систем - тобто, це інструмент, що має давати можливість розробляти пристрої з різними протоколами(зараз розробляю драйвер spi-Flash та spi-програматор. Вже розроблені і успішно випробувані ПП виводу на дисплей 1602А і універсальний драйвер матричної клавіатури(провірено для матриці 3х4, але без змін тексту, а лише параметрів драйвер має працювати і з 7х8 матрицею + окрема клавіша ALT). А це 112 кодів.
Мій досвід цікавий тим, що (не маючи ні програматора, ні відповідних програм) я оживив початковий варіант мікроконтролерної системи написаною мною мікропрограмою довжиною 60 байтів(розробив і на 45 байтів, але не протестував), яку я спаяв у вигляді діодної матриці з індикацією адрес і даних в бінарному вигляді(вона зараз працює, але розробляю монітор, який має включати роботу з клавіатурою 4х5, дисплеєм 1602А, флеш-пам'яттю 25LC1024 та програматор AT89S51\52. А також роботу з всіма можливими типами переривань.
Мій Дизайнер МК-51 має пам'ять програмного коду 32К(я трансформував адресний простір в нейманівський, як в Z80).
Думаю, обмін думками буде дуже корисний. Зацікавлений в програматорі, щоб нарешті від'єднати габаритну 60-байтну плату . В свою чергу можу поділитися ПП обміну з 1602А з опитуванням готовності в 8-бітному режимі та генерацією користувацьких символів.
Почав роботу над драйвером клавіатури PS\2(такі ще є на ринку, слава Богу), а мета - багатоцільова MKS-51 побутова система з швидкістю не меншою, ніж в AVR, пам'яттю програмного коду 256-512к і повним переліком протоколів(паралельний, послідовний), з стандартною клавіатурою(в перспективі USB), кольоровим графічним дисплеєм, файловою системою та мовою високого рівня.
Одному зробити це важко, а хочеться відновити пріорітет України - першими ж були "Фахівець" і "Львів ПК-01\02"!
Нам треба поспілкуватися грунтовніше на таку тему.
Удачі! Продовжу читати Ваш допис.
Нам треба поспілкуватися грунтовніше на таку тему.
...
Доброго дня. Відписав у приват.
У Nuvoton зараз до речі знижки до 90% на перших 5 мікроконтролерів кожного типу.
https://www.techdesign.com/market/nuvot … ontrollers
Там і 8051 сумісні, і на ARM-ядрі є, кому цікаво.
Дуже вигідно брати по 5 штук кожного. На 10 доларів можна штук 100 взяти))
Доброго дня!
Якщо мова йде про прошивку флеш-пам'яті, а не системне програмування, то я зацікавлений в тому і за домовленністю хотів би запрограмувати свій AT89C51\AT89S51 кодом розміром біля 1.5 кб. Взамін можу поділитися текстом драйвера послідовної флеш-пам'яті, драйвером алфавітно-цифрового дисплея 1602 чи універсальної матричної клавіатури(той самий текст з різними параметрами від 3х4 до 7х8). Практично завершив драйвер клавіатури ps2 для 8051.
хотів би запрограмувати свій AT89C51\AT89S51 кодом розміром біля 1.5 кб.
С51 — лише складний програматор з паралельним передаванням даних, 12-вольтовим сигналом, ...
S51 — якщо Win <= 7 і досі є паралельний порт (LPT), то можна спробувати at89s52.exe з адаптерами FBPRG, AlteraByteBlaster або STK. Потрібно поставити драйвер DLPortIO