Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

1us timer 1 sorunu

Başlatan fay_elektronik, 19 Eylül 2022, 17:30:11

fay_elektronik

Arkadaşlar kolay gelsin timer1 ile 1us aralıkta kesme yapmak istiyorum lakin 125us nin altında bir türlü yapamadım nerde hata yapıyorum anlamadım
1/8000000=0,000000125sn=0,125us yapar timer icine sadece ledi toggele yaptırsan 0,125us de high olması gerekiyor if komuyu ile 8 kesmede 1 us yalamam gerek lakin ne yaptıysam hep 125us aldım
kesmeyi tasma olarakta kullandım compare olarakta denedim bir türlü 125us den aşağı indiremedim 

JOKERAS

Timer clock kaynağı,Pre,Post Ön,son bölücü ayarları.
İşlemcinin o kısmına ait pdf ve registerleri eklerseniz Süper olurdu.

erkantr67

Denenen kodu burada paylaşmanız gerekiyor.

Soru işaretleri;

-MCU bilgisi(timer birimi clock kaynağını kaça bölerek kullanıyor?)
-Clock kaynağı
-Timer ayarları
-Donanım
-Diğer olasılıklar vb.

Not: Biz sizin ilgili MCU'ya, kullanılan birim hakkındaki detaylara ya da kodlamaya ne kadar vakıf olduğunuzu bilemeyiz.

Bilemediğimiz için de size hangi detaylardan yaklaşarak açıklama yapacağımızı kestiremeyiz.

Eğer riske girersek siz yanlış anlayabilirsiniz("-o kadar da değil, onu biliyoruz..."). Bu yüzden sizden parantez içindeki gibi bir cevap gelirse; bu sefer biz üzülürüz.


Kabil ATICI

#3
Öncelikle bunu Arduino üzerinde yapıyorsan hele ki komutları kullanarak yapıyorsan, istediğin sonuca ulaşamazsın. Çünkü fonksiyonlar için zaman kaybı oldukça fazladır.

Elde etmek istediğin zamanlama birimini OC1A veya OC1B çıkışları üzerinden ulaşabilirsin. Yani donanımsal timer çıkışlarını kullanarak.

illede komut kullanacağım diyorsan ASM komutları üzerinden gitmek lazım ki, en azından her komut için gereken zaman kaybını (gecikmesi) görebilesin.

Kullandığın ide programına göre sonuç alacağın ortada. Datasheet oku. Orada kod örnekleri yer almaktadır.
ambar7

Tagli

8 MHz'de çalışan bir işlemcide 1 MHz frekansta kesme üretmeye çalışıyorsan sistem tasarımında çok ciddi bir hata var demektir. Ben STM32F4 gibi bir işlemci ile bile 1 us'de bir kesme üretmeye çalışmazdım. Yapmak istediğin işi anlatırsan belki daha makul bir çözüm önerebiliriz.
Gökçe Tağlıoğlu

fay_elektronik

Arkadaşlar özür dilerim atmega 328p kullanıyorum ardunio kullanmıyorum atmel sutudio ile c ile yazıyorum atmelin registerlarina hakimim low level yazıyorum çok fonksiyon kullanmıyorum
Sayın tagli neticede bir komut işleme süresi 1/8000000=0.000000125=0.125us olmuyormu 1us kesme yapamamamı açıklama imkanınız varmı en azından bilgi bilgidir
Teşekkürler

Erol YILMAZ

İnterrupt a gir çık 6 cycle,
İnt içinde kaç cycle lık kod koşacak ?

2 cycle kod olmaz ama tut ki olsa mcu int ten çıkamaz zaten.

Bu tasarım düşüncesi hatalı.

fay_elektronik

Açıklamanız için teşekkürler

erkantr67

#8
MCU'da komutları çekirdek işler. Yani bir komutun işletim algoritması çekirdektedir. 8 MHz clock kaynağını çekirdek kullanır. Kullandığı bu ham clock kaynağını birimlere kendisi verir. Örneğin; ROM'daki komutun kaynak ve hedef adreslerini okurken program sayacı en az iki defa arttırması gerekir(Yapıya göre değişir), bunun için çekirdeğin program sayacına en az iki clock yollaması gerekir. Yine çekilen kaynak ve hedef datalarının işleme tabi tutulması için çekirdek, ilgili birime tekrardan clock yollaması gerekir. Şuan halen daha komut işlenmedi(dikkat)! Sonucu hedefin RAM adresine yazması için yine ilgili arabirime clock yollayıp işlemleri yaptırması gerekiyor.

Ne oldu şuan? Ham clock sinyalimizin neredeyse 5 tanesini kullandık, bir komut ancak tamamlandı. Yani siz timer'ı kurdunuz, sayaç kesmesi geldi, interrupt flag'i setlendi, interrupt vektörüne gittiniz orada bir a ile b değerine and işlemi uyguladınız. Zaten bir komut 5 cycle'da tamamlanırken ve zaten bir komutun işlenmesi en az 1 us sürüyorken, 1 us'lik kesme oluşturmaya çalıştınız. Yani olamaz.

Not: Değerler temsilidir.

Dip not: Tek saykılla komut tamamlayan bilgisayarlar da vardır. Nasıl yapar? Tek bir clock sinyali geldiğinden x4, x5 vs. PLL'i devreye sokar, devreye aldığı anda çekirdeğin birimleri yönettiği clock kaynağını PLL'e çevirir. 1 komut süresince hallolur. Ya da değişik ROM ve RAM yapısıyla bu süre kısaltılabilir. Düşünmek lazım.


https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf
Sayfa 14-18
Resim eki: