реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
студент ю
сообщение Nov 22 2011, 13:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 11-02-09
Пользователь №: 44 720



Я новичок в универе учился на пиках, конкретно на PIC16F877. Так как знания поверхностные то пытаюсь сам докопаться до истины, а чтоб конкретно докопаться решил сделать что то типа реле напряжения, вобщем устройство работает следующим образом АЦП меряет все время напряжение и заносит результат в регистры (AdresL) и (AdresH), только я не пойму если АЦП 10-разрядное (десятичное число выглядит как 1023) то как записывается туда результат. У меня два предположения либо поровну, 512 в регистр (AdresL) и 512 (AdresH) если сложить два регистра то получим 1024, либо восемь разрядов лежат в регистре (00000000 AdresL), а остальные два в регистре (00 AdresH) если их сложить, то получим 10 разрядное число = 1023. Я не знаю какое рассуждение правильное. И так к нашему заданию, АЦП меряет напряжение и у меня есть некое измеренное число (результат измерения). И есть некая константа даже две, я не знаю как в программе написать условие, если результат измерения меньше числа .106, то на одном из выходов порта D установить ноль, если больше то пусть там сохраняется единица. И второе условие если результат измерения больше чем число .145 то на одном из выводов порта D установить ноль, иначе должно все время присутствовать единица.
Вот это равенство я не могу представить программно как сравнить одно с другим. Пишу на ассемблере, очень прошу помощи.

Сообщение отредактировал студент ю - Nov 22 2011, 13:47
Go to the top of the page
 
+Quote Post
Allregia
сообщение Nov 22 2011, 15:43
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(студент ю @ Nov 22 2011, 15:45) *
Я новичок в универе учился на пиках, конкретно на PIC16F877. Так как знания поверхностные то пытаюсь сам докопаться до истины, а чтоб конкретно докопаться решил сделать что то типа реле напряжения, вобщем устройство работает следующим образом АЦП меряет все время напряжение и заносит результат в регистры (AdresL) и (AdresH), только я не пойму если АЦП 10-разрядное (десятичное число выглядит как 1023) то как записывается туда результат. У меня два предположения либо поровну, 512 в регистр (AdresL) и 512 (AdresH) если сложить два регистра то получим 1024, либо восемь разрядов лежат в регистре (00000000 AdresL), а остальные два в регистре (00 AdresH) если их сложить, то получим 10 разрядное число = 1023.


Именно так - в ADRESL младнмй байт, в ADRESH - станший.
Толко если мне память не изменяет, то в конфигурации АЦП есть битик. определяющий левое или правое выравнивание, и биты могут располагаться так при правом выравнивании:
b7 b6 b5 bh4 b3 b2 b1 b0 = ADRESL
0 0 0 0 0 0 b9 b8 = ADRESH

а при левом:
b1 b0 0 0 0 0 0 0 = ADRESL
b9 b8 b7 b6 b5 b4 b3 b2 = ADRESH

Левое хорошо когда достаточно 8-битного результата, тогда просто работаем с ADRESH а ADRESL игнорируем.

А правое легко преобразуется в 2-х байтную переменную:
int ADC;

ADC = 256u*ADRESH + ADRESL;


Цитата
Я не знаю какое рассуждение правильное. И так к нашему заданию, АЦП меряет напряжение и у меня есть некое измеренное число (результат измерения). И есть некая константа даже две, я не знаю как в программе написать условие, если результат измерения меньше числа .106, то на одном из выходов порта D установить ноль, если больше то пусть там сохраняется единица.


if(ADC<106) PD0 =0; else PD0=1;

или что тоже самое:
PD0= (ADC<106) ? 0 : 1 ;

Цитата
И второе условие если результат измерения больше чем число .145 то на одном из выводов порта D установить ноль, иначе должно все время присутствовать единица.


аналогично:

if (ADC > 145) PD1 = 0; else PD1=1;

Цитата
Вот это равенство я не могу представить программно как сравнить одно с другим.


Вычесть одно из другого и посмотреть на знак результата.

Цитата
Пишу на ассемблере, очень прошу помощи.


Учи Си....
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Nov 22 2011, 15:49
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(студент ю @ Nov 22 2011, 17:45) *
... PIC16F877...
АЦП меряет все время напряжение и заносит результат в регистры (AdresL) и (AdresH), только я не пойму если АЦП 10-разрядное (десятичное число выглядит как 1023) то как записывается туда результат.

Об этом вполне доступно написано в документации ( http://ww1.microchip.com/downloads/en/devicedoc/30292c.pdf ).
Если в регистре ADCON1 7-й бит - единичка, результат выравнивается вправо:
ADRESH ADRESL
000000xx xxxxxxxx
если наоборот, 7-й бит - ноль, результат выравнивается влево:
ADRESH ADRESL
xxxxxxxx xx000000

Цитата(студент ю @ Nov 22 2011, 17:45) *
...если результат измерения меньше числа .106, то ...

Есть много вариантов. Самый простой вариант - предположим, что АЦП 8-битное. Тогда и результат, и граничные значения влезают в регистр, с ними удобно работать. Для этого надо выровнять результат влево и пользоваться только ADRESH, игнорируя младшие биты в ADRESL.

Второй вариант - рассматривать надо обе "половинки" числа. Ассембер пиков я тоже крайний раз видел в институте, поэтому только в общих словах:
берём старшие части результата и границы; получаем три (в общем случае) варианта
- старшая часть результата больше. Значит, весь результат тоже больше границы
- старшая часть результата меньше. Соответственно, всё значение также меньше границы.
- старшие части равны. Надо рассматривать младшие части, там тоже будет три варианта.
Для этого алгоритма, мне кажется, удобнее выравнивать результат АЦП вправо.

PS а самое удобное - доверить компилятору Си "склеить" эти результаты в одно 16-битное число ;-)


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
студент ю
сообщение Nov 22 2011, 17:49
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 11-02-09
Пользователь №: 44 720



На си я пробовал писать но с трудом получалось, ассемблер ближе но путаюсь в нем сильно, пока рано мне переходить на си хоть знаю что намного проще пишется программа. А можно ли сделать вставку кода на си в программу написанную на ассемблере, если можно то как. наоборот знаю что вставляют в си ассемблерные вставки, а чтоб в ассемблер вставки на си не видел. Если десяти разрядное число поделить на части таким образом 00_0000_0000, то в моем случае двумя байтами можно пренебречь они все равно будут нули. Остается две части 0000_0000, если рассматривать два полубайта отдельно, (взять только 0000 старших разряда) то это сильно грубо получится, а у меня если результат измерения меньше 0110 1010, то RD5 установить 0, если число больше 1001 0001, то на RD6 установить 0, вот я и ломаю голову как такую кучу битов контролировать.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Nov 22 2011, 20:53
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Во-первых, старший байт проверять надо. Откуда уверенность, что там не появится единица? Помеха какая-то, например.

А во-вторых, совершенно не понял идеи разделять младший байт пополам. Берём его целиком (не думая, что там аж целых 8 бит!) и сравниваем...


upd: поправил опечатки


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
студент ю
сообщение Nov 23 2011, 07:22
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 11-02-09
Пользователь №: 44 720



Цитата(esaulenka @ Nov 23 2011, 00:53) *
не думаю, что там аж целых 8 бит

Так число 106 занимает в двоичной системе семь бит 1101010, а число 145 занимает восемь бит 10010001, так что по любому восемь их и контролировать, диапазон у меня будет узкий поэтому двумя старшими разрядами я могу пренебречь, хотя может и ошибаюсь
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Nov 23 2011, 07:53
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Ещё раз: про биты забываем, работаем с байтами.
Проверяем старший байт. Если там не ноль, значит, число ОЧЕНЬ большое, делаем, что нам надо.
Проверяем младший байт. Сравниваем с 106 и с 145, делаем, что надо. В чём затруднения-то?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
студент ю
сообщение Nov 23 2011, 12:00
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 11-02-09
Пользователь №: 44 720



затруднение простое, как на ассемблере написать результат измерения сравнить с 106 и 145, если меньше то установить ноль в порте D

Сообщение отредактировал студент ю - Nov 23 2011, 12:01
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Nov 23 2011, 16:23
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(студент ю @ Nov 23 2011, 14:00) *
затруднение простое, как на ассемблере написать результат измерения сравнить с 106 и 145, если меньше то установить ноль в порте D

Ну если вы такой любитель ассемблера, то хоть макросы применяйте, ну для затравки тут тут посмотрите

Хотя ассемблер- это тупик, причем уже много-много лет. Не тратьте молодые годы на ассемблер, это ни вам ни окружающим не нужно, поверьте sm.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 14:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016