avatar_ete

Lazer mesafe sensörleri

Başlatan ete, 17 Kasım 2025, 14:03:53

ete

Yazdığım program diğer programın bir nevi PBP ya tercimesi aslında. Bu son versiyona kalibrasyon eklemeye çalıştım ama fark lineer olmadığı için kalbrasyonda çalışmıyor.

Ete

#CONFIG
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
  __config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_ON & _LVP_OFF & _BORV_19 & _LVP_OFF 
#ENDCONFIG

'**********PLL ye dikkat ************************
DEFINE OSC 16

OSCCON = %01111000   ' 8MHz internal %0xxxx000 ,xxxx=1111 16Mhz, 1110=8Mhz, 1101=4Mhz, 1100=2 Mhz.

ANSELA=0:TRISA=%00100000:LATA=0:PORTA=0:WPUA=0 'MCLR PİNİ DAİMA GİRİŞ OLARAK AYARLANMALI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ANSELB=0:TRISB=%00000000:LATB=0:PORTB=0:WPUB=0 
MDCON = 0
CM1CON0=0
CM2CON0=0
DACCON0=0
CPSCON0=0
FVRCON=0

	 
BufferArray VAR WORD[12] 
J           VAR Byte
I           VAR BYTE
	 
DatoSensor  VAR BYTE[12] 
Distance    VAR Word	 
	 
Signal      VAR Word
Ambient     var Word
DisRest     VAR Word 
Result      var word
LIMIT       VAR WORD
TOPLAM      VAR WORD
'=======================================================================================
	' Setup the VL53L0x - I2C
'---------------------------------------------------------------------------------------
DEFINE I2C_SLOW 1
'DEFINE I2C_SDA PORTA,0 'Data pin for I2C (12-bit core only) 
'DEFINE I2C_SCL PORTA,1

SYMBOL  HSCL_Pin = PORTB.4 
SYMBOL  HSDA_Pin = PORTB.1 
SYMBOL  LED=PORTB.7
                              
DEFINE LCD_DREG PORTA 'LCD data port 
DEFINE LCD_DBIT 0 'LCD data starting bit 0 or 4 
DEFINE LCD_RSREG PORTA 'LCD register select port 
DEFINE LCD_RSBIT 7 'LCD register select bit 
DEFINE LCD_EREG PORTA 'LCD enable port 
DEFINE LCD_EBIT 6 'LCD enable bit 
DEFINE LCD_BITS 4 'LCD bus size 4 or 8 
DEFINE LCD_LINES 2 'Number lines on LCD 
DEFINE LCD_COMMANDUS 2000 'Command delay time in us 
DEFINE LCD_DATAUS 50 'Data delay time in us 
	 
Symbol W_ADDRESS = $52
Symbol R_ADDRESS = $53	 

lcdout $FE,1
PAUSE 500
do
Loop While OSCSTAT.0 = 0
LIMIT=10
BASLA:
	lcdout $fe,1
	lcdout $fe,$80," VL53L0x - TOF" 
    lcdout $fe,$c0,"  Laser Unit"

	pause 2000
	lcdout $fe,1
	lcdout $fe,$80,"Distance: "

	
	 
	Do
	    GOSUB OLCUM_AL
	    IF RESULT>LIMIT THEN 
          LED=1
        ELSE
          LED=0:PAUSE 500
        ENDIF    
	    Distance =  result
	 
	    lcdout $fe,$8A,Dec Distance," mm  "              ' Print Distance in mm
	 
	    pause 500
	Loop
	 
OLCUM_AL: 'System Range Start 
         TOPLAM=0
         for I= 0 TO 29 
           I2CWRITE HSDA_Pin, HSCL_Pin,W_ADDRESS,[$00,$01]
           PAUSE 5
         
	'Range status
	       I2CWRITE HSDA_PIN, HSCL_PIN, W_ADDRESS,[$14]
           PAUSE 5
	    ' Read The 12 Bit Raw Data Of The VL53L0x Sensor:
	      I2Cread HSDA_PIN, HSCL_PIN, r_ADDRESS,[STR Datosensor\12]	    
	 
	      Result  = DatoSensor[10]*256 + DatoSensor[11]   ' Fill All 12 Elements of the BufferArray With Distance Measurements from VL53L0X
	      TOPLAM=TOPLAM+RESULT
	     NEXT
	     RESULT=TOPLAM/30
