я не критикую, просто советую свой вариант
я не критикую, просто советую свой вариант
Код: Выделить всё
.include "tn2313def.inc"
.def tmp = r16
.def tmp1 = r17
.equ power0 = 65535
.equ OutPort = PORTB
.equ OutCntr = DDRB
.equ OutPin = PB0
.equ T1_off = 0b00000000
.equ T1_on = 0b00000100
.CSEG
.org 0
reset: rjmp start ; 00 Reset Handler
; ***** INTERRUPT VECTORS ************************************************
.org INT0addr ;= 0x0001 External Interrupt Request 0
rjmp int_0
;.equ INT1addr = 0x0002 ; External Interrupt Request 1
;.equ ICP1addr = 0x0003 ; Timer/Counter1 Capture Event
; .org OC1Aaddr ;= 0x0004 Timer/Counter1 Compare Match A
; rjmp comp1a
;.equ OC1addr = 0x0004 ; For compatibility
.org OVF1addr ;= 0x0005 ; Timer/Counter1 Overflow
rjmp T1_OVF
;.equ OVF0addr = 0x0006 ; Timer/Counter0 Overflow
;.equ URXCaddr = 0x0007 ; USART, Rx Complete
;.equ URXC0addr = 0x0007 ; For compatibility
;.equ UDREaddr = 0x0008 ; USART Data Register Empty
;.equ UDRE0addr = 0x0008 ; For compatibility
;.equ UTXCaddr = 0x0009 ; USART, Tx Complete
;.equ UTXC0addr = 0x0009 ; For compatibility
;.equ ACIaddr = 0x000a ; Analog Comparator
;.equ PCIaddr = 0x000b ;
; .org OC1Baddr ;= 0x000c
; rjmp comp1b
; .org OC0Aaddr ;= 0x000d
; rjmp comp0a
;.equ OC0Baddr = 0x000e ;
;.equ USI_STARTaddr = 0x000f ; USI Start Condition
;.equ USI_OVFaddr = 0x0010 ; USI Overflow
;.equ ERDYaddr = 0x0011 ;
;.equ WDTaddr = 0x0012 ; Watchdog Timer Overflow
;=================
start:
ldi tmp,low(ramend) ;stack init SP=0xdf
out spl,tmp
sbi ACSR,ACD ;Analog comparator off
ser tmp
out OutCntr,tmp
clr tmp
out OutPort,tmp
clr tmp
out ddrd,tmp
ldi tmp,0b01111011
out portd,tmp
ldi tmp,(0<<ISC01)|(1<<ISC00) ; это так для порядка - сначала ст.бит, затем мл.бит
out MCUCR,tmp ;INT0
ldi tmp,(1<<INT0)
out GIMSK,tmp
; установки для Т1
; тактовая Fo, режим работы - сброс по совпадению
clr tmp ; таймер отключен от выводов порта
out TCCR1A,tmp
ldi tmp,0b00000000 ; режим работы NORMAL, таймер остановлен!!!
out TCCR1B,tmp
; вот здесь загружаем начальное значение для power, таймер остановлен
ldi tmp,low(power0)
ldi tmp1,high(power0)
out TCNT1H,tmp1 ; загрузка стартового значения мощности
out TCNT1L,tmp
; установка разрешений прерываний от таймеров
clr tmp
ldi tmp,(1<<TOV1)
out TIMSK,tmp
; здесь размещают тело основной программы.
sei
next:
rjmp next
;=================
; Обработчики прерываний
;=================
int_0:
in tmp,sreg
push tmp
; запускаем Т1
ldi tmp,T1_on
out TCCR1B,tmp
pop tmp
out sreg,tmp
reti
T1_OVF:
in tmp,sreg
push tmp
brts t1_001
sbi OutPort,(1<<OutPin)
pop tmp
out sreg,tmp
set rjmp t1_exit
t1_001:
ldi tmp,T1_off
out TCCR1B,tmp
cbi OutPort,(1<<OutPin) ; получается 2,5 мкс
pop tmp
out sreg,tmp
clt
t1_exit:
reti
по спаду такldi tmp,(0<<ISC01)|(1<<ISC00)
Код: Выделить всё
ldi tmp,(1<<ISC01)|(0<<ISC00)
т.е. 1=галка, 0=нет галки.Галка это 1
включенный FUSE - это FUSE без галочки!