Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Микроконтроллеры для начинающих
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Страницы: 1, 2, 3, 4, 5
ZLOI
Цитата(Old_Jedi @ May 7 2008, 17:08) *
измерять величену мою не надо. Смысл примерно такой: есть теоретическая функция преобразования преобразователя, она нелинейна, поэтому ее как бы разбиваем, что бы получить таблицу где определенной величене угла соответствовал определенный уровень выходного сигнала. Эту таблицу забиваем в память контроллера. Сигнал будет оцифровываться с помощью ацп контроллера и этот код например может служить адресом ячейки памяти, где уже храниться величена угла соответственная входному сигналу, останеться ее только вывести на индикатор. Я представляю как это все сделать на древнем МП который мы изучали smile.gif. но суровая реальность требует современных технологий, поэтому нужно как то воплотить это на совершенно незнакомом котроллере. Вот поэтому я сдесь smile.gif

Вот здесь посмотрите, там и прошива и схема:
http://people.overclockers.ru/NAPman/record14

А можно и так:
http://www.google.ru/search?source=ig&...oogle&meta=
Chado
Nu надо же вопросики для начинающих 07.gif
У меня вопрос начинающего.
Пытаюсь поторить чужое рукотворное изделие, и даже спаял.
Не могу прожечь PIC. Программатор ExstraPic ни мур-мур sad.gif
rezident
Цитата(Old_Jedi @ May 7 2008, 14:08) *
измерять величену мою не надо.
Не понял. Почему это не нужно? Насколько я понял у вас имеется первичный пробразователь, который угол отклонения преобразует в электрический сигнал. Этот сигнал аналоговый или уже цифровой?
Цитата(Old_Jedi @ May 7 2008, 14:08) *
Смысл примерно такой: есть теоретическая функция преобразования преобразователя, она нелинейна, поэтому ее как бы разбиваем, что бы получить таблицу где определенной величене угла соответствовал определенный уровень выходного сигнала. Эту таблицу забиваем в память контроллера. Сигнал будет оцифровываться с помощью ацп контроллера и этот код например может служить адресом ячейки памяти, где уже храниться величена угла соответственная входному сигналу, останеться ее только вывести на индикатор.
А тут про оцифровку сигнала с помощью АЦП речь идет. Ну и как понимать вашу фразу выше, о том, что сигнал оцифровывать не нужно? Кстати, а какой разрядности АЦП вы применять хотите? 10-и, 12-и, 16-и, 24-х? А теперь прикиньте-ка размер этой таблички для преобразования: например, для 24-х битного АЦП 2^24 состояний * 4 байта = 64 МегаБайта табличка получается однако! biggrin.gif Так что в аналитической форме-то формула преобразования гора-а-аздо меньше места займет. wink.gif Также при необходимости применяют таблицы аппроксимации (например, кусочно-линейной), которые опять же гораздо меньше предложенного вами способа преобразования занимают места в памяти.
Цитата(Old_Jedi @ May 7 2008, 14:08) *
Я представляю как это все сделать на древнем МП который мы изучали smile.gif. но суровая реальность требует современных технологий, поэтому нужно как то воплотить это на совершенно незнакомом котроллере. Вот поэтому я сдесь smile.gif
Тогда начинать нужно с изучения самого МК.
Old_Jedi
Цитата(rezident @ May 7 2008, 20:18) *
Не понял. Почему это не нужно? Насколько я понял у вас имеется первичный пробразователь, который угол отклонения преобразует в электрический сигнал. Этот сигнал аналоговый или уже цифровой?
А тут про оцифровку сигнала с помощью АЦП речь идет. Ну и как понимать вашу фразу выше, о том, что сигнал оцифровывать не нужно? Кстати, а какой разрядности АЦП вы применять хотите? 10-и, 12-и, 16-и, 24-х? А теперь прикиньте-ка размер этой таблички для преобразования: например, для 24-х битного АЦП 2^24 состояний * 4 байта = 64 МегаБайта табличка получается однако! biggrin.gif Так что в аналитической форме-то формула преобразования гора-а-аздо меньше места займет. wink.gif Также при необходимости применяют таблицы аппроксимации (например, кусочно-линейной), которые опять же гораздо меньше предложенного вами способа преобразования занимают места в памяти.
Тогда начинать нужно с изучения самого МК.

Меня понять сложно, я же совсем не прошареный в научных делах smile.gif Говоря что величену не нужно измерять это я имел ввиду, что контролер сам не вычисляет эту величену. Да сигнал надо оцифрововать, и не помню что я говорил обратное. Я вроде конкретно ставил задачу, что ацп использую базовое Меги128, оно 10разрядное, вообще не понимаю зачем 24 разряда ) Я что то не уверен что моя таблица чисел, вернее это не таблица а набор чисел, будет занимать столько места в памяти, используя вашу же формулу подсчета - памяти нужно 4кбайта, а у меги128 на барту 128 кбайт встроеная память. Зато програмно такай способ помоему не напряжен, я вообще не программист ни грамма, но думаю все будет выглядить просто.
Спасибо за ссылки и коментарии, иногда это помогает избежать критических ошибок. Но я буду надеяться на незнание нашими препадами данного микроконтроллера, что затруднит проверку правильности моих решений smile.gif
r_dot
Цитата(Chado @ May 7 2008, 17:07) *
... Не могу прожечь PIC. Программатор ExstraPic ни мур-мур sad.gif


Какой PIC? Прожигаешь в схеме или отдельно чип?
Chado
Цитата(r_dot @ May 10 2008, 07:56) *
Какой PIC? Прожигаешь в схеме или отдельно чип?


Отдельно чип!
Винда грузит прогу (IcProg) и ни мур-мур. В списке процессов вижу прогу и ресурс проца на её. неделю бодаюсь с компом. Не дайте лоб расшибить! twak.gif
vladi1147
Цитата(Chado @ May 10 2008, 09:59) *
Отдельно чип!
Винда грузит прогу (IcProg) и ни мур-мур. В списке процессов вижу прогу и ресурс проца на её. неделю бодаюсь с компом. Не дайте лоб расшибить! twak.gif


Добрый день,

я пользовался, хотя и недолго, парой ExtraPIC и программой для прошивки PIC16F628A. Проблем не встретил. Если нужно повторить, могу еще раз это попробовать, единственная проблема - Windows. Я пользуюсь Linux.
Chado
в томто и бодяга.
ХР со вторым паком, то она потеряет компорт, то графику на прогу, то вдруг ресурс проца под 100%.
Выкручивался следующим образом. В оборудовании выключаю сом порт.перезагружаюсь по требованию винды. Гружу прогу от имени администратора( постоянно ругается и то немогу и это). Убиваю прогу в диспетчере задач. Включаю компорт. гружу типово. Проверяю настройки проги. всё тип топ. читаю микруху- всё по нолям. НЕЧИТАЕТ. Хотя светодиодик мерцает. Что с виндой? Пробовал на другом цомпе. тест программатора не идет самый первый пункт. хотя все режимы в норме. Дата туда, а оттуда нэмааа. Икуда девается компорт? Каждый раз выключать? В ломы!
ПОМОГИТЕ!!! smile3009.gif
vladi1147
Цитата(Chado @ May 12 2008, 16:04) *
в томто и бодяга.
ХР со вторым паком...


XP SP2. Попробую сегодня что-нибудь придумать. Как долго нужно работать с программатором, чтобы проявились проблемы?
Chado
Вроде не должно быть проблем Но есть ведь.Все грехи валю на виду.Чип прожег у друга за 10 секунд.
На моем программаторе. Уже впендюрил в схему ---- ПАШЕТ!
Что с виндой непонятно!
vladi1147
Цитата(Chado @ May 12 2008, 19:48) *
...Что с виндой непонятно!


Windows XP SP2, кажется со всеми последними обновлениями. После настройки по инструкции (уже забыл, что надо настраивать) появлялись ошибки. После установки задержки до 40 (процессор 2.2ГГц), вроде бы, пропали ошибки. Раз 5-6 в режиме Прочитать-Стереть-Программировать и т.д.

Возможно, проблема не столько с Windows, сколько с быстрым процессором? Может быть задержики и в 40 не хватает?
Chado
smile.gif Ситуяция похожа на то, что брандмауэр гасит экранную часть проги по образу и подобию антивирусника нод32. В любом случае пога не в полном обЪёме загрузилась там где используются функции винды остается пустое место. Вызова функций АПИ просто нету. Что делать?Это гдето видимо в реестре вколочено. Хренаськи найдешь сотня мег реестр. или грохнуть всю винду и потом медленно и вернопоставить весь свой арсенал задач smile3046.gif cranky.gif
vladi1147
Цитата(Chado @ May 14 2008, 13:13) *
... В любом случае пога не в полном обЪёме загрузилась там где используются функции винды остается пустое место. Вызова функций АПИ просто нету. Что делать?Это гдето видимо в реестре вколочено. Хренаськи найдешь сотня мег реестр. или грохнуть всю винду и потом медленно и вернопоставить весь свой арсенал задач smile3046.gif cranky.gif


Грохнуть все, это никогда не поздно. А Вы точно выполнили все рекомендации по настройке IC-PROG при первом запуске? Я забыл о настройках, попытался запустить и все было очень странно, пришлось прочитать файл pdf, который был на диске и тупо повторить все, что там касалось предварительной настройки. К сожалению, я уже псчти забыл Windows. Но, если мешает брэндмауэр, то, может быть, попробовать его отключить? Извините, если сказал глупость.

Я уже запамятовал, но мне кажется, что я пробовал использовать EXTRA-PIC в Linux с программами KTechlab и Piklab. Если это мне не приснилось, то вполне удачно. Хотя больше я использовал самодельный простейший программатор.
Chado
Но, если мешает брэндмауэр, то, может быть, попробовать его отключить?

Отключиь брэндмауэр система не дает в сервис паках довески это ресекают сразу. Поступаю проще ВЫБРАСЫВАЮ IcProg к какойто маме. И шпандорим на проге Winpic800 она умеет распознавать чип. Шью пики 84, 628, 628А, 716, 874. Время на прошиву затрачивает чуть больше 10 сек. Одной рутинной работой меньше. так что тема бум говорить снята. Нехочет винда Icprog - и я не сильно то хотел. wink.gif 08.gif
Obama
Вот красивый проект для начинающих от новичка - LCD графический MT12864 - 128x64 точки. исходники для CVAVR и симуляция в PROTEUS - Прекрасно компилируется и симулируется. Можно симулировать в PROTEUS без компиляции - все файлы в архиве есть.
sKWO
что такое BCD и для чего оно нужно

BCD - Binary Coded Decimal -- это десятичное кодированное двоичным
Binay Coded Decimal- это кодирование которое упрощает хранение,доступ к ним и конвертацию данных для вывода к примеру на ЖКИ.
В результате конвертации мы в байте (8-bit) будем иметь два нибла (4-bit) каждый из которых будет содержать число
в размере от 0 до 16.Таким образом это позволяет нам хранить в каждом нибле десятичное число от 0 до 9 и два в одном
байте, тоесть в оном байте два десятичных числа.
Пример конвертации десятичного числа переменной mybyte если её значение находится в пределах от 0 до 99:
Код
char mybyte = 78;

Объявим переменную для значения старшего нибла.
Код
char upper_nibble = 0;
//Подсчитаем колличество десятков в переменной mybyte.
while (mybyte >= 10)
{
upper_nibble++;
mybyte -= 10;
}

После таких преобразований в переменной mybyte осталось число 8, а upper_nibble равно 7.
Чтобы получить сконвертированный байт объединим старший и младший ниблы:
Код
char result = (upper_nibble << 4) | mybyte;

Такой алгоритм исспользуется для конвертации в программе функции CHAR2BCD2.
Код
char CHAR2BCD2(char input)
{
    char high = 0;
    
    
    while (input >= 10)                 // Подсчитаем десятки
    {
        high++;
        input -= 10;
    }

    return  (high << 4) | input;        // Добавляем единицы и возвращаем результат
}

Если входное значение находится в пределах от 0 до 255 то исспользуют следующую функцию
Код
unsigned int CHAR2BCD3(char input)
{
    int high = 0;
        
    while (input >= 100)                // Подсчитаем сотни
    {
        high++;
        input -= 100;
    }

    high <<= 4;
    
    while (input >= 10)                 // Подсчитаем десятки
    {
        high++;
        input -= 10;
    }

    return  (high << 4) | input;        //  Добавляем единицы и возвращаем результат
}

Ещё один маленький пример ковертации байта в эквивалентное значение ASCII
с исспользованием BCD.
К примеру мы имеем байт Number размерностью от 0 до 99 который нужно сконвертировать BCD
в два эквивалентных кодировке ASCII значениям.
Код
char Tens = 0;     // десятки
char Ones = 0;     // единицы
char Number = 93; // значение для конвертации

Переведём десятичное значение в BCD исспользуя вышеописсаную функцию:
Код
Tens = CHAR2BCD2(Number);

Теперь переменная Tens в старшем нибле содержит десятки а в младшем - единицы. Дальше всё
очень просто, только необходимо помнить что ASCII ‘0’ - это 48, ‘9’ - это 48+9=57,‘3’ - это 48+3=51,
и наоборот 57 это десятичное значение ASCII ‘9’,51 это десятичное значение ASCII ‘3’.Таким образом конвертация десятичного значения в его эквивалентное ASCII значение - это простое суммирование десятичного значения и 48. Поскольку функция CHAR2BCD2 загрузила десятки и единицы переменной Number в Tens то мы должны сначала извлечь переменные Tens и Ones и добавляя 48 получить эквивалентные ASCII значения для Number.
Код
Ones = Tens;
Ones = (Ones & 0x0F) + '0';

Десятые мы получаем сдвигом на 4 и добавим 48.
Код
Tens = (Tens >> 4) + '0';

Теперь можно посимвольно выводить значения на ЖКИ, передавать в компютер и т.п.Пользуйтесь, это удобно. В общем может где-то есть и другая инфа на русском, я её не нашол, разобрался сам и решил другим помочь. Всё вышеперечиссленное тестировалось в компиляторе ИАР вер.5.10А.
Если будут найдены ошибки прощу исправить
Anub
Добрый день, решил заняться программированием МК, купил программатор ChipProg-40. Программатор полностью устраивает, все прошивает на отлично, но вот контроллер работать отказывается. Работаю с atmega8535. Вопрос - он действительно работает без внешнего кварца, или может как то нужно активировать внутренний? При установке в схему контроллер заметно греется, что наводит меня на мысль о том что проблема вовсе не в программаторе или самом контроллере а в программе, ибо походу контроллер работает а вот программу выполнять отказывается. Программу компилировал в Programmers Notepad 2, в makefile соответственно вписал atmega8535. Если кому не сложно, сделайте элементарный пример для этого контроллера(например что бы на PA0 горел светодиод).
Kuzmi4
2 Anub - зря вы потратились. СТК200/300 - вот это вЭщ!
По теме -
Меги имеют встроенный РЦ-генератор - вроде с заводи идут с тактированием 1МГц(Читайте ДШ раздел ФУЗЫ).
Если при установке в схему камень греется - это не програмам а скорей всего(99%) монтажка - проверяйте схему.
Пример с миганием:
Код
int main (void)
{
    DDRA=0x01;// устанавливаем 0-й пин порта А на вывод
    while (1)//типа бесконечный цикл
    {
        PORTA =0x01;//установка "1" на 0-ю лапу
        //тут надо вставить задержку - юзаю стандартную, там либу подрубать нужно- delay.h вроде - а вы сами определитесь что и где вам нужно
        _delay_ms(200);
        PORTA =0x00;// установка "0" на все лапы
        _delay_ms(200);// аналогично , а то мигать не будет
    }

    return 1;//пусть будет - варнингов меньше..
}
zltigo
Цитата(Obama @ May 16 2008, 09:38) *
Вот красивый проект для начинающих от новичка