'aşağıdaki iki satırı kaldırır yada iptal ederseniz kalibrasyon yapılmayacaktır!!!!!!
	'     toplam=(result*/243)
	'     result=toplam
	     
       return 

ete

Pepe,
Puedo decir que el programa funciona correctamente después de la calibración. Parece que hay un error de 1 mm en distancias cortas, pero no parece haber ningún error en distancias de 50 cm o más.
Gracias.

Arkadaşlar,
Pepe nin son yolladığı program kablisyon işleminden sonra doğru çalışmaktadır.
PORTB.0 pinine bir buton bağlanacak ve sensörün 10cm (100mm) karşı mesafesine bir cisim yerleştirilecektir. İlk açılışta Ekrana Gelen "Press button" ikazına uygun olarak Kalibrasyn butonuna basıp bırakın. Bu aşamadan sonra program 4 tane okuma yapıyor ve bunarı önce toplayıp sonra 4 e bölerek farkı hesaplıyor.Sonra bu değeri 100 den çıkartarak Offset değerini hesaplıyor ve bunu eprom sıfır nolu adrese yazarak sonraki ölçümlerde kullanıyor.

Yapılan ölçümlerde ;
100 mm  ==> 101 mm olarak okundu
500 mm  ==> 500,5 mm olarak okundu
1000mm  ==> 1000 mm olarak okundu.

Ete


ete

#17
Biraz fazla deneme yapınca bazı kusurlar ortaya çıkıyor.
Ölçüm esnasında sensör önünde engel olmaz ise ekranda bir sıfır bir 6545x gibi değer görüyorsunuz. Buda sensörün yeterince iyi okuyamadığını gösteriyor. Yada okuma süresinin yeterli olmadığını. Data sheet'i inceleyince sensörün okuma yapıp registerleri yenileme süresinin 33 ms olduğu görülüyor. Bu nedenle sensöre okuma emri verildikten sonra mutlaka bu süre kadar bekleme yapılması ve ardından register değerlerinin okunması gerekiyor.
Bütün bu olumsuzluklarıda gidermek amacı ile programı PBP ya çevirip yeniden düzenledim.
Bu hali ile daha stabil ve dügün çalışmaktadır.

Ancak bir hususu belirtmekte yarar var. Orjinal program Signed yani işaretli değişkenler kullanıyor ve hesaplamalarda bu işareti kullanıyor. PBP da ise signed değişken olmadığı gibi bu tür hesaplamada bulunmuyor. Ancak bir şekilde bu sorunun üstesinden gelmek mümkün.
Örnek vermek gerekir ise Word tip değişkenin Signed olarak kullanılması durumunda değişkenin alabildiği en yüksek değer 65535/2 =32767 olabiliyor ve bu değer kadar olan sayılar pozitif sayı olarak kabul ediliyor. Bu sayıdan büyükleri ise negatif sayılar kapsamına giriyor. En belirin ayıraç ise bit15 değeri oluyor. Bu bit 1 ise sayı negatif sıfır ise sayı pozitif anlamına geliyor. Bu özelliği kullanarak bende programda işaret olayını ve işlemleri çözmeye çalıştım.
Kusur gören olursa bildirsin lütfen düzeltelim.

Ete

'****************************************************************
'*  Name    : VL53L0X.PBP                                       * 
'*  Author  : [E.T.E]                                           *
'*  Notice  : Copyright (c) 2025                                *
'*          : All Rights Reserved                               *
'*  Date    : 25.11.2025                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
;-------------------------------------------------------------------------------
'    Device = 16F1827
#CONFIG
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_ON & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
  __config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_ON & _LVP_OFF & _BORV_19 & _LVP_OFF 
#ENDCONFIG

DEFINE OSC 16

OSCCON = %01111000   ' 8MHz internal %0xxxx000 ,xxxx=1111 16Mhz, 1110=8Mhz, 1101=4Mhz, 1100=2 Mhz.
Do : Loop While OSCSTAT.0 = 0
ANSELA=0:TRISA=%00100000:LATA=0:PORTA=0:WPUA=0 'MCLR PİNİ DAİMA GİRİŞ OLARAK AYARLANMALI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ANSELB=0:TRISB=%00000011:LATB=0:PORTB=0:WPUB=1 
option_reg.7=0       
MDCON = 0
CM1CON0=0
CM2CON0=0
DACCON0=0
CPSCON0=0
FVRCON=0

