.include "d:\avr\avrasm\appnotes\2313def.inc" .def Temp1=R16 .def Temp2=R17 .def Temp3=R18 .def Temp4=R19 .def Temp=R20 .dseg CountRate: .byte 1 MelAddL: .byte 1 MelAddH: .byte 1 ;****************************************************************************** .macro stsi ;save_immediate , ldi Temp,@1 sts @0,Temp .endmacro .macro rdm ldi ZH,High(@0*2) ldi ZL,Low(@0*2) add ZL,XL adc ZH,XH lpm mov Temp3,r0 .endmacro ;****************************************************************************** .cseg .org 0 rjmp RESET ; Reset Handler rjmp EXT_INT0 ; IRQ0 Handler rjmp EXT_INT1 ; IRQ1 Handler rjmp TIM_CAPT1 ; Timer1 Capture Handler rjmp TIM_COMP1 ; Timer1 Compare Handler rjmp TIM_OVF1 ; Timer1 Overflow Handler rjmp TIM_OVF0 ; Timer0 Overflow Handler rjmp UART_RXC ; UART RX Complete Handler rjmp UART_DRE ; UDR Empty Handler rjmp UART_TXC ; UART TX Complete Handler rjmp ANA_COMP ; Analog Comparator Handler EXT_INT0 : ret EXT_INT1 : ret TIM_CAPT1 : ret TIM_OVF0 : ret TIM_OVF1 : ret UART_RXC : ret UART_DRE : ret UART_TXC : ret ANA_COMP : ret TIM_COMP1 : ret reset: ldi Temp1, RamEnd ;Инициализация стека out SPL, Temp1 cli inc Temp3 ;========================================================= ldi Temp1,0xff ;Инициализация порта (все на вывод) out DDRB, Temp1 ldi temp1,0b00000001 out PORTB,Temp1 ;========================================================= ;Инициализация таймеров ldi temp1,0b01000000 ;OC1 toggle at compare out tccr1a,temp1 ldi temp1,0b00001011 out tccr1b,temp1 ;clear on compare, clk=C/64 ldi Temp1,1 sts CountRate,Temp1 ;********************************************************************************************** ;Partiture reader ;input: ;output: Temp3 - код текущей ноты Partiture: ldi XL,0 ldi XH,0 ldi Temp1,0 ldi Temp2,0 Play: rdm HymnUSSR cpi Temp3,0xff ;comparing with "end" flag breq Partiture sts MelAddL,XL sts MelAddH,XH rcall Note lds XL,MelAddL lds XH,MelAddH adiw XL,1 rdm HymnUSSR rcall Wait adiw XL,1 rjmp Play HymnUSSR: .db 28,6,27,6,28,6,27,6,28,6,23,6 .db 26,6,24,6,21,12,254,6 .db 12,6,16,6,21,6,23,12,254,6,16,6 .db 20,6,23,6,24,12,254,6 .db 16,6,28,6,27,6,28,6,27,6,28,6 .db 23,6,26,6,24,6,21,12 .db 254,6,12,6,16,6,21,6,23,12,254,6 .db 16,6,24,6,23,6,21,12 .db 254,6,23,6,24,6,26,6,28,16,19,6 .db 29,6,28,6,26,16,17,6 .db 28,6,26,6,24,16,16,6,26,6,24,6 .db 23,12,254,6,16,6 .db 28,6,27,6,28,6,27,6,28,6,23,6 .db 26,6,24,6,21,12,254,6 .db 12,6,16,6,21,6,23,12,254,6,16,6 .db 20,6,23,6,24,12,254,6 .db 16,6,28,6,27,6,28,6,27,6,28,6 .db 23,6,26,6,24,6,21,12 .db 254,6,12,6,16,6,21,6,23,12,254,6 .db 16,6,24,6,23,6,21,24,254,64,255,0 ; до(263) до#(285) ре(297) ре#(316) ми(330) фа(351) фа#(375) соль(395) соль#(422)ля(440) ля#(474) си(494) ; 0 1 2 3 4 5 6 7 8 9 10 11 ; 12 13 14 15 16 17 18 19 20 21 22 23 ; 24 25 26 27 28 29 30 31 32 33 34 35 ;**************************************************** Note: ldi ZH,High(Notelist*2) ldi ZL,Low(Notelist*2) ldi Temp1,0 clc rol Temp3 rol Temp1 add ZL,Temp3 adc ZH,Temp1 lpm mov Temp2,r0 adiw ZL,1 lpm mov Temp1,r0 rcall NotePlay ret ; до(263) до#(285) ре(297) ре#(316) ми(330) фа(351) фа#(375) соль(395) соль#(422)ля(440) ля#(474) си(494) ; 0 1 2 3 4 5 6 7 8 9 10 11 Notelist: .db 0x02,0x50,0x02,0x24,0x02,0x0e,0x01,0xed,0x01,0xd9,0x01,0xbc,0x01,0xa0,0x01,0x8b,0x01,0x72,0x01,0x63,0x01,0x49,0x01,0x3c;сред. октава ; 12 13 14 15 16 17 18 19 20 21 22 23 .db 0x01,0x28,0x01,0x12,0x01,0x07,0x00,0xf6,0x00,0xec,0x00,0xde,0x00,0xd0,0x00,0xc5,0x00,0xb9,0x00,0xb1,0x00,0xa4,0x00,0x9e;бол. октава ; 24 25 26 27 28 29 30 31 32 33 34 35 .db 0x00,0x94,0x00,0x89,0x00,0x83,0x00,0x7b,0x00,0x76,0x00,0x6f,0x00,0x68,0x00,0x62,0x00,0x5c,0x00,0x58,0x00,0x52,0x00,0x4f;1 октава NotePlay: ldi Temp3,0 out tcnt1h,Temp3 out tcnt1l,Temp3 out ocr1ah,temp2 out ocr1al,temp1 ret ;************************************************************ Wait: push Temp1 push Temp2 ldi Temp1,0 ldi Temp2,0 l: dec temp1 brne l dec temp2 brne l dec temp3 brne l pop Temp2 pop Temp1 ret