|
|
  |
Хочется программно инициировать прерывание, Но не INT0/INT1, как бы погламурнее |
|
|
|
May 20 2008, 13:15
|

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

|
Цитата Разрешили прерывание - получили прерывание. Да не годится мне так. Мне нужно раздельное управление flag и enable. Так понятнее? Цитата Руками сбросить в процедуре обработки прерывания - религия не позволяет? Он не сбросится для EEPROM'а, единственный выход - запрещать, а мне так не годится... Цитата Какой у Вас контроллер и какие ресурсы свободны? Разные контроллеры. На данный момент ATMega168.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 20 2008, 13:31
|

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

|
Цитата(Rst7 @ May 20 2008, 15:52)  Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем?............. Как-то не очень понятна вообще логика вопроса. Понятно , что программно это иногда необходимо ( кнопка - таймер) тут есть логика , но из Ваших пояснений не прослеживается мысль - зачем Вам это нужно. У любого устройства в MK есть регистра флага - по которому и происходит прерывание ( устанавливается и сбрасывается программным путём в большинстве случаев) . Но не понятно зачем Вам надо вызвать прерывание - зная, что оно точно произойдёт- затем, что-то сделать и при этом по сути прерывание не использовать . Не поняттно зачем при обработке (например входов порта) зачем-то дёрнуть прерывание компаратора или таймера или EEPROM и при этом узнать что pin1 порта установлен в 1
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
May 20 2008, 13:39
|
Знающий
   
Группа: Свой
Сообщений: 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 не пишется/читается).
|
|
|
|
|
May 20 2008, 13:49
|

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

|
Цитата Так вроде с готовностью EEPROM всё хорошо получается. Тут следующий момент: счетчики надо инкрементировать/декрементировать с запрещенными прерываниями. Да еще и сохранять регистр SREG. К сожалению, это занимает слишком много времени, у меня тут жестко все... Цитата Как-то не очень понятна вообще логика вопроса. Логика Вашего текста тоже не ясна ни разу  Цитата У любого устройства в MK есть регистра флага - по которому и происходит прерывание ( устанавливается и сбрасывается программным путём в большинстве случаев) . Сбрасывается программным путем - да, устанавливается - нет. Из-за этого и весь сыр-бор.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 20 2008, 14:14
|

Гуру
     
Группа: Свой
Сообщений: 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. К сожалению, это занимает слишком много времени, у меня тут жестко все... Из-за этого - весь сыр-бор? Но, ведь запретить/разрешить прерывания - гораздо быстрее, чем вход/выход в/из прерывания...
|
|
|
|
|
May 20 2008, 14:16
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Rst7 @ May 20 2008, 17:49)  К сожалению, это занимает слишком много времени, у меня тут жестко все... Кстати регистр можно сохранять в регистр адреса EEPROM EEARL (out 1 такт), или использовать его и EEARH как данные (в т.ч. командами cbi, sbi, sbic, sbis). Всегда так делаю у тех процессоров где они до 0x20. А прерывание от 8ми битных таймеров/счётчиков по сравнению (если есть свободные) чем вас не устраивает?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|