Робота з двома байтами як із єдиним цілим
Завдання: PIC16, ASM.
Є два байти інформації (10-бітовий АЦП).
Потрібно ці 10 біт порівняти з певними числами і зробити в програмі відповідне розгалуження.
Раніше я працював з АЦП так: вибирав ліве вирівнювання і працював тільки з ADRESH, втрачаючи таким чином 2 молодших біти. Точність була непотрібна.
Нині потрібні всі 10 біт. У зв'язку з цим питання: як розглянути 2 байти інформації як одне ціле? На думку спадають якісь незграбні методи, для реалізації яких потрібно чимало машинного часу. Може, є якісь гарні та ефективні рішення?
Ну, ось дивись. Наприклад: треба зробити розгалуження: якщо значення АЦП більше 450, зробити А, якщо менше - зробити B.
d'450' = b'00000001 11000010'
Що з точки зору бінарної системи числення та 8-бітного асму означає, що число X, отримане в результаті перетворення, менше від цього числа 450?
Старший байт повинен бути меншим або дорівнює 1-ці. Молодший байт має бути строго менше 11000010.
Завдання: PIC16, ASM.
Є два байти інформації (10-бітовий АЦП).
Потрібно ці 10 біт порівняти з певними числами і зробити в програмі відповідне розгалуження.
Раніше я працював з АЦП так: вибирав ліве вирівнювання і працював тільки з ADRESH, втрачаючи таким чином 2 молодших біти. Точність була непотрібна.
Нині потрібні всі 10 біт. У зв'язку з цим питання: як розглянути 2 байти інформації як одне ціле? На думку спадають якісь незграбні методи, для реалізації яких потрібно чимало машинного часу. Може, є якісь гарні та ефективні рішення?
А що за завдання загалом? Чи може це порівняння двох 16 бітних чисел і не потрібно?
Завдання надзвичайно просте: на АЦП через дільникзаведений вихід імпульсного перетворювача, на який надходить ШІМ від мікроконтролера. Потрібно стабілізувати напругу на виході перетворювача на певному рівні. Зворотній зв'язок, коротше. Ось тут (http://www.microchip.su/showthread.php?t=11518+) я описав завдання. Можна було б використовувати компаратор та модуль VREF, але обробка даних від компаратора мені видалася трохи складнішою, ніж від АЦП. Заодно можливість познайомитися з 16-розрядними даними випала, давно хотів розібратися.
Дякую всім за поради, друзі. Прочитав статті, багато що зрозумів, ще більше поки не зрозумів (особливо у 2-й :)), але основне засвоїв. Зробив у результаті методом, запропонованим korsaj і tester, в Протеусі код працездатний і добре стабілізує напругу на виході імпульсника. І порівняння справді займає зовсім небагато часу. Залишилося зрозуміти, чому реальна схема дивує :) а саме "стабілізує" напругу на виході не тоді, коли на дільнику 2 В (як зазначено у прошивці), а коли на ньому 1,8 В. Підчіплював окремо БП до АЦП, подавав напругу їм - все одно поріг о 1.8 В залишився. Чудеса в решете :)
Якщо просто П-регулятор, то можна і компаратор використовувати. Він швидше буде ніж АЦП PIC16 + обробка.
Алгоритм із компаратором мені здається простіше. Таймером задаєш будь-яку потрібну частоту в перериванні (частота ШІМ). У перериванні таймера врубаєш ключ. І чекаєш, поки напруга на сенсорі не наростатиме. Коли досягне порога компаратор спрацює. У перериванні компаратора відрубуєш ключ.
Для компаратора потрібна опорна напруга, яку можна створити за допомогою його модуля напруги або використовуючи апаратний ШІМ як ЦАП. У другому випадку маємо велику роздільну здатність.
Наче так. Робив якось раніше для стабілізації потужності обмоток кроковогодвигуна.
Ще питання виникло також за двобайтним числом.
Власне, є двобайтне число в межах 0 - d'10 000', мені потрібно розкидати це число за розрядами. Тобто дізнатися першу десяткову цифру числа, другу, третю, четверту та п'яту окремо. Робиться це виведення цих цифр на семисегментний індикатор. Як мені вчинити? На думку не спадає зовсім нічого. :(
Не зовсім зрозуміло. Я щоб приїхати з числа десятки сотні тощо. просто вичитав відповідно 10, 100 і т.д. скільки разів віднімаєш (до позики) стільки і десятків. Геніально. Дякую:)
А якщо завдання стоїть трохи інакше? Наприклад, є число 12345 – дванадцять тисяч триста сорок п'ять. Мені потрібно розкласти це число на п'ять: "1", "2", "3", "4" та "5". Як це зробити?:)
1. Вичисти 10000 до появи позики десятки тисяч сохр. залишок (12345-10000 = 2345 - це залишок) 2. Вичисти 1000 до появи позики тисячі сохр. залишок (2345-1000-1000 = 345 - це залишок після двох віднімань) 3. Вичисти 100 до появи позики сотні сохр. залишок (345-100-100-100=45 - це залишок (3-віднім.)) 4. Вичисти 10 до появи позики десятк сохр. залишок (45-10-10-10-10=5 - це залишок (4-віднім.)) 5. Залишок після віднімання 10 до появи позики одиниці.
Я так тільки 2-х байтні переобразовував, приклад коду ща не знайду. А взагалі пошуки приклади перетворення двійкового в двійково-десятковий (BCD) вид уявлення. Зазирни сюди. (http://www.microchip.su/showthread.php?t=2343)
Ще знайшов. Тут ще красивіше (http://www.microchip.su/showthread.php?t=2162&highlight=bcd).
Ще питання виникло також за двобайтним числом.
Власне, є двобайтне число в межах 0 - d'10 000', мені потрібно розкидати це число за розрядами. Тобто дізнатися першудесяткову цифру числа, другу, третю, четверту та п'яту окремо. Робиться це виведення цих цифр на семисегментний індикатор. Як мені вчинити? На думку не спадає зовсім нічого. :( Ще ось http://www.massmind.org/techref/postbot.asp?by=time&id=piclist\1996\11\07\205530a&author=John+Payson+&tgt=post (http://www.massmind.org/techref/postbot.asp?by=time&id=piclist%5C1996%5C11%5C07%5C205530a&author=John+Payson+&tgt=post) Максимальний час перетворення трохи менше 1000 машинних циклів, якщо пам'ять мені не бреше.
Ще ось http://www.massmind.org/techref/postbot.asp?by=time&id=piclist\1996\11\07\205530a&author=John+Payson+&tgt=post (http://www.massmind.org/techref/postbot.asp?by=time& Максимальний час перетворення трохи менше 1000 циклів, якщо пам'ять мені не бреше. на старій конференції багато було про це і посилань теж
А за 732 цикли можна 8 цифр отримати на асмі 16-их. Шукати на старій конференції "3HEX-8DEC" правда за рахунок обсягу коду.