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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Прерывания в AVR
archi2000
сообщение Nov 14 2006, 15:29
Сообщение #16


Участник
*

Группа: Новичок
Сообщений: 38
Регистрация: 30-09-05
Пользователь №: 9 098



Хочу такое запрограммировать - программный одновибратор 100 мсек.
Начало.
Внешние прерывания запрещаем в регистре GICR.
Разрешаем прерывания от таймеров.
Разрешаем прерывания глобально.
Задержка 100 мсек.
Разрешаем внешние прерывания.
Если за эти 100 мсек внешие события были, то флаги int0 и int1 должны присутствовать и добавляем в теле прерывания к переменной единичку.
Запрещаем внешние прерывания.
Выполняем несколько комманд основной программы с проверкой различных условий.
Переходим на начало.

Так как в даташите написано, что флаг постоянно сбрасывается если прерывание по уровню, а я не хочу мгновенно это событие обрабатывать, то вот и не знаю будет ли этот алгоритм работать.
Где еще прочитать или ставить эксперименты?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 14 2006, 16:16
Сообщение #17


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Инициализируете нужное прерывание по фронту (или спаду, как надо). После очередного разрешения внешнего прерывания анализируете вручную вход INTx. Если он в нужной полярности - запоминаете где-нибудь. Всё это можно делать прямо из прерывания по таймеру - два раза подряд на включение и выключение анализа входов внешних прерываний. GICR по-моему лучше вообще не трогать. Лучше в этом регистре сразу выключить оба прерывания, а их настроить на нужный фронт. А потом только анализировать вручную вход INTx и его "захваченный" флаг прерывания. Сам так не делал, но думаю это сработает. Загрузка процессора - минимальная.

Забыл ещё кое-что. Перед "ручным" анализом входа INTx нужно сбрасывать флаг INTFx. А через 100 мс его только считывать и можно не сбрасывать.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
klop
сообщение Nov 14 2006, 16:33
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 433
Регистрация: 28-02-06
Пользователь №: 14 788



Цитата(GetSmart @ Nov 14 2006, 18:18) *
Насчёт 1+1=0 прикольно :-)
Мне такое и в голову не приходило. Но скорее всего сделано не так. И программно такой бит не установить. Если кто проверет - сообщите. Самому интересно.


Конечно не установить. А сбрасывать записью 1 - это чтобы при сбросе сбросить только нужные флаги.
Go to the top of the page
 
+Quote Post
xemul
сообщение Nov 14 2006, 17:41
Сообщение #19



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(GetSmart @ Nov 14 2006, 18:18) *
Насчёт 1+1=0 прикольно :-)
Мне такое и в голову не приходило. Но скорее всего сделано не так.

Именно так и сделано. Для проверки можете разрешить какое-нибудь прерывание при взведенном флаге этого прерывания - незамедлительно отправитесь по соответствующему векторуsmile.gif.
Цитата
И программно такой бит не установить. Если кто проверет - сообщите. Самому интересно.

Сам бит прерывания программно не установить. Тем не менее (из даташита на mega48, в остальных аналогично):
Цитата
The External Interrupts are triggered by the INT0 and INT1 pins or any of the PCINT23..0 pins.
Observe that, if enabled, the interrupts will trigger even if the INT0 and INT1 or PCINT23..0 pins
are configured as outputs. This feature provides a way of generating a software interrupt.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 14 2006, 18:54
Сообщение #20


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(xemul)
Цитата
The external interrupts are triggered by the INT0, and INT1 pins. Observe that, if
enabled, the interrupts will trigger even if the INT0..1 pins are configured as outputs.
This feature provides a way of generating a software interrupt.
Тут немного о другом написано. Написано что для софтовых прерываний нужно сконфигурить нужный вход прерывания как выход и установив на нём нужный сигнал вызвать прерывание. К битам INTFx это отношение не имеет. А жаль. Лучше бы софтовые прерывания вызывать менее извратно, например как в LPC-армах.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Diusha
сообщение Nov 15 2006, 04:23
Сообщение #21


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



«А жаль. Лучше бы софтовые прерывания вызывать менее извратно, например как в LPC-армах.»

А зачем? Разве трудно в прогу всавить rcall Int_SubRoutine?
Go to the top of the page
 
+Quote Post
_Bill
сообщение Nov 15 2006, 07:10
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(GetSmart @ Nov 14 2006, 21:54) *
Цитата(xemul)
Цитата
The external interrupts are triggered by the INT0, and INT1 pins. Observe that, if
enabled, the interrupts will trigger even if the INT0..1 pins are configured as outputs.
This feature provides a way of generating a software interrupt.
Тут немного о другом написано. Написано что для софтовых прерываний нужно сконфигурить нужный вход прерывания как выход и установив на нём нужный сигнал вызвать прерывание. К битам INTFx это отношение не имеет. А жаль. Лучше бы софтовые прерывания вызывать менее извратно, например как в LPC-армах.