DEFINE I2C_SLOW 1 'Use for >8MHz OSC with standard speed devices 
'---------------------------------------------------------------------
DEFINE LCD_DREG PORTA 'LCD data port 
DEFINE LCD_DBIT 0 'LCD data starting bit 0 or 4 
DEFINE LCD_RSREG PORTA 'LCD register select port 
DEFINE LCD_RSBIT 7 'LCD register select bit 
DEFINE LCD_EREG PORTA 'LCD enable port 
DEFINE LCD_EBIT 6 'LCD enable bit 
DEFINE LCD_BITS 4 'LCD bus size 4 or 8 
DEFINE LCD_LINES 2 'Number lines on LCD 
DEFINE LCD_COMMANDUS 2000 'Command delay time in us 
DEFINE LCD_DATAUS 50 'Data delay time in us 
'---------------------------------------------------------------------
Symbol CalBtn=PORTB.0
;------------------------------------------------
    Symbol W_ADDRESS = $52
    Symbol R_ADDRESS = $53
    symbol I2C_SDA=PORTB.1
    symbol I2C_SCL=PORTB.4
;------------------------------------------------
;------------------------------------------------
; Variables
;------------------------------------------------
dist       var Word: dist = $ffff
Distance   var word  'bu signed çalışacak!!!!!!!!!!!!!!!!!!!!!!!!!
tmp        var Word  'buda signed çalışacak!!!!!!!!!!!!!!!!!!!!!!!
DatoSensor var byte[12] 
offset     var Word   'signed çalışacak!!!!!!!!!!!!!!!!!!!!!!!!!!
prom       var Word
dat        var Word
RESULT     VAR WORD
i          var Byte
isaret     var byte


lcdout $fe,1
pause 500

read 0,offset.byte0, offset.byte1
If offset = $FFFF Then offset = 0

lcdout $fe,$80,"VL53L0X + calib "
lcdout $fe,$c0,"  Butona Basın  "
pause 1500
gosub VL53_Init
     
lcdout $fe,1
lcdout $fe,$80,"Dist:"

;====================================================================
Do
    '------------------------------------------
    '    SI SE PRESIONA EL BOTON = CALIBRAR
    '------------------------------------------
    If CalBtn = 0 Then
       GOSUB Kalibre
    Else 
       GOSUB Olcum_Al       
    EndIf
         
    PAUSE  100
Loop
 
;===============================================================================     
Olcum_Al:                       
     '------------------------------------------
     '      LECTURA NORMAL DEL SENSOR
     '------------------------------------------
     GOSUB Sensor_oku
     Distance = prom        
     
     If Distance <> dist Then
        dist =  Distance
        tmp=Distance+offset
        IF TMP=OFFSET THEN TMP=0 
        If tmp > 0 Then 
          Distance = tmp
        Else
          Distance = 0
        EndIf
        LCDOUT $FE,$87,Dec Distance,"mm  "
     EndIf
       
    RETURN
;===============================================================================
Kalibre:
    LCDOUT $FE,1
    LCDOUT $FE,$80,"kalibrasyon icin"
    LCDOUT $FE,$C0,"10cm'e cisim koy"
     
    While CalBtn = 0:WEND
     
    GOSUB Sensor_oku
    offset = 100 - prom
    
    write 0, offset.byte0,offset.byte1:pause 10
    isaret=" "
    IF OFFSET.BIT15=1 THEN isaret="-"
        
    lcdout $fe,1
    lcdout $fe,$80,"OFFSET= ",ISARET,dec ABS(offset)," mm"
    pause 2000
    lcdout $fe,1
    lcdout $fe,$80,"Dist:"
    dist = $ffff
    return
     
;====================================================================
Sensor_oku:
  prom = 0
    For i = 1 To 4
        gosub VL53LX
        dat= result
        If dat<>0 Then
           prom = prom + dat
        Else
           i=i+1
        EndIf
        pause 30
    Next
    prom = prom / 4
