AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
06.01.2013, 14:47
|
|
Гражданин KAZUS.RU
Регистрация: 01.02.2011
Адрес: г. Долгопрудный
Сообщений: 996
Сказал спасибо: 339
Сказали Спасибо 94 раз(а) в 91 сообщении(ях)
|
Выход из спящего режима по INT0
Здравствуйте, не могу проснуться из спящего режима по INT0, по низкому уровню сигнала.
МК мега-8.
Засыпаю вот так:
Код:
|
LDI TEMP, 0b10100001
OUT MCUCR, TEMP
LDI TEMP, 0b01000000
OUT GICR, TEMP
sleep |
Я так понимаю, что по низкому уровня сигнала на ноге контроллера меня должно кидать на вектор прерывания INT0, в обработчике прерывания у меня стоит переход на RESET.
Но при нажати на кнопку (на INT0оявляется лог. 0) ничего не происходит.
Подскажите в чём ошибка.
Может быть нужно перед входом прерывания что то делать ? например сохранять программный счётчик или SREG, или нужно при выходе из сна возвращать что то в системные регистры ?
Последний раз редактировалось putmannn; 06.01.2013 в 15:05.
|
|
|
|
06.01.2013, 15:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
Для начала попробуй вот так
PHP код:
|
LDI TEMP, 0b10100000
OUT MCUCR, TEMP
|
Сейчас стоит по любому перепаду, а при отключенном генераторе синхронные операции не работают.
RFTM, ёлы-палы.
|
|
|
|
06.01.2013, 15:58
|
|
Гражданин KAZUS.RU
Регистрация: 01.02.2011
Адрес: г. Долгопрудный
Сообщений: 996
Сказал спасибо: 339
Сказали Спасибо 94 раз(а) в 91 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
omercury, сделал, всё равно спит собака.
Попробовал эмулировать в АВРстудии, запускаю c кодом :
Код:
|
LDI TEMP, 0b10100000
OUT MCUCR, TEMP
LDI TEMP, 0b01000000
OUT GICR, TEMP
sleep |
В режиме трассировки мышкой тыкаю в PIND2, ВКЛЮЧАЮ-включаю/выключаю его, как будто я жму кнопку чтобы получить низкий уровень сигнала и вызвать прерывание, но ничего не происходит, программный счётчик стоит на команде после sleep.
Я точно забыл чего то указать, всё что нашел прочитал, но прерывание не вызывается.
|
|
|
|
06.01.2013, 16:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
Конечно не вызывается - оно же включается после "отбоя".
Сначала запись в GICR, а уж потом в MCUCR.
Кстати, SEI есть?
|
|
|
Сказали "Спасибо" omercury
|
|
|
06.01.2013, 16:24
|
|
Гражданин KAZUS.RU
Регистрация: 01.02.2011
Адрес: г. Долгопрудный
Сообщений: 996
Сказал спасибо: 339
Сказали Спасибо 94 раз(а) в 91 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
omercury, Сначала запись в GICR, а уж потом в MCUCR ничего не дало, ведь они записываются до команды sleep.
А вот поставил перед командами SEI и всё заработало, но я ведь в самом начале RESETа этот код вставлял и трассировал в АВРстудии, никаких запретов прерываний не стояло, очень странно.
Спасибо, теперь всё работает, засыпает и просыпается по INT0.
Последний раз редактировалось putmannn; 06.01.2013 в 16:41.
|
|
|
|
06.01.2013, 16:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
Сообщение от putmannn
|
Сначала запись в GICR, а уж потом в MCUCR ничего не дало
|
Действительно, фигню спорол. Здесь последовательность не важна.
Поставил sei в другом месте - всё нормально работает.
Проблема, думаю, в другом - стек.
|
|
|
|
06.01.2013, 17:07
|
|
Гражданин KAZUS.RU
Регистрация: 01.02.2011
Адрес: г. Долгопрудный
Сообщений: 996
Сказал спасибо: 339
Сказали Спасибо 94 раз(а) в 91 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
А что нужно отключать для полного засыпания ?
У меня в начале, когда сразу после ресет процедура засыпания стоит, то потребление 150 мкА, а когда из программы засыпает, то 250 мкА ест.
Значит что то у меня в процессе работы включается и потом не отключается (100 мкА).
Посмотрите всё ли я отключаю ? может быть что то забыл ?
Код:
|
clr temp ;stop timer
out tccr1b,temp
out tccr1a,temp
out tccr0,temp
ldi temp, 0b00000000
out ADCSR, temp
ldi temp, 0b00000000
out ADMUX, temp
ldi temp, 0b11111111
out DDRB, temp
ldi temp, 0b00000000
out PORTB, temp
ldi temp, 0b11111011
out DDRD, temp
ldi temp, 0b00000000
out PORTD, temp
ldi temp, 0b11111110
out DDRC, temp
ldi temp, 0b00000000
out PORTC, temp
ldi temp, 0b00000000
out TIMSK, temp
LDI TEMP, 0b10100000
OUT MCUCR, TEMP
LDI TEMP, 0b01000000
OUT GICR, TEMP
sei
sleep |
|
|
|
|
06.01.2013, 17:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
Сообщение от putmannn
|
никаких запретов прерываний не стояло, очень странно
|
Прерывания автоматически запрещаются в обработке прерывания (любого). Или этот твой код со Слипом вызывается в прерывании, или где-то забыл поставить РЕТИ или хотя бы РЕТ
Убирай СЕИ и ковыряй код, если не хочешь внезапных переполнений стека
250 мка - или какая-то ножка как вход болтается в воздухе без подтяжки, или 2 ножки с включенной подтяжкой закорочены на землю
|
|
|
|
06.01.2013, 17:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
Дык INT0 такой и есть.
|
|
|
|
06.01.2013, 17:32
|
|
Гражданин KAZUS.RU
Регистрация: 01.02.2011
Адрес: г. Долгопрудный
Сообщений: 996
Сказал спасибо: 339
Сказали Спасибо 94 раз(а) в 91 сообщении(ях)
|
Re: Выход из спящего режима по INT0.
Сообщение от omercury
|
Дык INT0 такой и есть.
|
Какой он есть ?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:13.
|
|