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[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
    
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