Пороект вполне банальный,действительно уровень новичка. А с учетом прикладывания к нему рук, и особенно ссылок, воинствующего ламера 123 я бы вообще более, чем скептически рекомендовал ко всему написанному относиться.
Moderator:
Приложение слегка почистил от наглой саморекламы присоседившегося 123.
ysb
добрый день!
подскажите, пожалуйста, как железно(без прошивки) проверить МК AVR на работоспособность? программатор выдает communication error(
ysb
такой вопрос: если в CVAVR при прошивке стоит галочка Program Fuse Bits, но ниодного фьюза в списке не выбрано, то это он их всех сделал '1'? т.е CKSEL[3..0] = 1111 => работа от внешнего клока?? (mega16)
ситуация такая: один раз прошивается норм, потом МК не отвечает программатору... подскажите, куда смотреть пожалуста
vet
Цитата(ysb @ Jun 18 2008, 17:20) *
такой вопрос: если в CVAVR при прошивке стоит галочка Program Fuse Bits, но ниодного фьюза в списке не выбрано, то это он их всех сделал '1'? т.е CKSEL[3..0] = 1111 => работа от внешнего клока?? (mega16)
ситуация такая: один раз прошивается норм, потом МК не отвечает программатору... подскажите, куда смотреть пожалуста

галка означает фьюз, запрограммированный в 0, а её отсутствие - 1.
Таким образом, чтобы зашить режим работы от кварца, нужно снять все галки CKSELn.
radiofill
Цитата(nameless @ Apr 6 2005, 16:06) *
Не советую AVR для начинающих. Уж куда приятнее PIC. В преподавательской практике использовал оба - PIC схватывают на лету !!!
Есть подозрение - что из-за системы команд.


Всё гораздо проще. Для PIC есть много литературы на руссоком языке. Для AVR в основном только документация с минимумом примеров.
Daedal07
Я осваивать начал и,собственно,пока там и остался, с Мультикоров..и вот думаю,что мне просто не повезло...кто сталкивался-поймёт..конечно RISC+DSP сходу - это не совсем верно,но ситуация обязывала. Впринципе, неплохо,но глюки есть и они добивают,в основном, они в среде разработки(ПО слетает и если к этому не привыкнуть,то забросишь сразу же)..возможно предвзятость это,потому как отечественный...полезно знать,что наши пытаются.Если верить анонсам,то на них стоит обратить внимание,в мощности они прибавляют. smile.gif
Hitako
Тут много полезного программы, литература. http://www.forum.ocp.su/
марат
Добрый вечер. Подскажите пожалуйста, Как сделать секундомер на ATmega103 длительностью до 5 минут на Code VisionAVR C ?

Заранее большое спасибо!!
Kuzmi4
2 марат - вам нужно в интерупте по таймеру инкрементировать дабл например (если дискретность таймера маленькая -2х байт может не хватить ) - зная период таймера легко вычислить какое значение дабла будет по прошествию 5 минут wink.gif
марат
Алгоритм и структурная схема находятся тут : http://electronix.ru/forum/index.php?showt...mp;#entry433443
Tiny
Такой вопрос.
CodeVision, пример из пакета \cvavreval\examples\DS1820
Термометр с использованием Dallas Semiconductor DS1820, кварц 3.6864MHz
В программе используются библиотеки для работы с DS1820. Насколько я поинмаю, для обработки получаемых данных от DS1820 нужны определенные интервалы времени.
Я сделал проектик на Mega 16. Такого кварца у меня нет. Есть 4МГц, 4,5МГц и выше. Внутренние частоты МК - 1, 2, 4, 8. Попробывал в Протеусе симуляцию на 4 МГц. Работает. Но в реальном устройстве - нет.
Попробывал подключить внешнюю RC-цепь (4,2К 22пФ), выставив соответсвующие фюзы. Опять же на индикаторах ерунда.
Есть ли выход из данного положения? Можно ли обойтись без кварца на 3.6864MHz?
Tiny
Разобрался. Забыл проинвертировать управление транзисторами, которые коммутируют сегменты. Работает и от внутреннего 4МГц и от внешней RC цепи.
DeVOuR
простенькй вопросик)

Первая моя прога на АТмелах. Атмега8.

последоательный порт (USART). принцип приема с прерыванием каков?

Система такова:
1. прием определенного байта, который соотв. 1му из 3х определенных последующих действий мк.
а) выслать по юарт одни данные
б) выслать по юарт другие данные
в) приготовится принять данные

с передачей проблемм нет, а как организовать прием?
я пока что сделал так:
1. принимается байт - срабатывает прерывание - прерываемся - смотрим, какой байт получили - переходим к нужной проце - и тут же, не выходя из прерывания всю процу и выполняем.
с трансмиттом то так и будет, а вот с приемом номально? или все же следует както организовать прерывания таким образом, чтобы выходить из него после каждого принятого байта?

спс за ответ.
Kuzmi4
Приём/передача по прерываниям.
При чём лучше передавать пакетом данные - тогда разбор полётов можно засунуть сразу в прерывание + ошибок меньше будет в зашумлённых условиях.
Работа приблизительно такова - в ресив интерупте декодировался пакет -> есть комманада и данные - тогда выставляем определённый семафор и системный манагер (можна на таймер какой либо прицепить) по наступлению тика обрабатывает нужный запрос.
Передача - забиваете в буффер данные и кол-во для передачи - выставляете флаок и пошли интерупты клацать wink.gif
DeVOuR
Kuzmi4,
спасибо.
передачу переделал на пакетную, прием тоже сделал красиво.
в симуляторе работает как часики..
надо дописать ПО под виндоз, тогда посмотрим, че там получится)


и, есть ли смысл считать контрольную сумму? или это все зависит от частот и скоростей?
bureau
2 DeVOuR - вё зависит от зашумлённости среды в которой будет идти провод smile.gif
OlegH
Цитата(bureau @ Jul 26 2008, 14:00) *
2 DeVOuR - вё зависит от зашумлённости среды в которой будет идти провод smile.gif


Мне так видится, все зависит прежде всего от тяжести последствий приема и обработки искаженного пакета smile.gif Потому что вероятность приема искаженных данных существует всегда (и причины могут быть самые разные). Особенно если одной из обменивающихся сторон является ПК с виндой smile.gif
Фактически, в протоколе обмена типа "пакет запроса - пакет ответа" контрольные суммы нужны всегда.
Во избежание пусть очень редко случающихся, но весьма неприятных и непредсказуемых глюков smile.gif Даже простая арифметическая сумма или XOR байт пакета куда лучше чем ничего.
Ну а по-правильному - CRC8, CRC16 или CRC32 в зависимости от длин пакета и предполагаемой вероятности искажения данных. В качестве прикидки (где-то когда-то что-то такое слышал): CRC16 в типичном канале с BER (Bit Error Rate - вероятностью приема сбойного бита) = 10^-3 (один на тысячу) гарантирует обнаружение ошибки в пакетах с длиной, ограниченной на уровне 256 байт.
Integral
Для работы от внешнего кварца снял все галки CKSELn. Другие галки не трогал. Поставил внешний кварц. После чего МК перестал отвечать програматору. В чем проблема? может нужно было еще какието фьюзы поменять? Как теперь запустить МК? (мега16)

Кажется я понял в чем проблема.... по дефолту CKSELn=0001. А в моей проге для програматора по дефолту стояла только 1 галка в CKSELn, соотвецтвенно в этой проге идет наоборот.... галка - 1, нету галки - 0.
Таким образом получилось у мну CKSELn=0000. angry.gif

Как запустить теперь МК и выставить фьюзы как положено?
SSerge
Цитата(Integral @ Aug 16 2008, 10:27) *
Как запустить теперь МК и выставить фьюзы как положено?

Подать на МК внешний клок от любого источника.
При использовании адаптеров типа STK200/300 или Altera ByteBlaster клок можно генерить самим адаптером, если, конечно, программа программатора это умеет.
Например AvReal умеет.
Integral
Будем пробывать... на К155ЛА3 генератор склипаю...
Частота порядка 100КГц - 1МГц покатит?
SSerge
Цитата(Integral @ Aug 16 2008, 20:31) *
Будем пробывать... на К155ЛА3 генератор склипаю...
Частота порядка 100КГц - 1МГц покатит?

Должно при одном условии. Частота тактирования процессора должна быть в несколько раз выше частоты сигнала SCK при программировании.

