Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Kesme+Timer

Başlatan gambit1244, 19 Ocak 2012, 09:12:38

gambit1244

merhaba ustalarım dünden beri uğraşıyorum 10 mikro saniyelik bir kesme üretemedim yada yapılamıyormu anlayamadım :(
timer0 ,1 ve 2 de denedim. çokta berbat olduğum bir konu olduğu için tıkandım :(
pic ile 10 mikrosaniyelik bir kesme programı varsa elinizde paylaşırsanız çok sevaba geçer
pwm okumak için ccs c de yazdığım programımımın içinde kullanacağım
şimdiden emeği geçen herkese teşekkürler..
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

Kabil ATICI

Umarım bunu isiste yapmaya çalışmamışsındır,çünkü gerçek zamanda simülasyon için iyi değil.

timer zamanlamasını ayarlarken, timer kesme bitini tekrar atayana kadar ki geçen süreyi de göz önüne almak gerekiyor. Forumda verilen bir program bağlantısı ile kesmede için ortalama  7 saat darbesi verilmiş ve bu süre sizin kesme bitini sıfırlayama yönteminize göre değişiklik gösterebilir.

Gerçi c konusunda bir şey diyemiyorum, ama c'de  kesme bitini sıfırlama için kaç saat döngüsü geçer araştırmak lazım.
ambar7

justice_for_all

kristal degerin ne peki?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

İşlemcin ve frekansın nedir?

16 serisini 20Mhz civarında çalıştırmadığın sürece C kullanarak 10us Timer int üretmek çok zor. Int rutinin kendisi bile bu kadar zaman alabilir.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

gambit
Elinde STM32f4 var. ve PWM ölçmek istiyorsun. Sağolsu Klein Hoca Bir örnek vermiş illaki PIC lemi Yapacaksın. 10Us ye inemezsin insende kesme olmaz artık

camby

#5
Uzun bir cevap yazmıştım ancak 100us sanmışım onu sildim o yüzden...

16f pic için yazıyorum.

10 us için :

- Timer0 ile minimum 256*0.2 =51.2 us. İptal.

- Timer1 'e de bulaşmıyorum.

1 - Timer2 : PR2 registerını 49'a set edersin. 50 cycle'da bir kesmen olur. 50*0.2= 10.000 us

Kesmenin içinde bayrak temizleme dışında bir şey olmasın yaklaşık 15 cycle. 3 us harcanır. 50 cycle'lık bir periyotta , 15 cycle kesmene 35 cycle kendi programına kalır. Kesmenin içinde başka şeyler varsa yandın.. Hocam da demiş kesmeye girdiğinde çıkana kadar yeni kesmeler gelebilir zamanında oradan çıkılmaz ise.

2 - Kesme kullanmadan Timer2 kullansak :

PR2 yine aynı şekil set etsen ancak kesmeler kapalı olsun. Programı da Timer2 kesme bayrağını bekleyerek başlasan. Sonra istediğin işleri yapsan kayıp minimuma iner. Şunun gibi :

BASLA          btfss    TMR2IF
                    GOTO   BASLA


                    ( Kendi kodların )


                    GOTO    BASLA

Bu yapı çok kısıtlar ancak deminki 15-35 cycle oranını değiştirir. 6-44 cycle gibi bir oran verir.

gambit1244

Alıntı yapılan: muhittin_kaplan - 19 Ocak 2012, 18:32:57
gambit
Elinde STM32f4 var. ve PWM ölçmek istiyorsun. Sağolsu Klein Hoca Bir örnek vermiş illaki PIC lemi Yapacaksın. 10Us ye inemezsin insende kesme olmaz artık

hocam doğru diyorsunuz fakat diyelimki bir devre yapmak istedim ve uçağımın içine koymak istedim şuan bu chipten bulup incecik pinlerle uğraşmaktansa bitane pic ile işi bitirebilirim belki diye düşündüm

evet isiste deniyorum sıkıntı ordan oluyor sanırım yeni kalktım :) bu gece tavsiyelerinize gore çalışma yapacağım hepinize tekrar teşekkürler cevaplarınız için
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

camby

10us lik kesme kullanarak PWM'i nasıl ölçeceksin ?

gambit1244

#8
Alıntı yapılan: camby - 20 Ocak 2012, 01:05:19
10us lik kesme kullanarak PWM'i nasıl ölçeceksin ?

pwm kanalını capture edeceğim
logic1 olduğu anda 100 us 100us saymaya başlayacağım
logic0 olduğunda saymayı durduracağım
logic1 kalma süresine göre pwm değerini belirleyeceğim

ölçmek istediğim pwm frekansı çok yavaş 50 hz
yani dogru hesaplamam gereken aralık 1000us
50us de bir kesme alabilsem yüzde 5 hata payı ile 20 kademe pwm ölçerim olur


Alıntı Yaptimer zamanlamasını ayarlarken, timer kesme bitini tekrar atayana kadar ki geçen süreyi de göz önüne almak gerekiyor. Forumda verilen bir program bağlantısı ile kesmede için ortalama  7 saat darbesi verilmiş ve bu süre sizin kesme bitini sıfırlayama yönteminize göre değişiklik gösterebilir.

hocam o hiç sıkıntı olmaz ben gelen süreye göre kumandamdan bir değer belirleyeceğim diyelimki yazdığım programda:
kumandayı en sağa aldığımda 2000 kesme yapıyor
2000= en sağ diyeceğim
tekrar ölçüp en sol diye belirleyip yine işin içinden çıkarım yeterki her tepe süresine göre bir değer alabileyim

Alıntı Yapİşlemcin ve frekansın nedir?

16 serisini 20Mhz civarında çalıştırmadığın sürece C kullanarak 10us Timer int üretmek çok zor. Int rutinin kendisi bile bu kadar zaman alabilir.
@bunalmıs hocam
şuan elimdeki deneme kartında pic18f4580 var üzerindede 20mhz kristal var
bu şekilde çalışır umarım
10 us den ziyade 50 ye kadar yolu var aslında ama 10 olsa kaliteli olur
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

justice_for_all

#9
timer instruction=(1/fosc)*4*(256-timer degeri)* bölme oranı

10 us=0,0000002 * (256- timer)*1

10us/0,0000002 =256-timer

50= 256-timer

timer=206 =>  timer degerine 205 yazarsan sana 10 us lik kesme uretir..(bölme oranı 1 olacak.)


Not : bu deger timer0 için gecerlidir.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

gambit1244

çok teşekkürler hocam
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

gambit1244

#11
ustam dünden beri uğraştım benim timer 16 bitmiş meğersem :)
neyse timer zamanlama olayını çozdüm buseferde çalıştırma kısmında takıldım
sanırım kesme içinde kesme oluyor gibi birşey oldu neyse bende kendi çozumumle devam ettim.
benim istediğim şey
capture kesmesinde iken i değişkenini 10 mikro saniyede bir bitane arttırsın
bunu ccs c de timersiz delay_us(10); komutu ile yapıyorum fakat bunu yapınca o işlemciyi başka bir iş için kullanamam ve ayrı bir işlemci daha koymam gerekir

