Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: fay_elektronik - 19 Eylül 2022, 17:30:11

Başlık: 1us timer 1 sorunu
Gönderen: fay_elektronik - 19 Eylül 2022, 17:30:11
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 
Başlık: Ynt: 1us timer 1 sorunu
Gönderen: JOKERAS - 19 Eylül 2022, 20:23:56
Timer clock kaynağı,Pre,Post Ön,son bölücü ayarları.
İşlemcinin o kısmına ait pdf ve registerleri eklerseniz Süper olurdu.
Başlık: Ynt: 1us timer 1 sorunu
Gönderen: ziyaretci - 19 Eylül 2022, 20:28:58
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.

Başlık: Ynt: 1us timer 1 sorunu
Gönderen: Kabil ATICI - 20 Eylül 2022, 14:15:32
Ö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.
Başlık: Ynt: 1us timer 1 sorunu
Gönderen: Tagli - 20 Eylül 2022, 17:40:01
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.
Başlık: Ynt: 1us timer 1 sorunu
Gönderen: fay_elektronik - 20 Eylül 2022, 21:09:54
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
Başlık: Ynt: 1us timer 1 sorunu
Gönderen: Erol YILMAZ - 20 Eylül 2022, 21:22:13
İ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ı.
Başlık: Ynt: 1us timer 1 sorunu
Gönderen: fay_elektronik - 20 Eylül 2022, 22:41:23
Açıklamanız için teşekkürler
Başlık: Ynt: 1us timer 1 sorunu
Gönderen: ziyaretci - 20 Eylül 2022, 22:52:39
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 (https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf)
Sayfa 14-18
Resim eki:

(https://i.ibb.co/L5dWcgp/fdf3.png) (https://ibb.co/L5dWcgp)


(https://i.ibb.co/FXgXz54/fdf4.png) (https://ibb.co/FXgXz54)