конкретно для Мега16:
Depending on CKSEL Fuses, a valid clock must be present. The minimum low and high periods
for the serial clock (SCK) input are defined as follows:
Low:> 2 CPU clock cycles for fck < 12 MHz, 3 CPU clock cycles for fck ≥ 12 MHz
High:> аналогично.

т.е. низкий и высокий уровень на ноге SCK должны удерживаться не менее 2 (или даже 3) периодов тактирования процессора.
Быстрее одного раза за микросекунду порт принтера обычно не переключается, так что частоты от 2МГц точно хватит, немного более низкой - скорее всего хватит.
Integral
заработал на частоте 1.6МГц, програмируется у меня через СОМ порт.

Удивительно то что при напряжении 12В которое подавалось на питание МК около 30сек. он не накрылся... 07.gif (сгорел сволочь стабилизатор 7805)
monos
Столкнулся с такой задачей:
Необходимо было оцифровать сигнал с потенциометра и затем отмаштабировать цифровой результат. Как это сделать я так и не придумал, поэтому пришлось масштабировать аналоговый сигнал. Хотелось бы все таки делать это (масштабирование) программно. Камень использовал пик16ф886. Подскажите начинающему.
Sergey Reva
т.е нужно умножить, например на 0,12345? можно сделать так, умножить на 12345, разделить на 100000, при этом тип данных должен быть соответствующий, long например.
monos
Спасибо. Если не затруднит, дайте примерчик на си для понимания, как правильно задать этот (long) тип данных.
А как сделать "смещение нуля" программно? Так, как нужно, чтобы отмаштабированный сигнал имел заданные минимальное и максимальное значения.
Sergey Reva
Код
long value;

const long offset=-10;  // -10 adc попугаев
const long mul= 12345; // 0,12345
const long div=100000;

value=readADC();

value+=offset;
value*=mul;
value/=div;

showOnLcdLong(value);
showOnLcdByte((char)value);


вот собственно и полный пример: http://electronix.ru/forum/index.php?act=A...st&id=16863
monos
Видимо, я сильно начинающийsmile.gif : понял принцип, а как применить к моему случаю-- понял не совсем.
У меня задача следующая: необходимо результат ацп поместить 8-разрядный регистр PR (он задает длительность импульса шим модуля ССР). При этом, 8<PR<48. У пиков ацп 10-разрядное (результат ацп читается из спаренного 16-разрядного регистра- старший байт и младший байт) т.е. результат будет в диапазоне 0...1024. В Вашем примере задается 32-разрядный тип данных, надо ли это в моем случае? Помогите разобраться.
Sergey Reva
ну тогда можно просто делить на 25, без округления
1023/25=40,92 = 40
0/25=0
добавить смещение 8 и готово, в результате 8 ~ 48, тогда хватит и 16 бит, если есть возможность перевести АЦП в 8 бит режим, то наверное можно ещё проще, но это уже сами считайте smile.gif

з.ы.
только что заметил... больше 8, меньше 48... значит смещение 9, коэф соотв тоже надо пересчитать.. но смысл тот же
monos
Принцип понял, спасибо. Вы правы, наверное, будет лучше не читать два младших бита ацп и оперировать восьмиразрядным словом: такая возможность есть. Надо только продумать, как оперативно изменять мин и мах значения при наладке железа. А в пэдээфке, как понял, три варианта вычисления?
Sergey Reva
сначала идёт расчёт коэф, потом 3 варианта расчёта, 1й с типом double, 2й через целочисленную арифметику с округлением, 3й - то же что и 2й (только через 1/к) но без округления
monos
2Sergey Reva
Спасибо.
_Ie0nid
Спасибо всем кто помог с регистрами USART. Подскажите пожалуйста еще один такой нюансик. Я пытался подключитть клавиатуру к УСАРТУ в синхронном режиме, у него есть стробирующие импульсы - 11 штук, идут они одновременно с данными, следовательно получается нужные 11 бит. (1 стартовый, стоповый, бит четности, и 8 бит данных). Естественно у меня ни чего не получилось. Такой вопрос, УСАРТ принимает очередной бит данных каким образом? По каждому стробу? И следующее, данные, я так понимаю, он считывает по уровню при появлению фронта строба.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.