Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 30.04.2018, 15:25  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Как реализовать на С

Ну это мы можем
Реклама:
AR_Favorit вне форума  
Непрочитано 30.04.2018, 23:11  
ptr
Прописка
 
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
ptr на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от AR_Favorit Посмотреть сообщение
Раздел называется "вопросы новичков". Что ты тут ожидал увидеть? ))
Ну что-то типа
Код:
#include <stdint.h›

typedef struct adc_handlers_st {
  uint16_t adc_top_value;
  uint8_t (*adc_handler)(void);
} adc_handlers_t;

static uint8_t adc_handler_550(void)
{
  return 1;
}

static uint8_t adc_handler_650(void)
{
  return 2;
}

static uint8_t adc_handler_750(void)
{
  return 3;
}

static uint8_t adc_handler_max(void)
{
  return 10;
}

adc_handlers_t adc_handlers[] =
{
  {750, adc_handler_max},
  {650, adc_handler_750},
  {550, adc_handler_650},
  {0, adc_handler_550},
};

uint8_t sample(uint16_t adc_value)
{
  uint8_t rc=0;

  for (uint8_t i=0; i++; i<sizeof(adc_handlers)/sizeof(adc_handlers[0]))
  {
     if ( adc_handlers[i].adc_top_value<adc_value ) 
     {
       rc=(*adc_handlers[i].adc_handler) ();
       break;
     }
  }
  return rc;
}

Последний раз редактировалось ptr; 01.05.2018 в 01:37.
ptr вне форума  
Непрочитано 30.04.2018, 23:27  
Ara41
Почётный гражданин KAZUS.RU
 
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от ptr Посмотреть сообщение
Ну что-то типа
не лень было это все набивать?
Ara41 вне форума  
Непрочитано 01.05.2018, 00:41  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 943
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от Исбанни Посмотреть сообщение
замес по теме: "Что лучше - switch, if или if-else?
Лучше всего таблица - 1024 (ацп 10 бит) адресов функций обработки. Получили результат ацп, прибавили адрес начала таблицы, извлекли адрес, перешли по нему. Минимальное число тактов, причём ВСЕГДА одинаковое, вне зависимости от числа сравнений. Варианты if, switch будут давать разное время, в зависимости от числа сравнений. Т.е. плюсы очевидны, и они о-го-го. Минусы не менее очевидны, гы-гы-гы. Впрочем, зачем останавливаться? Ведь алгоритм обработки известен, все возможные значения так же известны... Формируется ещё несколько таблиц, по 100 значений, делается очередная итерация - базовый адрес плюс значение... И так далее... В итоге в теоретическом пределе "компилируется" "программа" из кучи связанных таблиц... без операторов, а значит пригодных к исполнению на любой архитектуре как есть, без перекомпиляций и адаптаций. Скорость выполнения программы возрастёт в десятки раз. А насколько упростится ОС - её задача сведётся только к извлечению чисел из таблиц...Хотя наверно не все алгоритмы можно будет свести к набору таблиц... Но это уже вопрос надо исследовать. Сам я этим пока не занимался, бо лень. Хотя если кто-то напишет такой компилятор, может быть и нобелевку получит.
Someone вне форума  
Непрочитано 01.05.2018, 01:11  
makakus
Почётный гражданин KAZUS.RU
 
Регистрация: 08.10.2007
Сообщений: 2,760
Сказал спасибо: 1,106
Сказали Спасибо 1,037 раз(а) в 569 сообщении(ях)
makakus на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от Someone Посмотреть сообщение
Лучше всего таблица - 1024 (ацп 10 бит) .... Варианты if, switch будут давать разное время, в зависимости от числа сравнений.
Что за пурга... Сколко памяти сожрёт та таблица?
Число тактов - да, если делать по-тупому, можно дойти до виндового окна "Идёт подготовка к удалению ярлыка" - видел такое.
Сравнение должно быть типа двоичного дерева: Первое сравнение больше или меньше 512 следующее - с 256 или 768 и т.д. Ради упражнения посчитайте количество шагов с точностью до 1.
makakus вне форума  
Непрочитано 01.05.2018, 01:16  
ptr
Прописка
 
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
ptr на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от Someone Посмотреть сообщение
Лучше всего таблица - 1024 (ацп 10 бит) адресов функций обработки.
А если АЦП 32 бита, то понадобится 64-битный процессор и 32 гигабайта под эту таблицу?
Боюсь, это тупиковый путь...
ptr вне форума  
Непрочитано 01.05.2018, 01:21  
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от ptr Посмотреть сообщение
Код:
for (uint8_t i=0; i++; i ‹ sizeof (adc_handlers) )
Серьезно?

Последний раз редактировалось AR_Favorit; 01.05.2018 в 01:24.
AR_Favorit вне форума  
Непрочитано 01.05.2018, 01:27  
ptr
Прописка
 
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
ptr на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от makakus Посмотреть сообщение
Сравнение должно быть типа двоичного дерева
Классический вариант все же B-Tree, а не двоичное дерево. Конечно, при коэффициенте B-Tree равным 2, это и получится двоичное дерево, вот только этот коэффициент, обычно, выбирают на один-три порядка большим двух: от нескольких десятков до нескольких тысяч.
А вот уже внутри узла или листа B-Tree двоичный поиск оправдан.
ptr вне форума  
Непрочитано 01.05.2018, 01:37  
ptr
Прописка
 
Регистрация: 24.11.2016
Адрес: Moscow
Сообщений: 287
Сказал спасибо: 57
Сказали Спасибо 54 раз(а) в 39 сообщении(ях)
ptr на пути к лучшему
По умолчанию Re: Как реализовать на С

Сообщение от AR_Favorit Посмотреть сообщение
Серьезно?
Нет, поторопился в процессе борьбы с глюками форума из-за некоторых символов. Должно быть:
Код:
for (uint8_t i=0; i++; i<sizeof (adc_handlers)/sizeof (adc_handlers[0]) )
P.S. По месту тоже исправил.
ptr вне форума  
Сказали "Спасибо" ptr
AR_Favorit (01.05.2018)
Непрочитано 01.05.2018, 08:51  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Как реализовать на С

При числе обработчиков ‹=256 и разрядности ADC›8 вполне элегантно будет выглядеть таблица индексов обработчиков и к ней таблица адресов обработчиков. Считать индекс по смещению, сдвинуть его влево на битовую длину адреса и получить адрес перехода. При достаточной памяти небольшая плата за скорость. Обычно такого ветвления вполне хватает .

Количество памяти можно оптимизировать с учётом разрядности и возможно нормирования значения для двухполярного со знаком.

Единственная нудная задача - избежать ошибок при заполнении того индексного массива. Подход хорош при большом числе и сложной логике диапазонов.
Тут весьма полезна отдельная программа для генерации массива индексов про диапазонам.

Нехватку своей памяти можно решить с помощью внешней и использовании значения ADC (возможно после сдвига) как адрес для выборки…

И код получится достаточно элегантным .
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 03.05.2018 в 05:18.
mike-y-k вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать "реализуемое" - цифровой фильтр TranceBooster Цифровые сигнальные процессоры 8 18.03.2011 22:35
Задание. Реализовать на attiny2313 doband Микроконтроллеры, АЦП, память и т.д 17 13.12.2010 18:28
Как реализовать на ATmeg8 или ATtiny датчик случайных чисел Don_Ambrosio Микроконтроллеры, АЦП, память и т.д 20 03.05.2008 21:06
Можно ли на AVR реализовать вот такую схемку? -Dmitriy- Микроконтроллеры, АЦП, память и т.д 9 14.05.2006 16:43


Часовой пояс GMT +4, время: 08:46.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot