HC-SR04 avr asm

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вт апр 09, 2013 20:43:04

Сообщение triest »

Алгоритм работы выбрал следующий: прерывания ловят изменения уровня на ноге еслт появился высокий уровень, то очишаем счетчик микросекунд. Появился низкий- копируем счетчик микросекунд в регистр для вывода.
Все вро-де просто, но почему-то не работает.
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


 
Реклама
Ответить

Вернуться в «Периферия»