include"m16def.inc" ; подключили мега 16 ;========================== определения =========== .def Temp = r16 .def Temp2 = r17 .def count = r18 .def XL_HIGH = r19 .def XH_HIGH = r20 .include"macro.inc" .dseg data: .byte 2 ;=========================== сегмент программы ==== .cseg ; ************************ INTERRUPT VECTORS ********* .org 0x0000 jmp reset .org OC1Aaddr ; Timer/Counter1 Compare Match A jmp OC1A_INT .org URXCaddr ; USART, Rx Complete jmp URXC_INT ;================================================== reset: mega_stack ; stack pointer set outi ACSR,(1< ;=========================== иницилизация ========= ldi XH,$ff ldi XL,$fb ldi count,$00 ldi Temp, $01 sts data,XL sts data+1,XH ;=========================== Usart INIT ================== USART_init 9600,10000000 ; baudrate 9600, Xtal 10 MHz OUTI UCSRB, (1< ;=========================== 16bit_timer init ============ outi TCCR1A,0b00000000 outi TIMSK, 0b00010000 ; output compare_A match interrupt enable outi TIFR,$FF ; стираем флаги единицами ! /* outi ddrd, 0b00000111 outi portd, 0b00000001 */ outi ddra,$ff outi porta,$00 outi ddrb,$ff outi portb,$00 outi ddrc, 0b00000111 outi portc,0b00000000 outi OCR1AH,$ff outi OCR1AL,$fb // запускаем таймер outi TCCR1B,0b00001001 ; normal mode, OC1A,OC1B disconected sei ;=========================== программа ====================== main: brtc main lds Temp,data+1 out OCR1AH,Temp lds Temp,data out OCR1AL,Temp clt jmp main ;========================== подпрограммы =============== ;============================= прерывания ============== OC1A_INT: set in Temp,portc cpi Temp,0b00000001 breq a cpi Temp,0b00000011 breq b cpi Temp,0b00000010 breq c cpi Temp,0b00000110 breq d cpi Temp,0b00000100 breq e cpi Temp,0b00000101 breq f a: outi portc,0b00000011 rjmp getout b: outi portc,0b00000010 rjmp getout c: outi portc,0b00000110 rjmp getout d: outi portc,0b00000100 rjmp getout e: outi portc,0b00000101 rjmp getout f: outi portc,0b00000001 getout: reti URXC_INT: in Temp,UDR cpi Temp,'+' ; если плюс , добавляем времени breq add_tcnt cpi Temp,'-' ; если минусб убираем время breq sub_tcnt jmp exit ; ничего нет - выходим sub_tcnt: ADIW X,30 ; увеличиваем таймер на один и пишем в переменную sts data,XL sts data+1,XH jmp exit add_tcnt: SBIW X,30 ; уменьшаем таймер на один и пишем в переменную sts data,XL sts data+1,XH jmp exit exit: ; выходим reti