EndSub
'===============================================================================
VL53Lx:
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS,[$00,$01]
        PAUSE 5
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS,[$14]
        PAUSE 33
        I2CREAD I2C_SDA,I2C_SCL, R_ADDRESS,[Str DatoSensor\12]
        If DatoSensor[0]= $5E Then 
           Result = DatoSensor[10]*256 + DatoSensor[11]
        Else
           Result= 0
        EndIf
    RETURN


VL53_Init:     
        I2CWRITE I2C_SDA,I2C_SCL,W_ADDRESS, [$88,$00]
        PAUSE 10
     
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$80,$01]
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF,$01]
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$00,$00]
     
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$91,$3C]
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$00,$01]
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF,$00]
        I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$80,$00]
        return    
Pepe ye bir kez daha teşekkür ederim. Sonuçta tam özellikleri ile kullanamasak da sensörü bu kod yardımı ile kullanabiliyoruz. 200 cm'e kadar (bizim denememizde 181 cm'e kadar doğru ölçüm aldık) Nispeten hassas bir ölçüm alabilmek mümkün oldu. Bu arada hemen belirteyim. Sensör bir lazer ışını gönderip engelden yanısyan ışığa ait fotonların havada kalma süresini hesaplayarak mesafe bilgisi oluşturuyor. Dolayısıyla engel denilen cisimlerin renkleri bu işte etkin rol oynamaktadır. Siyah veya çok koyu renkli cisimlerden yansıma çok zor olduğundan ölçüm mesafesi küçülmekte açık renkli cisimlerde ise sorun olmamaktadır. Denemelerinizde bu hususu dikkate almanızda yarar vardır.

Ete

Pepe

pruebe esto

VL53_Init:
     
    '-----------------------------------------
    ' 1) Apagar control automático interno
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$88, $00]
    PAUSE 10

    '-----------------------------------------
    ' 2) Entrar en modo de configuración secreta
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$80, $01]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $01]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$00, $00]

    '-----------------------------------------
    ' 3) Patchear reloj interno (registro oculto $91)
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$91, $3C]

    '-----------------------------------------
    ' 4) Salir de modo secreto
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$00, $01]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $00]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$80, $00]

    '-----------------------------------------
    ' 5) Configurar SPADs (fijos de fábrica)
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $01]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$4F, $00]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$4E, $20]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $00]

    '-----------------------------------------
    ' 6) Configuración obligatoria recomendada por ST
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$2D, $00]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$2E, $00]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$2F, $00]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$30, $00]

    '-----------------------------------------
    ' 7) Timeout de lectura (MSRC + Range)
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$01, $FF]    ' SIGNAL_RATE_MSRC
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$02, $00]    ' SIGNAL_RATE_PRE_RANGE
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$0A, $30]    ' MSRC_CONFIG_CONTROL (obligatorio)

    '-----------------------------------------
    ' 8) VCSEL Pre-Range timing
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $01]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$00, $00]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $00]

    '-----------------------------------------
    ' 9) Configurar timing budgets estándar de fábrica
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$50, $45]    ' FINAL_RANGE_CONFIG
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$51, $20]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$52, $20]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$53, $12]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$54, $07]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$55, $06]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$56, $06]

    '-----------------------------------------
    ' 10) Configurar VCSEL Periods
    '-----------------------------------------
    ' Pre-range VCSEL = 14 PCLK
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $01]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$0E, $06]   ' pre-range period
    ' Final-range VCSEL = 10 PCLK
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$0F, $0A]   ' final-range period
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $00]

    '-----------------------------------------
    ' 11) Apertura del SPAD y ajustes de ROI
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$61, $AD]   ' GLOBAL_CONFIG_SPAD_ENABLES_REF

    '-----------------------------------------
    ' 12) VHV & Phase Calibration
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $01]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$00, $00]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$FF, $00]
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$0B, $00]

    ' Hacer un disparo de calibración
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$00, $01]
    PAUSE 100

    '-----------------------------------------
    ' 13) Habilitar single ranging mode
    '-----------------------------------------
    I2CWRITE I2C_SDA,I2C_SCL, W_ADDRESS, [$00, $01]
return    


ete

