Страница 1 из 2

ОЧЕНЬ НУЖНА ПОМОЩЬ ЖИВЫХ МИКРОКОНТРОЛЛЕРЩИКОВ!!!

Добавлено: Чт янв 08, 2009 18:34:16
levon66
Достало копаться в сети и листать книги, поэтому обращаюсь к живым микроэлектронщикам... Ситуация вот какая. Есть сигнал аналоговый. Напряжение от 0 до +5В. Нужно на 4 блока по 2 индикатора семисегментных вывести: среднее значение за 10 измерений, текущее, миниммальное и максимальное. Есть еще 2 кнопки: старт и сброс. Есть контроллер КР1816ВЕ31. Соотвественно без памяти программ, но с памятью данных. Есть АЦП-8ми разрядное. На выбор.....
Вот так) вообщем начал разбираться, то-се.
1. Дошел до ацп-AD7880. Как его подключить-понятно. Но вот вопрос. Он же выдаст мне 8 бит. А нужно выводить "целые" вольты и "десятые". Можно взять и четыре старших бита-как целые вольты, а 4 младших - за десятые? если да-то как? или если нет, то что делать? Или нужно переводить в 2-10 систему?
2. Дальше...я эти биты принял, и решил кидать в "банки" то есть все операции там произвести. Положим получилось и у меня будут они лежать как 1 байт. Можно видимо выделить старшие и младшие и отдельно подавать на индикаторы? И здесь же - как быть с точкой "h" циферкой. Ее зажигать нужно будет одновременно со старшим разрядом или как???
3. Кнопки. От них нужно будет делать прерывание? то есть нажал "старт" у меня запустился МК, обнулили все, а потом запустили ацп, считали и пошло-поехало. Или как? Или старт включать должно считывание ацп? Сброс-просто обнуляет видимо.
4. Внешняя память (здесь видимо мое непонимание читателя выбесит, но все же) - - - я в нее что записывать-то должен??? программу??? то есть мне нужно каждый mov кидать как-то туда....?? то есть у меня порты P0 и P2. На Р0 подаю младший байт адреса ячейки ПЗУ, а на Р2-старший. Младший по сигналу ALE уходит в защелку (ну эти RG)??? а потом на Р0 выставляю свой несчастный mov????

вообщем я пока в трансе, но затею это все дело изучить не оставлю)
помогите, микроконтроллерщики добрые..)

Re: ОЧЕНЬ НУЖНА ПОМОЩЬ ЖИВЫХ МИКРОКОНТРОЛЛЕРЩИКОВ!!!

Добавлено: Чт янв 08, 2009 18:48:28
NiTr0
levon66 писал(а): Есть контроллер КР1816ВЕ31.
Такой раритет был выбран из любви к отечественной технике?
levon66 писал(а):Или нужно переводить в 2-10 систему?
Именно.
levon66 писал(а):2. Дальше...я эти биты принял, и решил кидать в "банки" то есть все операции там произвести. Положим получилось и у меня будут они лежать как 1 байт. Можно видимо выделить старшие и младшие и отдельно подавать на индикаторы? И здесь же - как быть с точкой "h" циферкой. Ее зажигать нужно будет одновременно со старшим разрядом или как???
1-го байта будет мало ИМХО. Рассчитывать на работу с 2 байтами, конкретно - умножить 1й байт на некую константу, чтобы при 256 на входе получилось скажем 5000 в результате.
levon66 писал(а):3. Кнопки. От них нужно будет делать прерывание? то есть нажал "старт" у меня запустился МК, обнулили все, а потом запустили ацп, считали и пошло-поехало. Или как? Или старт включать должно считывание ацп? Сброс-просто обнуляет видимо.
Нет. Достаточно опрос состояния кнопок сделать.
levon66 писал(а):4. Внешняя память (здесь видимо мое непонимание читателя выбесит, но все же) - - - я в нее что записывать-то должен??? программу??? то есть мне нужно каждый mov кидать как-то туда....?? то есть у меня порты P0 и P2. На Р0 подаю младший байт адреса ячейки ПЗУ, а на Р2-старший. Младший по сигналу ALE уходит в защелку (ну эти RG)??? а потом на Р0 выставляю свой несчастный mov????
Внешняя память прошивается на программаторе. И из нее читается самим МК программа.

