Обсуждаем контроллеры компании Atmel.
Ответить

Atmega 8 или 128 скорость чтения PIN 1 или 0

Ср май 01, 2019 15:43:44

С какой скоростью может читать данные из PIN в ОЗУ микроконтроллер Atmega 8 или 128
Как посчитать правильно. При частоте на 1 000 000 Гц.
p.s.
Нужно наподобие АЦП (не подходит) только, в двоичном виде 1 или 0.
Читать данные с потока, на порту. И если данные совпали то делать действие.

Re: Atmega 8 или 128 скорость чтения PIN 1 или 0

Чт май 02, 2019 09:39:06

Вопрос поставлен через опу.
С какой скоростью? Со скоростью выполения команда in RX,PINY, т.е. десятые доли микросекунды - это смотря какой кварц.
Сколько времени пройдет от подачи сигнала на пин? Это зависит от проги. Если там к этой команде обращаются раз в год - то соответственно. Чтобы время реакции было минимальным - прерывания.
Как скоро, приняв один бит, мы можем вернуться к приему следующего ? Это зависит от участка проги, обрабатывающего принятый бит. От долей микросекунды до бесконечности.
Так мучительно не хочется автору получить ответ на свой вопрос, что затемнился до предела. Если это не Манхеттэнский атомный проект, то хоть намекнул бы на ссуть.
А, понятно - радиовзрыватель... Террористам я не помощник. Пошел звонить в фСБ.

Re: Atmega 8 или 128 скорость чтения PIN 1 или 0

Чт май 02, 2019 17:19:01

Ну минимально положить байт в озу - 3 такта CPU. А дальше смотеть от алгоитма. буква не аботает.

Re: Atmega 8 или 128 скорость чтения PIN 1 или 0

Чт май 02, 2019 18:10:57

Насколько мне помнится, если читать весь поти, то можно уложиться где-то 5 тактов. Но плохо.
Собственно, чтение - 1 такт.
Запись в память - 2 такта (со смещением)
Переход к чтению - 2 такта (если без проверок на окончание)

Код:
loop:
in r16, porta; // Чтение - 1 такт
st y+, r16; // Запись в память - 2 такта
rjmp loop; // Бесконечный цикл - 2 такта.
// Реально, бесконечный цикл. Без проверок и возможности выхода.


Можно чуть дольше, но до конца буфера.
Код:
// Предварительно:
ldi r17, 0x20; // 0x0200 - 1024 байта памяти выделено под буфер захвата. Предполагается, что буфер памяти расположен в адресах 0x0000..0x1F00
loop:
in r16, porta; // Чтение - 1 такт
st y+, r16; // Запись в память - 2 такта
cpse r17, r29; // Сравниваем верхний байт регистра Y - 0x??xx со значением (0x20), установленым ранее. 1 такт, если не совпадает, иначе - 3 такта (инструкция перехода занимает 2 байта).
rjmp loop; // Вернуться обратно на метку - 2 такта.

Итого - 6 тактов на цикл.

Соответственно, второй вариант будет захватывать состояние порта со скоростью (8000000 / 6) = 1'333'333 MSa/s

Естественно, код выше требует некоторых предварительных действий - установку индексного регистра Y перед началом захвата, определением конца буфера захвата (можно установить технически любое значение, но дополнительные проверки только уменьшат скорость выполнения кода).

И, кстати, при такой скорости чтения - у контроллера не останется времени на обработку полученных данных.
Я бы оценил реальную скорость приёма и обработки в... от силы 100kSa/s.

Re: Atmega 8 или 128 скорость чтения PIN 1 или 0

Чт май 02, 2019 20:52:24

Читать данные с потока, на порту. И если данные совпали то делать действие.

Проверка логического состояния пина и выполнение команды записи данного состояния в ОЗУ и возврат в первоначальное состояние (проверка пина) занимает максимально 8 тактов (при тактовой 1 МГц = 8 мкс). То же действие, но с записью в рабочий регистр в место ОЗУ, занимает максимум 6 мкс.
Ответить