Алгоритм работы выбрал следующий: прерывания ловят изменения уровня на ноге еслт появился высокий уровень, то очишаем счетчик микросекунд. Появился низкий- копируем счетчик микросекунд в регистр для вывода.
Все вро-де просто, но почему-то не работает.
Atmega16, assembler, датчик расстояния HC-SR0
Частоты МК-2мГц.
Все вро-де просто, но почему-то не работает.
Atmega16, assembler, датчик расстояния HC-SR0
Частоты МК-2мГц.
Код: Выделить всё
.include "m16def.inc"
.list
.def tri = r1 ; TimerInterruptRegister (m? ikke bruges af andre!)
.def disp = r16 ; display on LEDS
.def tmp1 = r17 ; tmp1 reg
.def count = r18
.def dan=r19
.equ echo_dat = PORTD
.equ echo_ddr =DDRD
.equ echo_pin=PIND
.equ echo=0;
.equ triq=1;
.cseg ; codesegment
.org 0
rjmp RESET
; interrupt-vector commands,
; ***** INTERRUPT VECTORS ************************************************
.org INT0addr ; = 0x0002 External Interrupt Request 0
jmp INT1;
.org INT1addr ; = 0x0004 External Interrupt Request 1
ret;
.org OC2addr ; = 0x0006 Timer/Counter2 Compare Match
ret
.org OVF2addr ; = 0x0008 Timer/Counter2 Overflow
ret
.org ICP1addr ; = 0x000a Timer/Counter1 Capture Event
ret
.org OC1Aaddr ; = 0x000c Timer/Counter1 Compare Match A
ret
.org OC1Baddr ; = 0x000e Timer/Counter1 Compare Match B
ret
.org OVF1addr ; = 0x0010 Timer/Counter1 Overflow
ret
.org OVF0addr ; = 0x0012 Timer/Counter0 Overflow
ret; jump here on Timer/Counter0 Overflow
.org SPIaddr ; = 0x0014 Serial Transfer Complete
ret
.org URXCaddr ; = 0x0016 USART, Rx Complete
ret
.org UDREaddr ; = 0x0018 USART Data Register Empty
ret
.org UTXCaddr ; = 0x001a USART, Tx Complete
ret
.org ADCCaddr ; = 0x001c ADC Conversion Complete
ret
.org ERDYaddr ; = 0x001e EEPROM Ready
ret
.org ACIaddr ; = 0x0020 Analog Comparator
ret
.org TWIaddr ; = 0x0022 2-wire Serial Interface
ret
.org INT2addr ; = 0x0024 External Interrupt Request 2
ret
.org OC0addr ; = 0x0026 Timer/Counter0 Compare Match
ret
.org SPMRaddr ; = 0x0028 Store Program Memory Ready
ret
.org INT_VECTORS_SIZE ; int table f?rdig
INTR1:
sbic echo_dat,echo ;смотрим сигнал на входе, если высокий очищаем считчик
clr disp;
sbis echo_dat,echo; если сменился на низкий, то сохранием данные
mov dan,disp
reti
INTR2:
reti
RESET:
ldi R17,LOW(RAMEND) ;Initiate Stackpointer (for subroutines/interupts)
out SPL,R17
ldi R17,HIGH(RAMEND)
out SPH,R17
ldi R17,0b00000100 ;любое изменение на INT0
out MCUCR,R17
ldi R17,0b11000000
out GICR,R17
ldi r17,0b00000001
out echo_ddr,r17;
sei;
jmp main;
main:
sbi echo_dat,triq ;высокий уровень на 10 мкс
ldi R17, $06
WGLOOP0: dec R17
brne WGLOOP0
; -----------------------------
; delaying 2 cycles:
nop
nop
; ===========
cbi echo_dat,triq
jmp main2
main2:
out portb,r19
ldi R17, $05
WGLOOP1: dec R17
brne WGLOOP1
; -----------------------------
; delaying 1 cycle:
nop
inc disp;+1 каждые 8 микросекунд
jmp main2