Измерение пройденного пути
СхемаРасчет
Текст программы микроконтроллера
.include "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.cseg
.org 0
.def tmp = r16 ;временный регистр
.def t1 = r17 ;1 разряд индикатора (VT3)
.def t2 = r18 ;2 разряд индикатора (VT2)
.def t3 = r19 ;3 разряд индикатора (VT1)
.def tmp2 = r20 ;сдвиговая последовательность
.def tm = r21 ;число для текущего разряда
rjmp RESET
RESET: ldi tmp,HIGH(RAMEND) ;определение начала стека
out SPH,tmp ;в ОЗУ
ldi tmp,LOW(RAMEND)
out SPL,tmp
ser tmp ;установить tmp (= $ff)
out DDRA,tmp ;линии порта A - выходы на индикатор
out DDRC,tmp ;линии порта C - выходы на транзисторы
ldi tmp,15 ;инициализация сторожевого таймера:
out WDTCR,tmp ;при отсутствии команды сброса (wdr)
;в течение 2 с произойдет переход на
;прерывание RESET
clr tmp ;очистить регистр tmp (= 0)
out DDRD,tmp ;линии порта D - входы
out PORTA,tmp ;очистить индикатор
out PORTC,tmp
;начальные значения регистров
ldi YL,low(637) ;загрузка в YH:YL константы 637
ldi YH,high(637) ;637 оборотов = 1 км
ldi tmp2,0b00010000 ;регистр tmp2 = 00010000
clr tm ;очистить регистр tm (= 0)
clr t1 ;очистить регистр t1 (= 0)
clr t2 ;очистить регистр t2 (= 0)
clr t3 ;очистить регистр t3 (= 0)
;=====================================================
;управление разрядами индикатора
;=====================================================
Start: wdr ;сброс сторожевого таймера
rcall ind ;вывод на индикатор tm
lsl tmp2 ;сдвиг tmp2 влево
out PORTC,tmp2 ;вывод на транзистор
sbrc tmp2,7 ;если в регистре tmp2 7 бит = 1
ldi tmp2,0b00010000 ;то tmp2 = 00010000
rcall timer1 ;счетчик оборотов колеса
cpi tmp2,0b00100000 ;если транзистор VT3 открыт
breq m1 ;то перейти на метку m1
cpi tmp2,0b01000000 ;если транзистор VT2 открыт
breq m2 ;то перейти на метку m2
cpi tmp2,0b10000000 ;если транзистор VT1 открыт
breq m3 ;то перейти на метку m3
m1: mov tm,t1 ;копировать t1 в tm
rjmp Start ;на метку Start
m2: mov tm,t2 ;копировать t2 в tm
rjmp Start ;на метку Start
m3: mov tm,t3 ;копировать t3 в tm
rjmp Start ;переход на метку Start
;=====================================================
;счетчик сигналов от геркона
;=====================================================
timer1:
cpi YH,0 ;проверка регистра YH
breq next1 ;если YH=0 перейти на метку next1
;т.е. пройден 1 км
sbis PIND,PD7 ;если в регистре PIND 7 бит = 0
sbiw YL,1 ;YL=YL-1 (-1 оборот)
rjmp ex2 ;переход на метку ex2
next1:
ldi YL,low(637) ;загрузка в YH:YL константы 637
ldi YH,high(637) ;637 оборотов = 1 км
inc t1 ;t1=t1+1 (+1 км)
cpi t1,10 ;если t1<>10
brne w1 ;то перейти на метку w1
clr t1 ;очистить регистр t1 (= 0)
inc t2 ;t2=t2+1
w1: cpi t2,10 ;если t2<>10
brne w2 ;то перейти на метку w2
clr t2 ;очистить регистр t2 (= 0)
inc t3 ;t3=t3+1
w2: cpi t3,10 ;если t3<>10
brne ex2 ;то перейти на метку next2
clr t1 ;очистить регистр t1 (= 0)
clr t2 ;очистить регистр t2 (= 0)
clr t3 ;очистить регистр t3 (= 0)
ex2:
ret ;возврат из подпрограммы
;=====================================================
;подпрограмма вывода числа на текущий разряд индикатора
;=====================================================
ind:
cpi tm,0 ;сравнение tm c 0
breq x0 ;если tm = 0 то перейти на метку x0
cpi tm,1 ;сравнение tm c 1
breq x1 ;если tm = 1 то перейти на метку x1
cpi tm,2 ;сравнение tm c 2
breq x2 ;если tm = 2 то перейти на метку x2
cpi tm,3 ;сравнение tm c 3
breq x3 ;если tm = 3 то перейти на метку x3
cpi tm,4 ;сравнение tm c 4
breq x4 ;если tm = 4 то перейти на метку x4
cpi tm,5 ;сравнение tm c 5
breq x5 ;если tm = 5 то перейти на метку x5
cpi tm,6 ;сравнение tm c 6
breq x6 ;если tm = 6 то перейти на метку x6
cpi tm,7
breq x7
cpi tm,8
breq x8
cpi tm,9
breq x9
x0: ldi tmp,0b10111011 ;загрузить код 0 в tmp
out PORTA,tmp ;вывести tmp на индикатор
rjmp ex ;переход на метку ex
x1: ldi tmp,0b10000010 ;загрузить код 1
out PORTA,tmp ;вывести 1
rjmp ex ;переход на метку ex
x2: ldi tmp,0b00111110 ;загрузить код 2
out PORTA,tmp ;вывести 2
rjmp ex ;переход на метку ex
x3: ldi tmp,0b10101110 ;загрузить код 3
out PORTA,tmp ;вывести 3
rjmp ex ;переход на метку ex
x4: ldi tmp,0b10000111 ;загрузить код 4
out PORTA,tmp ;вывести 4
rjmp ex ;переход на метку ex
x5: ldi tmp,0b10101101 ;загрузить код 5
out PORTA,tmp ;вывести 5
rjmp ex ;переход на метку ex
x6: ldi tmp,0b10111101 ;загрузить код 6
out PORTA,tmp ;вывести 6
rjmp ex ;переход на метку ex
x7: ldi tmp,0b10100010 ;загрузить код 7
out PORTA,tmp ;вывести 7
rjmp ex ;переход на метку ex
x8: ldi tmp,0b10111111 ;загрузить код 8
out PORTA,tmp ;вывести 8
rjmp ex ;переход на метку ex
x9: ldi tmp,0b10101111 ;загрузить код 9
out PORTA,tmp ;вывести 9
ex:
ret ;возврат из подпрограммы
Скачать файлы проекта для AVR Studio 4 (6,77 КБ)