Страница 1 из 1

Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Пн авг 12, 2013 18:07:05
СКАЗОЧНИК
Может и тупой вопрос..., но мне надо организовать внешнее прирывание именно на портуВ, 7 пин. т.е. Я конфигурирую на то, чтобы этот 7 пин реагировал на изменение сигнала.
Вопрос. Я так понимаю, что он будет реагировать, как на фронт, так и на спад сигнала??? Т.е. если я запущу на него меандр, он мне будет ловить по два прерывания на один период????
Как сделать, чтобы ловил только фронты (или спады)??

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Пн авг 12, 2013 18:38:34
СКАЗОЧНИК
Я просто понимаю, что можно уйти в прерывание и задать там задержку, чтобы например, отловив фронт, проигнорировать следующий спад импульса. Но у меня импульсы с частотой 1 Гц, значит в прерывании сидеть очень долго надо будет, что меня в корне не устраивает, т.к. .....
А. ВСЕ, ПРИДУМАЛ, КАК СДЕЛАТЬ... =0)

СПасибо всем за внимание. Прошу тему закрыть уже за ненадобностью...

Хотя, если кто ответит по поводу правильности моего понимания работы этого вида прерываний, буду очень рад. =)

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Пн авг 12, 2013 18:57:55
blackx
Да, прерывание вызывается на любом изменении лог. уровня на выводе.
Нужно просто проверять уровень на ноге вначале прерывания (бит 7 регистра PINB). Если лог. 1 - был возрастающий фронт, 0 - спадающий.

Надеюсь, вы до этого догадались :wink:

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Пн авг 12, 2013 19:00:30
АСУ
СКАЗОЧНИК писал(а):Вопрос. Я так понимаю, что он будет реагировать, как на фронт, так и на спад сигнала??? Т.е. если я запущу на него меандр, он мне будет ловить по два прерывания на один период?
Правильно понимаете.
СКАЗОЧНИК писал(а):Я просто понимаю, что можно уйти в прерывание
Один из вариантов: в первом прерывании по фронту взводить флаг, в следующем сбрасывать флаг.

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Вт авг 13, 2013 07:06:48
СКАЗОЧНИК
=))) Да я все проще придумал, хотя думал про то, чтобы считывать состояние на ПИН7, определять фронты или спады. =) Мне просто надо было подсчитать количество импульсов, т.е. секунд в минуте, от часов РТС. В голову пришло считать количество прерываний, а если их идет по два на импульс, нужно просто считать в два раза прерываний. Т.е. не 60 за минуту, а 120. Вот и все. Контроллер в счетчике накопит 120 значений, поймет что прошла минута и выполнит запрос на РТС и обновит время на индикаторе. Примерно так.

Спасибо всем.

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Вт авг 13, 2013 07:31:17
BOB51
Для таких задач (подсчет внешних импульсов) используется таймер/счетчик (Т0 или Т1) в режиме счета с внешнего входа.
8)

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Вт авг 13, 2013 07:46:12
СКАЗОЧНИК
таймер/счетчик (Т0 или Т1)
И это разумно, можно еще и просто прерывание внешнее INT0 или INT1, но я сделал все шиворот на выворот... Сначала все спаял, а потом мне приспичело сделать прерывание... Когда уже все выводы были заняты другими функциями. Приходится использовать то, что осталось. 8)

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Вт авг 13, 2013 10:49:17
BOB51
Садомазохизмо однако... :cry:

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Вт авг 13, 2013 21:55:42
СКАЗОЧНИК
Мне надо еще на этот вывод сделать вывод сигнала будильника... =) Т.е. прерывания буду временно отключать, а сразу после сигнала снова включать, ну и обновлять считывание значений часов и минут с РТС....

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 06:45:28
BOB51
AVRки для таких дел (работа одновременно с несколькими прерываниями) не совсем удобны по сравнению с mcs51.
Как один из вариантов - соорудить всю начинку часиков внутри МК, а с внешней RTC обмениваться только при запуске и перед отключением (ну и по спецсобытиям а-ля будильник или корректор хода).
Частое обращение к регистрам часиков может вносить погрешность в их работу (смотри http://radiokot.ru/forum/viewtopic.php?f=61&t=83313 )
:beer:

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 09:32:11
eess9
BOB51 дело говорит
Я когда-то тоже часы на тиньке собирал. Тактировал кристалл от кварца 3.2768MHz (пусть и не сильно распространенный, но со стандартного ряда). 8-ми разрядный таймер (не помню точно при каком предделитете) переполняется ровно 12.5 раз в секунду. А далее дело техники...

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 10:47:17
СКАЗОЧНИК
Т. е. вы рекомендуете сделать так, чтобы МК сам считал время и выводил его на индикатор? А синхронизировать с РТС только время от времени?

Я планировал сделать счетчик количества прерываний секунд от вывода SQW (настроен на 1 Гц), и по прошествии минуты запрашивать показания времени из часов и выводить их на индикатор... Т.е. обращаться к РТС каждую минуту.

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 11:10:46
eess9
СКАЗОЧНИК писал(а):Т. е. вы рекомендуете сделать так, чтобы МК сам считал время и выводил его на индикатор? А синхронизировать с РТС только время от времени?

Я планировал сделать счетчик количества прерываний секунд от вывода SQW (настроен на 1 Гц), и по прошествии минуты запрашивать показания времени из часов и выводить их на индикатор... Т.е. обращаться к РТС каждую минуту.
А что мешает считать на основе этого сигнала (1Гц) время внутри контроллера постоянно?

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 11:46:09
BOB51
Если обращение не к массиву, а побайтовое - проблем меньше, но это "недокументированный режим" для DS1307.
Да и внешний обмен - довольно ресурсоемкое дело (тем более, что внутри МК операции быстрее выполняются). :roll:

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 14:50:55
СКАЗОЧНИК
BOB51 писал(а):Если обращение не к массиву, а побайтовое - проблем меньше,
ну, я так и собирался сделать. =) Только часы и минуты выдергивать, все не читать. Тем более весь протокол на ассемблере нарисовал (малость упрощенный) для I2C.
eess9 писал(а):что мешает считать на основе этого сигнала (1Гц)
Ну, так даже проще сделать... =) Просто думал, зачем писать двойные часы, если есть РТС???... Конечно, можно РТС использовать только для корректировки времени.

З.Ы. Календарь мне не нужен..

З.З.Ы. Тему, наверное, надо переименовать... Или приклеить к какой-нибдуь существующей... А то вопрос про прерывания себя исчерпал, а про РТС вопросы еще могут быть... Спасибо.

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 15:48:08
BOB51
Там в даташите I2C только для работы с массивом.
Побайтовый вот такое дает:
shpora_I2C_1.pdf
(135.75 КБ) 255 скачиваний
8)

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 16:07:19
СКАЗОЧНИК
А я не использую протокол из даташита... =) ПРимерно, то же сделал, что и пдфе написано.
Я правильно понимаю, что можно просто обратиться к часам РТС по адресам 0х01 и 0х02 и считать только значения минут и часов, причем к каждому по отдельности??? А потом на каждый ответный байт отослать их НАК.

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Ср авг 14, 2013 19:51:51
BOB51
Именно так и делается - считываются только часы и минуты (ну и календарь, если нужно).
Предварительно задан адрес и чтение одного или нескольких байт подряд. Однако если читаем два байта подряд, то лучше выставить младший адрес и считать оба последовательно, чем задавать два отдельных блока заголовок+чтение.
У меня закопалось два описания на DS1307. Скинул в личку. :beer:

Re: Прерывания по любому изменению ПортаВ в АТтини2313, как?

Добавлено: Чт авг 15, 2013 08:04:24
СКАЗОЧНИК
BOB51 писал(а):У меня закопалось два описания на DS1307. Скинул в личку.
Огромное спасибо! Очень признателен. :beer: