реклама на сайте
подробности

 
 
> Счетчик на Mega128
Ojo
сообщение Jun 26 2008, 15:54
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 16-06-05
Пользователь №: 6 070



Счетчик на Mega128

Пожалуйста, подскажите, как сделать следующую вещь? Есть линия для анализа. На ней могут быть логический ноль (почти всегда) или логическая 1 (редко, небольшими импульсами различной длины от 1 мсек до 10 мсек). Задача состоит в том, чтобы подсчитывать какова длительность всех импульсов логической 1 за текущую прошедшую секунду. Частота Меги 16MHz. Точность измерений:10% устроит.

Самое очевидное решение. Повесить исследуемую линию на любую ножку прерывания Мегию. При возникновении на ней логической 1 (и как следствия прерывания) засекать время (организовав внутренний таймер), При возникновении логического 0 на ней подсчитывать время импульса и прибавлять к переменной ВСЕГО.

Данное решение не подходит. Т.к. в силу специфики прошивки устройства Мега может запретить прерывания на длительное время (до 10 мсек).

Наверняка есть возможность решить эту задачу через таймеры/счетчки.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GDI
сообщение Jun 27 2008, 07:00
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



А может чем мудрить лучше переписать программу так чтобы она не запрещала прерывания на 10мсек? Или рассмотреть возможность разрешения вложенных прерываний, можно разрешить , например, вложенные только от таймера.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Jun 27 2008, 09:23
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Паноптикум... Мега 128 на 16 мегагерцах, внешний вентиль и ещё конденсатор!... lol.gif

Нужен один таймер, четыре байта памяти и одна нога порта.
Таймер даёт прерывания через, например 1 миллисекунду. Процедура его прерывания смотрит на порт и наращивает счётчик длительности (2-байтовый), если единица. Потом наращивает счётчик времени. Если счётчик времени равен 1000, то переписывает счётчик длительности в другое место памяти, поднимает флаг "измерено" и сбрасывает счётчики времени и длительности. ВСЁ. Точность 0.1%, всё синхронно, где-то в основном цикле - программа обработки счётчика длительности по флагу. Блин, на ассемблере будет короче всё это написать.

Цитата(Ojo @ Jun 26 2008, 20:56) *
Спасибо за ответы. Жалко что у меги нет возможности в таймере по одному фронту записать значение счетчика в один регист, а по второму во второй. Т.к. оба предложенных решения требуют задействования 2-х ножек Мега.

Есть такая возможность! Подаёте свой сигнал на вход прерывания, настраиваете реакцию на оба фронта. В обработчике первым делом ветвитесь по уровню сигнала - какой фронт. И вперёд.
interrupt:
in reg,port
sbrc port,bit
rjmp falling
mov reg_raising,timer
ret
falling: mov reg_falling,timer
ret

Регистр флагов запоминать не нужно - ни одна команда его не меняет. 14 циклов процессора - 625 нс.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 14:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016