0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
||||||
1 | ||||||
Не срабатывают прерывания31.08.2017, 12:17. Показов 3445. Ответов 13
Метки нет (Все метки)
Привет.
Написал программу для измерения длины импульса, прерывания должны срабатывать при приходе переднего фронта (INT0) и заднего фронта импульса (INT1). Обработчик прерывания считывает содержимое счетчика, обнуляет его, запускает вновь и зажигает на дисплее символ r для переднего фронта и L для заднего. Но не срабатывают почему-то (не зажигаются символы переднего и заднего фронтов.) ПОдскажите пожалуйста, что там написано не так? И ещё наверно, я не правильно пользуюсь отладкой, потому что при пошаговом режиме оно доходит до WHILE и дальше не бегает по строкам. И ещё мне непонятно, как в режиме отладки имитировать работу генератора импульсов длину которых я собираюсь измерить?
0
|
31.08.2017, 12:17 | |
Ответы с готовыми решениями:
13
Прерывания ATxmega256a3U не срабатывают Не срабатывают внешние прерывания INT0/INT1 в Atmega8 не срабатывают прерывания Alarm будильника RTC STM32F4 discovery не срабатывают прерывания по I2C |
317 / 268 / 61
Регистрация: 12.10.2011
Сообщений: 434
|
||||||
31.08.2017, 12:50 | 2 | |||||
0
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
|
31.08.2017, 13:24 [ТС] | 3 |
ну я просто не дописал функцию, но основной вопрос почему прерывания не срабатывают?
кстати, а что же тут бессмыссленного если одной переменной присваивается значение аккумулятора, и затем он обнуляется?
0
|
317 / 268 / 61
Регистрация: 12.10.2011
Сообщений: 434
|
||||||
31.08.2017, 13:38 | 4 | |||||
Объявите переменную HighLength, как volatile
0
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
||||||
31.08.2017, 14:01 [ТС] | 5 | |||||
Обьявил, спасибо за совет, но это не повлияло на работу прерываний, светодиодная индикация, которую должно зажигать прерывание, всё равно не загорается.
0
|
317 / 268 / 61
Регистрация: 12.10.2011
Сообщений: 434
|
|
31.08.2017, 14:10 | 6 |
Под рукой нет компилятора под avr. Не на чем проверить.
Просьба модераторам перенести тему в раздел Микроконтроллеры AVR. Там помогут быстрее.
0
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
||||||
31.08.2017, 18:20 [ТС] | 7 | |||||
вот отредактировал, но всё равно прерывания не срабатывают.
на схеме симулятора состояние портов меняется при записи в регистр D из основной программы, а при записи в регистр D из прерывания - не меняется, из чего я сделал вывод, что прерывание не срабатывает - то ли я его неправильно написал, то ли событие прерывания не происходит. Хотя компилируется без ошибок. Во вложении есть файл прототип, из которого я переделал в эту программу, так он работает замечательно. И симулятор и железо.
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
01.09.2017, 07:55 | 8 |
1) а где у вас объявляется, что вы работаете с mega328? в коде я этого не встретил.
2) Не перебдите с управлением SREG в AVR. Глобальный флаг управляется атомарно, инструкциями sei, cei, вызовом прерываний и reti. Все это предусмотрено в библиотеке и настройках компилятора. дергать SREG не только не обдуманно, но и опасно.
0
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
|
01.09.2017, 12:48 [ТС] | 9 |
Так а что именно из этого мне надо изменить, чтобы прерывания срабатывали?
0
|
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
01.09.2017, 13:28 | 10 |
design_m, для начала разберитесь, какие прерывания Вы используете.
По идее, INT0 и INT1. А какие вектора Вы описали? PCINT0_vect и PCINT1_vect Добавлено через 1 минуту Voland_, указание на ATmega328P находится в проекте Добавлено через 1 минуту Как и подключение iom328p.h Добавлено через 3 минуты design_m, выкиньте все манипуляции с SREG. Добавлено через 3 минуты design_m, перед написанием программы внимательно изучайте datasheet на контроллер
1
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
|
01.09.2017, 14:51 [ТС] | 11 |
0
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
||||||
01.09.2017, 15:36 [ТС] | 12 | |||||
Добавлено через 3 минуты
design_m, выкиньте все манипуляции с SREG. поправил вектора, так все равно прерывания не срабатывают (т.е не загораются светодиоды в Proteus), а как проверить пошаговым просмотром то, что использует импульсы, я никак не могу догадаться? подскажите пожалуйста, как мне смоделировать приход переднего фронта импульса в пошаговом симуляторе Atmel Studio?
(Прицепил полный проект Atmel+Proteus)
0
|
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
|
|
01.09.2017, 16:34 | 13 |
1) design_m, я не случайно сказал, "перед написанием программы внимательно изучайте datasheet на контроллер"
int0 и int1 на каких портах? 2) уберите ВСЕ манипуляции с SREG. А также внутри прерывания sei() также лишний. После выхода из прерывания прерывания будут разрешены автоматически. Как и запрещены прерывания при входе. 3) _delay_ms(500); - лишнее. Зачем висеть в прерывании на паузе? 4) TCCR1B = TCCR1B | 0x05; вынесите в Pulse(). Запускаем один раз. Дальше только считываем и обнуляем. Добавлено через 9 минут 6) все записи вида TCCR1B = TCCR1B | 0x05 можно смело заменить на TCCR1B = 0x05, т.к. в вашем случае надо просто записать в регистр значение. А вот как "смоделировать приход переднего фронта импульса в пошаговом симуляторе Atmel Studio" не подскажу, ибо пишу программы только для готовых плат.
1
|
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 209
|
||||||
04.09.2017, 17:46 [ТС] | 14 | |||||
Спасибо, что подсказали. я читаю, просто снова ошибся маленько. Так зато теперь у меня возникла новая проблема - если я использую для индикации 7 сегментный индикатор, в порту D теперь не будет 2 битов. А если я перевел выходы в порт B, так там тоже все выводы не используешь, из-за подключения кристалла на В7 и В6.
Как в таких случаях поступать - делить выводы индикатора между двумя портами, т.е. делать вывод знака двумя командами,
Сейчас у меня при переводе входов индикатора на порт В 7й вывод (6й бит) не работает (он не показывает никакого уровня в PROTEUS? Я думаю, как раз из за наличия кварцевого резонатора.
0
|
04.09.2017, 17:46 | |
04.09.2017, 17:46 | |
Помогаю со студенческими работами здесь
14
Не срабатывают стили для текста, но для фона срабатывают [Вопрос] Перехват прерывания прямым доступом к вектору прерывания Вычислить адрес вектора прерывания по номеру прерывания. Вызов прерывания в обработке прерывания Не срабатывают якоря Не срабатывают скрипты Не срабатывают кнопки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |