Похоже на то были причины. Ведь ни что не мешало определить SM не как 5, а как 0х20 (или 32). Тогда бы ваш способ работал.Но это требует дополнительных определений.
Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
По мне, при входе в режим power-down нужно ещё устранить предысторию нажатия кнопки и учесть, что только низкий уровень, а не спад может вывести из него; при выходе из режима нужно дождаться начала генерации и стабилизации частоты тактированияranger93 писал(а):Помогите разобраться со power-down.
В avr-studio все работает нормально: контроллер засыпает и при нажатии кнопке на 4-й ноге уходит в прерывание, а вот в реальной жизни как-то не работает... В чем может быть причина?
Спойлер
Код: Выделить всё
.include "m8def.inc" ; используем mega8
RJMP START
RJMP ISR_INT0
START:
LDI R16,HIGH(RAMEND)
LDI R17,LOW(RAMEND)
OUT SPH,R16
OUT SPL,R17
LDI R16, 0b10100000
out MCUCR, r16 ; хотим работать по низкому уровню с прерыванием int0 и выключаться по команде sleep sleepmode:
; ldi r16, 0b10100010
; out MCUCR, r16 ; хотим работать со спадающим фронтом????? с прерыванием int0 и выключаться по команде sleep sleepmode:
ldi r16,0b00000000
out timsk,r16; запрещаем прерывания по таймеру
; ldi r16, 0
out tcnt2, r16; сбросим таймер нахрен!
ldi r16, 0b01000000
out GICR, r16 ; разрешаем прерывание int0
OUT GIFR,R16 ; сбрасываем флаг
sei
sleep
nop
rjmp START
ISR_INT0:
CLR YH
CLR YL
SBIW YL,1
BRNE PC-1 ;программная задержка для начала генерации и стабилизации тактирования
OUT GICR,YH
RET ; выход с запретом всех прерываний
ploop, игрался только с mega8, поэтому не знал, что в других контроллерах есть такие же регистры но с другими битами. Учту, так действительно понятнее.
akl,
akl,
Кстати очень может быть, надо попробовать.akl писал(а):что только низкий уровень, а не спад может вывести из него
Главное, чтоб был источник ЭДС, а с остальным разберемся
.
можно ли тогда сделать так, если в атмеге 8 я хочу повесить кнопку на вывод ресет то для этого мне уже не обязательно с помощью фьюзов данную ногу конфигурировать на ввод, а потом с помощью паралельного прогера все это исправлять......, теперь мне просто надо следить за 1 битом регистра MCUCSR и при его установке выполнять некие события в проге.pyzhman писал(а):2FreshMan: MCUCSR
Tell Me The Truth
- Реклама
Ё! Я в ауте! Не, на самом деле. Я бы в жисть не догадался так сделать. Как красиво-то придумано! Нафига программировать вход сброса как порт фьюзом? Если можно отследить битом источника сброса. FreshMan, зачет! Только учитываем, что при сбросе вся память херится к чертовой матери. 
Docendo discimus
Вот только необходимо применять это крайне аккуратно! Ведь при нажатии кнопки у тебя прервется исполнение любой подпрограммы, и если где-то что-то недосохранилось или не до делалось может возникнуть целый спектр всевозможных неожиданных и редко происходящих проблем.
Ладно там если это что-то вроде светодиодной мигалки, и кнопкой сброса выбираешь режим работы... А если это что-то сложнее со сложными внутренними и внешними состояниями, то проблемы практически гарантированны.
Ладно там если это что-то вроде светодиодной мигалки, и кнопкой сброса выбираешь режим работы... А если это что-то сложнее со сложными внутренними и внешними состояниями, то проблемы практически гарантированны.
pyzhman, ну вот зачем вы так меня поддергиваете........ я уже догадывался что сморозил ерунду. 
Tell Me The Truth
Откуда такая информация? Только при отключении питания.Только учитываем, что при сбросе вся память херится к чертовой матери.
Нет. Просто делаете переменную в памяти, которая изменяет своё значение после сброса, её и анализируете.если в атмеге 8 я хочу повесить кнопку на вывод ресет то для этого мне уже не обязательно с помощью фьюзов данную ногу конфигурировать на ввод, а потом с помощью паралельного прогера все это исправлять......, теперь мне просто надо следить за 1 битом регистра MCUCSR и при его установке выполнять некие события в проге.
Способ подходит для простых применений: мигалок всяких, гирлянд и т.д, т.к. при включении питания её состояние будет не определено (то есть может быть любым).
Во наговорили
. Насколько я знаю в некоторых Мк есть специальные биты в определенном регистре по которым можно узнать по какой причине произошел сброс. Далее нужно просто отделить мух от котлет и определить нужно ли инициализировать переменные(в случае первого включения), либо просто обработать нажатие на кнопку или собаку.
Единственное условие- всегда после считывания этих битов нужно сразу их сбросить так как они устанавливаются аппаратно и сохраняются вплоть до выключения Мк.
Единственное условие- всегда после считывания этих битов нужно сразу их сбросить так как они устанавливаются аппаратно и сохраняются вплоть до выключения Мк.
2FreshMan: никаких поддергиваний, всё взаправду.
Согласен.ploop писал(а):Только при отключении питания.
Docendo discimus
а откуда такая информация ?ploop писал(а):Только при отключении питания.
Tell Me The Truth
Мля, пару страниц назад разговаривали на эту тему. Ты или впитывай, или сам разбирайся.
да тот разговор я помню....., просто хотелось узнать нет ли у атмела какого либо обще-официального документа, кроме даташита конечно, где описывается общий принцип работы их МК.
Tell Me The Truth
если вас не затруднит, ткните носом на данный документ, пожалуйста
Tell Me The Truth
дорогие братья по разуму, а не скрыта ли сдесь ошибка ?
может там надо reti вместо ret ?
http://radiokot.ru/start/mcu_fpga/avr/15/

может там надо reti вместо ret ?
http://radiokot.ru/start/mcu_fpga/avr/15/
Tell Me The Truth
Ошибкой как таковой не является. Просто заткнуться все прерывания. Если ВДРУГ программа скакнет туда.
Docendo discimus
но ведь для выхода из прерывания юзается RETI
али я неправ ?
али я неправ ?
Tell Me The Truth
Если не хочется открывать прерывания, то надо пользоваться ret. reti делается всё то же самое, что и ret, только еще разрешает глобальные прерывания, т.е. взводит флаг I.
Docendo discimus


