ChipKiller писал(а):reti нужен в конце любого прерывания - стек и улетает из-за его отсутствия
Спасибо, буду разбираться
ChipKiller писал(а):reti нужен в конце любого прерывания - стек и улетает из-за его отсутствия
neoneon писал(а):Спасибо, буду разбираться
Seriyvolk писал(а):neoneon писал(а):Спасибо, буду разбираться
Просто перед ждампом сделай РОР (два раза вроде, т.к. адрес двухбайтный) для выдёргивания адреса возврата из стека.
... по-человечески на прерывание не переходят - вход в прерывание происходит аппаратно .... косяк не у протеуса - советую в начале выучить матчасть.я сделал по-человечески, т.е.создал переменную (типа флага), на какое прерывание нужно переходить, reti после каждого прерывания
Я имел ввиду, в какой из видов сна переходит при соответствующем прерыванииChipKiller писал(а):по-человечески на прерывание не переходят - вход в прерывание происходит аппаратно.
Код: Выделить всё
.INCLUDE "tn13def.inc"
; ****************************
; Дата: 14.02.2015 ПРОВЕРКА ДРУГОЙ СТРУКТУРЫ
; Для AVR: ATtiny13A
; Тактовая частота: 4.8 МГц
; Выполняемые функции: включение светодиода на 3 минуты, двойное энергосбережение
; =========
; объявления
.equ Fo=4800000
.def temp=r16;
.def flag=r19;
; =========
.cseg ; выбор сегмента - программный код
.org $000
rjmp nach ; (reset)
.org $001
rjmp Knopka ; появление 0 на PB1
.org $002
reti
.org $003
Timer: ; Timer\counter overflow
SBIW ZH:ZL,1
BRNE BLA
ldi temp,0b00000011 ; выкл LED
out PortB, temp ;
out TIMSK0,R0 ; запрещ прерыв таймера
ldi flag,0
reti
; =========
Bla:
cpi flag,1
brlo PC+3; переход, если flag=0
ldi temp,0b00100000 ; разрешение sleep (5 бит), idle (4-3 биты)
out MCUCR, temp ; сон для таймера
RETI
; обработка прерывания
Knopka:
out GIMSK,R0 ; запрещение прерывания от INT0
LDI R22,1<<SE
OUT MCUCR,R22 ; режим работы SLEEP IDLE
ldi temp,0b00000010 ; вкл LED
out PortB, temp ;
ldi temp,0b00000010 ;
out TIMSK0, temp ;разрешение прерыв по переполнению
; очистка счетчика
ldi temp,0b0000001 ; для проверки clk/1!!!!!!!!!
; ldi temp,0b0000101 ;
out TCCR0B,temp ; clk/1024 - tccr0b=xxxx x101
; тут счетчик начал считать
ldi flag,$01 ; флаг=1 -> переход в bla
reti
; =========
; =========
; =========
Nach:
SBI ACSR,ACD ; выключить аналоговый компаратор
; =========
; инициализация портов и периферии
ldi temp,0b11111111 ;
out DDRB,temp ;
ldi temp,0b00000011 ;
out PortB, temp ;
CBI DDRB,1 ; лапу INT0(PB1) на вход с подтяжкой
LDI ZH,HIGH(3*60*Fo/256/1024)
LDI ZL,LOW(3*60*Fo/256/1024) ; загрузка значения 3 минуты
; ldi zh,$0C ;для числа 3296: zl=$E0, zh=$0C
; ldi zl,$E0 ;
CLR R0
OUT TCNT0,R0
ldi temp,0b00110000 ; разрешение sleep (5 бит), power down (4-3 биты),
out MCUCR, temp ; просыпается от низкого уровня на INT0 (1-0 биты)
ldi temp,0b01000000 ; разрешение прерывания от INT0
out GIMSK, temp ;
OUT GIFR,temp
sei
WAIT:
SLEEP
; Основное тело программы
; flag=1? да - к таймеру. нет - спать
CPI flag,1
BREQ WAIT; переход, если flag=1
rjmp Nach
.exit
По мне, эта программа вообще не должна работать как задумано.
Попробуйте

Код: Выделить всё
sbi DDRB, 1 ;ножка OC1A вкл.
ldi R16, 0x00
out OCR1AH, R16
ldi R16, 0xFF
out OCR1AL, R16 ;вписали задержку 00FF в OCR1A
ldi R16, 0b11000001
out TCCR1A, R16 ;настройка
ldi R16, 0b00010001
out TCCR1B, R16 ;настройка и пуск
