Измерение пройденного пути

Схема

Расчет

 
Текст программы микроконтроллера
 
.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 КБ)