Zamanlayıcı (timer), kesme (interrupt) kullanımıyla ilgili alıştırma yapmak ve Arduino öğreticilerinin çoğunlukla kullandığı Hc-Sr04' ün AVR ve C ile kullanımını anlatmaya çalışacağım. Hc-Sr04 sensörler ses ile mesafe ölçümü yapmakta kullanılır. İnternette birçok yazı mevcut ama kabaca anlatacağım.
Hc-Sr04
Bilgi sayfasına buradan erişebilirsiniz. Hc-Sr04 3mm hassasiyetinde 2cm ile 400cm arası temassız ölçüm yapabilen bir sensördür. Sensör üstünde 4 adet pin bulunur.
Vcc: +5 volt besleme.
Trig: Sensörün ölçüme başlaması için sinyal gönderilen pin.
Echo: Çıkış pini, high "1" seviyede olduğu süreyi ölçeceğiz.
Gnd: (0 Volt) Negatif besleme.
Sensörün çalışması oldukça basit. Bilgi sayfasına göre ilk yapılması gereken Trig pinini 10us süreyle high "1" yapıp, low "0" yapmaktır. Sonrasında sensör 40kHz frekansında 8 ses dalgası gönderir ve Echo pinini high "1" yapar. Echo pini sensöre ses dönüşü olana kadar high "1" olarak kalır. Echo pininin high "1" olduğu an ve low "0" olduğu an arasında geçen süre sesin bir engele çarpıp geri döndüğü süredir. Bilgi sayfasına göre yüzey 0,5m² ve daha büyük, ayrıca pürüzsüz olursa daha doğru ölçüm yapılacaktır. Sesin gidiş ve dönüşü arasında geçen süreyi sınırlamak gerekir. Bu yapılmazsa ölçüm sınırının dışına çıkılır ve hatalı sonuç alınır. Ayrıca önlem alınmazsa döngü içinde tekrar Trig pininin high "1" olması gibi bir durum gerçekleşebilir.
Echo pininin high olduğu sürenin, sesin gidiş dönüş süresi olduğunu ve bu sürenin yarısını almamız gerektiğini unutmamak gerekir. Sesin hızı ortamın yoğunluğuna göre değişir. Katıda suya göre, su içinde havaya göre daha hızlıdır. Havanın sıcaklık ve yüksekliğe göre yoğunluğu değiştiğinden sesin hızı da değişir. Ben ses hızını 344m/s olarak alacağım. Buna göre ses 1sn de 344 metre gider. Birimleri cm ve us cinsine çevirdiğimizde 0,0344cm/us yani 1us de 0,0344cm yol gider. Yol=hızXzaman formülüne göre işlem yaparak aradaki mesafeyi buluruz. Echo high süresi için kronometre görevi görecek zamanlayıcı birimini kullanacağız.
Timer/Counter1 (TC 1)
Önceki yazıda Timer0 birimini kullandım. Sensöre 400cm ölçüm yaptırmak istediğimizde 11.627us, 1cm için 29us gerekir. (yol=hızXzaman, 400=0,0344Xzaman, zaman= 400/0,0344)
Mikro saniye hassasiyetinde sayabilmeli fakat çok büyük sayaç değerleri olmamalı. 16MHz de prescaler değeri 8 seçilirse en uygun değerleri bulabiliriz. Bu durumda sayaç değeri limit yani 400cm mesafede gidiş dönüş için 23.254 gibi bir değer tutmalıdır. Bu ancak 16 bitlik bir zamanlayıcı biriminde yapılabilir. Bu nedenle Timer1 birimini kullanacağız.
Mikro saniye hassasiyetinde sayabilmeli fakat çok büyük sayaç değerleri olmamalı. 16MHz de prescaler değeri 8 seçilirse en uygun değerleri bulabiliriz. Bu durumda sayaç değeri limit yani 400cm mesafede gidiş dönüş için 23.254 gibi bir değer tutmalıdır. Bu ancak 16 bitlik bir zamanlayıcı biriminde yapılabilir. Bu nedenle Timer1 birimini kullanacağız.
TCNT1
TCNT1 kristal veya seçilebilen farklı bir kaynaktan gelen saat darbesiyle artarak sayım yapan registerdir. TCNTL ve TCNTH olarak iki 8 bit registerde veri tutulur. TCNT1 üst değer olan 65535 0xFFFF e kadar artabilir. Bizim için fazlasıyla yeterli bir değerdir.
Yukarıda TC1 şeması bulunmaktadır. Birimde bulunan kontrol registerleriyle istediğimiz ayarlamaları yapacağız. Yukarıda bahsettiğim gibi prescaler değerini 8 alacağız. Uygun bir çözünürlük ve kayıt edebileceğimiz büyüklükte değerler vermektedir.
Bu seçim sonucunda 1sn de 16.000.000/8 saat darbesi yani 2.000.000 olacaktır. Bir mikro saniye 2 darbe olacaktır. TCNT1 değerini 2' ye böldüğümüzde "us" cinsinden süreyi buluruz. Prescaler 8 için CS11 isimli bit "1" olmalıdır.
OCR1A
Zamanlayıcı birimini sürenin tespiti yanında sensörün ihtiyaç duyduğu beklemeleri yapması için de kullanacağız. Bunun için OCR1A registerini kullanacağız. TCNT1 gibi 16 bit bir registerdir. OCR1AL ve OCR1AH isimli iki 8 bit registerden oluşur. Timer1 birimiyle istediğimizi yapmak için TCNT1 ile eşleşme olduğunda kesme oluşmalı ve TCNT1 sıfırlanmalıdır. Bunu CTC moduyla yapabiliriz.
Şekilde görüldüğü gibi eşleşmede kesme oluşuyor ve TCNT1 sıfırlanıyor. CTC modu için aşağıdaki şekilde görüldüğü gibi mode 4 seçilmeli bunun için WGM12 "1" yapılmalıdır.
TC1 Kontrol Registerleri
TCCR1A registerinde yer alan bitler bizim seçimlerimizi ilgilendiren bitler olmadığından burada değinmeyeceğim. TCCR1B registeri aşağıdaki gibidir. İstediğimiz ayarlar için WGM12 ve CS11 "1" yapılacak.
Mesafe Ölçümü ve Kontrol
Bunun için timer1 OCR1A eşleştirme ve Pin değişim kesmeleri kullanacağız. Zamanlayıcı kesmesi trig pininin high "1" olması ve 10us bu şekilde kalmasını sağlayacak. Bunun sonucunda echo high "1" olacak, bu değişimin olduğu anı belirlemek için pin değişim kesmesini kullanacağız. Sesin geri dönüşüne kadar sayacı başlatıp echo low "0" olana kadar sayacağız. Bu sayım süresini kısıtlayarak hem limit dışı ölçümleri düzelteceğiz hem de ölçüm için gereksiz bekleme yapmayarak döngüyü hızlandıracağız. Echo low "0" olduğunda yine pin değişim kesmesi gerçekleşecek, bu olduğunda sayma işlemini durdurup sayacın değerini kayıt altına alacağız. Böylece bir döngü halinde ölçüm işlemini tamamlayacağız. Sayaç değerini gidiş dönüş süresi ve mikro saniye dönüşümü için 4' e böleceğiz ve ses hızıyla çarparak mesafeyi bulacağız.
Bulduğumuz mesafeyi istediğimiz mesafe ile arasında oluşan farka göre değerlendirip, negatif ise geri pozitif ise ileri yön veriyoruz. Fark oransal (P) katsayı ile çarpılarak motorların hareket eşiği olan PWM değerine eklenerek motorun hızını ayarlıyoruz. Kod içinde yeterli açıklama olduğunu düşünüyorum bu nedenle daha fazla uzatmadan yazıyı burada sonlandırıyorum.
/* * Ppwm_hcsr04.c * * Created: 24.12.2019 20:26:48 * Author : simsek */ #define F_CPU 16000000ul #include <avr/io.h> #include <avr/interrupt.h> #define UART_Rx_Boyut 64 #define UART_Tx_Boyut 64 #define UART_Rx_Mask (UART_Rx_Boyut-1) #define UART_Tx_Mask (UART_Tx_Boyut-1) #define UART_Bos_On UCSR0B|=(1<<UDRIE0) #define UART_Bos_Off UCSR0B&=~(1<<UDRIE0) #define h_sol PORTD5 #define h_sag PORTD6 #define echo PORTD2 #define trig PORTB4 #define TRIG_H PORTB|=(1<<trig) #define TRIG_L PORTB&=~(1<<trig) // 16MHz, prescaler 8,1us 2 saat darbesi, OCR1A değeri/2=X us #define trig_delay 20 // 10us #define limit_sayac 20000 // 172cm/0,0344=5000us TCNT sınır (gidiş-geliş 20000, tek yön 10000) #define limit_mesafe 172 // 172cm/0,0344=5000us TCNT sınır (gidiş-geliş 20000, tek yön 10000) #define olcme_delay 2000 //1ms ölçüm arası bekleme #define ses_hizi 0.0344 //0.0344cm/us ile cm veya 0.344mm/us ile mm ölçülür uint8_t ist_mesafe=12, pkat=5;//pkat oransal katsayı uint8_t m_durum=0; int8_t hiz=200, *ptrhiz=&hiz; int16_t hata=0, ppwm=0; uint16_t pwm_motor=0, ort_mesafe=0; volatile uint16_t sayac=0, top_mesafe=0; volatile uint8_t durum=0, olcme=0; volatile uint8_t rx_bas=0,rx_son=0,tx_bas=0,tx_son=0; volatile uint8_t rx_ring[UART_Rx_Boyut]; volatile uint8_t tx_ring[UART_Tx_Boyut]; void dur(); void ileri_git(); void geri_git(); void sag_git(); void sol_git(); void sag_ileri_git(); void sol_ileri_git(); void sag_geri_git(); void sol_geri_git(); void hiz_1(); void hiz_2(); void hiz_3(); void hiz_4(); void hiz_5(); void pwm_pin(uint8_t _pin,uint8_t _pwm); void pin_kesme(); void kopek_ayar(); void zaman1_ayar(); void uart_basla(uint32_t baud); uint8_t uart_oku(); void uart_gonder(uint8_t uData); void uart_dizi(char*str); uint8_t uart_gelen(); void (*motor[14])(void)={ dur, ileri_git, geri_git, sag_git, sol_git, sag_ileri_git, sol_ileri_git, sag_geri_git, sol_geri_git, hiz_1, hiz_2, hiz_3, hiz_4, hiz_5, }; ISR (TIMER1_COMPA_vect){ switch (durum){ case 0:// timer ilk kesme oldu TRIG_H;// trig pin high OCR1A=trig_delay; durum++; break; case 1: // trig pin bekleme sonrası TRIG_L; //trig pin low OCR1A=limit_sayac; durum++;// echo kesme olmazsa, ölçüm yapılamadı break; case 2: // ölçüm yapılmadı, top_mesafe+=limit_mesafe; olcme++;//ortalama için toplanan değer sayısını belirliyoruz durum=0;// ölçüm yapılmadı başa dön, else kullanmamak için önceden değişti if (!(olcme&0x03)){//4 ölçüm olduğunda durum=4;// mesafe ölçüldü bilgisi için 4 oldu olcme=0; TCCR1B=0x00;// timer durdu } break; case 3:// ölçüm yapıldı, top_mesafe+=(sayac*ses_hizi);//YOL=HIZxZAMAN olcme++;////ortalama için toplanan değer sayısını belirliyoruz durum=0;// başa dön, else kullanmamak için önceden değişti if (!(olcme&0x03)){//4 ölçüm olduğunda durum=4;// mesafe ölçüldü bilgisi için 4 oldu olcme=0; TCCR1B=0x00;// timer durdu } break; default: durum=0; break; } } ISR (INT0_vect){ if (durum==2){ if (!(PIND&(1<<echo))){// echo low kesme oldu, ölçüm yapıldı sayac=TCNT1;// sayaç TCNT ile eşitlendi sayac>>=2;// sesin gidiş ve dönüşü ve 2 darbe 1us hesabı için 4'e bölüyoruz, geçen us bulundu durum++;// zaman kesmesinde durumu değiştiriyoruz. durum=3 OCR1A=olcme_delay; }else{ TCNT1=0;//echo ilk kesme, sesin dönüşü için TCNT sıfırlandı } } } ISR (USART_RX_vect){ rx_bas=(rx_bas+1) & UART_Rx_Mask; rx_ring[rx_bas]= UDR0; } ISR (USART_UDRE_vect){ tx_son=(tx_son+1)&UART_Tx_Mask; UDR0=tx_ring[tx_son]; if (tx_son==tx_bas) UART_Bos_Off; } int main(void){ DDRB|=(1<<PORTB0)|(1<<PORTB1)|(1<<PORTB2)|(1<<PORTB3)|(1<<trig); uart_basla(115200); pin_kesme(); zaman1_ayar(); while (1){ if (durum==4){ durum=0;// döngüye devam etmek için 0 yapıldı ort_mesafe=(top_mesafe>>2); //ortalama için 4' e böldük top_mesafe=0; hata=ort_mesafe-ist_mesafe; //istenen mesafe ile ölçülen mesafenin farkı ppwm=hata*pkat; if (hata>0){ pwm_motor=ppwm+165; if (pwm_motor>230){// motor hızını sınırladım pwm_motor=230;} *ptrhiz=pwm_motor; ileri_git(); } if (hata<0){ pwm_motor=-(ppwm-165); if (pwm_motor>230){ pwm_motor=230;} *ptrhiz=pwm_motor; geri_git(); } if (hata==0){ pwm_motor=0; *ptrhiz=pwm_motor; dur(); } TCCR1B|=(1<<WGM12)|(1<<CS11);//timer başladı } /*if (uart_gelen()){ m_durum=uart_oku(); motor[m_durum](); }else { m_durum=0; }*/ } } ///////////////// void zaman1_ayar(){ TCCR1B|=(1<<WGM12)|(1<<CS11);// CTC ve prescaler 8, 1us 2 saat darbesi. TIMSK1|=(1<<OCIE1A); OCR1A=olcme_delay; sei(); } void pin_kesme(){ DDRD&=~(1<<echo);//pd2 giriş yapıldı EICRA|=(1<<ISC00);// kesme akif EIMSK|=(1<<INT0);//echo pin değişim aktif sei(); //tüm kesmeler açıldı } //////////////// motor void dur(){ pwm_pin(h_sag,0); pwm_pin(h_sol,0); PORTB&=~(0x0F); } void ileri_git(){ pwm_pin(h_sag,hiz); pwm_pin(h_sol,hiz); PORTB=(PORTB&(0xF0))|(0x03); } void geri_git(){ pwm_pin(h_sag,hiz); pwm_pin(h_sol,hiz); PORTB=(PORTB&(0xF0))|(0x0C); } void sag_git(){ pwm_pin(h_sag,hiz); pwm_pin(h_sol,hiz); PORTB=(PORTB&(0xF0))|(0x05); } void sol_git(){ pwm_pin(h_sag,hiz); pwm_pin(h_sol,hiz); PORTB=(PORTB&(0xF0))|(0x0A); } void sag_ileri_git(){ pwm_pin(h_sag,hiz-(hiz>>3)); pwm_pin(h_sol,hiz); PORTB=(PORTB&(0xF0))|(0x03); } void sol_ileri_git(){ pwm_pin(h_sag,hiz); pwm_pin(h_sol,hiz-(hiz>>3)); PORTB=(PORTB&(0xF0))|(0x03); } void sag_geri_git(){ pwm_pin(h_sag,hiz-(hiz>>3)); pwm_pin(h_sol,hiz); PORTB=(PORTB&(0xF0))|(0x0C); } void sol_geri_git(){ pwm_pin(h_sag,hiz); pwm_pin(h_sol,hiz-(hiz>>3)); PORTB=(PORTB&(0xF0))|(0x0C); } void hiz_1(){*ptrhiz=180;} void hiz_2(){*ptrhiz=190;} void hiz_3(){*ptrhiz=210;} void hiz_4(){*ptrhiz=220;} void hiz_5(){*ptrhiz=230;} //////////////// pwm void pwm_pin(uint8_t _pin,uint8_t _pwm){ if(_pin==5){ DDRD|=(1<<PORTD5); TCCR0A|=(1<<COM0B1)|(1<<WGM00); TCCR0B|=(1<<CS00); OCR0B=_pwm; } else if(_pin==6){ DDRD|=(1<<PORTD6); TCCR0A|=(1<<COM0A1)|(1<<WGM00); TCCR0B|=(1<<CS00); OCR0A=_pwm; } } //////////////// uart void uart_basla(uint32_t baud){ uint16_t baudRate=0; baudRate=(F_CPU/baud/16)-1; if (baud>=115200){ baudRate=(F_CPU/baud/8)-1; UCSR0A|=(1<<U2X0); } UBRR0H=(baudRate>>8); UBRR0L=baudRate; UCSR0B|=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0); UCSR0C|=(1<<UCSZ01)|(1<<UCSZ00); sei(); } uint8_t uart_oku(){ rx_son=(rx_son+1) & UART_Rx_Mask; return rx_ring[rx_son]; } void uart_gonder(uint8_t uData){ tx_bas=(tx_bas+1)&UART_Tx_Mask; tx_ring[tx_bas]=uData; UART_Bos_On; } void uart_dizi(char*str){ while(*str){ uart_gonder (*str++); } } uint8_t uart_gelen(){ if (rx_son==rx_bas){ return 0; } return 1; }
Merhaba. Blogunuzu ilgi ile takip ediyorum. Daha önce yine sormuştum. VFD (SPWM) ile alakalı . Aşağıda yazmış olduğum komutlar mevcut yalnız adc ile frekansı yani motorun hızını değiştiremiyorum.
YanıtlaSil/* Written by : MESUT ERDEN
Timer3 mode changed to Fast PWM (due to problems in frequency change)
3 phase SPWM outputs on OCR1A,OCR1B,OCR1C V1.0 2011
Carrier frequency = 15.6 KHz
Sine frequency range = 0.5-100Hz with 0.1Hz step
PWM resolution = 8bit
mega64 oscillator frequency = 8MHz
Frequency varies by applied voltage to ADC0(PF0)
ADC Vref = AVcc
ADC result<14 ---> output off
ADC result: 14-1009 ---> f: 0.5 Hz - 100 Hz
ADC result>1009 ---> f=100 Hz
*/
Merhaba, ADC çıkış voltajınızı ölçmeye yarar frekansı timer kesmesinin süresini azaltarak artırabilirsiniz. Aşağıdaki kodlar ya eksik ya hatalı, kod yapıştırma sitelerini kullanarak link paylaşırsanız daha anlaşılır olur. Timer ayarları yapılmış ama timer1 ve timer3 için prescaler ayarı yapılmamış CSnX 0 ayarlı bu durumda timer çalışmaz.
SilCevap için teşekkürler. Dediğiniz düzeltmeyi yaptım. Ama sonuç yine aynı aslında spwm alıyorum yalnız frekansı değiştiremiyorum. Application noteları arayıp taradım tek anladığım sinus tablosunu okuma hızı ile çıkış frekansı bağlantılı.
SilKomutlar: https://paste.ofcode.org/exKaM6nDsZp2BpGdGffkrH
Bu şekilde daha iyi oldu. ADC ile ölçüm sonucuna göre speed değişkenini değiştiriyor ve bu şekilde frekans değişiyor. Mantık bu ama sorunlar ve eksikler var. ADCW, ETIMSK ve ETIFR isimli registerler nedir? ADC kesmesi içindeki OCR3A degerini timer dizisi ve speed değişkeni belirliyor bunu el ile değiştirerek kontrol edebilirsiniz. Bir de kesme girişinde sıfırlanan değişkenler var bunların değerleri artmaz dolayisiyla ıf koşulları gerçekleşmez.
SilETIMSK ve ETIFR atmega64a eklenmis timer registerlermiş ama ADCW nedir bulamadım.
SilADCW doğrudan 10 bit sonucu gönderiyor. Yalnız sinus işaretinde çok fazla harmonik var ve bu motor için iyi değil. Aslinda AVR 447 ve AVR 449 da anlatmış ama orada nasıl frekansı değiştiğinin pek anlayamadım açıkcası
Silhttp://ww1.microchip.com/downloads/en/AppNotes/doc8010.pdf
http://ww1.microchip.com/downloads/en/AppNotes/doc8030.pdf
Bu arada ilginiz için teşekkürler
#include
YanıtlaSil#include
volatile unsigned int speed;
ISR(TIMER3_COMPA_vect)
{
static unsigned char index=0;
if (speed>794)index+=16;
else if(speed>594)index+=8;
else if(speed>394)index+=4;
else if(speed>194)index+=2;
else ++index;
OCR1A=sine[index];
OCR1B=sine[(unsigned char)(index+84U)];
OCR1CL=sine[(unsigned char)(index+170U)];
}
ISR(ADC_vect)
{
static unsigned int adc_temp=0;
static unsigned char n=0;
adc_temp+=ADCW;
ADCSRA|=(1<>6);
adc_temp=0;
if(temp<14)
{
TCCR1A&=~((1<>8);
OCR3AL=(unsigned char)temp;
TCCR1A|=((1<<COM1A1)|(1<<COM1B1)|(1<<COM1C1));
TCCR3B|=(1<<CS00);
ETIMSK|=(1<<OCIE3A);
}
}
}
int main(void)
{
DDRB=(1<<PORTB7)|(1<<PORTB6)|(1<<PORTB5);
ADMUX=(1<<REFS0);
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1);
OCR1A=sine[0];
OCR1B=sine[84];
OCR1CL=sine[170];
TCCR1A=(1<<WGM30);
TCCR1B=(1<<CS00);
TCCR3A=(1<<WGM31)|(1<<WGM30);
TCCR3B=(1<<WGM33)|(1<<WGM32);
sei();
while (1);
}
const unsigned char sine[256]={
YanıtlaSil0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c};
Birde 996 karakterlik TIMER Tablosu var. uzun olduğundan yazamıyorum buraya :)
YanıtlaSiltımer3 için o
YanıtlaSil