Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Aleksey75 23 июня 2005 г. 15:34
В ответ на: Да, конечно, покажите. отправлено Bill 23 июня 2005 г. 15:33

.include "c:\avr\MYTILT\m8def.inc"
.def tmp=r16
.def x=r17
.def y=r18
.def xlo=r19
.def xhi=r20
.def ylo=r21
.def yhi=r22
.def k=r23
.equ xin=PD0
.equ yin=PD1
.equ offin=PD2
.equ blok=PD3
.cseg ;начало программы
.org 0 ;определение размещения кода
rjmp RESET
nop ;rjmp EXT_INT0
nop ;rjmp EXT_INT1
nop ;rjmp TIM_CAPT1
nop ;rjip TIM_COMP1
nop ;rjip TIM_OVF1
nop ;rjip TIM_OVF0
nop ;rjip UART_RXC
nop ;rjip UART_DRE
nop ;rjip UART_TXC
nop ;rjip ANA_COMPldi tmp,low(RAMEND) ;загрузить low(RAMEND) в tmp
RESET: ldi tmp,low(RAMEND) ;определение начала
out spl,tmp ;определить расположение стека
clr tmp
ldi tmp,0x08 ;00001000
out DDRD.tmp ;указать направление портов
ldi tmp,0xff ;загрузить в tmp 11111111
out PORTD,tmp ;на всех ногах 1
out PIND,tmp ;!!!!!!!!!!!!!!!!!!!
;=====================================================================================
;Подсчёт длительности импульсов
;=====================================================================================
Schet: ;метка проверки импульсов
rcall off
clr TCNT0 ;очистить таймер 0
s: ldi tmp,0x02 ;
sbrs PIND,0 ;проруск rcall пока не появиться 1 на Xin
rjmp s ;перейти к s
out TCCR0,tmp ;запустить таймер 0
r: ldi tmp,0x00 ;tmp=00000000
sbrc PIND.0 ;проруск rcall пока не появиться 0 на Xin
rjmp r ;перейти к r
out TCCR0,tmp ;Остановить таймер
mov x,TCNT0 ;Скопировать значение таймера в X
clr TCNT0 ;очистить таймер 0
s1: ldi tmp,0x02 ;
sbrs PIND,1 ;проруск rcall пока не появиться 1 на Yin
rjmp s1 ;перейти к s
out TCCR0,tmp ;запустить таймер 0
r1: ldi tmp,0x00 ;tmp=00000000
sbrc PIND.1 ;проруск rcall пока не появиться 0 на yin
rjmp r1 ;перейти к r
out TCCR0,tmp ;Остановить таймер
mov y,TCNT0 ;Скопировать значение таймера в y
;=====================================================================================
;Чуствительность
;=====================================================================================
rcall off
kalib: ld tmp,x ;загрузить в tmp x
add tmp,k ;сложить tmp и k
mov xhi,tmp ;cохранить xhi
ld tmp,x ;загрузить в tmp x
sub tmp,k ;Вычесть tmp и k
mov xlo,tmp ;cохранить xlo
ld tmp,y ;загрузить в tmp y
add tmp,k ;сложить tmp и k
mov yhi,tmp ;cохранить yhi
ld tmp,y ;загрузить в tmp y
sub temp,k ;Вычесть tmp и k
mov ylo,tmp ;cохранить ylo
;=====================================================================================
;Подсчёт длительности импульсов
;=====================================================================================
alarm: ;метка проверки импульсов
rcall off
clr tcnt0 ;очистить таймер 0
ldi tmp,0x02
s2: sbrs PIND,0 ;проруск rcall пока не появиться 1 на Xin
rjmp s2 ;перейти к s
out TCCR0,tmp ;запустить таймер 0
r2: ldi tmp,0x00 ;tmp=00000000
sbrc PIND.0 ;проруск rcall пока не появиться 0 на Xin
rjmp r2 ;перейти к r
out TCCR0,tmp ;Остановить таймер
mov x,tcnt0 ;Скопировать значение таймера в X
clr TCNT0 ;очистить таймер 0
s3: ldi tmp,0x02 ;
sbrs PIND,1 ;проруск rcall пока не появиться 1 на Yin
rjmp s3 ;перейти к s
out TCCR0,tmp ;запустить таймер 0
r3: ldi tmp,0x00 ;tmp=00000000
sbrc PIND.1 ;проруск rcall пока не появиться 0 на Yin
rjmp r3 ;перейти к r
out TCCR0,tmp ;Остановить таймер
mov y,TCNT0 ;Скопировать значение таймера в y
;=====================================================================================
;Сравнение результатов
;=====================================================================================
rcall off
cp x,xhi ;Сравнить x с xhi
brsh ignblok ;пропуск если Xhi=>X
cp xlo,x ;Сравнить xlo с x
brsh ignblok ;пропуск если x=>xlo
cp y,yhi ;Сравнить y с yhi
brsh ignblok ;пропуск если Xhi=>X
cp ylo,y ;Сравнить ylo с y
brsh ignblok ;пропуск если y=>ylo
rjmp alarm
;=====================================================================================
;блокировка
;=====================================================================================
ignblok:
cbi PORTD,3 ;вывести в blok 0
rcall d500ms
rcall d500ms
rcall d500ms
rcall d500ms
sbi PORTD,3 ;вывести в blok 1
ret
;=====================================================================================
;отключение устройства
;=====================================================================================
off:
sbrc PIND.2 ;проруск ret пока не появиться 0 на Xin
ret
ldi tmp,0x30 ;загрузить в tmp = 00110000
out MCUCR,tmp
sleep
nop
;=============================================
;Подпрограмма задержки 05 мс
;=============================================
d05ms:
ldi YL,low(497) ;Загрузка в YH:YL константы 497
ldi YH,high(497)
d05_1: sbiw YL,1 ;вычитание из YH:YL еденицы
brne d05_1 ;Если результат вычитания не равен 0 перейти на d05_1
ret ;возврат из подпрограммы
;=============================================
;Подпрограмма задержки 1000 мс
;=============================================
d500ms:
ldi YL,low(1000) ;Загрузка в YH:YL константы 497
ldi YH,high(1000)
d500_1: rcall d05ms
sbiw YL,1 ;вычитание из YH:YL еденицы
brne d500_1 ;Если результат вычитания не равен 0 перейти на d05_1
ret ;возврат из подпрограммы

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru