12f675 ile HC-SR04 ULTRASONİC MESAFE SENSÖRÜ KULLANIMI

Başlatan muyat, 09 Mayıs 2020, 18:24:25

muyat

Bu sensörü kullanarak  sensörün önüne 1metre mesafede bir cisim yaklaştıgı zaman picin bir pinindeki led yansın istiyorum.
Konuyla ilgli farklı bir işlemciyle yapılmış şöyle bir örnek buldugum ama hesaplamaları nasıl yapıcaz?Lcd kullanamayacagım için 12f675 seçtim.

@ DEVICE PIC16F873A, HS_OSC 'Xtal OSC
@ DEVICE PIC16F873A, WDT_OFF 'WDT off
@ DEVICE PIC16F873A, PWRT_ON 'Power-up timer on
@ DEVICE PIC16F873A, BOD_OFF 'Brown-out detect off

ADCON1 = %00000110 'All PORTA digital

define osc 4

TRISA = %00000010
TRISB = %00000000
PORTB = %00000000

w var word
r var word
a var word

tr var PORTA.0 'Trig pin
ec var PORTA.1 'Echo pin

PORTB = %11111111 'Flash LED on PORTB
pause 500 'to check PIC running
PORTB = %00000000

w = 0
low tr

Main :
high tr
pauseus 10
low tr
pulsin ec,1,w
r = w/58
if r < 10 then
PORTB = %11111111
else
PORTB = %00000000
endif
pause 200
goto main
end

ete

Aşağıdaki linki incele biraz gerekli her türlü bilgi mevcut orada.
Bulduğun programda ufak tefek kusurlar var. Linkteki açıklamalardan ve programdan yararlanmanı tavsiye ederim. Yada bulduğun programı oradaki açıklamalara göre düzelt öyle kullan.
Hesaplama meselasine gelince,
Sensör mesafeye göre pusl uzunluğu vermektedir. Max 400 cm' e kadar doğru çalışmaktadır.
400 cm için aşağıdaki komut sonunda W değeri 23200 olarak okunmalıdır. Ancak komutun özelliği nedeni ile w değeri 2320 olarak okunur. Bunu birde 10 ile çarpman gerekecek.

pulsin ec,1,w
r = w*10/58
Programda Şayet r değeri 100 ise led yansın demen gerekiyor.
Ama bana kalırsa oraya aralık vermen daha doğru olur. Ard arda okumaların hepsi 100 sonucunu vermeyecektir. Şöyle yapsan daha uygun olur.
IF r>99 and R<105 then Led=1

https://etepic.com/index.php/topic,4459.0.html

Ete


alisumer

yeni bir çalışmamı paylaşmak isterim hc sr mesafe hesaplama konusunda daha hassas bir yöntem prot b değişiklik kesmesi + timer1 kullanıyorum. kesme modifiyesi uyguladığımdan pasic ASM karması kullanıyorum basic i sadece hesaplamalarda ve seri haberleşmede kullanıyorum.hesaplama kısmı sorunsuz kullanılabilir herkesçe.
'****************************************************************
'*  Name    : hc-sr04.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2022 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                              *
'*  Date    : 15.01.2022                                        *
'*  Version : 1.0                                              *
'*  Notes  :                                                  *
'*          :                                                  *
'****************************************************************
 ASM
  LIST P = PIC16F628A  
  INCLUDE "p16f628a.inc"
    __CONFIG  0X2130;_WDTE_OFF &_PWRTE_ON &_MCLRE_ON &_CP_OFF&_CPD_OFF &_BOREN_OFF &_CP_ON &_LVP_OFF&_ER_OSC_NOCLKOUT &_MCLRE_ON


 
 ENDASM

 ON INTERRUPT GOTO KESME
 ASM

 BANKSEL TXSTA  
 MOVLW  0X24        ;DEFINE HSER_RCSTA 90h
 MOVWF  TXSTA        ;DEFINE HSER_TXSTA 20h
 MOVLW  0X19        ;DEFINE HSER_BAUD 2400
 BANKSEL RCSTA      ;DEFINE HSER_SPBRG 25h
 MOVLW 0X90
 MOVWF RCSTA 
 BANKSEL PORTA      
 ENDASM
 
 W VAR WORD
 D VAR WORD
 T VAR WORD
 W1 VAR WORD
 W2 VAR WORD
 W3 VAR WORD
 TMP0 VAR BYTE
 TMP1 VAR BYTE
 TMP2 VAR BYTE
 AYAR:
 TRISA= %00000000
 TRISB= %10000000
 PORTB=0
 PORTA=0
 CMCON=7
 OPTION_REG=%11000000
 INTCON=%10001000
 T1CON = 00000001
 PCON = $0B
 W = 0
 D= 0
 T=0


 BASLA:                                              ;ses hızı 340 olarak alındı
                                               ;okumanın daha yükesek değerlere çıkması için div32 kullanıldım
 ASM                                    ;200 e  bölerek gidiş dönüş yolunu ikiye bölmüş oluyorum mesafe çıkıyor
 CALL MOLA      ;PAUSE 200                 ;w3 ü servonun cm cinsinden okunan değere göre hareketi sağlanıyor 
                                               ;w2 ise mm cinsinden ölçümü virgülden sonrası için kaydediyor
                                         ;servo kontrolunu mm cinsinden de sağlayabilirsiniz 10 okuma 
                                        ;ortalaması ile gayet stabil milimetre hareketleri olkuyabiliyor servo
 ENDASM 

 W = (T*340)                              
 W1= DIV32 200                              
 D= W1/100                                
 W3 = D*10                                
 W2=((W1 DIG 2*100) + (W1 DIG 1 *10)  +W1 DIG 0)  
 hSEROUT [ "ZAMAN ","=" ,dec t,"      us","      MESAFE =",DEC D,",",DEC W2 ,"    cm",10 ] 
 
 ASM
      CALL MOLA
 ENDASM
asm
      ;BCF PORTA ,0
      BANKSEL PORTA ;GOTO BEKLE
      CLRF    PIR1
      BCF PORTA ,0
      CALL BEKLE
      BSF PORTA ,0
      CALL BEKLE
      BCF PORTA ,0
      GOTO _BASLA
BEKLE                        
            movlw      .4
            movwf      _TMP0
            decfsz      _TMP0,F
            goto        $-1
            nop
            nop
            RETURN

 endasm
 KESME:
 ASM
 ;BANKSEL PORTB
 BCF        INTCON ,7
; BCF        PORTA ,1
 CLRF      TMR1H
 CLRF      TMR1L
 BTFSC      PORTB ,7            
 GOTO      $-1
 MOVFW      TMR1L 
 MOVWF      _T
 MOVFW      TMR1H 
 MOVWF      _T+1
 BSF        PORTA ,1
 CALL        _PLS
 BCF        PORTA ,1          
 ;CLRF TMR1L
 ;CLRF TMR1H
 BCF INTCON ,0
 RETFIE

 ENDASM
    ASM
MOLA
    MOVLW    .255
    MOVWF    _TMP0
    MOVLW    .100                                                                                                                          
    MOVWF    _TMP1
    DECFSZ    _TMP0 ,F
    GOTO      $-1
    DECFSZ    _TMP1 ,F
    GOTO      $-3
    RETURN
;PLS
;    MOVF      _T ,W
;    MOVWF    _TMP0
;    RRF      _TMP0
;    MOVF      _T+1  ,W
;    MOVWF    _TMP1
;    INCF      _TMP1 ,F
;    DECFSZ    _TMP0,F
;    GOTO      $-1
;    DECFSZ    _TMP1
;    GOTO      $-3
;    RETURN 
 ENDASM
PLS: 
PAUSEUS 1000+W3;w2
RETURN
 END 
 

Hep meraktan

alisumer

 W = (T*340)                             
 W1= DIV32 200                             
 D= W1/100                               
 W3 = D*10                               
 W2=((W1 DIG 2*100) + (W1 DIG 1 *10)  +W1 DIG 0)

donanımın datasında belirtilen /58 kullanmak yerine okunan rakamı olabildiğince yükseltip bütün basamakları ve küsüratları okma imkanımız oluyor kod içerisinde elimden geldiğince açıklamaya çalıştım ayrıca resimde okunan time değeri ve mesafe değeri fiziki denemede de tam ölçüm vermiştir.
NOT: işlemci 4 mhz de çalışıyor kristal değeri timer değerini değiştirir hesaplamalar 4 mhz ye göre yapılmştır.
Hep meraktan

alisumer

#4

deneme videosu elimden geldiğince anlatmaya çalıştım
Hep meraktan

Powered by EzPortal