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

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

Отправлено Aleksey75 30 июня 2005 г. 15:04
В ответ на: Давай сюда ВЕСЬ исходник. В начале напиши <pre>, затем copy-paste, в конце - </pre> отправлено =AVR= 30 июня 2005 г. 15:02


.include "c:\avr\m8def.inc"
.def tmp=r16
.def xo=r17
.def yo=r18
.def xlo=r19
.def xhi=r20
.def ylo=r21
.def yhi=r22
.def ko=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 ;на всех ногах D = 1
out PIND,tmp ;!!!!!!!!!!!!!!!!!!!
;=====================================================================================
;Подсчёт длительности импульсов
;=====================================================================================
ldi ko,0x02
Schet: ;метка проверки импульсов
rcall off
ldi tmp,0x00
out TCNT0,tmp ;очистить таймер 0
s: ldi tmp,0x02 ;
sbis PIND,0 ;проруск rcall пока не появиться 1 на Xin
rjmp s ;перейти к s
out TCCR0,tmp ;запустить таймер 0
r: ldi tmp,0x00 ;tmp=00000000
sbic PIND,0 ;проруск rcall пока не появиться 0 на Xin
rjmp r ;перейти к r
out TCCR0,tmp ;Остановить таймер
ldi xo,TCNT0 ;Скопировать значение таймера в X
ldi tmp,0x00
out TCNT0,tmp ;очистить таймер 0
s1: ldi tmp,0x02 ;
sbis PIND,1 ;проруск rcall пока не появиться 1 на Yin
rjmp s1 ;перейти к s
out TCCR0,tmp ;запустить таймер 0
r1: ldi tmp,0x00 ;tmp=00000000
sbic PIND,1 ;проруск rcall пока не появиться 0 на yin
rjmp r1 ;перейти к r
out TCCR0,tmp ;Остановить таймер
ldi yo,TCNT0 ;Скопировать значение таймера в y
;=====================================================================================
;Чуствительность
;=====================================================================================
rcall off
kalib: mov tmp,xo ;загрузить в tmp x
add tmp,ko ;сложить tmp и k
mov xhi,tmp ;cохранить xhi
mov tmp,xo ;загрузить в tmp x
sub tmp,ko ;Вычесть tmp и k
mov xlo,tmp ;cохранить xlo
mov tmp,yo ;загрузить в tmp y
add tmp,ko ;сложить tmp и k
mov yhi,tmp ;cохранить yhi
mov tmp,yo ;загрузить в tmp y
sub tmp,yo ;Вычесть tmp и k
mov ylo,tmp ;cохранить ylo
;=====================================================================================
;Подсчёт длительности импульсов
;=====================================================================================
main: ;метка проверки импульсов
rcall off
ldi tmp,0x00
out tcnt0,tmp ;очистить таймер 0
ldi tmp,0x02
s2: sbis PIND,0 ;проруск rcall пока не появиться 1 на Xin
rjmp s2 ;перейти к s
out TCCR0,tmp ;запустить таймер 0
r2: ldi tmp,0x00 ;tmp=00000000
sbic PIND,0 ;проруск rcall пока не появиться 0 на Xin
rjmp r2 ;перейти к r
out TCCR0,tmp ;Остановить таймер
ldi xo,TCNT0 ;Скопировать значение таймера в X
ldi tmp,0x00
out TCNT0,tmp ;очистить таймер 0
s3: ldi tmp,0x02 ;
sbis PIND,1 ;проруск rcall пока не появиться 1 на Yin
rjmp s3 ;перейти к s
out TCCR0,tmp ;запустить таймер 0
r3: ldi tmp,0x00 ;tmp=00000000
sbic PIND,1 ;проруск rcall пока не появиться 0 на Yin
rjmp r3 ;перейти к r
out TCCR0,tmp ;Остановить таймер
ldi yo,TCNT0 ;Скопировать значение таймера в y
;=====================================================================================
;Сравнение результатов
;=====================================================================================
rcall off
cp xo,xhi ;Сравнить x с xhi
brsh ignblok ;пропуск если Xhi=>X
cp xlo,xo ;Сравнить xlo с x
brsh ignblok ;пропуск если x=>xlo
cp yo,yhi ;Сравнить y с yhi
brsh ignblok ;пропуск если Xhi=>X
cp ylo,yo ;Сравнить ylo с y
brsh ignblok ;пропуск если y=>ylo
rjmp main
;=====================================================================================
;блокировка
;=====================================================================================
ignblok:
cbi PORTD,3 ;вывести в blok 0
rcall d500ms
rcall d500ms
rcall d500ms
rcall d500ms
sbi PORTD,3 ;вывести в blok 1
ret
;=====================================================================================
;отключение устройства
;=====================================================================================
off:
sbic 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