neyse timer0 sız program cok güzel çalıştı
kumandada hiçbir yön vermediğimde hepsi sıfırı gösteriyor
en sağ +34    orta=0   en sol-34  olmak üzere her kanalı 68 parçaya bölüyor bu oldukça iyi bir değer

program kodunu ekliyorum bu kod daha çok gelişicek fakat yapmak isteyenlere fikir verebilir
ayrıca anlayan birisi bu işi timer ile nasıl yapabilirim fikir verirse cok memnun olurum
sağlıcakla..

#include <18F4580.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=20000000)
#use rs232(baud=38400, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli

int i=0; // Tamsayı tipinde değişken tanımlanıyor
int x=0;
int t=0;
int16 yeni=0;


//*********** CCP1 KESMESİ ******************
#INT_CCP1   // INT_CCP1 kesmesi fonksiyonu
void yakala1_kesmesi ()
{
if(x==0) // x değeri ilk çalışmada sıfır olacağı için mecburen ilk bölüm çalışacak ve yükselmesini bekliycek
{
t=0; //burada sinyal yükseldi ve ben saymaya başladım  sinyal yükselir yükselmez t değişkenimi sıfırladım
setup_ccp1(CCP_CAPTURE_fe); // artık sinyal yükseldiği için ccp1 düşen kenarı aktif ettim ve düşmesini bekliyorum
x=1; // x değişkeni sinyalin yükseldiğini ve artık düşmesini beklediğimi gösteriyor

}
else  // eğer sinyal daha yükselmemişse burayı hiçbizaman çalıştırma
{
setup_ccp1(CCP_CAPTURE_re);// else den geçtiyse sinyal düşmüş demektir bu yüzden döngüyü sağlamak için ccp1 yükselen kenarı aktif ettim ve artık yükselmesini bekliyorum
x=0;// x
printf("Deger=%d",t-119);  // buradaki -119 un sebebi şu   ilk programı yazdığımda hiçbir tuşa basmadığımda 119 yazıyordu bende ekrana bunun 119 eksiğini verdirtttim boylece kolu oynatmıyorken sıfır değeri aldım bu değerleri kolay okumamı sağladı
t=0; // değeri ekrana yazdıktan sonra tekrar sıfırladım
delay_ms(50); //bu komutu seri port şişmesin diye ekledim değişiklikleri 50ms de bir ekrana vericek
}
   
  
}



void main() {

   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
  
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı

   set_tris_b(0x00);   // B portu komple çıkış
   set_tris_c(0x07);   // RC0, RC1 ve RC2 pini giriş

   output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor
   setup_ccp1(CCP_CAPTURE_re); // CCP1 kesmesi her 4 yükselen kenarda 1 yakalama yapacak
 
   CCP_1_HIGH=0x00; // CCPR1H kaydedicisi sıfırlanıyor
   CCP_1_LOW=0x00;  // CCPR1H kaydedicisi sıfırlanıyor
   

  
   enable_interrupts(INT_CCP1);  // INT_CCP1 kesmesi aktif yapılıyor
   enable_interrupts(GLOBAL);    // Aktif edilen kesmelere izin ver
   
   

   
   printf("START!");
   Delay_ms(10);
   

   while(TRUE) {
   while(x==1)  //capture kesmesi aktif olmuyorsa burayı boşa saydırmanın bir anlamı yok.
   {
    t++; //bu bölüm timer0 kesmesini yapamadığım için eklendi. capture kesmesinin nekadar zaman aktif kaldığını ölçmemi sağlıyor. 3mikro saniyede bir bitane artıyor. kesme sonunda eğer 100 tane arttıysa 300mikro saniye geçmiş diyoruz.
    delay_us(3);
   }

     }
   
}

[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.