Добавлено: Чт янв 08, 2009 18:59:41
levon66
вас не затруднит по порядку начать...вы единственный откикнувшийся...так сказать путь к знаниям. можно а ацп начать? у меня ацп 8ми разрядное. то есть максимум 11111111. это должно соответсвовать 5 вольтам, а 00000000 - о вольт?

Добавлено: Чт янв 08, 2009 19:03:09
NiTr0
Да. Точнее - 11111111 - это при Uвх=Uref, 00000000 - Uвх=0

Добавлено: Чт янв 08, 2009 19:08:38
levon66
так. а нужно как-то это в ацп отображать (эти 0 и 1)? или важно получить с него байт информации в мк и уже здесь дальше все делать?

Добавлено: Чт янв 08, 2009 19:13:37
NiTr0
Почитайте даташит на АЦП, там все описано. С АЦП получаются данные, после - их обрабатывает МК и выводит на индикатор

Добавлено: Чт янв 08, 2009 19:15:23
levon66
одно дело почитать, а другое, когда в глаза этого не видел и щупал. вот и лезу с вопросами. ((

Добавлено: Чт янв 08, 2009 19:18:35
levon66
там и пишут: с мк приходит 3 сигнала, то-се, и имеем байт. его закидывают в аккум. но он там в двоичной системе. зачем мне в 2-10 переводить? или ацп нужно перед этим как сказать-что вот это 5в и ты мне давай 11111111, а вот это 0 и давай 0000000. это опорным рещается или там какие-то пересчеты нужны. в литературе просто-держи 8 бит и все.

Добавлено: Чт янв 08, 2009 19:24:54
NiTr0
levon66 писал(а):но он там в двоичной системе. зачем мне в 2-10 переводить?
Чтобы на индикатор вывести.

Добавлено: Чт янв 08, 2009 19:30:04
levon66
то есть для каждой палочки индикатора и точки 0и1 должны быть в 2-10? у фрунзе "микроконтроллеры? это же просто" есть примеры с индикаторами. там как-то не помни такого. а почему так нужно? а дешифратор также их воспримет как и двоичные? и одну цифру одним байтом?
а еще...как мне "десятые" доли вольта от ацп понять. от туда ведь без точек десятичных идет...

Добавлено: Чт янв 08, 2009 19:38:00
NiTr0
levon66 писал(а):то есть для каждой палочки индикатора и точки 0и1 должны быть в 2-10? у фрунзе "микроконтроллеры? это же просто" есть примеры с индикаторами. там как-то не помни такого. а почему так нужно? а дешифратор также их воспримет как и двоичные? и одну цифру одним байтом?
При чем здесь одно к другому? С двоичным кодом вы ничего удобоваримого не получите на выходе - раче что-что-то вроде C7 на индикаторе.
levon66 писал(а):а еще...как мне "десятые" доли вольта от ацп понять. от туда ведь без точек десятичных идет...
Умножить на 195 (тогда вместо 256 получите грубо 50 000 - точнее, 49 920) и перевести в двоично-десятичную систему (займет 3 байта, получится что-то вроде 04 99 20), последний байт откидываете, результат выводите на индикатор

Добавлено: Чт янв 08, 2009 19:45:01
levon66
честно. не понял. индикаторов допустим 2. мне нужно на правый высти целые вольты. потом поставить точку. а потом вывести "десятые" доли. где 195:? ну не понимаю я, простите пожалуйста.

Добавлено: Чт янв 08, 2009 19:55:45
NiTr0
Понятия "целые", "десятые" в МК нет. Т.к. нет плавающей запятой.
С АЦП идет величина. пропорциональная напряжению - т.е., 0 - это 0В, 256 - это 5В, если опорный источник 5В.
Вам нужно привести это как-то к удобоваримому для индикатора виду - т.е. получить либо 50, либо 500, либо 5000 и т.д. для входной величины, дальше - это уже переводить в двоично-десятичный код и выводить нужные разряды. Учтите, что умножать/делить можно опять-таки только на целые числа. Потому - подбирать разрядность операций, чтобы погрешность не особо большая была
Хотя я бы на вашем месте немного схитрил бы - поставил бы опорное напряжение не 5, а 5.12В. Тогда достаточно было бы полученные данные умножить на 2 и преобразовать в bcd, после - откинуть 1 разряд...

Добавлено: Чт янв 08, 2009 20:08:48
levon66
умножаю на 2- получаю 10.24. что подсказывает, что связано со степенью двойки. но, чтоб меня, не понимаю я. можно подробней с этими разрядами. как и почему там должно произойти. и почему обязательно 50, 500 или 500? откуда они.

Добавлено: Чт янв 08, 2009 20:40:08
NiTr0
levon66 писал(а):умножаю на 2- получаю 10.24.
Что именно умножаете?
Если вы умножите 256 (которое соответствует 5.12В опорным) - вы получите число 512. Которое потом будете выводить на индикатор.
levon66 писал(а):можно подробней с этими разрядами. как и почему там должно произойти. и почему обязательно 50, 500 или 500? откуда они.
Для 5 вольт (или 5.12В) вы получаете на выходе АЦП число 256. Чтобы вывести на индикатор 5В, вам нужно получить из этого числа либо 50 (x100 мВ), либо 500 (х10 мВ) и т.д., потом - перевести его в двоично-десятичную запись, и потом - вывести нужное кол-во разрядов (2 старших в вашей задаче)

Добавлено: Чт янв 08, 2009 20:51:06
levon66
то есть если мне нужно было указать до сотых, то нужно было получить число 500, а вот если до десятых, то 50.??? не понимаю зачем 50 и 500? и как быть если 4.8 вольта.?? мне стыдно, что я так туплю,но хочу разобраться.

Добавлено: Чт янв 08, 2009 21:02:06
levon66
а может вот -если у меня от 0 до 5 вольт и нужно точность до десятых, то можно взять и через каждые пять изменений в двоичном переводить через 0,1 вольта. т.е. 00000000-0вольт. а вот 00000100-уже 0,1 вольт

Добавлено: Чт янв 08, 2009 21:08:13
NiTr0
Можно - только тогда получается поделить на 5, получим для максимального значения число 51 (51.2 - но сотые отбрасываются), в итоге - при опорном напряжении 5.12В получаем корректное отображение.
Рассчет делается для максимального/минимального значения (т.к. известно, что должно быть на выходе при известном опорном напряжении), для меньших значений - пропорционально пересчитается.

Добавлено: Чт янв 08, 2009 21:15:10
levon66
а как это выглядеть должно? то есть как мне объяснить мк что вот так и так. в программе то есть как реализовать. на асме. и деление производить в 2ой форме? то есть в регистр В класть 2ку в 2ой, а в А класть то, что снимаю?

Добавлено: Чт янв 08, 2009 22:11:12
NiTr0
levon66 писал(а):а как это выглядеть должно? то есть как мне объяснить мк что вот так и так. в программе то есть как реализовать. на асме.
Пишете процедуру запуска преобразования и считывания результата, процедуру вывода на экран, и увязываете это мат.обработкой и обработкой кнопок.
levon66 писал(а):и деление производить в 2ой форме? то есть в регистр В класть 2ку в 2ой, а в А класть то, что снимаю?
Да, только делить на 5.