.include "D:\Program Files\Atmel\AVR Studio\Appnotes\tn2313def.inc" ;Автор: Кравченко А.В. ;Дата: 8.01.2011 ;Версия: 1.1.1 ;Имя файла: Rob.asm ;Микроконтроллер: AVR tiny2313. ;Тактовая частота: 4,0 мГц ;Питание: нестабилизированное 5,0 В .list .def adr = r0 ; Рабочий регистр .def prg1 = r18 ; Рабочий регистр .def prg2 = r19 ; Рабочий регистр .def tmp =r21 ; Общий регистр .def DN =r22 ; Рабочий регистр .def tmp2 = r20 ; Рабочий регистр .def tmp3 = r24 ; Рабочий регистр .def Hbt = r25 ; Рабочий регистр .def Lbt = r16 ; Рабочий регистр .def XN = r26 ; Рабочий регистр .def YN = r17 ; Рабочий регистр .def MN = r23 ; Рабочий регистр .def par = r27 ; Рабочий регистр .def pur = r28 ; Рабочий регистр .def per = r29 ; Рабочий регистр .equ Lev = PD4 ; Lev = порт D / разряд 4 .equ Pra = PD5 ; Lev = порт D / разряд 5 .cseg .org 0 rjmp RESET rjmp EXT_INT0; прерывание не используется rjmp EXT_INT1; прерывание не используется nop ;rjmp TIMER1_CAPT прерывание не используется nop ;rjmp TIMER1_COMPA прерывание от таймера nop ;rjmp TIMER1_OVF прерывание от таймера nop ;rjmp TIMER0_OVF прерывание от таймера nop ;rjmp USART0, RXC прерывание от USART0 nop ;rjmp USART0, UDRE прерывание от USART0 nop ;rjmp USART0, TXC прерывание от USART0 nop ;rjmp ANA_COMP прерывание от компаратора nop ;rjmp PCINT прерывание не используется nop ;rjmp TIMER1_COMPB прерывание не используется nop ;rjmp TIMER0_COMPA прерывание от таймера nop ;rjmp TIMER0_COMPB прерывание от таймера nop ;rjmp UCI_START прерывание от USI nop ;rjmp UCI_OVF прерывание от USI nop ;rjmp EE_RDY прерывание от таймера nop ;rjmp WDT прерывание .org 22 ;настройка порта В RESET: nop clr tmp out DDRB, tmp out PORTB, tmp ;обнулить порт В clr tmp ldi tmp, $FF ;PB0-7 -выход out DDRB, tmp clr tmp ldi tmp, $FF out PORTD, tmp out DDRD, tmp ;настройка программного стека ldi tmp, low(RAMEND) ;указатель стека out SPL, tmp ;пол стекA ;Настройка прерывния ;***************************************************** ;Маска прерывания INT0 ldi tmp, $C0 ;разрешение прерывание INT0 out GIMSK, tmp ldi tmp, $00 ;режим ;условие прерывания по спадающему уровню на INT0 out MCUCR, tmp ;**************************************************** sei ;Начало программы nStart: nop ;сброс всех значений clr tmp clr tmp2 clr tmp3 clr Hbt clr Lbt clr prg1 clr prg2 clr DN clr par clr pur clr adr nop rcall vlevo nop sbis PinD, Lev ;состояние ожидания ведомого устройства rcall vlevpra nop sbis PinD, Pra ;состояние ожидания ведомого устройства rcall vpravle nop rjmp nStart ;переход в начало программы ;Подпрограмма разворота по чсаовой стрелке vlevpra: nop clr tmp ldi tmp, $0A ;десять шагов clr par cln cls sld1: nop cpi par, $08 breq prv1 ldi ZH, high(2*prog2) ldi ZL, Low(2*prog2) Add ZL, par LPM mov prg2, adr ;запись данных в регистр out PORTB, prg2 ;вывод в порт В rcall zader nop ldi ZH, high(2*prog1) ldi ZL, Low(2*prog1) Add ZL, par LPM mov prg2, adr ;запись данных в регистр mov per, prg2 swap per ;обмен полубайтов данных в регистре rcall stop mov prg2, per out PORTB, prg2 ;вывод в порт В rcall zader inc par rjmp sld prv1: nop clr par cln dec tmp brmi nert1 rjmp sld1 nert1: nop ret ;Подпрограмма разворота против чсаовой стрелки vpravle: nop clr tmp ldi tmp, $0A ;десять шагов clr par cln cls sld2: nop cpi par, $08 breq prv2 ldi ZH, high(2*prog1) ldi ZL, Low(2*prog1) Add ZL, par LPM mov prg2, adr ;запись данных в регистр mov per, prg2 ;перезапись данных в регистр ldi ZH, high(2*prog2) ldi ZL, Low(2*prog2) Add ZL, par LPM mov prg2, adr ;запись данных в регистр swap per ;обмен полубайтов данных в регистре or prg2, per ;формирование байта out PORTB, prg2 ;вывод в порт В rcall zader inc par rjmp sld prv2: nop clr par cln dec tmp brmi nert2 rjmp sld2 nert2: nop ret ;Подпрограмма влево полный шаг vlevo: nop clr tmp ldi tmp, $0A ;десять шагов clr par cln cls sfg: nop cpi par, $08 breq prn2 ldi ZH, high(2*prog1) ldi ZL, Low(2*prog1) Add ZL, par LPM mov prg1, adr ;запись данных в регистр mov per, prg1 ;перезапись данных в регистр swap per ;обмен полубайтов данных в регистре ldi tmp, $FF ;PB0-7 -выход out DDRB, tmp out PORTB, prg1 ;вывод в порт В rcall zader nop rcall stop nop mov prg1, per ldi tmp, $FF ;PB0-7 -выход out DDRB, tmp out PORTB, prg1 ;вывод в порт В rcall zader nop rcall stop nop inc par rjmp sfg prn2: nop clr par cln dec tmp brmi hkj rjmp sfg hkj: nop ret ;Подпрограмма вправо полный шаг vpravo: nop clr tmp ldi tmp, $0A ;десять шагов clr par cln cls sld: nop cpi par, $08 breq prv ldi ZH, high(2*prog2) ldi ZL, Low(2*prog2) Add ZL, par LPM mov prg2, adr ;запись данных в регистр mov per, prg2 ;перезапись данных в регистр swap per ;обмен полубайтов данных в регистре ldi tmp, $FF ;PB0-7 -выход out DDRB, tmp out PORTB, prg2 ;вывод в порт В rcall zader nop rcall stop nop mov prg2, per ldi tmp, $FF ;PB0-7 -выход out DDRB, tmp out PORTB, prg2 ;вывод в порт В rcall zader nop rcall stop nop inc par rjmp sld prv: nop clr par cln dec tmp brmi nert rjmp sld nert: nop ret ;Подпрограмма стоп stop: nop clr tmp out DDRB, tmp out PORTB, tmp ;обнулить порт В nop ret ;Подпрограмма задержки включения zader: nop ldi pur, $04 rte: nop cln dec pur brpl hkoj rjmp sfog hkoj: nop rcall Z25 nop rjmp rte sfog: nop nop ret ;Подпрограмма обработки прерывания INT0 EXT_INT0: nop cli nop rcall vpravo nop rcall zader nop rcall vpravo nop rcall zader nop rcall vpravo nop rcall zader nop rcall vpravo nop rcall zader nop sei nop reti ;Подпрограмма обработки прерывания INT1 EXT_INT1: nop cli nop rcall vpravo nop rcall zader nop rcall vpravo nop rcall zader nop rcall vpravo nop rcall zader nop rcall vpravo nop rcall zader nop sei nop reti ;Подпрограмма задержки включения 2,5 mC Z25: nop wdr ldi YN, $3F ldi MN, $3D ldi XN, $1A dm: nop nop nop nop dv: nop wdr nop dx: nop cln dec YN brpl dx cln dec XN brpl dv cln dec MN brne dm ret ;Код движения по часовой стрелке .org $200 prog1: .DB $08, $0A, $02, $06, $04, $05, $01, $09 ;Код движения против часовой стрелке .org $220 prog2: .DB $09, $01, $05, $04, $06, $02, $0A, $08 .EXIT