| Автор | Сообщение |
datachip Новичок Сообщения: 4
|
Подскажите пожалуйста почему не происходит пробуждение МК
от сна по нарастающему фронту сигнала на выводе INT0
В AVRstudio всё работает а контроллер нет ?
.include"m8def.inc"
.def reset = r15
.def tmp = r16
.def delay1 = r20
.def delay2 = r21
.def delay3 = r22
rjmp init
rjmp start
start:
out GICR,reset
sbi DdrB,4
ldi delay1,0x01
ldi delay2,0x00
ldi delay3,0x00
wite:
subi delay1,01
sbci delay2,00
sbci delay3,00
brcc wite
sleep_:
cbi DdrB,4
ser tmp
out TIFR,tmp
sei
ldi tmp,(1
out MCUCR,tmp
ldi tmp,(1
out GICR,tmp
sleep
rjmp start
init:
ldi tmp,low(ramend)
out SPL,tmp
ldi tmp,high(ramend)
out SPH,tmp
sbi DdrB,2
rjmp sleep_ |
|
starko Гость 95.153.*.*
|
Не догоняю, а что в r15?  |
|
pavel-pervomaysk Your editor Сообщения: 8046
|
Все должно начинаться так после именов регистров
.include"m8def.inc"
.def reset = r15
.def tmp = r16
.def delay1 = r20
.def delay2 = r21
.def delay3 = r22
rjmp init вот это не нужно ...
rjmp start вот это не нужно ...
.cseg
.org 0
.CSEG
rjmp RESET ; External Pin, Power-on Reset, Brown-out
INT0_:
rjmp обработчик прерывания
INT1_:
reti
TIMER2_COMP:
reti
TIMER2_OVF:
reti
TIMER1_CAPT:
reti
TIMER1_COMPA:
reti
TIMER1_COMPB:
reti
TIMER1_OVF:
reti
TIMER0_OVF:
reti
SPI_STC:
reti
USART_RXC:
reti
USART_UDRE:
reti
USART_TXC:
reti
ADC_:
reti
EE_RDY:
reti
ANA_COMP:
reti
TWI_:
reti
SPM_RDY:
reti
RESET:
// STACK
ldi tmp,high(ramend) //
out SPH,tmp //
ldi tmp,low(ramend) //
out SPL,tmp //
тут пишем всю инициализацию |
|
datachip Новичок Сообщения: 4
|
Проблема с ATmega8 не работает внешнее прерывание
Здравствуйте starko
В R15 у меня по идеи 0
и я им обычно пользуюсь для стирания каких-либо регистров
а в данном случае GICR.
После дороботки программы, всё равно МК не хочет просыпаться.
Просыпается только тогда, когда делаешь пробуждение по НИЗКОМУ уровню сигнала.
В этом случае работают все спящие режимы.
А мне нужно чтоб МК просыпался от нарастающего фронта сигнала и как можно меньше потреблял энергии в спящем режиме, допустим в Power Down.
Спасибо за ответ ! |
|
starko Гость 95.153.*.*
|
datachip, вектора прерываний не указал, чтобы зазря место в теме не занимать, а они там есть - так надо понимать ?
Лучше бы делать, как подсказывает pavel-pervomaysk, а то хрен разберешь что как.
Зачем играться с направлением PB4?
MCUCR 6-4 Sleep Mode Select = 001 - ADC Noise Reduction - чего так?
Зачем его, МСUCR, трогать в цикле?
Какая вообще задача? |
|
datachip Новичок Сообщения: 4
|
Здравствуйте кому ещё не надоела эта тема ! И отдельное спасибо
starko и pavel-pervomaysk
Задача такова.
Предположим что это сигнализация , и нужно зажигать светодиод при нажатии на кнопку.
А именно, подовать +5v. на вывод МК.
Поскольку устройство питается от батареек, нужно как можно меньше
снизить потребление энергии за щёт спящего режима.
Далее приведена уже доработанная программа, как подсказал pavel-pervomaysk
И опять повторюсь,какой бы я не ставил спящий режим, в AVR studio всё работает прекрасно,
а как прошиваю МК то он конечно в спячку ложиться, а встовать не хочет.
И ещё одно, если этот вывод подтянуть к питанию а кнопкой замыкать на ноль,то схема работает отлично.Но мне нужно чтобы светодиод загорался именно от подачи 5v на вывод МК.
.include"m8def.inc"
.def reset_ = r17
.def tmp = r16
.def delay1 = r20
.def delay2 = r21
.def delay3 = r22
.cseg
.org 0
.CSEG
rjmp RESET ; External Pin, Power-on Reset, Brown-out
INT0_:
rjmp start
INT1_:
reti
TIMER2_COMP:
reti
TIMER2_OVF:
reti
TIMER1_CAPT:
reti
TIMER1_COMPA:
reti
TIMER1_COMPB:
reti
TIMER1_OVF:
reti
TIMER0_OVF:
reti
SPI_STC:
reti
USART_RXC:
reti
USART_UDRE:
reti
USART_TXC:
reti
ADC_:
reti
EE_RDY:
reti
ANA_COMP:
reti
TWI_:
reti
SPM_RDY:
reti
RESET:
// STACK
ldi tmp,high(ramend) //
out SPH,tmp //
ldi tmp,low(ramend) //
out SPL,tmp //
clr reset_
rjmp sleep_
start:
out GICR,reset_
sbi DdrB,4
ldi delay1,0x00
ldi delay2,0x00
ldi delay3,0x03
wite:
subi delay1,01
sbci delay2,00
sbci delay3,00
brcc wite
sleep_:
cbi DdrB,4
ser tmp
out TIFR,tmp
sei
ldi tmp,(1
out MCUCR,tmp
ldi tmp,(1
out GICR,tmp
sleep
rjmp start |
|
INT1 Участник Сообщения: 469
|
Так может он аппаратно не "видит" перепада 0->1? Как там в железе это организовано? |
|
starko Гость 95.153.*.*
|
datachip, я уже подмечал, ты меняешь MCUCR после sei в цикле. Я бы так не делал. Лучше отдельно выставить настройки, а в цикле разрешать-запрещать прерывания. Нюансы работы логики не расписаны в даташитах, хз, что при этом происходит. Быть может, сначала переходит на срабатывание по нулю, а следующим тактом по заданному условию. Но это так, фантазии...  |
|
pavel-pervomaysk Your editor Сообщения: 8046
|
| datachip писал: | | И ещё одно, если этот вывод подтянуть к питанию а кнопкой замыкать на ноль,то схема работает отлично.Но мне нужно чтобы светодиод загорался именно от подачи 5v на вывод МК. |
Так нужно настроить прерывание по фронту, а не по спаду.
и делается это у меня обычно после инита стека.
сколько должен быть включен светодиод после импульса на прерывании ?
Лучше запустить таймер 1 в это время и отсчитывать сколько тебе нужно.
// INT0 // RC-5 IR remote control
in tmp,MCUCR //
ori tmp,(1
out MCUCR,tmp //
in tmp,GIMSK //
ori tmp,(1
out GIMSK,tmp // разрешаем внешнее прерывание INT0
in tmp,MCUCR
ori tmp,(1
out MCUCR,tmp
// TIMER1
ldi tmp,0x05 // ~16 sec time ovf F.osc 4 000 000
out TCCR1B,tmp //
clr tmp //
out TCCR1A,tmp //
out TCNT1H,tmp // счетчик таймера_1 H
out TCNT1L,tmp // счетчик таймера_1 L
out ICR1H,tmp //
out ICR1L,tmp //
out OCR1AH,tmp //
out OCR1AL,tmp //
out OCR1BH,tmp //
out OCR1BL,tmp //
in tmp,TIMSK //
sbr tmp,1
out TIMSK,tmp // |
|
starko Гость 95.153.*.*
|
pavel-pervomaysk, дык, у него ldi tmp,(11) - это ж и есть 1
Что есть GIMSK? У него же маска в GICR.  |
|
Murka Профессор Сообщения: 2382
|
AtMeg_и из спящего режима просыпаются только по низкому уровню, даташит почитайте. |
|
starko Гость 95.153.*.*
|
Murka, кроме Idle, а он его, похоже, не пробовал. |
|
datachip Новичок Сообщения: 4
|
Привет всем любителям головоломок !
Действительно , режим Idle я даже и не попробовал.
После его включения, схема заработала нормально и потребляет в
спящем режиме 500 uA.
Конечно не так, как если бы сделать пробуждение по низкому уровню,
в этом случае она потребляла всего 100 uA,Ну и ладно, в принципе
задача выполнена.
По поводу даташита,конечно я его читал,если так можно выразиться,
я его переводил в google и понял, что МК можно пробудить из любого спящего режима,
но как видно это не так.
Вем участникам темы: starko, pavel-pervomaysk и конечно Murka большое спасибо !
И действительно, Смешно!!!, с всемирной тупостью бороться!!! |
|
|