Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » посчитать импульсы от 48 источников


посчитать импульсы от 48 источников

Сообщений 1 страница 9 из 9

1

Здравствуйте,
У меня задача посчитать импульсы от 48 источников , импульсы идут с частотой 0,0001-3 Гц, и передавать это все на ПК, также сохранять количество импульсов по каждому входу в ЕЕПРОМ
Я думаю использовать  для этих целей  atmega2560
И тут встает вопрос, как мне опрашивать эти 48 портов?
Постоянно в цикле или еще завести через диодs по восемь входов на  одно прерывание PCINTx  как на рисунке сделал?
http://s5.uploads.ru/t/FgcCt.png

0

2

Логично представить, что по скорости, проще порт читать не как 8 бит, а сразу байт (быстрее будет, вместо опроса 48 ног, всего лишь 6).
С изменением данных на порте надо смотреть, смотря что требуется, если изменения могут быть в хаотичном виде на всех 48 входах - это одно.
Если вы делаете типа что-то логера (один вход синхронизации) - это другое.
Кстати говоря, вам EEPROM жалко не будет? Хоть она и 100.000 циклов, но при 3 герцах её хватит на 23 суток и всё.

0

3

изменения  будут в хаотичном виде на всех 48 входах
в EEPROM я собираюсь писатть  приблизительно  1 раз в 360 импульсов и при том чтобы не потерять значение EEPROM в момент отключения напряжения я хочу записывать это значение в EEPROM циклически друг за другом определенное число раз а при чтении выбирать только последнеее (но это другой вопрос)
Зы, если брать массив в 10 записей то EEPROM должно хватить на 11 лет

Отредактировано Penumbra (2016-11-28 19:05:15)

0

4

Представьте ситуацию, на всех 48 входах одно и тоже состояние долгое время, что должно происходить?
Реакция должна быть при смене состояния или просто отсчет времени (за период)?

0

5

Необходимо подсчитывать количество импульсов!
На входа приходят импульсы длительностью примерно 100 мс (зависит от датчика) , поэтому считать только пи смене состояния, 
P/S  только подумал, что если импульс долго не менялся тогда можно диагностировать обрыв датчика или кз в линии датчика

Отредактировано Penumbra (2016-11-28 21:24:04)

0

6

Диоды свести все в одно прерывание - не получится, из-за разных значений/состояний входов.
Видимо придется как-то махинировать с PCINTx (как вы и предполагали), по этой вещи была тема уже: работа с PCINT на attiny13 (пользуйтесь поиском).
Пробуйте примеры, только вам понять, что вы хотите получить.

0

7

про  работу PCINTx  я знаю, вроде... но вопрос как все таки лучше организовать подсчет импульсов с 48 ми ног?
я еще думаю что может завести диоды  не на PCINTx  а на  INTx  и ловить прерывания по спаду ? и в прерывании читать весь порт с которого пришло прерывание
или тупо в цикле все порты читать и инкриментить переменные при изменении состояния? но тогда вопрос , сколько я импульсов прокакаю если проц уйдет в общение с EEPROM или ПК

0

8

Если только по "спаду", то вы будите отслеживать только 50% состояний.
Если будите отслеживать с каждого входа, то тут нужен такой алгоритм, который: быстро работает, не запутаетесь в обработке и туча памяти на обработку прерывания (48*17=816 байт в стэк, если не оптимизировать в асме).

На счет пропусков, всё зависит как код напишите/алгоритм, частота на входе вроде не большая, надо сильно накосячить, чтобы начать пропускать.

Конкретно по atmega2560 я ничего посоветовать не могу, ибо в наличии этот камень никогда не юзал (вот в ХМеге этот механизм нормально реализован, по целому порту).

На счет алгоритма, можно к примеру сделать так:

- данные хранить [байт - порт][байт - данные порта];
- если в "байт - порт" = #FF, то это конец данных;
- запись ведется по 2 байта (всегда, аля фрейм);
- при записи новых данным (2-х байт), всегда 3-й байт писать #FF;
- так всё идет по кругу.

Естественно массив должен быть четным.
Здесь получается механизм записи (один счетчик) и механизм чтения/отправки данных в ПК/порт (второй счетчик).
Кольцевой буфер. Главное понять, что делать, когда буфер переполнился, а данные так и не отправились.
Я такой алгоритм давно делал, работал на более шустрых скоростях - норм.
Да же если представить, что придет сразу несколько изменений по 48 каналам, то код быстрее выполняется, прежде чем что-то утеряется.

На счет прерываний PCINT, можно попробовать на нём сделать всё, но надо смотреть, прерывание на них скорее всего одно (на все каналы, доку почитайте), тогда делаете просто выставление флага (в этом общем прерывании), что прерывание сработало и сравнивать новое состояние с предыдущими значениями портов, если новые изменения есть, то просто пишем в переменную новые значения (для каждого порта отдельно). Затем, когда появляется/выставляется новый бит от подпрограммы прерывания, основное тело программы начинает их извлекать и сбрасывать флаг (что данные забрали), а сами данные пишем в буфер (выше описан).

0

9

Можно использовать по "мельче" КМ (mega328) и расширитель портов MCP23016. У неё есть выход прерывания, который дает импульс по изменению на любом из 16-ти входов. А дальше считанное с данной микры обрабатывать ВСЕ 16 бит. И того надо будет ТРИ MCP23016. НОГИ: SDA, SCL, 3 входа INT (если без диодов).
Исследование расширителей портов контроллера

Отредактировано Каримов (2016-11-30 23:05:37)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » посчитать импульсы от 48 источников