Ну, вот и приехали!!! Как раз все наоборот. Тут же ясно все написано. Внешние прерывания могут возникать и тогда, когда порты ВВ установлены на вывод. Но если прерывания возникли, то соответствующие флаги INTFx будут устанавливаться. Посмотрите схему конфигурации портов в DS внимательней.
Изменяя в программе значения на выходных портах (1->0 или 0->) Вы сможете вызывать прерывания в нужный момент времени. Но, еще раз повторюсь, external interrupts возникают при изменении значения на входе пина, независимо от того, как сконфигурирован порт, на ввод или на вывод.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 15 2006, 07:36
Сообщение #23


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(GetSmart @ Nov 14 2006, 20:54) *
Цитата(xemul)
Цитата
The external interrupts are triggered by the INT0, and INT1 pins. Observe that, if
enabled, the interrupts will trigger even if the INT0..1 pins are configured as outputs.
This feature provides a way of generating a software interrupt.
Тут немного о другом написано. Написано что для софтовых прерываний нужно сконфигурить нужный вход прерывания как выход и установив на нём нужный сигнал вызвать прерывание. К битам INTFx это отношение не имеет. А жаль. Лучше бы софтовые прерывания вызывать менее извратно, например как в LPC-армах.

even if переводится как "даже если", а вовсе не как "нужно".
Смысл от этого меняется кардинально.
Что же касается софтовых прерываний, то их в AVR нет вообще если никак не трогать периферию.
Согласен, что в некоторых ARM (да и других контроллерах) этот вопрос решён лучше.

Цитата(Diusha @ Nov 15 2006, 06:23) *
А зачем? Разве трудно в прогу всавить rcall Int_SubRoutine?

При обычном вызове процедуры прерывания, т. е. собственно через прерывание, а не через call, прерывания запрещаются.
Этого нет при вызове через call. Запрещать прерывания придётся вручную до вызова.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 15 2006, 09:25
Сообщение #24


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Ну все тут прямо знатоки аглицкого как я погляжу. Только за смыслом беседы так же дотошно почему-то не следят. Смысл от "даже если" к "нужно" смещается очень легко. Нужно всего лишь прочитать все предложения в обратном порядке. Начиная с софтверных прерываний (о которых и шла речь) и доходя до того как их организовать.

Вопрос-то был всего-лишь в том, как аппаратно реализованы биты INTFx и можно ли их "вручную" установить для вызова софт-прерывания. Ну и кроме этого, какие ещё механизмы влияют на изменение этих флагов. Хотя главный вопрос - вопрос автора, как ему сделать то что нужно.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Nov 15 2006, 11:27
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Как по мне, то любая неочевидная логика работы устройства, отличающаяся от if ... then ..., затрудняет даже собственное понимание после недели отвлечения на другой проект. Маскирование прерывания, чтобы не обработать прерывание от помех - это заботливо поставленные в собственном сарае грабли. Так можно делать, пока проект помещается на страницу текста и в голову. У меня в среднем проекте 15-20 файлов.
Вывод. Прерывания не маскировать, но при обработке его предусмотреть очевидный механизм анализа.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Nov 15 2006, 16:57
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(archi2000 @ Nov 14 2006, 18:29) *
Хочу такое запрограммировать - программный одновибратор 100 мсек.
Начало.
Внешние прерывания запрещаем в регистре GICR.
Разрешаем прерывания от таймеров.
Разрешаем прерывания глобально.
Задержка 100 мсек.
Разрешаем внешние прерывания.
Если за эти 100 мсек внешие события были, то флаги int0 и int1 должны присутствовать и добавляем в теле прерывания к переменной единичку.
Запрещаем внешние прерывания.
Выполняем несколько комманд основной программы с проверкой различных условий.
Переходим на начало.

Так как в даташите написано, что флаг постоянно сбрасывается если прерывание по уровню, а я не хочу мгновенно это событие обрабатывать, то вот и не знаю будет ли этот алгоритм работать.
Где еще прочитать или ставить эксперименты?


Я не вижу проблем в Вашем алгоритме, но боюсь что не совсем понимаю его. Вы лучше опишите что хотите сделать, а мы предложим Вам варианты.

Можно в прерывании смотреть фронт а можно, например каждый раз менять фронт и по разному обрабатывать. Можно отложить обработку прерывания, только надо учесть, что при запрете прерывания флаг выставится только один раз. Остальные будут потеряны. Лучше, как предлагает, Dog Pawlowa прерывания обрабатывать всегда. А если Вы не хочете увеличивать объём вычислений в прерывании, то в прерывании только сохранять очередь. А обрабатывать эту очередь в голове.
Go to the top of the page
 
+Quote Post

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

 


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


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