Pepe,
He añadido los comandos de configuración que me has dado al programa en ejecución. Algunos de ellos ya estaban en el programa.
Lamentablemente, el programa no ha funcionado con las nuevas líneas de configuración. Es evidente que una o varias de esas líneas están causando problemas.
Ete

Arkadaşlar,
Pepe nin vermiş olduğu config komutlarını çalışan programa ekledim. Ancak program çalışmadı.
Belliki config satırlarının birisi veya bir kaçı sorun çıkartıyor. Hangisi olduğunu bulmakda zor olacak. Satırları teker teker kapatıp deneme yapmak gerekiyorki çok zaman alıcı bir iş.

Ete

Pepe

Only this

VL53_Init:

    ' Apagar el sensor (Fresh Out of Reset)
    I2CWRITE SDA,SCL,W_ADDRESS, [$88, $00]
    PAUSE 10

    ' Stop variable initialization
    I2CWRITE SDA,SCL,W_ADDRESS, [$80, $01]
    I2CWRITE SDA,SCL,W_ADDRESS, [$FF, $01]
    I2CWRITE SDA,SCL,W_ADDRESS, [$00, $00]
    
    ' Patch clock (registro oculto 0x91)
    I2CWRITE SDA,SCL,W_ADDRESS, [$91, $3C]

    ' Salir del modo especial
    I2CWRITE SDA,SCL,W_ADDRESS, [$00, $01]
    I2CWRITE SDA,SCL,W_ADDRESS, [$FF, $00]
    I2CWRITE SDA,SCL,W_ADDRESS, [$80, $00]

    ' Timeout estándar recomendado por ST
    I2CWRITE SDA,SCL,W_ADDRESS, [$01, $FF]
    I2CWRITE SDA,SCL,W_ADDRESS, [$02, $00]
    I2CWRITE SDA,SCL,W_ADDRESS, [$0A, $30]

    ' Habilitar medición continua con presupuesto default
    I2CWRITE SDA,SCL,W_ADDRESS, [$00, $02]

RETURN


Pepe

#21
otra inicializacion para probar

'========================================================
'   INICIALIZACIÓN COMPLETA VL53L0X 
'========================================================
VL53_Init:

    '----------------------------------------------------
    ' 1) Apagar control automático interno
    '----------------------------------------------------
    I2CWRITE SDA,SCL W_ADDRESS, [$88, $00]
    PAUSE 10

    '----------------------------------------------------
    ' 2) Entrar al modo secreto
    '----------------------------------------------------
    I2CWRITE SDA,SCL W_ADDRESS, [$80, $01]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF, $01]
    I2CWRITE SDA,SCL W_ADDRESS, [$00, $00]

    '----------------------------------------------------
    ' 3)  Patch clock (registro oculto 0x91)
    '----------------------------------------------------
    
    I2CWRITE SDA,SCL,W_ADDRESS, [$91, $3C]

    I2CWRITE SDA,SCL W_ADDRESS, [$00, $01]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF, $00]
    I2CWRITE SDA,SCL W_ADDRESS, [$80, $00]

    '----------------------------------------------------
    ' 4) Tuning Settings completos (ST + Pololu)
    '----------------------------------------------------
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$00,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$09,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$10,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$11,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$24,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$25,$FF]
    I2CWRITE SDA,SCL W_ADDRESS, [$75,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$4E,$2C]
    I2CWRITE SDA,SCL W_ADDRESS, [$48,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$30,$20]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$30,$09]
    I2CWRITE SDA,SCL W_ADDRESS, [$54,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$31,$04]
    I2CWRITE SDA,SCL W_ADDRESS, [$32,$03]
    I2CWRITE SDA,SCL W_ADDRESS, [$40,$83]
    I2CWRITE SDA,SCL W_ADDRESS, [$46,$25]
    I2CWRITE SDA,SCL W_ADDRESS, [$60,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$27,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$50,$06]
    I2CWRITE SDA,SCL W_ADDRESS, [$51,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$52,$96]
    I2CWRITE SDA,SCL W_ADDRESS, [$56,$08]
    I2CWRITE SDA,SCL W_ADDRESS, [$57,$30]
    I2CWRITE SDA,SCL W_ADDRESS, [$61,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$62,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$64,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$65,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$66,$A0]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$22,$32]
    I2CWRITE SDA,SCL W_ADDRESS, [$47,$14]
    I2CWRITE SDA,SCL W_ADDRESS, [$49,$FF]
    I2CWRITE SDA,SCL W_ADDRESS, [$4A,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$7A,$0A]
    I2CWRITE SDA,SCL W_ADDRESS, [$7B,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$78,$21]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$23,$34]
    I2CWRITE SDA,SCL W_ADDRESS, [$42,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$44,$FF]
    I2CWRITE SDA,SCL W_ADDRESS, [$45,$26]
    I2CWRITE SDA,SCL W_ADDRESS, [$46,$05]
    I2CWRITE SDA,SCL W_ADDRESS, [$40,$40]
    I2CWRITE SDA,SCL W_ADDRESS, [$0E,$06]
    I2CWRITE SDA,SCL W_ADDRESS, [$20,$1A]
    I2CWRITE SDA,SCL W_ADDRESS, [$43,$40]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$34,$03]
    I2CWRITE SDA,SCL W_ADDRESS, [$35,$44]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$31,$04]
    I2CWRITE SDA,SCL W_ADDRESS, [$4B,$09]
    I2CWRITE SDA,SCL W_ADDRESS, [$4C,$05]
    I2CWRITE SDA,SCL W_ADDRESS, [$4D,$04]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$44,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$45,$20]
    I2CWRITE SDA,SCL W_ADDRESS, [$47,$08]
    I2CWRITE SDA,SCL W_ADDRESS, [$48,$28]
    I2CWRITE SDA,SCL W_ADDRESS, [$67,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$70,$04]
    I2CWRITE SDA,SCL W_ADDRESS, [$71,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$72,$FE]
    I2CWRITE SDA,SCL W_ADDRESS, [$76,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$77,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$0D,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$80,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$01,$F8]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$8E,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$00,$01]
    I2CWRITE SDA,SCL W_ADDRESS, [$FF,$00]
    I2CWRITE SDA,SCL W_ADDRESS, [$80,$00]


    '----------------------------------------------------
    ' 5) Single Ranging Mode (listo para medir)
    '----------------------------------------------------
    I2CWRITE SDA,SCL W_ADDRESS, [$00, $01]

RETURN
'========================================================


ete

Pepe,
El archivo de configuración anterior funcionaba. Cuando digo que funcionaba, me refiero a que no siempre daba cero (sin obstáculos), sino que de vez en cuando daba valores aleatorios. Sin embargo, si se coloca un obstáculo delante del sensor, las mediciones son más estables y precisas.
El último que me has enviado no puede realizar mediciones, siempre da cero en la pantalla.


Arkadaşlar, bir önceki config dosyası çalışıyor. Ufak tefek sorunları var. Engelsiz ölçümleri her zaman sıfır olmuyor araya rastgele ölçümler sokuyor. Ama emngelli ölçümleri nispeten daha iyi.

Bu son yollanan Config dosyası ile ölçüm alamıyoruz. Ölçüm sürekli sıfır gösteriyor.


Ete

Pepe

#23
gracias por probar

para investigar

status = DatoSensor[0]
status = (status >> 3) & $0F

Esto extrae únicamente bits 5..3, quedando:

range_status   Significado

0   OK, válida
1   Sigma fail
2   Signal fail
4   Out of bounds
5   Hardware fail
6   Clean fail
7   No object detected

ete

Pepe,
El programa funciona con otros comandos de configuración. Pero no funciona con configuraciones múltiples. A juzgar por el resultado obtenido, puedo decir que la comunicación se ha interrumpido de alguna manera. Porque con las líneas de configuración que no funcionan no se obtiene ningún valor de medición. Esto indica que el sensor no funciona con estos comandos. De esta manera, no es posible comprender el problema mirando el estado. Porque el programa tampoco podrá leer el estado. Pero aún así, intentaré probar tu sugerencia este fin de semana.
En realidad, el funcionamiento no está nada mal. Para solucionar los pequeños defectos, creo que es necesario conectar el sensor con los condensadores de filtro necesarios que se recomiendan en la hoja de datos. En primer lugar, hay que ajustar el circuito a la forma deseada. Una vez hecho esto, haré algunas pruebas. Gracias por tu ayuda.

Ete


Powered by EzPortal
▲