.include "D:\Program Files\Atmel\AVR Studio\Appnotes\tn25def.inc" ;Автор: Кравченко А.В. ;Дата: 18.06.2010 ;Версия: 1.1.1 ;Проект Воллибот ;Имя файла: Voli.asm ;Микроконтроллер: AVR tiny25. ;Тактовая частота: 8 мГц ;Питание: стабилизированное 5,0 В .def tmp = r16 .def tmp2 = r17 .def tmp3 = r18 .def tempo = r19 .def adc2 = r22 .def adc1 = r23 .def Yo = r20 .def Xo = r21 .def Mo = r26 .def adr = r0 .def d1 = r24 .def d2 = r25 .def S1 = r27 .def S2 = r28 .cseg .org 0 rjmp RESET nop ;rjmp EXT_INT0 прерывание не используется nop ;rjmp EXT_PCINT прерывание не используется nop ;rjmp TIMER1_COMPA совпадение таймер 1 nop ;rjmp TIMER1_OVF0 прерывание от таймера nop ;rjmp TIMER0_OVF0 прерывание от таймера nop ;rjmp EE_RDY прерывание от таймера nop ;rjmp ANA_COMP прерывание не используется nop ;rjmp ADC прерывание не используется nop ;rjmp TIMER1_COMPB прерывание от таймера nop ;rjmp TIMER0_COMPA прерывание от таймера nop ;rjmp TIMER0_COMPB прерывание от таймера nop ;rjmp WDT тайм аут сторожевой таймен nop ;rjmp USI START состояние START nop ;rjmp USI OVF прерывание не используется .org 20 ;настройка порта В RESET: nop clr tmp mov r12, tmp out DDRB, tmp ldi tmp, $0C out PORTB, tmp ;обнулить порт В clr tmp ldi tmp, $13 ;PB0,PB1,PB4-выходы out DDRB, tmp nop ;старт программы nop rcall zader nStart: nop rcall zader clr tmp out PORTB, tmp ;обнулить порт В ;Один шаг левый clr tmp ldi tmp, $02 out PORTB, tmp ;обнулить порт В rcall zader clr tmp out PORTB, tmp ;обнулить порт В nop ;Один шаг правый clr tmp ldi tmp, $10 out PORTB, tmp rcall zader clr tmp out PORTB, tmp ;обнулить порт В nop rcall zader clr tmp out PORTB, tmp ;обнулить порт В ;Проверка фото датчиков ;вход в подпрограмму опроса АЦП1 правые датчики nop ldi tmp3, $A3 ;источник питания, ADC2,ADMUX ldi tmp2, $C6 ;одиночное, запуск, 1/64,ADCSRA ldi tempo, $00 ;ADCSRB ;опрос уровня правых датчиков rcall adcn mov S1, tmp2 ;загрузка младшего разряда mov S2, tmp3 ;загрузка старшего разряда clc ror S1 cln cls clz subi S1, $18 ;вычесть 200 единиц nop brpl dalee2 nop ldi tmp, $01 ;nazad out PORTB, tmp ;порт В rjmp con nop dalee: nop ;вход в подпрограмму опроса АЦП1 левые датчики nop ldi tmp3, $A1 ;источник питания, ADC2,ADMUX ldi tmp2, $C6 ;одиночное, запуск, 1/64,ADCSRA ldi tempo, $00 ;ADCSRB ;опрос уровня левых датчиков rcall adcn mov d1, tmp2 ;загрузка младшего разряда mov d2, tmp3 ;загрузка старшего разряда clc ror d1 cln cls clz subi d1, $18 ;вычесть 200 единиц nop brpl dalee2 nop ldi tmp, $01 ;nazad out PORTB, tmp ;порт В rjmp con nop dalee2: nop ;Вычитаем значения левых датчиков от значения правых cln cls clz clc ror d2 ror S2 sub d2, S2 ;Вычитание младших байтов nop brmi npr ;переход если результат отрицательный nop ;Один шаг левый clr tmp ldi tmp, $02 out PORTB, tmp ;обнулить порт В rcall zader clr tmp out PORTB, tmp ;обнулить порт В nop rjmp con npr: nop ;Один шаг правый clr tmp ldi tmp, $10 out PORTB, tmp rcall zader clr tmp out PORTB, tmp ;обнулить порт В nop con: nop ;Один шаг левый rcall nazadlevo nop clr tmp out PORTB, tmp ;обнулить порт В nop ;Один шаг правый rcall nazadpravo clr tmp out PORTB, tmp ;обнулить порт В nop rjmp nStart ;Подпрограмма назад, влево вперед nazadlevo: ;назад clr tmp ldi tmp, $13 out PORTB, tmp ;обнулить порт В nop rcall zader nop rcall zader clr tmp out PORTB, tmp ;обнулить порт В ;Один шаг левый clr tmp ldi tmp, $03 out PORTB, tmp ;обнулить порт В nop rcall zader nop rcall zader clr tmp out PORTB, tmp ;обнулить порт В ret ;Подпрограмма назад, вправо вперед nazadpravo: ;назад clr tmp ldi tmp, $13 out PORTB, tmp ;обнулить порт В nop rcall zader clr tmp out PORTB, tmp ;обнулить порт В ;Один шаг правый clr tmp ldi tmp, $11 out PORTB, tmp ;обнулить порт В nop rcall zader clr tmp out PORTB, tmp ;обнулить порт В ret ;Настройка АЦП adcn: nop mov r12, tmp3 mov r13, tmp2 nop clr tmp awe: nop cpi tmp, $04 brsh ass mov tmp3, r12 mov tmp2, r13 out ADMUX, tmp3 ;коммутация входов АЦП nop out ADCSRA, tmp2 ;запуск АЦП на преобразование nop out ADCSRB, tempo ;запуск АЦП на преобразование ;Сохранение данных АЦП in tmp2, ADCL in tmp3, ADCH mov r2, tmp2 mov r3, tmp3 mov r4, r2 mov r5, r3 mov r6, r4 mov r7, r5 inc tmp rjmp awe ;среднее арифметическое действие ass: nop clr r8 clc add tmp2, r2 adc r9, r8 add tmp2, r4 adc r9, r8 add tmp2, r6 adc r9, r8 clc lsr r9 ror tmp2 lsr r9 ror tmp2 clr r9 clc add tmp3, r3 adc r9, r8 add tmp3, r5 adc r9, r8 add tmp3, r7 adc r9, r8 clc lsr r9 ror tmp3 lsr r9 ror tmp3 nop ret ;Подпрограмма задержки включения zader: nop rcall zader2 clr tempo in tempo, PORTB clr tmp out PORTB, tmp nop ;вход в подпрограмму опроса АЦП1 правые датчики nop ldi tmp3, $A3 ;источник питания, ADC2,ADMUX ldi tmp2, $C6 ;одиночное, запуск, 1/64,ADCSRA ldi tempo, $00 ;ADCSRB ;опрос уровня правых датчиков rcall adcn mov S1, tmp2 ;загрузка младшего разряда mov S2, tmp3 ;загрузка старшего разряда clc ror S1 cln cls clz subi S1, $1C ;вычесть 200 единиц nop brpl sled nop ldi tmp, $01 ;nazad out PORTB, tmp ;порт В rjmp red ;вход в подпрограмму опроса АЦП1 левые датчики nop ldi tmp3, $A1 ;источник питания, ADC2,ADMUX ldi tmp2, $C6 ;одиночное, запуск, 1/64,ADCSRA ldi tempo, $00 ;ADCSRB ;опрос уровня левых датчиков rcall adcn mov d1, tmp2 ;загрузка младшего разряда mov d2, tmp3 ;загрузка старшего разряда clc ror d1 cln cls clz subi d1, $1C ;вычесть 200 единиц nop brpl sled nop ldi tmp, $01 ;nazad out PORTB, tmp ;порт В rjmp red sled: nop out PORTB, tempo red: nop rcall zader2 clr tmp out PORTB, tmp ;порт В ret zader2: nop wdr ldi tmp2, $4C ldi tmp3, $5F clr Mo clr Yo ldi Yo, $7F ldi Mo, $03 add Mo, tmp3 dm: nop nop nop goq: nop mov Xo, tmp2 nop dv: nop wdr nop dx: nop nop ldi tmp, $12 mov r12, tmp dec Yo brpl dx cln dec Xo brpl dv nop nop cln dec Mo brne dm ret .EXIT