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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Хочется программно инициировать прерывание, Но не INT0/INT1, как бы погламурнее
Rst7
сообщение May 20 2008, 13:15
Сообщение #16


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Разрешили прерывание - получили прерывание.


Да не годится мне так. Мне нужно раздельное управление flag и enable. Так понятнее?


Цитата
Руками сбросить в процедуре обработки прерывания - религия не позволяет?


Он не сбросится для EEPROM'а, единственный выход - запрещать, а мне так не годится...


Цитата
Какой у Вас контроллер и какие ресурсы свободны?


Разные контроллеры. На данный момент ATMega168.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
andrvisht
сообщение May 20 2008, 13:16
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



так и не понял, нога которая ICP используется ?
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 20 2008, 13:24
Сообщение #18


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
ICP используется ?


Занята. Да и дрыгать ножками не хотелось бы, они могут пригодиться для других целей.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение May 20 2008, 13:31
Сообщение #19


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(Rst7 @ May 20 2008, 15:52) *
Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем?.............

Как-то не очень понятна вообще логика вопроса. Понятно , что программно это иногда необходимо ( кнопка - таймер) тут есть логика , но из Ваших пояснений не прослеживается мысль - зачем Вам это нужно.
У любого устройства в MK есть регистра флага - по которому и происходит прерывание ( устанавливается и сбрасывается программным путём в большинстве случаев) .
Но не понятно зачем Вам надо вызвать прерывание - зная, что оно точно произойдёт- затем, что-то сделать и при этом по сути прерывание не использовать . Не поняттно зачем при обработке (например входов порта) зачем-то дёрнуть прерывание компаратора или таймера или EEPROM и при этом узнать что pin1 порта установлен в 1


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
galjoen
сообщение May 20 2008, 13:39
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Rst7 @ May 20 2008, 16:34) *
Мне не нужно прерывание, запрос которого сам по себе устанавливается, мне нужно его запрос руками (программно) поднять только в нужный мне момент времени. Т.е. из более приоритетного прерывания запустить менее приоритетное после окончания обработки более приоритетного.

Так вроде с готовностью EEPROM всё хорошо получается. Только ещё флаг в ОЗУ нужно завести, а м.б. счётчик (от задачи зависит). В обработчике __interrupt void fast_irq(void) вместо if (....) SET_SLOW_IRQ(); пишите if (....) Счётчик++;, а в конце вместо if (!SLOW_IRQ_LOCK) ENABLE_SLOW_IRQ(); пишите if (!Счётчик) ENABLE_SLOW_IRQ();. А в обработчике __interrupt void slow_irq(void) в начале DISABLE_SLOW_IRQ() (==cbi EECR,EERIE), а в конце делаете Счётчик--; и ещё раз if (!Счётчик) ENABLE_SLOW_IRQ();

Ещё могу рекомендовать более экзотический способ: использования совпадений у таймеров/счётчиков. Там при обработке флаг прерывания сам сбрасывается.

2 Палыч
Чтобы прерывание от EEPROM возникло никакого чтения EEPROM делать не нужно. Оно сразу возникнет - после его разрешения (если в этот момент EEPROM не пишется/читается).
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 20 2008, 13:49
Сообщение #21


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Так вроде с готовностью EEPROM всё хорошо получается.


Тут следующий момент: счетчики надо инкрементировать/декрементировать с запрещенными прерываниями. Да еще и сохранять регистр SREG. К сожалению, это занимает слишком много времени, у меня тут жестко все...

Цитата
Как-то не очень понятна вообще логика вопроса.


Логика Вашего текста тоже не ясна ни разу wink.gif

Цитата
У любого устройства в MK есть регистра флага - по которому и происходит прерывание ( устанавливается и сбрасывается программным путём в большинстве случаев) .


Сбрасывается программным путем - да, устанавливается - нет. Из-за этого и весь сыр-бор.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 20 2008, 13:53
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Rst7 @ May 20 2008, 20:34) *
Мне не нужно прерывание, запрос которого сам по себе устанавливается, мне нужно его запрос руками (программно) поднять только в нужный мне момент времени. Т.е. из более приоритетного прерывания запустить менее приоритетное после окончания обработки более приоритетного.
Можно пойти таким путем - в конце более приоритетного прерывания закидывать в стек возврата адрес менее приоритетного прерывания. Правда, надо будет вставочку на асме соорудить, и после вставочки не должно буть, естественно, ни каких вызовов.


--------------------
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 20 2008, 14:14
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(galjoen @ May 20 2008, 16:39) *
Чтобы прерывание от EEPROM возникло никакого чтения EEPROM делать не нужно. Оно сразу возникнет - после его разрешения (если в этот момент EEPROM не пишется/читается).
Да, конечно! Это результат спешки... Вместо "делаете чтение" - "разрешаете прерывание"...

Счетчик предлагаете завести для подсчета числа разрешений прерывания?

2 Rst7
Почему запрещать прерывания - не годиться? Это равнозначно сбросу флага. Желаете иметь два "рычага" управления: разрешение прерывания и флаг? Ну, и аппетиты у Вас... Так, что из ресурсов свободно?



Цитата(prottoss @ May 20 2008, 16:53) *
Можно пойти таким путем - в конце более приоритетного прерывания закидывать в стек возврата адрес менее приоритетного прерывания. Правда, надо будет вставочку на асме соорудить, и после вставочки не должно буть, естественно, ни каких вызовов.
Тагда уж и закидывание в стек адреса - не нужно: в конце процедуры обработки прерывания сделать вызов процедуры обработки другого прерывания. Но, автору вопроса понадобилось зачем-то настоящее прерывание

Цитата(Rst7 @ May 20 2008, 16:49) *
Тут следующий момент: счетчики надо инкрементировать/декрементировать с запрещенными прерываниями. Да еще и сохранять регистр SREG. К сожалению, это занимает слишком много времени, у меня тут жестко все...
Из-за этого - весь сыр-бор? Но, ведь запретить/разрешить прерывания - гораздо быстрее, чем вход/выход в/из прерывания...
Go to the top of the page
 
+Quote Post
galjoen
сообщение May 20 2008, 14:16
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Rst7 @ May 20 2008, 17:49) *
К сожалению, это занимает слишком много времени, у меня тут жестко все...

Кстати регистр можно сохранять в регистр адреса EEPROM EEARL (out 1 такт), или использовать его и EEARH как данные (в т.ч. командами cbi, sbi, sbic, sbis). Всегда так делаю у тех процессоров где они до 0x20.
А прерывание от 8ми битных таймеров/счётчиков по сравнению (если есть свободные) чем вас не устраивает?
Go to the top of the page
 
+Quote Post
=GM=
сообщение May 20 2008, 14:59
Сообщение #25


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Rst7 @ May 20 2008, 10:52) *
Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем?
3. А может кто гламурнее способ знает?

А почему так нельзя: RCALL INTERRUPTVECTOR? Вот вам и будет вызов прерывания программным путём.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение May 20 2008, 15:03
Сообщение #26


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Rst7 @ May 20 2008, 15:52) *
Все не годятся, причину объяснил выше.

Ну дык и устанавливайте руками - UDRIE = 1.
так же руками и убирайте - UDRIE = 0.

Вы вероятно не приняли во внимание, что прерывание можно сгенерить не только по условию события возбуждения прерывания, а и просто разрещением этого прерывания (с учетом, что все внешние факторы уже готовы сгененерить прерывание).. E.g. установить прерывание по уровню INT0, держать INT0 всегда в соотв уровне, а прерывание возбуждать не дерганием пина, а дерганием GIMSK.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 20 2008, 15:05
Сообщение #27


Гуру
******

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



Я использую от таймера. У меня мега640 - там этих таймеров.... smile.gif

Код
    if(Flag.EnShow)    TIMSK0=2;                            // Выполнить прерывание
Go to the top of the page
 
+Quote Post
defunct
сообщение May 20 2008, 15:11
Сообщение #28


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Rst7 @ May 20 2008, 16:49) *
Сбрасывается программным путем - да, устанавливается - нет. Из-за этого и весь сыр-бор.

Зато маска чудесно контроллируется программным путем. Включать маску везде где нужно, тушить только в обработчике.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 20 2008, 15:11
Сообщение #29


Гуру
******

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



2 GM - ты немного задачу не осознал. smile.gif

Например я делаю 100 прерываний от таймера, а вот после сотого мне надо выполнить хороший кусок работы. За это время придёт 4 прерывания от таймера. Короче надо в прерывании от таймера, по какому-то событию вызвать другое прерывание. Прямой вызов - не проходит, надо чтобы из того вернулась и вошла в новое.

smile.gif Короче не умею я объяснять. smile.gif Пусть кто другой попробует.
Go to the top of the page
 
+Quote Post
defunct
сообщение May 20 2008, 15:16
Сообщение #30


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SasaVitebsk @ May 20 2008, 18:11) *
Например я делаю 100 прерываний от таймера, а вот после сотого мне надо выполнить хороший кусок работы. За это время придёт 4 прерывания от таймера.

Не, такой пример не пойдет, разобъют сразу тупым и в тоже время справедливым вопросом - почему бы не выполнить хороший кусок работы в основном цикле программы. smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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