.include "D:\Program Files\Atmel\AVR Studio\Appnotes\m8def.inc" ;Автор: Кравченко А.В. ;Дата: 15.11.2010 ;Версия: 1.3.1 ;Имя файла: sumota4.asm ;Микроконтроллер: AVR mega8. ;Тактовая частота: 8 мГц ;Питание: стабилизированное 5 В .list .def adr = r0 ; Рабочий регистр .def adc1 = r27 ; Рабочий регистр .def prg1 = r24 ; Рабочий регистр .def prg2 = r25 ; Рабочий регистр .def Xa = r16 ; Рабочий регистр .def Ya = r17 ; Рабочий регистр .def tmp2 = r18 ; Рабочий регистр .def tmp3 = r28 ; Рабочий регистр .def tmp = r20 ; Рабочий регистр .def adc2 = r21 ; Рабочий регистр .def F = r22 ; Рабочий регистр .def F1 = r23 ; Рабочий регистр .def par = r26 ; Рабочий регистр .def Ma = r19 ; Рабочий регистр .def bit = r29 ; Рабочий регистр .def d2 = r30 ; Рабочий регистр .def s2 = r31 ; Рабочий регистр .def tmp1 = r13 ; Рабочий регистр .cseg .org 0 rjmp RESET rjmp EXT_INT0 ;прерывание не используется nop ;rjmp EXT_INT1 прерывание не используется nop ;rjmp TIMER2_COMP прерывание от таймера nop ;rjmp TIMER2_OVF прерывание от таймера nop ;rjmp TIMER1_CAPT прерывание от таймера nop ;rjmp TIMER1_COMPA прерывание от таймера nop ;rjmp TIMER1_COMPB прерывание от таймера rjmp TIMER1_OVF ;прерывание от таймера nop ;rjmp TIMER0_OVF прерывание от таймера nop ;rjmp SPI_STC прерывание не используется nop ;rjmp UCASRT_RXC прерывание от USART nop ;rjmp UCASRT_UDRE прерывание от USART nop ;rjmp UCASRT_TXC прерывание от USART nop ;rjmp ADC прерывание от АЦП nop ;rjmp EE_RDY прерывание от таймера nop ;rjmp ANA_COMP прерывание от компаратора nop ;rjmp TWI прерывание от TWI nop ;rjmp SPM_RDY прерывание не используется .org 20 RESET: nop ;************************************************** ;настройка портов ввода - вывода clr tmp ldi tmp, $00 ; out DDRC, tmp out PORTC, tmp ;обнулить порт C clr tmp ldi tmp, $C3 ;PD0-1 6-7 -выход out DDRD, tmp clr tmp out PORTD, tmp ;обнулить порт D ;***************************************************** ;Маска прерывания INT0 ldi tmp, $40 ;разрешение прерывание INT0 out GIMSK, tmp ldi tmp, $02 ;режим ;условие прерывания по спадающему уровню на INT0 out MCUCR, tmp ;**************************************************** ;настройка программного стека ldi tmp, low(RAMEND) ;указатель стека out SPL, tmp ;полный стек ldi tmp, high(RAMEND) out SPH, tmp ;**************************************************** clr tmp mov r13, tmp ;чтение DIP переключателей in tmp, PORTD sbis PIND, 3 ;пропустить если не нажат DIP1 rjmp qq0 nop sbis PIND, 4 ;пропустить если не нажат DIP2 rjmp qq2 nop rjmp nStart qq0: nop sbis PIND, 4 ;пропустить если не нажат DIP2 rjmp qq1 nop rjmp Motor qq1: nop rjmp Test qq2: nop rjmp pet ;**************************************************************** ;Начало программы с паузой в 5 секунд pet: nop ;разрешение всех прерываний sei ;Пауза 5 С (4934786,13 mkS). Ход 1 ;запуск таймера Т1 clr F mov r15, F ;реализация прерывания через 5 С ldi tmp3,$05 out TCCR1B,tmp3 ;деление СК/1024 ldi bit, $67 out TCNT1L, bit ldi bit, $69 out TCNT1H, bit ldi tmp3, $06 out TIMSK,tmp3 ;разрешаем прерывания по переполнению от Т1 nop retp: nop clz cpi F, $D2 brne retp mov r15, F nop ;**************************************************** ;Начало программы без паузы в 5 секунд nStart: nop nop sei ;сброс всех значений ;сброс всех значений clr tmp clr tmp2 clr tmp3 nop ; mov tmp, r13 ; cpi tmp, $13 ; brne rrrt1 ; rjmp trm1 ;rrrt1: nop nop ; rcall SS ;trm1: nop rcall onestep ;движение прямо nop rcall zader nop rcall stop ;вход в подпрограмму опроса АЦП1 nop cli ldi adc1, $E2 ;источник питания, ADC2, ldi adc2, $C7 ;одиночное, запуск, 1/128 ;опрос уровня освещенности rcall adcn mov d2, tmp3 ;загрузка старшего разряда ;вход в подпрограмму опроса АЦП2 nop ldi adc1, $E3 ;источник питания, ADC3, ldi adc2, $C7 ;одиночное, запуск, 1/128 ;опрос уровня освещенности rcall adcn mov s2, tmp3 ;загрузка старшего разряда ;вычитаниеи F=D-S nop rcall arifm ;подпрограмма ариметических действий nop ;проверка область значений +-10 ;освещенность местности - день brmi min ;переход по отрицательное nop rjmp vpravo ;переход по больше положительное min: nop cln cls clz cpi s2, $18 nop brlt svlevo nop rjmp pram svlevo: nop cln cls clz rjmp vlevo nop rjmp Start ;********************************************************* ;движение влево vlevo: nop ;переход влево sei nop rcall onevlev nop rcall zader ;подпрограмма задержки nop rcall stop nop rjmp Start ;****************************************************** ;движение вправо vpravo: nop ;переход влево sei nop rcall onevprav nop rcall zader ;подпрограмма задержки nop rcall stop nop rjmp Start ;**************************************************** ;Движение прямо pram: nop sei rcall onestep nop rcall zader ;подпрограмма задержки nop rcall stop nop rjmp Start ;переход в начало программы ;************************************************** Start: nop nop rcall stop ;вход в подпрограмму опроса АЦП1 nop cli ldi adc1, $E2 ;источник питания, ADC2, ldi adc2, $C7 ;одиночное, запуск, 1/128 ;опрос уровня освещенности rcall adcn mov d2, tmp3 ;загрузка старшего разряда ;вход в подпрограмму опроса АЦП2 nop ldi adc1, $E3 ;источник питания, ADC3, ldi adc2, $C7 ;одиночное, запуск, 1/128 ;опрос уровня освещенности rcall adcn mov s2, tmp3 ;загрузка старшего разряда ;вычитаниеи F=D-S nop rcall arifm ;подпрограмма ариметических действий nop ;проверка область значений +-10 ;освещенность местности - день brmi min1 ;переход по отрицательное nop rjmp vlevo1 ;переход по больше положительное min1: nop cln cls clz cpi s2, $18 nop brlt svlevo1 nop rjmp pram1 svlevo1: nop cln cls clz rjmp vpravo1 nop rjmp nStart ;********************************************************* ;движение влево vlevo1: nop ;переход влево sei nop rcall onevlev nop rcall zader ;подпрограмма задержки nop rcall stop nop rjmp nStart ;****************************************************** ;движение вправо vpravo1: nop ;переход влево sei nop rcall onevprav nop rcall zader ;подпрограмма задержки nop rcall stop nop rjmp nStart ;**************************************************** ;Движение прямо pram1: nop sei rcall onestep nop rcall zader ;подпрограмма задержки nop rcall stop nop rjmp nStart ;переход в начало программы ;************************************************** ;Проверка правильного включения двигателей ;1 Левый вперед ;2 Правый вперед ;3 Оба вперед ;4 Оба назад ;5 Левый назад ;6 Правый назад motor: nop ;Запрет прерываний cli clr par ww: nop rcall onevlev nop rcall zader ;подпрограмма задержки nop inc par clz cpi par, $08 ;20 циклов по 100 мС breq asd rjmp ww asd: nop clr par ww2: nop rcall onevprav nop rcall zader ;подпрограмма задержки nop inc par clz cpi par, $08 ;20 циклов по 100 мС breq asd2 rjmp ww2 asd2: nop clr par ww3: nop rcall onestep nop rcall zader ;подпрограмма задержки nop inc par clz cpi par, $08 ;20 циклов по 100 мС breq asd3 rjmp ww3 asd3: nop clr par ww4: nop rcall zadstep nop rcall zader ;подпрограмма задержки nop inc par clz cpi par, $08 ;20 циклов по 100 мС breq asd4 rjmp ww4 asd4: nop clr par ww5: nop rcall zadleft nop rcall zader ;подпрограмма задержки nop inc par clz cpi par, $08 ;20 циклов по 100 мС breq asd5 rjmp ww5 asd5: nop clr par ww6: nop rcall zadright nop rcall zader ;подпрограмма задержки nop inc par clz cpi par, $08 ;20 циклов по 100 мС breq asd6 rjmp ww6 asd6: nop rjmp motor ;*********************************************** ;Тест программа с учетом датчиков test: nop ;разрешение всех прерываний ; sei nop ; mov tmp, r13 ; cpi tmp, $13 ; brne rrrt ; rjmp trm ;rrrt: nop nop rcall datch ; rcall SS ;trm: nop nop wdr rjmp test ;*************************************** ;SS: nop ;реализация прерывания через 10 mС ; ldi tmp3,$04 ; out TCCR1B,tmp3 ;деление СК/256 ; ldi bit, $FE ; out TCNT1L, bit ; ldi bit, $8E ; out TCNT1H, bit ; ldi tmp3, $06 ; out TIMSK,tmp3 ;разрешаем прерывания по переполнению от Т1 ; nop ; ldi tmp, $13 ; mov r13, tmp ; ret ;*************************************** ;Подпрограмма проверки датчиков периметра datch: nop cli ;сброс всех значений clr tmp clr tmp1 clr tmp2 clr tmp3 ;вход в подпрограмму опроса АЦП1 nop ldi adc1, $E0 ;источник питания, ADC0 перед лево ldi adc2, $C7 ;одиночное, запуск, 1/128 ;опрос уровня rcall adcn clr r27 ldi r26, $61 ;запись в ОЗУ старший байт st x, tmp3 ;вход в подпрограмму опроса АЦП2 nop ldi adc1, $E1 ;источник питания, ADC1 перед право ldi adc2, $C7 ;одиночное, запуск, 1/128 ;опрос уровня rcall adcn clr r27 ldi r26, $62 ;запись в ОЗУ старший байт st x, tmp3 ;вход в подпрограмму опроса АЦП3 nop ldi adc1, $E4 ;источник питания, ADC4 задний правый ldi adc2, $C7 ;одиночное, запуск, 1/128 ;опрос уровня rcall adcn clr r27 ldi r26, $63 ;запись в ОЗУ старший байт st x, tmp3 ;вход в подпрограмму опроса АЦП4 nop ldi adc1, $E5 ;источник питания, ADC5 задний левый ldi adc2, $C7 ;одиночное, запуск, 1/128 ;опрос уровня rcall adcn clr r27 ldi r26, $64 ;запись в ОЗУ старший байт st x, tmp3 nop ;анализ полученных данных АЦП clr r27 ldi r26, $61 ld tmp, x clc ror tmp cln cls clz subi tmp, $18 ;вычесть 200 единиц nop brpl redf rjmp kzadlev redf: nop clr r27 ldi r26, $62 ld tmp, x clc ror tmp cln cls clz subi tmp, $1C ;вычесть 200 единиц nop brpl redf2 rjmp kzadprv redf2: nop clr r27 ldi r26, $63 ld tmp, x clc ror tmp cln cls clz subi tmp, $1C ;вычесть 200 единиц nop brpl redf3 rjmp klev redf3: nop clr r27 ldi r26, $64 ld tmp, x clc ror tmp cln cls clz subi tmp, $1F ;вычесть 200 единиц nop brpl redf4 rjmp kpr redf4: nop rjmp wex ;окончание неравенств переменных klev: nop clr r27 ldi r26, $64 ld tmp, x clc ror tmp cln cls clz subi tmp, $1F ;вычесть 200 единиц nop brpl spra rjmp kpr spra: nop rcall onevlev nop rcall zader1 nop rcall zader1 nop rcall stop nop rjmp wex kprv: nop rcall onevprav nop rcall zader1 nop rcall zader1 nop rcall stop nop rjmp wex kpr: nop rcall onestep nop rcall zader1 nop rcall zader1 nop rcall zader1 nop rcall stop nop rjmp wex kzad: nop rcall zadstep nop rcall zader1 nop rcall zader1 nop rcall stop nop rjmp wex nop kzadprv: nop kzadlev: nop rcall zadstep nop rcall zader1 nop nop rcall zader1 nop rcall zader1 nop nop rcall stop nop wex: nop sei ret nop ret ;**************************************** ;Прерыание по INT0 EXT_INT0: nop ;подпрограмма проверки контактов nop ; rcall SS nop clr tmp3 in tmp3, $1B nop ldi tmp, $0C and tmp3, tmp ;проверка контактов 00001100 nop clz cpi tmp3, $04 ;проверка S1 breq vper1 nop clz cpi tmp3, $08 ;проверка S2 breq nazad nop clz cpi tmp3, $0C ;проверка S1S2 breq stopic nop vper1: nop rcall onestep nop rcall zader nop rjmp qlo nazad: nop rcall zadstep nop rcall zader nop rjmp qlo stopic: nop rcall stop qlo: nop reti ;**************************************************** ;Подпрограмма обработки прерывания таймера 1 TIMER1_OVF: nop nop rcall datch nop clr tmp mov r13, tmp nop nop ; rcall SS nop reti ;***************************************************** ;Подпрограмма АЦП обработки данных ;Настройка АЦП adcn: nop nop clr tmp awe: nop cpi tmp, $04 brsh ass out ADMUX, adc1 ;коммутация входов АЦП clr tmp2 clr tmp3 out ADCSR, adc2 ;запуск АЦП на преобразование ;Сохранение данных АЦП 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 ;****************************************** ;Подпрограмма вычитания одно байтного числа arifm: nop ;проверка на ноль старшего байта clc ror d2 nop ror s2 nop cln cls clz cpi d2, 0 brne loki subi d2, $20 nop sub d2, S2 ;Вычитание старшего байта с заемом loki: nop ret ;**************************************** ;Подпрограмма задержки включения на 100 мС zader: nop nop wdr clr tmp clr Ma clr Ya ldi Ya, $3A ldi Ma, $2F nop ldi Xa, $3F nop goo: nop nop dm: nop nop rcall datch nop goq: nop mov Xa, tmp2 dv: nop wdr nop dx: nop nop eee: nop inc tmp cln cpi tmp, $1A brlo eee nop clr tmp nop cln dec Ya nop brpl dx cln dec Xa brpl dv clz dec Ma brne dm ret ;********************************************** zader1: nop wdr clr tmp clr Ma clr Ya ldi Ya, $5A ldi Ma, $4F nop ldi Xa, $7F dm1: nop nop dv1: nop wdr nop dx1: nop nop eee1: nop inc tmp cln cpi tmp, $CA brlo eee1 nop clr tmp nop cln dec Ya nop brpl dx1 cln dec Xa brpl dv1 clz dec Ma brne dm1 ret ;********************************************** onevlev: nop clr tmp ldi tmp, $01 out PORTD, tmp ;обнулить порт D ret onevprav: nop clr tmp ldi tmp, $40 out PORTD, tmp ;обнулить порт D ret onestep: nop clr tmp ldi tmp, $41 out PORTD, tmp ;обнулить порт D ret stop: nop clr tmp out PORTD, tmp ;обнулить порт D ret zadstep: nop clr tmp ldi tmp, $82 out PORTD, tmp ;обнулить порт D ret zadleft: nop clr tmp ldi tmp, $02 out PORTD, tmp ;обнулить порт D ret zadright: nop clr tmp ldi tmp, $80 out PORTD, tmp ;обнулить порт D ret ;************************************************ ;Подпрограмма задержки включения на 20 мС zader20ms: nop wdr clr tmp clr Ma clr Ya ldi Ya, $0A sub Ya, prg1 ldi Ma, $21 sub Ma, prg1 ldi Xa, $2C sub Xa, prg1 dm4: nop nop dv4: nop wdr nop dx4: nop nop eee4: nop inc tmp cln cpi tmp, $0A brlo eee4 nop clr tmp nop cln dec Ya nop brpl dx4 cln dec Xa brpl dv4 clz dec Ma brne dm4 ret ;в случае проскока nop rjmp RESET