Файлы  •  Ссылки  •  Прошивки  •  Правила  •  Архив  •   FAQ  •  Участники  •  Поиск
Регистрация  •  Вход

Проблема с ATmega8 не работает внешнее прерывание

Список форумов» Программное обеспечение» Микроконтроллеры
АвторСообщение
datachip
Новичок
Сообщения: 4




16-11-2011 12:31

Подскажите пожалуйста почему не происходит пробуждение МК
от сна по нарастающему фронту сигнала на выводе 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.*.*





17-11-2011 07:24

Не догоняю, а что в r15?
pavel-pervomaysk
Your editor
Сообщения: 8046




17-11-2011 11:59

Все должно начинаться так после именов регистров


.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




17-11-2011 16:42

Проблема с ATmega8 не работает внешнее прерывание


Здравствуйте starko

В R15 у меня по идеи 0
и я им обычно пользуюсь для стирания каких-либо регистров
а в данном случае GICR.

После дороботки программы, всё равно МК не хочет просыпаться.
Просыпается только тогда, когда делаешь пробуждение по НИЗКОМУ уровню сигнала.
В этом случае работают все спящие режимы.

А мне нужно чтоб МК просыпался от нарастающего фронта сигнала и как можно меньше потреблял энергии в спящем режиме, допустим в Power Down.

Спасибо за ответ !
starko
Гость 95.153.*.*





17-11-2011 19:45

datachip, вектора прерываний не указал, чтобы зазря место в теме не занимать, а они там есть - так надо понимать ?
Лучше бы делать, как подсказывает pavel-pervomaysk, а то хрен разберешь что как.
Зачем играться с направлением PB4?
MCUCR 6-4 Sleep Mode Select = 001 - ADC Noise Reduction - чего так?
Зачем его, МСUCR, трогать в цикле?
Какая вообще задача?
datachip
Новичок
Сообщения: 4




20-11-2011 21:37

Здравствуйте кому ещё не надоела эта тема ! И отдельное спасибо
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




20-11-2011 22:16

Так может он аппаратно не "видит" перепада 0->1? Как там в железе это организовано?
starko
Гость 95.153.*.*





21-11-2011 05:44

datachip, я уже подмечал, ты меняешь MCUCR после sei в цикле. Я бы так не делал. Лучше отдельно выставить настройки, а в цикле разрешать-запрещать прерывания. Нюансы работы логики не расписаны в даташитах, хз, что при этом происходит. Быть может, сначала переходит на срабатывание по нулю, а следующим тактом по заданному условию. Но это так, фантазии... улыбка
pavel-pervomaysk
Your editor
Сообщения: 8046




21-11-2011 12:01

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.*.*





21-11-2011 18:24

pavel-pervomaysk, дык, у него ldi tmp,(11) - это ж и есть 1
Что есть GIMSK? У него же маска в GICR.
Murka
Профессор
Сообщения: 2382




22-11-2011 01:44

AtMeg_и из спящего режима просыпаются только по низкому уровню, даташит почитайте.
starko
Гость 95.153.*.*





22-11-2011 03:33

Murka, кроме Idle, а он его, похоже, не пробовал.
datachip
Новичок
Сообщения: 4




22-11-2011 21:17

Привет всем любителям головоломок !
Действительно , режим Idle я даже и не попробовал.
После его включения, схема заработала нормально и потребляет в
спящем режиме 500 uA.
Конечно не так, как если бы сделать пробуждение по низкому уровню,
в этом случае она потребляла всего 100 uA,Ну и ладно, в принципе
задача выполнена.
По поводу даташита,конечно я его читал,если так можно выразиться,
я его переводил в google и понял, что МК можно пробудить из любого спящего режима,
но как видно это не так.

Вем участникам темы: starko, pavel-pervomaysk и конечно Murka большое спасибо !

И действительно, Смешно!!!, с всемирной тупостью бороться!!!
Список форумов» Программное обеспечение» Микроконтроллеры» Проблема с ATmega8 не работает внешнее прерывание
Перейти:  
Текущий раздел» Программное обеспечение» Микроконтроллеры (Микроконтроллеры - AVR-ы, PIC-и и другие)


Похожая информация:
  • Проблема с ds18b20 на atmega8
  • ATMega8
  • AtMega8 - брак?
  • ATmega8-16AU
  • Вольтметр на Atmega8








  • Информация по ремонту для специалистов - справочники, инструкции, энциклопедия, советы и секреты ремонта,  настройка, сервисные режимы
    Powered by phpBB 2.0.18 © 2001, 2002 phpBB Group!