Код: Выделить всё
.include "tn2313def.inc"
.equ Fo=8000000
;Definitions
;.def temp = R16
;.def temp1 = R17
;.def temp2 = R18
;Interrupts
rjmp RESET ; Reset Handler
rjmp INT_0 ; External Interrupt0 Handler
rjmp INT_1 ; External Interrupt1 Handler
;reti ; rjmp TIM1_CAPT ; Timer1 Capture Handler
;reti ; rjmp TIM1_COMPA ; Timer1 CompareA Handler
;reti ; rjmp TIM1_OVF ; Timer1 Overflow Handler
;reti ;TIM0_OVF ; Timer0 Overflow Handler
;reti ; rjmp USART0_RXC ; USART0 RX Complete Handler
;reti ; rjmp USART0_DRE ; USART0,UDR Empty Handler
;reti ; rjmp USART0_TXC ; USART0 TX Complete Handler
;reti ; rjmp ANA_COMP ; Analog Comparator Handler
;reti ; rjmp PCINT0 ; PCINT0 Handler
;reti ; rjmp TIMER1_COMPB ; Timer1 Compare B Handler
;reti ;rjmp TIMER0_COMPA ; Timer0 Compare A Handler
;reti ;rjmp TIMER0_COMPB ; Timer0 Compare B Handler
;reti ; rjmp USI_START ; USI Start Handler
;reti ; rjmp USI_OVERFLOW ; USI Overflow Handler
;reti ; rjmp EE_READY ; EEPROM Ready Handler
;reti ; rjmp WDT_OVERFLOW ; Watchdog Overflow Handler
;reti ; rjmp PCINT1 ; PCINT1 Handler
;reti ; rjmp PCINT2 ; PCINT2 Handler
RESET:
; STACK initialization
ldi R16,low(RAMEND)
out SPL,R16
; ldi R16,high(RAMEND)
; out SPH,R16
; PORT's initialization
; ser R16
; out DDRB,R16 ; PORTB as output
; ldi R16,0b11111101
; out PORTB,R16 ; PORTB output value all "1"
sbi DDRB,PB3 ;OC1A
sbi DDRB,PB4
;clr R16
ldi R16,0b11100000
out DDRD,R16 ; PORTD as input
ser R16
out PORTD,R16 ; PORTD pull-up is ON
; Turning OFF comparator
SBI ACSR,ACD
; ldi R16,0x80
; out ACSR,temp
/*
; Clock prescaler initialization
ldi R16,0b10000000
out CLKPR,R16
ldi R16,0b00001000 ; Divide by 256
out CLKPR,R16
nop
nop
nop
nop
*/
; 8 bit Timer initialization
LDI XH,HIGH(Fo/500000/2-1)
LDI XL,LOW(Fo/500000/2-1)
OUT OCR1AH,XH
OUT OCR1AL,XL
; clr R16
; out OCR1AH,R16
; ldi R16,15 ; Frequency for CTC mode
; out OCR1AL,R16
; clr R16
; out OCR1BH,R16
; ldi R16,8 ; Frequency for CTC mode
; out OCR1BL,R16
// ldi R16,0b00000010 ; TOV0 interrupt
// ldi R16,0b00000011 ; TOV0 & OCF0A interrupt
; ldi R16,0b00000111 ; TOV0 & OCF0A & OCF0B interrupt
; ldi R16,0b00000000
; out TIMSK,R16
// clr R16 ; NORMAL operation mode
; ldi R16,0b00000010 ; CTC operation mode
// ldi R16,0b01000010 ; CTC operation mode & OCR0A toggle
; ldi R16,0b00100011 ; Fast PWM mode & OCR0A and OCR0B toggle
; ldi R16,0b11100011 ; Fast PWM mode & OCR0A and OCR0B toggle (different toggle mode)
LDI R16,1<<COM1A0
OUT TCCR1A,R16
; ldi R16, 1<<COM1B1 | 1<<COM1B0; | 1<<WGM10 | 1<<WGM11
; out TCCR1A,R16
;ldi R16,0b00000001 | 1<<WGM02 ; 1024 Prescaler & PWM TOP 255
; ldi R16,0b00001101 ; 1024 Prescaler & PWM TOP OCROA
ldi R16,1<<WGM12|1<<CS10 ;1<<WGM13 | 1<<WGM12 | 0<<CS12 | 0<<CS11 | 1<<CS10
out TCCR1B,R16
ldi R16,0b00001111
out MCUCR,R16
ldi R16,0b11000000
out GIMSK,R16
; ser R16
out GIFR,R16
sei ; ENable interrupts
; Main program
main:
rjmp main
INT_0:
rcall wait
sbis PIND,PD2
rjmp exit_int_0
in R24,OCR1BL
in R25,OCR1BH
clc
rol R24
rol R25
adiw R25:R24,1
out OCR1BH,R25
out OCR1BL,R24
in R24,OCR1AL
in R25,OCR1AH
clc
rol R24
rol R25
adiw R25:R24,1
out OCR1AH,R25
out OCR1AL,R24
exit_int_0:
ser R16
out GIFR,R16
reti
INT_1:
rcall wait
sbis PIND,PD3
rjmp exit_int_1
in R24,OCR1BL
in R25,OCR1BH
;
clc
ror R25
ror R24
; adiw R25:R24,1
out OCR1BH,R25
out OCR1BL,R24
in R24,OCR1AL
in R25,OCR1AH
clc
ror R25
ror R24
out OCR1AH,R25
out OCR1AL,R24
exit_int_1:
ser R16
out GIFR,R16
reti
; Delay Sub-program
wait: ldi R16,255
ldi R17,255
ldi R18,1
delay: subi R16,1 ; (3+2)xR16(255)xR17(255)xR18(100) = 32.5kk ~2sec
sbci R17,0
sbci R18,0
brcc delay
ret
.EXIT