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

Обсуждаем контроллеры компании Atmel.
Ответить
cgw
Открыл глаза
Сообщения: 64
Зарегистрирован: Ср дек 24, 2014 20:28:17

Сообщение cgw »

С какой скоростью может читать данные из PIN в ОЗУ микроконтроллер Atmega 8 или 128
Как посчитать правильно. При частоте на 1 000 000 Гц.
p.s.
Нужно наподобие АЦП (не подходит) только, в двоичном виде 1 или 0.
Читать данные с потока, на порту. И если данные совпали то делать действие.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6322
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

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

Сообщение Sergi »

Ну минимально положить байт в озу - 3 такта CPU. А дальше смотеть от алгоитма. буква не аботает.
Прорезались зубы
Аватара пользователя
Сообщения: 237
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Сообщение AlanDrakes »

Насколько мне помнится, если читать весь поти, то можно уложиться где-то 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.
Реклама
Эиком - электронные компоненты и радиодетали
Самсусамыч

Сообщение Самсусамыч »

[uquote="cgw",url="/forum/viewtopic.php?p=3626459#p3626459"]Читать данные с потока, на порту. И если данные совпали то делать действие.[/uquote]
Проверка логического состояния пина и выполнение команды записи данного состояния в ОЗУ и возврат в первоначальное состояние (проверка пина) занимает максимально 8 тактов (при тактовой 1 МГц = 8 мкс). То же действие, но с записью в рабочий регистр в место ОЗУ, занимает максимум 6 мкс.
Реклама
Ответить

Вернуться в «AVR»