Selamlar arkadaşlar, F84A için yazılmış kodu F628A'ya uyarlamak istiyorum. Netten araştırdım, konfigurasyon ayarlarını deniyorum, değiştirdiğim kod yine F84A da çalışıyor ama F628A da çalışmıyor. Devre hiç çalışmıyor. (Gerçekte denemedim, proteus da denedim.) Yardımcı olabilir misiniz?
Orjinal kod:
LIST P=16F84 ; no need to change this for the 16C84
ERRORLEVEL -302 ; suppress bank selection messages
__CONFIG 3FF9H ; XT oscillator (and PWRTE if 16C84)
#DEFINE _4_00MHZ ; clock speed
PCL EQU 2 ; registers are defined here to make this
STATUS EQU 3 ; program self contained.
PORTA EQU 5
PORTB EQU 6
INTCON EQU 0BH
TRISA EQU 85H
TRISB EQU 86H
OPTREG EQU 81H
C EQU 0 ; bits in STATUS
Z EQU 2
RP0 EQU 5
T0IF EQU 2 ; bit in INTCON
#IFDEF _4_00MHZ ; number of ticks per second for 4 MHz:
TCK0 EQU .122 ; nominal
TCK1 EQU .123 ; every 10 secs
TCK2 EQU .121 ; every min
TCK3 EQU .123 ; every 10 mins
TCK4 EQU .124 ; every hour
TCK5 EQU .125 ; every 10 hours
TCK6 EQU .125 ; every 24 hours
#ENDIF
CBLOCK 0CH ; define variables required
TICKS ; decremented every tick (9.15 ms or 8.19 ms)
SEGS ; one bit per segment: "-gfedcba"
SEC
SEC10
MIN
MIN10
HOUR
HOUR10
FRAME ; used to decide when to display time
HHMM ; one bit per digit displayed
COUNT ; scratch register
DIGIT ; last digit displayed
ENDC
;*********************************;
; Initialisation ;
;*********************************;
ORG 0
INIT CLRF SEC
CLRF SEC10
CLRF MIN
CLRF MIN10
movlw D'2' ; 12:00 initialized here!
movwf HOUR
movlw D'1'
movwf HOUR10
CLRF FRAME
CLRF PORTA
CLRF PORTB
BSF STATUS,RP0 ; select register bank 1
CLRF TRISA
MOVLW 80H
MOVWF TRISB ; only RB7 is an input
MOVLW 4
MOVWF OPTREG ; assign prescaler (1:32) to TMR0
BCF STATUS,RP0 ; reselect bank 0
BTFSS PORTB,7 ; switch open?
GOTO TEST ; no, go to test mode
;*********************************;
; Main Program ;
;*********************************;
MAIN CALL CLOCK ; real-time clock algo called every second
CALL SHOW ; display the time
WAIT BTFSS INTCON,T0IF ; wait for TMR0 to roll over
GOTO WAIT
CLRF INTCON
CALL CHKSW ; check for button press
MOVF TICKS,W
XORLW D'20' ; Check for 20 ticks
BTFSS STATUS,Z
GOTO J1
MOVLW 30 ; Turn off Display at 100/120 ticks
MOVWF PORTB
MOVLW 1F
MOVWF PORTA
J1 DECFSZ TICKS,F
GOTO WAIT
GOTO MAIN ; get here every second
;*********************************;
; Convert digit to segment form ;
;*********************************;
SEGTAB ANDLW 0FH
ADDWF PCL,F
DT 40,79,24,30,19,12,02,78,00,10
DT 0F,0F,0F,0F,0F,0F
;*********************************;
; Real-time clock algorithm ;
;*********************************;
CLOCK MOVLW TCK0 ; increment digits as appropriate
MOVWF TICKS ; and define number of ticks per
INCF SEC,F ; second for next second
MOVF SEC,W
SUBLW 9
BTFSC STATUS,C
RETURN
MOVLW TCK1
MOVWF TICKS
CLRF SEC
INCF SEC10,F
MOVF SEC10,W
SUBLW 5
BTFSC STATUS,C
RETURN
MOVLW TCK2
MOVWF TICKS
CLRF SEC10
INCF MIN,F
MOVF MIN,W
SUBLW 9
BTFSC STATUS,C
RETURN
MOVLW TCK3
MOVWF TICKS
CLRF MIN
INCF MIN10,F
MOVF MIN10,W
SUBLW 5
BTFSC STATUS,C
RETURN
MOVLW TCK4
MOVWF TICKS
CLRF MIN10
MOVF HOUR10,W
SUBLW 1
BTFSC STATUS,C
GOTO INCHR
INCF HOUR,F
MOVF HOUR,W
SUBLW 3
BTFSC STATUS,C
RETURN
MOVLW TCK6
MOVWF TICKS
CLRF HOUR
CLRF HOUR10
RETURN
INCHR INCF HOUR,F
MOVF HOUR,W
SUBLW 9
BTFSC STATUS,C
RETURN
MOVLW TCK5
MOVWF TICKS
CLRF HOUR
INCF HOUR10,F
RETURN
;*********************************;
; Displays the time digit by digit;
;*********************************;
SHOW CLRF HHMM
INCF FRAME,F ; increment place in frame
MOVF FRAME,W
SUBLW D'08' ; Display cycle time
BTFSS STATUS,C
CLRF FRAME
MOVF FRAME,W
XORLW 1
BTFSC STATUS,Z
GOTO DHOUR10 ; display 10s of hours when frame is 1
XORLW 1^2
BTFSC STATUS,Z
GOTO DHOUR ; display hour when frame is 2
XORLW 2^3
BTFSC STATUS,Z
GOTO DMIN10 ; display 10s of mins when frame is 3
XORLW 3^4
BTFSC STATUS,Z
GOTO DMIN ; display mins when frame is 4
MOVLW 30 ; otherwise blank display
MOVWF PORTB
MOVLW 1F
MOVWF PORTA
RETURN
DHOUR10 BSF HHMM,3
MOVF HOUR10,W
BTFSS STATUS,Z ; check for leading zero
GOTO DISPLAY
RETURN ; skip display of leading zero
DHOUR BSF HHMM,2
MOVF HOUR,W
GOTO DISPLAY
DMIN10 BSF HHMM,1
MOVF MIN10,W
GOTO DISPLAY
DMIN BSF HHMM,0
MOVF MIN,W ; falls through to DISPLAY
;*********************************;
; Displays digit in W ;
;*********************************;
DISPLAY MOVWF DIGIT ; save number to be displayed in DIGIT
CALL SEGTAB ; convert to segment form
MOVWF SEGS ; and store
ANDLW 1FH ; extract PORTA segments
MOVWF PORTA ; and display
RRF SEGS,W
ANDLW 30H ; extract PORTB segments
IORWF HHMM,W
MOVWF PORTB ; and display
RETURN
;*********************************;
; Checks for a switch press and ;
; updates digit if displayed ;
;*********************************;
CHKSW BTFSC PORTB,7 ; switch closed?
RETURN ; no
MOVF HHMM,F
BTFSC STATUS,Z ; digit displayed?
RETURN ; no
INCDIG INCF DIGIT,F ; DIGIT is the currently displayed number
MOVF DIGIT,W
SUBLW 9
BTFSS STATUS,C
CLRF DIGIT ; If DIGIT incremented over 9
MOVF DIGIT,W
CALL DISPLAY
CALL DELAY ; wait for switch to settle
CHKSW0 BTFSS PORTB,7 ; switch open?
GOTO CHKSW0 ; no
CALL DELAY
BTFSS PORTB,7 ; still open?
GOTO CHKSW0 ; no
MOVLW D'20'
MOVWF COUNT
CHKSW1 BTFSS PORTB,7 ; switch open?
GOTO INCDIG ; no
CALL DELAY
DECFSZ COUNT,F
GOTO CHKSW1
MOVF DIGIT,W ; switch was open for around 2 secs
CLRF FRAME
CLRF SEC10
CLRF SEC
BTFSC HHMM,3 ; update correct digit
MOVWF HOUR10
BTFSC HHMM,2
MOVWF HOUR
BTFSC HHMM,1
MOVWF MIN10
BTFSC HHMM,0
MOVWF MIN
GOTO MAIN ; restart the program
;*********************************;
; Delay used by switch routine ;
;*********************************;
DELAY MOVLW D'12' ; roughly 100ms delay
MOVWF TICKS
DEL1 BTFSS INTCON,T0IF ; wait for TMR0 to roll over
GOTO DEL1
CLRF INTCON
DECFSZ TICKS,F
GOTO DEL1
RETURN
TEST CLRF COUNT ; exercise Numitron by cycling through
MOVF COUNT,W ; all numbers
CALL DISPLAY
CALL DELAY
CALL DELAY ; 1 second delay
INCF COUNT,F
MOVF COUNT,W
XORLW D'10' ; Test for 10
BTFSS STATUS,Z
GOTO TEST+1
GOTO TEST ; Reset COUNT to 0
END
Benim değişiklik yaptığım:
LIST P=16F628A
include "P16F628A.INC"
ERRORLEVEL -302
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF
#DEFINE _4_00MHZ ; clock speed
PCL EQU 2 ; registers are defined here to make this
STATUS EQU 3 ; program self contained.
PORTA EQU 5
PORTB EQU 6
INTCON EQU 0BH
TRISA EQU 85H
TRISB EQU 86H
OPTREG EQU 81H
C EQU 0 ; bits in STATUS
Z EQU 2
RP0 EQU 5
T0IF EQU 2 ; bit in INTCON
#IFDEF _4_00MHZ ; number of ticks per second for 4 MHz:
TCK0 EQU .122 ; nominal
TCK1 EQU .123 ; every 10 secs
TCK2 EQU .121 ; every min
TCK3 EQU .123 ; every 10 mins
TCK4 EQU .124 ; every hour
TCK5 EQU .125 ; every 10 hours
TCK6 EQU .125 ; every 24 hours
#ENDIF
CBLOCK 0CH ; define variables required
TICKS ; decremented every tick (9.15 ms or 8.19 ms)
SEGS ; one bit per segment: "-gfedcba"
SEC
SEC10
MIN
MIN10
HOUR
HOUR10
FRAME ; used to decide when to display time
HHMM ; one bit per digit displayed
COUNT ; scratch register
DIGIT ; last digit displayed
ENDC
;*********************************;
; Initialisation ;
;*********************************;
ORG 0
MOVLW 0x07
MOVWF CMCON
INIT CLRF SEC
CLRF SEC10
CLRF MIN
CLRF MIN10
movlw D'2' ; 12:00 initialized here!
movwf HOUR
movlw D'1'
movwf HOUR10
CLRF FRAME
CLRF PORTA
CLRF PORTB
BSF STATUS,RP0 ; select register bank 1
CLRF TRISA
MOVLW 80H
MOVWF TRISB ; only RB7 is an input
MOVLW 4
MOVWF OPTREG ; assign prescaler (1:32) to TMR0
BCF STATUS,RP0 ; reselect bank 0
BTFSS PORTB,7 ; switch open?
GOTO TEST ; no, go to test mode
;*********************************;
; Main Program ;
;*********************************;
MAIN CALL CLOCK ; real-time clock algo called every second
CALL SHOW ; display the time
WAIT BTFSS INTCON,T0IF ; wait for TMR0 to roll over
GOTO WAIT
CLRF INTCON
CALL CHKSW ; check for button press
MOVF TICKS,W
XORLW D'20' ; Check for 20 ticks
BTFSS STATUS,Z
GOTO J1
MOVLW 00 ; Turn off Display at 100/120 ticks
MOVWF PORTB
MOVLW 00
MOVWF PORTA
J1 DECFSZ TICKS,F
GOTO WAIT
GOTO MAIN ; get here every second
;*********************************;
; Convert digit to segment form ;
;*********************************;
SEGTAB ANDLW 0FH
ADDWF PCL,F
DT 0x6F,0x06,0xAB,0x8F,0xC6,0xCD,0xED,0x07,0xEF,0xCF
DT 7F,7F,7F,7F,7F,7F
;*********************************;
; Real-time clock algorithm ;
;*********************************;
CLOCK MOVLW TCK0 ; increment digits as appropriate
MOVWF TICKS ; and define number of ticks per
INCF SEC,F ; second for next second
MOVF SEC,W
SUBLW 9
BTFSC STATUS,C
RETURN
MOVLW TCK1
MOVWF TICKS
CLRF SEC
INCF SEC10,F
MOVF SEC10,W
SUBLW 5
BTFSC STATUS,C
RETURN
MOVLW TCK2
MOVWF TICKS
CLRF SEC10
INCF MIN,F
MOVF MIN,W
SUBLW 9
BTFSC STATUS,C
RETURN
MOVLW TCK3
MOVWF TICKS
CLRF MIN
INCF MIN10,F
MOVF MIN10,W
SUBLW 5
BTFSC STATUS,C
RETURN
MOVLW TCK4
MOVWF TICKS
CLRF MIN10
MOVF HOUR10,W
SUBLW 1
BTFSC STATUS,C
GOTO INCHR
INCF HOUR,F
MOVF HOUR,W
SUBLW 3
BTFSC STATUS,C
RETURN
MOVLW TCK6
MOVWF TICKS
CLRF HOUR
CLRF HOUR10
RETURN
INCHR INCF HOUR,F
MOVF HOUR,W
SUBLW 9
BTFSC STATUS,C
RETURN
MOVLW TCK5
MOVWF TICKS
CLRF HOUR
INCF HOUR10,F
RETURN
;*********************************;
; Displays the time digit by digit;
;*********************************;
SHOW CLRF HHMM
INCF FRAME,F ; increment place in frame
MOVF FRAME,W
SUBLW D'04' ; Display cycle time
BTFSS STATUS,C
CLRF FRAME
MOVF FRAME,W
XORLW 1
BTFSC STATUS,Z
GOTO DHOUR10 ; display 10s of hours when frame is 1
XORLW 1^2
BTFSC STATUS,Z
GOTO DHOUR ; display hour when frame is 2
XORLW 2^3
BTFSC STATUS,Z
GOTO DMIN10 ; display 10s of mins when frame is 3
XORLW 3^4
BTFSC STATUS,Z
GOTO DMIN ; display mins when frame is 4
MOVLW 00 ; otherwise blank display
MOVWF PORTB
MOVLW 00
MOVWF PORTA
RETURN
DHOUR10 BSF HHMM,3
MOVF HOUR10,W
BTFSS STATUS,Z ; check for leading zero
GOTO DISPLAY
RETURN ; skip display of leading zero
DHOUR BSF HHMM,2
MOVF HOUR,W
GOTO DISPLAY
DMIN10 BSF HHMM,1
MOVF MIN10,W
GOTO DISPLAY
DMIN BSF HHMM,0
MOVF MIN,W ; falls through to DISPLAY
;*********************************;
; Displays digit in W ;
;*********************************;
DISPLAY MOVWF DIGIT ; save number to be displayed in DIGIT
CALL SEGTAB ; convert to segment form
MOVWF SEGS ; and store
ANDLW 0FH ; extract PORTA segments
MOVWF PORTA ; and display
RRF SEGS,W
ANDLW 70H ; extract PORTB segments
IORWF HHMM,W
MOVWF PORTB ; and display
RETURN
;*********************************;
; Checks for a switch press and ;
; updates digit if displayed ;
;*********************************;
CHKSW BTFSC PORTB,7 ; switch closed?
RETURN ; no
MOVF HHMM,F
BTFSC STATUS,Z ; digit displayed?
RETURN ; no
INCDIG INCF DIGIT,F ; DIGIT is the currently displayed number
MOVF DIGIT,W
SUBLW 9
BTFSS STATUS,C
CLRF DIGIT ; If DIGIT incremented over 9
MOVF DIGIT,W
CALL DISPLAY
CALL DELAY ; wait for switch to settle
CHKSW0 BTFSS PORTB,7 ; switch open?
GOTO CHKSW0 ; no
CALL DELAY
BTFSS PORTB,7 ; still open?
GOTO CHKSW0 ; no
MOVLW D'20'
MOVWF COUNT
CHKSW1 BTFSS PORTB,7 ; switch open?
GOTO INCDIG ; no
CALL DELAY
DECFSZ COUNT,F
GOTO CHKSW1
MOVF DIGIT,W ; switch was open for around 2 secs
CLRF FRAME
CLRF SEC10
CLRF SEC
BTFSC HHMM,3 ; update correct digit
MOVWF HOUR10
BTFSC HHMM,2
MOVWF HOUR
BTFSC HHMM,1
MOVWF MIN10
BTFSC HHMM,0
MOVWF MIN
GOTO MAIN ; restart the program
;*********************************;
; Delay used by switch routine ;
;*********************************;
DELAY MOVLW D'12' ; roughly 100ms delay
MOVWF TICKS
DEL1 BTFSS INTCON,T0IF ; wait for TMR0 to roll over
GOTO DEL1
CLRF INTCON
DECFSZ TICKS,F
GOTO DEL1
RETURN
TEST CLRF COUNT ; exercise Numitron by cycling through
MOVF COUNT,W ; all numbers
CALL DISPLAY
CALL DELAY
CALL DELAY ; 1 second delay
INCF COUNT,F
MOVF COUNT,W
XORLW D'10' ; Test for 10
BTFSS STATUS,Z
GOTO TEST+1
GOTO TEST ; Reset COUNT to 0
END
Proteusta bu piclerde mclre off yapılınca sorun çıkıyordu diye hatırlıyorum.
Sigorta ayarını _MCLRE_ON yaparak derleyelim. MCLR ucunu proteusta VDDye bağlayalım belki çalışır.
Alıntı yapılan: t2 - 20 Temmuz 2015, 21:17:56
Proteusta bu piclerde mclre off yapılınca sorun çıkıyordu diye hatırlıyorum.
Sigorta ayarını _MCLRE_ON yaparak derleyelim. MCLR ucunu proteusta VDDye bağlayalım belki çalışır.
Yok ustam şimdi denedim olmadı.
ne kadar da çok benziyor :)
http://www.microchip.com/forums/m276907.aspx
Alıntı yapılan: kutahyaspor - 20 Temmuz 2015, 22:00:53
ne kadar da çok benziyor :)
http://www.microchip.com/forums/m276907.aspx
Evet hocam ya çok şükür sayende çözdüm. Zaten birkaç değişikliği de ordan bakarak yapmıştım. Benzer devre bide.
"CBLOCK 0CH" satırını 020H yaptım, çalıştı :-)
görmüşsündür forumda mantığı da anlatılmış.
Alıntı YapDo you understand what was happening now?
In the 16F84, locations 0x0c through 0x1f are in the RAM space and can be used for storing the variables. In the 16F628, though, those addresses are in the top of the SFR address range. Trying to use them as if they were RAM locations will cause some strange and unpredictable results.
Alıntı YapYes. The variables were being placed on top of registers that are used by the chip to do other things and that was causing the erratic behavior. By moving the starting point for the GPR to 20H and starting the variable definition from there everything went back to normal.
Great learning experience and a lot more respect for Assembler.Smile
bu arada mevzuya hakim olduğumdan değil, sadece google :)
:-) devre proteusda çalışırken, altta error mesajları coşunca anladım bende. Baktım ram ile ilgili hatalar veriyo, o forumdaki yorumları tekrar okudum. Ram den bahsedince çözdüm.
cblock ile asm de
ram de kullanacağımız değişkenleri tanımlıyoruz
diye düşünebilirsiniz.
Daha doğrusu cblock ile
picin ram bölgesinin adreslerine
sırası ile yazdığımız takma isimler eşleştirilir
bu sadece biz program yazarken kolay anlayalım diye yapılan bir şey.
C de
unsigned int8 degisken_ismi
yapmışız gibide düşünülebilir.
cblock ibaresinin karşısına yazılan adres (0xKL)ne ise
derleyici tarafından o adresden başlanarak
sırası ile yazılan tüm ifadelere o adresler eşitlenir,
aslında asm de bunu
TICKS equ 20h ; decremented every tick (9.15 ms or 8.19 ms)
SEGS equ 21h ; one bit per segment: "-gfedcba"
SEC equ 22h
SEC10 equ 23h
.
.
.
gibi yapıyoruz.
Aşağıdaki fotoda görüldüğü gibi
16F84A nın programcı tarafından kullanılabilecek
genel kullanım registerları 0x0C den başlıyor
ama
16F628A nın 0x20 den başlıyor.
16F628A da kullanıcı ram değişkenlerini 0x0C den başlatmaya kalkarsak
TMR1L , TMR1H, T1CON gibi registerları kullanıyor oluruz
bunlarda doğal olarak hataya sebep olur.
(https://lh3.googleusercontent.com/-FDjWz-oQ3qs/Va1ptWZcKeI/AAAAAAAABuU/OBpGlSSIbeA/w717-h589-no/picmemory.png)
Daha diğer banklardaki general purpose register ların kullanımı var...
Bu devrede B portunun ilk 4 pinine bağlı ledler var, Gnd ye bağlanmış. Ledleri nasıl ters çevirip VDD ye bağlayabilirim? Bu pinleri high değilde low nasıl yapabilirim?
B7,B6,B5,B4.B3,B2,B1,B0
dediğine göre B3,B2,B1,B0 e ledler bağlı,
GND ye bağlı ise, pine 1 verildiğinde led yanar,
ama sen ters çevirip Vdd ye bağlayacaksın
artık pine 0 yani tersini verdiğinde yanar,
yani programda ledlerin bağlı olduğu pinlerin tersini alman lazım.
Programda PORTB ye değer yüklenen her yerde şu eki yapabilirsin:
misal orjinali şöyle ise;
ANDLW 30H ; extract PORTB segments
IORWF HHMM,W
MOVWF PORTB ; and display
Her MOVWF PORTB den sonra portb alt 4 bitini tersleyebilirsin;
ANDLW 30H ; extract PORTB segments
IORWF HHMM,W
MOVWF PORTB ; and display
MOVLW 0FH ;0 ile xor lanan bitler aynı kalır, 1 ile xor lanan bitler terslenir (1 ise 0, 0 ise 1 olur)
XORWF PORTB,F
PORTB ye değer yüklemenin hemen ardından terslendiği için bunu insan algılayamaz,
yinede iyi bir yöntem değil tabiki.
Alternatif olarak:
bir değişken tanımlanır ve bu değişkene hiçbir zaman değiştirmemek üzere 0Fh değeri yüklenir
misal alt_tersler equ xxh veya CBLOCK içinde tanımlanır,
programın başında
MOVLW 0Fh;
MOVWF alt_tersler;
dersin.
Sonra portb ye değer yüklenen her komuttan önce
yukarıdaki örnek için düşünürsek
ANDLW 30H ; extract PORTB segments
IORWF HHMM,W
XORWF alt_tersler,W ;W nin içindeki değerin alt 4 bitini tersler.
MOVWF PORTB ; and display
veya hiç değişken kullanmadan
yine aynı kısım için:
ANDLW 30H ; extract PORTB segments
IORWF HHMM,W
XORLW 0Fh ;w nin içindeki değerin alt 4 bitini tersler w ye yazar
MOVWF PORTB ; and display
mesaj birleştirme:: 24 Temmuz 2015, 15:35:42
PORTB ye BSF BCF xor and vs. gibi komutlar uygulanıyorsa onlarada bakmak lazım.
Alıntı yapılan: RaMu - 24 Temmuz 2015, 15:34:53
Programda PORTB ye değer yüklenen her yerde şu eki yapabilirsin:
misal orjinali şöyle ise;
ANDLW 30H ; extract PORTB segments
IORWF HHMM,W
MOVWF PORTB ; and display
Her MOVWF PORTB den sonra portb alt 4 bitini tersleyebilirsin;
ANDLW 30H ; extract PORTB segments
IORWF HHMM,W
MOVWF PORTB ; and display
MOVLW 0FH ;0 ile xor lanan bitler aynı kalır, 1 ile xor lanan bitler terslenir (1 ise 0, 0 ise 1 olur)
XORWF PORTB,F
PORTB ye değer yüklemenin hemen ardından terslendiği için bunu insan algılayamaz,
yinede iyi bir yöntem değil tabiki.
Hocam çok teşekkür ederim, bu önerinizi denedim proteusta sorunsuz çalışıyor.
En iyisini en sona saklamıştım,
diğerlerini örnek olsun diye yazdım.
Sondakini kullanman daha iyi olur.
ANDLW 30H ; extract PORTB segments
IORWF HHMM,W
XORLW 0Fh ;w nin içindeki değerin alt 4 bitini tersler w ye yazar
MOVWF PORTB ; and display
mesaj birleştirme:: 24 Temmuz 2015, 16:42:42
Ayrıca xor kapısı (exclusive or) nasıl çalışır bakabilirsin,
komutun mantığı oradan geliyor.
Farketmemişim son yazdığınızı. Tamamdır hocam son dediğiniz gibi değiştirdim. Tekrar teşekkür ederim.