HX711 Ağırlık sensörü modülü kullanımı ile ilgili örnek PİCBASİC kodu

Başlatan . Kağan, 26 Ocak 2022, 13:20:03

. Kağan

Merhaba,
HX711 Ağırlık sensörü modülü kullanımı ile ilgili örnek PİCBASİC kodu arıyorum. İnternette arduino vb. için çokca örnek kod bulunsada PİC işlemci (16f877-887 vb. 40 pin yada herhangi bir pic) ile kullanım örneği bulamadım. 
Paylaşan yada yardımcı olan arkadaşlara şimdiden teşekkür ederim.

mehmet

Alttakiler ilgili entegrenin referans
kodu. Çok zor olmasa gerek BASIC 'e
dönüştürmek.

sbit ADDO = P1^5;
sbit ADSK = P0^0;
unsigned long ReadCount(void)
{
   unsigned long Count;
   unsigned char i;
   ADDO=1;
   ADSK=0;
   Count=0;
   while(ADDO);
   for (i=0;i<24;i++)
   {
      ADSK=1;
      Count=Count<<1;
      ADSK=0;
      if(ADDO) Count++;
   }
   ADSK=1;
   Count=Count^0x800000;
   ADSK=0;
   return(Count);
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

ete

Yabancı sitelerde bulduğum bir kaç kod örneğini aşağıda veriyorum. Test edip çalışanı söylersen sevinirim.

Ete

Hx711Cnt var Word
 I var Byte
 GraM var word
 GraMM var word
 SigN var byte
 
Symbol dataa = PORTB.2
Symbol clock = PORTB.3   
input dataa
output clock
I=0
LoadCellA:
 dataa = 1:clock = 0: Hx711Cnt = 0
 While dataa = 1 : Wend
 For i = 0 To 15
   High clock
   Hx711Cnt = Hx711Cnt <<1
   Low clock
   if dataa=1 then Hx711Cnt=Hx711Cnt+1
 Next
 High clock
 Hx711Cnt = Hx711Cnt^32768
 gram=32768-Hx711Cnt
 'gram=gram-65477' zero
 IF gram.15 THEN  'negative values
     gram = ~gram + 1
     Sign = "-"
  else
     Sign=" "   
  ENDIF
disable 
gram=gram*11627   'scale values
gramm=div32 10000
 enable
 LCDOUT $FE, 1
 LcdOut $FE,$80, "Tara=",sign,dec(gramm)
 pause 100
GoTo LoadCellA
end

;pic16f1619 hx711 tm1637
#CONFIG
    __config _CONFIG1,  _FOSC_INTOSC & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
    __config _CONFIG2,  _WRT_OFF & _PPS1WAY_OFF & _ZCD_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_HI & _LVP_ON
    __config _CONFIG3,  _WDTCPS_WDTCPS6 & _WDTE_OFF & _WDTCWS_WDTCWS100 & _WDTCCS_LFINTOSC
#ENDCONFIG
' PutMulResult?D macro
' GetMulResult?D macro                                               
 TRISC =%10111111
 TRISA =%11011111
 define      OSC             32
 
; --- *** Oscillator  *** ---------------------------------------------------
    OSCCON = %11110000           ;32 MHz,
    ANSELb = 0
    ANSELA = 0
    ANSELC = 0
 
    USERCOMMAND "DISPLED"    ; BUFFER{,COLON }   TAKES 150uS FOR 4 DIGITS
    USERCOMMAND "STRLEN"     ; BUFFER
    USERCOMMAND "RJUSTBUFF"  ; BUFFER
    ;ALL NEED TO BE IN SAME BANK
    TM_BIT        VAR BYTE BANK0
    TM_DAT        VAR BYTE BANK0
    TM_NAK        VAR BYTE BANK0       ;set to $80 if tx error occured
    TM_DIG        VAR BYTE BANK0
    TM_BRIGHT     VAR BYTE BANK0       ;display pwm level 0 to 7
    TM_COLON      VAR BYTE BANK0       ;display colon  0/1
    TM_TMP        VAR BYTE[2] BANK0
    str_len       VAR BYTE BANK0
    ;tm1637 CONSTANTS
    CMD_AUTO_ADDR CON $40
    START_ADDR    CON $c0
    NUM_DIGITS    CON 4                ;number of 7seg leds
    COLON_FLAG    CON $80
    DISPLAY_ON    CON $88
    ;tm1637      DIO AND CLK NEED TO BE ON SAME PORT
    @TM_OUT_PORT = LATB       ;TM_DIO  OUT
    @TM_IN_PORT  = PORTB      ;TM_DIO  IN
    @TM_CLK      = 6          ;PIN
    @TM_DIO      = 7          ;PIN
    @TM_TRIS     = TRISB
   
   
    LEDBUFF       VAR BYTE[NUM_DIGITS +1]
    HX711_bits  VAR BYTE
    hx711_gain con 2 ; 2=read a @128 , 1= read b @32, 0 = read  a@64
    HX711_CAL  con 43 ;CALIBRATE TO GRAMS*10
    HX711_READING VAR BYTE[3BANK0
    HX711_ZERO VAR word
    HX711_upper var word  EXT
    av_cnt      VAR BYTE
    SGN  VAR BIT
    ; red  e+, black e- , green A+ , white A-
    HX_OUT    VAR PORTC.7
    HX_SCK    VAR LATC.6
    LED       VAR LATA.5
    ZERO_SW   VAR PORTC.4
@HX711_upper = _HX711_READING+1
   
GOTO OVERASM
 
ASM 
DISPLED?B  macro BUFFER       
    movlw   low BUFFER
    movwf   FSR0L
    movlw   high BUFFER
    movwf   FSR0H
    L?CALL _TM_DISP4
    endm 
DISPLED?BC  macro BUFFER ,COLON     
    movlw   low BUFFER
    movwf   FSR0L
    movlw   high BUFFER
    movwf   FSR0H
    CHK?RP  _TM_COLON
    MOVE?CB COLON ,_TM_COLON
    L?CALL _TM_DISP4
    endm   
DISPLED?BB  macro BUFFER ,COLON     
    movlw   low BUFFER
    movwf   FSR0L
    movlw   high BUFFER
    movwf   FSR0H
    CHK?RP  _TM_COLON
    MOVE?BB COLON ,_TM_COLON
    L?CALL _TM_DISP4
    endm
STRLEN?B  macro BUF     
    MOVE?CB high BUF, FSR0H ;load highbyte
    MOVE?CB low  BUF, FSR0L ;load low byte
    L?CALL   STRlen
    endm
RJUSTBUFF?B  macro BUF     
    MOVE?CB high BUF, FSR0H ;load highbyte
    MOVE?CB low  BUF, FSR0L ;load low byte
    CHK?RP   _TM_TMP
    MOVE?CB low  BUF, _TM_TMP  ;load low byte
    MOVE?CB HIGH  BUF, _TM_TMP+1  ;load low byte
    L?CALL  STRlen
    L?CALL  _strpad
    endm 
   
           
STRlen                     ;get buffer usage size
    CHK?RP   _str_len
    CLRF     _str_len   
str_tok_chr
    MOVIW    FSR0 ++       ; Get character
    btfsC    STATUS,Z     
    goto     exit_str_null ; EXIT ON Null char
    INCF     _str_len,F    ; not null so increment index
    goto     str_tok_chr
exit_str_null
    BANKSEL 0
    return
_strpad           ;right justify by padding with spaces " "
    CHK?RP  _str_len
    movlw   _NUM_DIGITS+1     ;buffer size
    subwf   _str_len,f        ;tx string size 
    btfsc   STATUS, C         ;tx string size  gotcha
    goto    expd              ;if positive difference then exit buffer overrun will occur  ;tx string size  gotcha
    comf    _str_len,f        ;the difference is number of spaces to SHIFT in
    btfsc   STATUS, Z
    goto    expd              ;if zero difference then exit
    movlw   _NUM_DIGITS       ;buffer size
    addwf   _TM_TMP,f         ;add  NUM_DIGITS to  addr of buffer
nxpd
    movf    _TM_TMP,w         ;low (addr of buffer + NUM_DIGITS )
    MOVWF   FSR0L
    movwf   FSR1L
    movf    _TM_TMP+1,w       ;high (addr of buffer + NUM_DIGITS )
    MOVWF   FSR0H
    movwf   FSR1H
    DECF    FSR0L,F            ;offset pointer 0
    movlw   _NUM_DIGITS
    movwf   _TM_BIT
nxby                          ;buffer shift right x 1
    MOVIW   FSR0 --
    MOVWI   FSR1 --
    DECFSZ  _TM_BIT,F
    GOTO    nxby
    movlw   0x20
    MOVWI   FSR1 --            ;poke a space in buff[0]
    DECFSZ  _str_len,F         ;need another one ?
    goto    nxpd
expd                           ;nah!
    BANKSEL 0
    return
 
SEG_val         ;VALID INPUT  0-9 ,A-F, a-f ," " ,-
    CHK?RP  _TM_TMP
    MOVWF   _TM_TMP
    SUBLW   0x21
    btfsc   STATUS, C
    retlw   0   ;" "
    MOVF    _TM_TMP,W
    SUBLW   0x2f
    btfsc   STATUS, C
    retlw   64   ;"-"
    MOVF    _TM_TMP,W
    MOVLW   0X40
    SUBWF   _TM_TMP,W
    btfsC   STATUS, C
    GOTO    TM_ALPHA
    MOVF    _TM_TMP,W
    ANDLW   0X0F
    GOTO    TM_LU
TM_ALPHA
    ANDLW   0xdf    ;ucase
    SUBLW   6
    btfsS   STATUS, C
    retlw   0       ;ERROR
    MOVLW   0X37
    SUBWF   _TM_TMP,W
    ANDLW   0xdf    ;ucase
TM_LU     
    BRW                                         
    retlw 0X3F    ;0   
    retlw 6           
    retlw 0X5B   
    retlw 0X4F
    retlw 0X66
    retlw 0X6D                       
    retlw 0X7D 
    retlw 7   
    retlw 0X7F         
    retlw 0X67    ;9
    retlw 0X77    ;A
    retlw 0X7C    ;b
    retlw 0X39    ;C
    retlw 0X5E    ;d
    retlw 0X79    ;E
    retlw 0X71    ;F
   
TM_START   
    CHK?RP TM_OUT_PORT
    BSF    TM_OUT_PORT,TM_CLK
    BSF    TM_OUT_PORT,TM_DIO
    NOP
    BCF    TM_OUT_PORT,TM_DIO
    NOP
    BCF    TM_OUT_PORT,TM_CLK
    ;NOP
    RETURN
   
TM_STOP
    CHK?RP TM_OUT_PORT
    BCF    TM_OUT_PORT,TM_CLK
    BCF    TM_OUT_PORT,TM_DIO
    NOP
    BSF    TM_OUT_PORT,TM_CLK
    NOP
    BSF    TM_OUT_PORT,TM_DIO
    ;NOP
    RETURN
   
TM_WRITE
    MOVLW  8
    CHK?RP _TM_BIT
    MOVWF  _TM_BIT
NXBT   
    CHK?RP TM_OUT_PORT
    BCF    TM_OUT_PORT,TM_CLK
    CHK?RP _TM_DAT
    BTFSS  _TM_DAT,0
    GOTO   TM_0
    CHK?RP TM_OUT_PORT
    BSF    TM_OUT_PORT,TM_DIO
    GOTO   TM_NB
TM_0   
    CHK?RP TM_OUT_PORT
    BCF    TM_OUT_PORT,TM_DIO 
TM_NB   
    CHK?RP _TM_DAT
    RRF    _TM_DAT,F
    CHK?RP TM_OUT_PORT
    BSF    TM_OUT_PORT,TM_CLK
    CHK?RP _TM_BIT
    DECFSZ _TM_BIT,F
    GOTO   NXBT
    CHK?RP TM_OUT_PORT
    BCF    TM_OUT_PORT,TM_CLK
    CHK?RP TM_TRIS
    BSF    TM_TRIS,TM_DIO
    CHK?RP TM_IN_PORT
    BTFSC  TM_IN_PORT,TM_DIO
    BSF    _TM_NAK,7
    CHK?RP TM_OUT_PORT
    BSF    TM_OUT_PORT,TM_CLK
    NOP
    NOP
    NOP
    NOP
    BCF    TM_OUT_PORT,TM_CLK
    CHK?RP TM_TRIS
    BCF    TM_TRIS ,TM_DIO
    BANKSEL 0
    RETURN
_TM_INIT
    CHK?RP  _TM_COLON
    CLRF    _TM_COLON
    CLRF    _TM_BRIGHT
    CHK?RP TM_TRIS
    BCF    TM_TRIS ,TM_DIO
    BCF    TM_TRIS ,TM_CLK
    BANKSEL 0
    RETURN
   
_TM_DISP4
    CHK?RP  _TM_DAT
    MOVLW   _CMD_AUTO_ADDR
    MOVWF   _TM_DAT
    CLRF    _TM_NAK
    CALL    TM_START
    CALL    TM_WRITE
    CALL    TM_STOP
    MOVLW   _NUM_DIGITS         
    CHK?RP  _TM_DIG
    MOVWF   _TM_DIG
    MOVLW   _START_ADDR
    CHK?RP  _TM_DAT
    MOVWF   _TM_DAT
    CALL    TM_START
    CALL    TM_WRITE
NXDIG
    MOVIW   FSR0 ++
    CALL    SEG_val
    CHK?RP  _TM_DAT
    IORWF   _TM_COLON ,W
    movwf   _TM_DAT
    CALL    TM_WRITE
    CHK?RP  _TM_DIG
    DECFSZ  _TM_DIG,F
    GOTO    NXDIG
    CALL    TM_STOP
    CHK?RP  _TM_BRIGHT
    MOVF    _TM_BRIGHT ,W
    ANDLW   7
    IORLW   _DISPLAY_ON
    CHK?RP  _TM_DAT
    MOVWF   _TM_DAT
    CALL    TM_START
    CALL    TM_WRITE
    CALL    TM_STOP
    BANKSEL 0
    RETURN
ENDASM   
OVERASM:
CALL TM_INIT 
LED = 0
HX_SCK  =  0
WHILE HX_OUT : WEND
ALOOP:
    gosub read_hx711
    asm         ;ROTATE READING TO GET SUFFICIENT RESOLOUTION INTO UPPER WORD
    bcf STATUS,C
    rlf  _HX711_READING   ,f
    rlf  _HX711_READING+1 ,f
    rlf  _HX711_READING+2 ,f
    bcf STATUS,C
    rlf  _HX711_READING   ,f
    rlf  _HX711_READING+1 ,f
    rlf  _HX711_READING+2 ,f
    endasm
    IF ! ZERO_SW THEN
      HX711_ZERO = HX711_upper
      WHILE ! ZERO_SW :WEND
    ENDIF
    HX711_upper=HX711_upper-HX711_ZERO
    IF HX711_upper.15 THEN
        SGN = 1
        HX711_upper = ~ HX711_upper + 1
    ENDIF
   
    HX711_upper=HX711_upper */ 363       ;CALIBRATE TO GRAMS*10
   
    IF SGN  THEN
        HX711_upper = ~ HX711_upper + 1
        SGN = 0
    ENDIF
   
    ARRAYWRITE LEDBUFF ,[SDEC HX711_upper,0]
    RJUSTBUFF  LEDBUFF
    DISPLED  LEDBUFF,0
    TOGGLE LED
GOTO ALOOP
   
END
read_hx711:
WHILE HX_OUT : WEND    ;data ready
    for HX711_bits = 23  to 0  step -1    ;read data
        HX_SCK  =  1
        @ NOP
        @ NOP
        HX711_reading.0[HX711_bits] =  HX_OUT
        HX_SCK  =  0
        @ NOP
        @ NOP
        @ NOP
        @ NOP
        @ NOP
        @ NOP
    NEXT
;set_hx711_gain   
    for HX711_bits = 0 to hx711_gain;  send    GAIN
        HX_SCK  =  1
        @ NOP
        @ NOP
        @ NOP
        HX_SCK  =  0
        @ NOP
        @ NOP 
        @ NOP
    NEXT
return

;pic18f26k22 hx711 tm1637
#CONFIG
  CONFIG  FOSC = INTIO67
  CONFIG  PLLCFG = ON
  CONFIG  PRICLKEN = OFF
  CONFIG  FCMEN = OFF
  CONFIG  IESO = OFF
  CONFIG  PWRTEN = OFF
  CONFIG  BOREN = SBORDIS
  CONFIG  BORV = 190
  CONFIG  WDTEN = ON
  CONFIG  WDTPS = 32768
  CONFIG  CCP2MX = PORTC1
  CONFIG  PBADEN = OFF
  CONFIG  CCP3MX = PORTB5
  CONFIG  HFOFST = ON
  CONFIG  T3CMX = PORTC0
  CONFIG  P2BMX = PORTB5
  CONFIG  MCLRE = EXTMCLR
  CONFIG  STVREN = ON
  CONFIG  LVP = OFF
  CONFIG  XINST = OFF
  CONFIG  DEBUG = OFF
  CONFIG  CP0 = OFF
  CONFIG  CP1 = OFF
  CONFIG  CP2 = OFF
  CONFIG  CP3 = OFF
  CONFIG  CPB = OFF
  CONFIG  CPD = OFF
  CONFIG  WRT0 = OFF
  CONFIG  WRT1 = OFF
  CONFIG  WRT2 = OFF
  CONFIG  WRT3 = OFF
  CONFIG  WRTC = OFF
  CONFIG  WRTB = OFF
  CONFIG  WRTD = OFF
  CONFIG  EBTR0 = OFF
  CONFIG  EBTR1 = OFF
  CONFIG  EBTR2 = OFF
  CONFIG  EBTR3 = OFF
  CONFIG  EBTRB = OFF
#ENDCONFIG
   ;tm1637      DIO AND CLK NEED TO BE ON SAME PORT
    @TM_OUT_PORT = LATB       ;TM_DIO  OUT
    @TM_IN_PORT  = PORTB      ;TM_DIO  IN
    @TM_CLK      = 6          ;PIN
    @TM_DIO      = 7          ;PIN
    @TM_TRIS     = TRISB
 include "strtok.pbpmod"
 include "tm1637.pbpmod"   
' PutMulResult?D macro
' GetMulResult?D macro                                               
 TRISC =%10111111
 TRISA =%11011111
 ;TRISB =%10111111
 define      OSC             64
 
; --- *** Oscillator  *** ---------------------------------------------------
    OSCCON = %11110000           
    ANSELb = 0
    ANSELA = 0
    ANSELC = 0
 
 
 
   
    LEDBUFF       VAR BYTE[5]
    HX711_bits  VAR BYTE
    hx711_gain con 2 ; 2=read a @128 , 1= read b @32, 0 = read  a@64
    HX711_CAL  con 43 ;CALIBRATE TO GRAMS*10
    HX711_READING VAR BYTE[3]  BANK0
    HX711_ZERO VAR word
    HX711_upper var word  EXT
    av_cnt      VAR BYTE
    SGN  VAR BIT
    ; red  e+, black e- , green A+ , white A-
    HX_OUT    VAR PORTC.7
    HX_SCK    VAR LATC.6
    LED       VAR LATA.5
    ZERO_SW   VAR PORTC.4
@HX711_upper = _HX711_READING+1
   
 
CALL TM_INIT 
LED = 0
HX_SCK  =  0
WHILE HX_OUT : WEND
ALOOP:
    gosub read_hx711
    asm         ;ROTATE READING TO GET SUFFICIENT RESOLOUTION INTO UPPER WORD
    bcf STATUS,C
    RLCF  _HX711_READING   ,f
    RLCF  _HX711_READING+1 ,f
    RLCF  _HX711_READING+2 ,f
    bcf STATUS,C
    RLCF  _HX711_READING   ,f
    RLCF  _HX711_READING+1 ,f
    RLCF  _HX711_READING+2 ,f
    endasm
    IF ! ZERO_SW THEN
      HX711_ZERO = HX711_upper
      WHILE ! ZERO_SW :WEND
    ENDIF
    HX711_upper=HX711_upper-HX711_ZERO
    IF HX711_upper.15 THEN
        SGN = 1
        HX711_upper = ~ HX711_upper + 1
    ENDIF
   
    HX711_upper=HX711_upper */ 170       ;CALIBRATE TO GRAMS*10
   
    IF SGN  THEN
        HX711_upper = ~ HX711_upper + 1
        SGN = 0
    ENDIF
   
    ARRAYWRITE LEDBUFF ,[SDEC HX711_upper,0]
    RJUSTBUFF  LEDBUFF ,4
    DISPLED  LEDBUFF,0
    TOGGLE LED
GOTO ALOOP
   
END
read_hx711:
WHILE HX_OUT : WEND    ;data ready
    for HX711_bits = 23  to 0  step -1    ;read data
        HX_SCK  =  1
        @ NOP
        @ NOP
        HX711_reading.0[HX711_bits] =  HX_OUT
        HX_SCK  =  0
        @ NOP
        @ NOP
        @ NOP
        @ NOP
        @ NOP
        @ NOP
    NEXT
;set_hx711_gain   
    for HX711_bits = 0 to hx711_gain;  send    GAIN
        HX_SCK  =  1
        @ NOP
        @ NOP
        @ NOP
        HX_SCK  =  0
        @ NOP
        @ NOP 
        @ NOP
    NEXT
return

. Kağan

Hx711Cnt var Word
 I var Byte
 GraM var word
 GraMM var word
 SigN var byte
 
Symbol dataa = PORTB.2
Symbol clock = PORTB.3   
input dataa
output clock
I=0
LoadCellA:
 dataa = 1:clock = 0: Hx711Cnt = 0
 While dataa = 1 : Wend
 For i = 0 To 15
   High clock
   Hx711Cnt = Hx711Cnt <<1
   Low clock
   if dataa=1 then Hx711Cnt=Hx711Cnt+1
 Next
 High clock
 Hx711Cnt = Hx711Cnt^32768
 gram=32768-Hx711Cnt
 'gram=gram-65477' zero
 IF gram.15 THEN  'negative values
     gram = ~gram + 1
     Sign = "-"
  else
     Sign=" "   
  ENDIF
disable 
gram=gram*11627   'scale values
gramm=div32 10000
 enable
 LCDOUT $FE, 1
 LcdOut $FE,$80, "Tara=",sign,dec(gramm)
 pause 100
GoTo LoadCellA
end

Bunu denemek istiyorum fakat hangi işlemciyi kullanacağıma karar veremedim. Bazı yabancı yazarlar hızlı bir işlemci olması gerektiği yönünde paylaşımlarda bulunmuşlar.

16f887 kullansammı yada 16f1827'de pll kullanıp dahili kristal hızını 32'ye çıkarmak gerekirmi?

ete

Hız işlemcilerde daima iyidir zaman alan uzun hesaplama işlemlerini nispeten kısaltır. Nadirde olsa bir takım yan elemanların kontrolünde hassas olan zamanlama (timing) sürelerine de dikkat etmek gerekir. Örnek vereyim I2C haberleşmesinde standart hız 400 Khz dir ve hızlı çalışan işlemcilerde ekstra tedbir (ek yavaşlatma komutları) kullanılarak hıza uyum sağlatılır. En iyisi bunları deneyin. Sormak yerine denerseniz kalıcı olarak öğrenirsiniz deneme yapmaktan korkmayın.
Ete

elektro77

@. Kağan
Yaklaşık 10 yıldır loadcell kullanımı araştırması yapıyorsunuz, bir sonuca ulaşabildiniz mi?
2014 te ve 2022 de iki konu açmışsınız ama her ikisini de yarım bırakmış ve bir sonuç yazmamışsınız.
Ben de bu aralar bir loadcell projesi ile uğraşıyorum. Açtığınız konularda HX711 veya INAXXX gibi entegreleri araştırmışsınız galiba. Özellikle HX711 konusunda sonuç ne oldu bilgi verebilir misiniz?

Diğer üyelerimiz de cevaplayabilirse,
loadcell uygulamalarında kullanılabilecek olan analog çıkışlı veya seri iletişim çıkışlı ve pbp örnek kodları da bulunabilen hangi entegreyi önerebilirsiniz?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal