.include "D:\Program Files\Atmel\AVR Studio\Appnotes\m328Pdef.inc" ;Автор: Кравченко А.В. ;Дата: 9.01.2014 ;Версия: 1.1.21 ;Имя файла: hoddod8.asm ;Микроконтроллер: AVR mega328P. ;Тактовая частота: 16 мГц ;Питание: стабилизированное 5 В .list .def adr = r0 ; Рабочий регистр .def prg1 = r18 ; Рабочий регистр .def prg2 = r28 ; Рабочий регистр .def tmp =r27 ; Общий регистр .def DN =r29 ; Рабочий регистр .def tmp2 = r20 ; Рабочий регистр .def R = r21 ; Рабочий регистр .def L = r22 ; Рабочий регистр .def S = r23 ; Рабочий регистр .def E = r24 ; Рабочий регистр .def P = r25 ; Рабочий регистр .def Q = r19 ; Рабочий регистр .def G = r20 ; Рабочий регистр .def XN = r26 ; Рабочий регистр .def YN = r17 ; Рабочий регистр .def MN = r16 ; Рабочий регистр .def tmp3 = r30 ; Рабочий регистр .def adc1 = r31 ; Рабочий регистр .cseg .org 0 rjmp RESET nop ;rjmp EXT_INT0 ; nop nop ;rjmp EXT_INT1 ; nop nop ;rjmp PCINT0 прерывание не используется nop nop ;rjmp PCINT1 прерывание не используется nop nop ;rjmp PCINT0 прерывание не используется nop nop ;rjmp WDT ; nop nop ;rjmp TIMER2_COMPA прерывание от таймера nop nop ;rjmp TIMER2_COMPB прерывание от таймера nop ;rjmp TIMER2_OTOIE0 0 78VF ;прерывание от таймера T2 nop nop ;rjmp TIMER1_CAPT прерывание от таймера nop nop ;rjmp TIMER1_COMPA прерывание от таймера22 nop nop nop nop rjmp TIMER1_COMPB ;прерывание от таймера nop ;rjmp TIMER1_OVF ;прерывание от таймера1 nop nop ;rjmp TIMER0_COMPA прерывание от таймера nop nop ;rjmp TIMER0_COMPB прерывание от таймера nop rjmp TIMER0_OVF ;прерывание от таймера0 nop nop ;rjmp SPI_STC прерывание не используется nop nop ;rjmp UCASRT_RXC прерывание от USART nop nop ;rjmp UCASRT_UDRE прерывание от USART nop nop ;rjmp UCASRT_TXC прерывание от USART nop nop ;rjmp ADC прерывание от АЦП nop nop ;rjmp EE_RDY прерывание от таймера nop nop ;rjmp ANA_COMP прерывание от компаратора nop nop ;rjmp TWI прерывание от TWI nop nop ;rjmp SPM_RDY прерывание не используется .org 64 RESET: nop ;***************************************************** ;настройка портов ввода - вывода clr tmp ldi tmp, $00 ; out DDRC, tmp out PORTC, tmp ;обнулить порт C clr tmp ldi tmp, $E0 ;PD5-PD8 -выход out DDRD, tmp clr tmp out PORTD, tmp ;обнулить порт D ldi tmp, $3F ;PB0-PB3, PB4,PB5 -выход out DDRB, tmp clr tmp out PORTB, tmp ;обнулить порт B ;******************************************************** ;Исходные данные clr tmp ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ;**************************************************** ;настройка программного стека ldi tmp, low(RAMEND) ;указатель стека out SPL, tmp ;полный стек ldi tmp, high(RAMEND) out SPH, tmp ;*************************************************************** sei ;Начало программы nStart: nop ;сброс всех значений clr tmp clr tmp2 clr prg1 clr prg2 clr adr ;************************************************* ;Ждем свет, считываем с ADC0 фотодатчик менее 1/3 Uпит qazx: nop sbi PORTB, 5 ;установить в 1 PORTB5 nop rcall zader05 nop rcall adcn nop clc clz cls subi tmp2, $73 cbi PORTB, 5 ;установить в 1 PORTB5 brsh qazx nop cbi PORTB, 5 ;установить в 1 PORTB5 sei ;Свет есть, робот стоит ;************************************Пауза в 100 мс clr tmp out TCCR0A,tmp ldi tmp,$05 out TCCR0B,tmp ;деление СК/1024 ldi tmp, $01 out TCNT0, tmp ldi tmp, $01 sts TIMSK0,tmp ;разрешаем прерывания по переполнению от Т0 clr DN reewv: nop ;Сброс портов rcall sbros nop clz cln cpi DN, $D2 breq ddwv rjmp reewv nop ddwv: nop sbi PORTB, 5 ;установить в 1 PORTB5 ;робот идет ;********************************** ldi tmp,$00 out TCCR0B,tmp ;счетчик остановлен clr prg1 clr prg2 ;Запуск таймера 20 мС ldi tmp,$00 out TIFR1, tmp sts TCCR1A,tmp ;режим работы нормальный ldi tmp,$04 ;режим работы нормальный, запуск таймера sts TCCR1B,tmp ; ldi tmp,$04 sts OCR1BH,tmp ldi tmp,$F0 sts OCR1BL,tmp ldi tmp, $00 sts TCNT1H, tmp ldi tmp, $4F sts TCNT1L, tmp ldi tmp, $04 sts TIMSK1,tmp ;разрешаем прерывания по совпадению от Т1 ;*************************************************************** sei ;разрешение прерываний ;сброс всех величин ;*************************************************************** ;Первая часть ;Запись в ОЗУ данных фазы sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ldi G, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q mov r8, G clr prg1 clr prg2 ree: nop ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq dd rjmp ree nop dd: nop clr prg1 clz cln ;Проверка 50 раз выполнена фаза (для суммы 1С) cpi prg2, $10 ;20 раз breq ren rjmp ree fdd2: nop ;начало цикла установка в исходное сосстояние 90-90 грд ;фаза голова влево ;*********************************************************** ren: nop; sei ;разрешение прерываний clr prg1 clr prg2 rel23: nop;Сброс портов rcall sbros cbi PORTB, 0 ;установить в 0 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ldi G, $20 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q mov r8, G ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq dd123 rjmp rel23 nop dd123: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ren3 rjmp rel23 ;********************************************************** ren3: nop; sei ;разрешение прерываний clr prg1 clr prg2 rel2: nop;Сброс портов rcall sbros sbi PORTB, 0 ;установить в 0 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ldi G, $10 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q mov r8, G ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq dd12 rjmp rel2 nop dd12: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ren2 rjmp rel2 ;********************************************************** ;Идем прямо фаза 1 ren2: nop; sei ;разрешение прерываний clr prg1 clr prg2 rel: nop;Сброс портов rcall sbros cbi PORTB, 5 ;установить в 0 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 ldi G, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q mov r8, G ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq dd1 rjmp rel nop dd1: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq res rjmp rel ;********************************************************** ;фаза 2 res: nop sei ;разрешение прерываний clr prg1 clr prg2 rets: nop;Сброс портов rcall sbros sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $10 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $20 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q nop clz cln cpi prg1, $1D breq ds rjmp rets nop ds: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ree112 rjmp rets ;****************************************************** ;фаза 3 ree112: nop sei ;разрешение прерываний clr prg1 clr prg2 rew: nop;Сброс портов cbi PORTB, 5 ;установить в 0 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q clz cln cpi prg1, $1D breq dd13 rjmp rew nop dd13: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $10 ;20 раз breq ree21 rjmp rew ;****************************************************** ;фаза 4 ree21: nop sei ;разрешение прерываний clr prg1 clr prg2 remm: nop sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $20 ldi R, $15 ldi S, $15 ldi E, $10 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddl77 rjmp remm nop ddl77: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ree31 rjmp remm ;*********************************************************** ;Фаза 5 ree31: nop sei ;разрешение прерываний clr prg1 clr prg2 reyu: nop cbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddyu rjmp reyu nop ddyu: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $10 ;20 раз breq ree312 rjmp reyu ree312: nop ;************************************************** ;Фаза 6 sei ;разрешение прерываний clr prg1 clr prg2 resm2: nop sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $20 ldi S, $20 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddl27t rjmp resm2 nop ddl27t: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ree314r rjmp resm2 ;*********************************************************** fdd: nop rjmp fdd2 ;Фаза 7 ree314r: nop sei ;разрешение прерываний clr prg1 clr prg2 remm3: nop cbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddl47r rjmp remm3 nop ddl47r: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $10 ;20 раз breq ree315r rjmp remm3 ree315r: nop sei ;разрешение прерываний clr prg1 clr prg2 ;*********************************************************** ;Фаза 8 reyuq: nop sbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $10 ldi S, $15 ldi E, $15 ldi P, $10 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddyuq rjmp reyuq nop ddyuq: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $1F ;20 раз breq ree312q rjmp reyuq ree312q: nop ;*********************************************************** ;фаза 9 sei ;разрешение прерываний clr prg1 clr prg2 reyuww: nop cbi PORTB, 5 ;установить в 1 PORTB5 ldi L, $15 ldi R, $15 ldi S, $15 ldi E, $15 ldi P, $15 ldi Q, $15 mov r2, L mov r3, R mov r4, S mov r5, E mov r6, P mov r7, Q ;Сброс портов rcall sbros nop clz cln cpi prg1, $1D breq ddyuwws rjmp reyuww nop ddyuwws: nop clr prg1 clz cln ;Проверка 6 раз выполнена фаза (для суммы 120 mС) cpi prg2, $10 ;20 раз breq reewws rjmp reyuww reewws: nop clr prg1 clr prg2 nop sei ;разрешение прерываний rjmp fdd ;*********************************************************** ;Дальше программа работает только по прерыванию ;****************************************** ;Обработка прерывания по Т 1 20 мС TIMER1_COMPB: nop cli ldi tmp,$00 out TIFR1, tmp sts TCCR1A,tmp ;режим работы нормальный ldi tmp,$04 ;режим работы нормальный, запуск таймера sts TCCR1B,tmp ; ldi tmp,$04 sts OCR1BH,tmp ldi tmp,$F0 sts OCR1BL,tmp ldi tmp, $00 sts TCNT1H, tmp ldi tmp, $4F sts TCNT1L, tmp ldi tmp, $04 sts TIMSK1,tmp ;разрешаем прерывания по совпадению от Т1 nop ldi prg1, $1D inc prg2 sbi PORTD, 6 ;установить в 1 PORTD6 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz ;Проверка 1,0 мС subi L, $10 brne sit nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim cbi PORTD, 6 ;установить в 0 PORTD6 sit: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi L, $05 brne sit1 cbi PORTD, 6 ;установить в 0 PORTD6 sit1: nop ;************************************************************** 1,5 mS rcall zader025 nop ; rcall trim ;-0,25 mS ;Проверка 2,0 мС rcall sbros nop ;***************************************************************вторая нога sbi PORTB, 1 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi R, $10 brne dicc nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim nop rcall trim ;1,25 mS cbi PORTB, 1 ;сбросить в 0 PORTB1 dicc: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi R, $05 brne dicc1 cbi PORTB, 1 ;сбросить в 0 PORTB1 dicc1: nop ;************************************************************** 1,5 mS rcall zader025 nop ; rcall trim ;-0,25 MS ;Проверка 2,0 мС cls clz subi R, $05 brne dicc2 cbi PORTB, 1 ;сбросить в 0 PORTB1 dicc2: nop ;************************************************************** 2,0 mS ;Сброс портов rcall sbros nop ;****************************************************третья нога sbi PORTB, 3 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi S, $10 brne dics cbi PORTB, 3 ;сбросить в 0 PORTB3 dics: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi S, $05 brne dicn cbi PORTB, 3 ;сбросить в 0 PORTB3 dicn: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi S, $05 brne dicl cbi PORTB, 3 ;сбросить в 0 PORTB3 dicl: nop ;************************************************************** 2,0 mS rcall sbros ;*********************************************************четвертая нога sbi PORTB, 0 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi P, $10 brne dier cbi PORTB, 0 ;сбросить в 0 PORTB1 dier: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi P, $05 brne dirt cbi PORTB, 0 ;сбросить в 0 PORTB1 dirt: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi P, $05 brne dity cbi PORTB, 0 ;сбросить в 0 PORTB1 dity: nop ;************************************************************** 2,0 mS ;Сброс портов rcall sbros nop ;***********************************************************пятая нога sbi PORTD, 7 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi E, $10 brne diyu cbi PORTD, 7 ;сбросить в 0 PORTB1 diyu: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi E, $05 brne diui cbi PORTD, 7 ;сбросить в 0 PORTB1 diui: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi E, $05 brne dicc29 cbi PORTD, 7 ;сбросить в 0 PORTB1 dicc29: nop ;************************************************************** 2,0 mS ;Сброс портов rcall sbros nop ;*********************************************************шестая нога sbi PORTB, 2 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi Q, $10 brne diop cbi PORTB, 2 ;сбросить в 0 PORTB1 diop: nop ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi Q, $05 brne dipp cbi PORTB, 2 ;сбросить в 0 PORTB1 dipp: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi Q, $05 brne diqq cbi PORTB, 2 ;сбросить в 0 PORTB1 diqq: nop ;************************************************************** 2,0 mS ;Сброс портов rcall sbros nop ;*********************************************************голова sbi PORTB, 4 ;Запуск отсчета 0,5 мС rcall zader05 nop ;Запуск отсчета 0,5мС rcall zader05 nop rcall trim cls clz subi G, $10 brne diopx cbi PORTB, 4 ;сбросить в 0 PORTB1 diopx: nop ; rjmp bbb ;************************************************************** 1 mS ;Запуск отсчета 0,5 мС rcall zader05 nop ;Проверка 1,5 мС cls clz subi G, $05 brne dippx cbi PORTB, 4 ;сбросить в 0 PORTB1 dippx: nop ;************************************************************** 1,5 mS rcall zader05 nop rcall trim ;Проверка 2,0 мС cls clz subi Q, $05 brne bbb cbi PORTB, 4 ;сбросить в 0 PORTB1 ;************************************************************** 2,0 mS ;Сброс портов bbb: nop rcall sbros nop mov L, r2 mov R, r3 mov S, r4 mov E, r5 mov P, r6 mov Q, r7 mov G, r8 sei ;разрешить прерывание reti ;**************************************Подпрограммы ;прерывание от таймера0 TIMER0_OVF: nop nop inc DN wdr reti ;**************************************Подпрограммы ;Сброс портов sbros: nop cbi PORTD, 6 ;установить в 0 PORTD6 cbi PORTB, 1 ;установить в 0 PORTB1 cbi PORTB, 3 ;установить в 0 PORTB3 cbi PORTD, 7 ;установить в 0 PORTD6 cbi PORTB, 0 ;установить в 0 PORTB1 cbi PORTB, 2 ;установить в 0 PORTB2 cbi PORTB, 4 ;установить в 0 PORTB4 ret ;Подпрограмма регулировки задержки включения mS trim : nop wdr ldi YN, $12 ldi MN, $02 ldi XN, $02 dm1: nop nop nop nop dv1: nop wdr nop dx1: nop cln dec YN brpl dx1 cln dec XN brpl dv1 cln dec MN brne dm1 ret ;Подпрограмма задержки включения 0,5 mS zader05 : nop wdr ldi YN, $76 ldi MN, $76 ldi XN, $76 dm: nop nop nop dv: nop wdr nop dx: nop nop nop nop nop nop nop nop cln dec YN brpl dx cln dec XN brpl dv cln dec MN brne dm ret ;***************************************************** ;Подпрограмма задержки включения 0,25 mS zader025 : nop wdr ldi YN, $16 ldi MN, $46 ldi XN, $76 dmvv: nop nop nop dvvv: nop wdr nop dxvv: nop nop nop nop nop nop nop nop cln dec YN brpl dxvv cln dec XN brpl dvvv cln dec MN brne dmvv ret ;***************************************************** ;Подпрограмма АЦП обработки данных ;Настройка АЦП adcn: nop cli ;отключение цифровых входов ldi tmp, $3F sts DIDR0, tmp nop nop nop clr tmp awe: nop cpi tmp, $04 brsh ass ;коммутация входов АЦП ADC0 REF=Uпит ldi adc1, $40 sts ADMUX, adc1 clr tmp2 clr tmp3 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop ldi adc1, $C7 nop nop ;запуск АЦП на непрерыв преобразование, 125 кГц sts ADCSRA, adc1 clr tmp3 sts ADCSRB, tmp3 fln: nop lds prg1, ADCSRA sbrs prg1, 4 rjmp fln ;Сохранение данных АЦП lds tmp2, ADCL lds tmp3, ADCH mov r10, tmp2 mov r11, tmp3 mov r12, r10 mov r13, r11 mov r14, r12 mov r15, r13 inc tmp rjmp awe ;среднее арифметическое действие ass: nop clr r8 clc add tmp2, r10 adc r9, r8 add tmp2, r12 adc r9, r8 add tmp2, r14 adc r9, r8 clc lsr r9 ror tmp2 lsr r9 ror tmp2 clr r9 clc add tmp3, r11 adc r9, r8 add tmp3, r13 adc r9, r8 add tmp3, r15 adc r9, r8 clc lsr r9 ror tmp3 lsr r9 ror tmp3 nop ret .EXIT