TMR0 kesmesi ve PIC ile dimmer

Başlatan humanus, 21 Mart 2009, 00:43:54

humanus

Bir dijital kontrollü dimmer yapmak  istiyorum. Sıfır geçiş kontrolü yaparak dimming işlemini yapıyorum. PIC sadece bu işi yapıyorsa sorun yok; oldukça kararlı bir dimmer olarak çalışıyor. Ama ben aynı zamanda multipleks display sürmek, buton kontrolü yapmak zorundayım. Sıfır geçişe bir kesme atadım, fakat bu kesme sırasında bazen başka bir kesmenin gerektirdiği işler yapılmakta olduğundan kesmeyi atlıyabiliyor ve lamba salınımlı yanmaya başlıyor. Bir türlü stabiliteyi sağlayamadım. Kod çok uzun , buraya koyamıyorum. Ustalardan en azından kesme içindeyken başka bir kesmeyi anlayabilmenin yolunu öğrenmek istiyorum.

Tagli

Normalde PIC'ler, kesme vektörüne atlandığında, kesmeye sebep olan bayrağın sürekli kesme üretmeye devam edip sonsuz döngüye girilmesini engellemek için GIE'yi 0 yaparak kesmeleri kapatırlar. Kesme bölümünde kesme kaynağına göre dallanma yapıldıktan sonra ilgili kesme bayrağı sıfırlanarak GIE tekrar açılabilir, böylece gelebilecek başka türden ikinci bir kesmeye imkan verilir. Ama ilk kesmeye sebep olan şart devam ediyorsa aynı kesmeden bir tane daha gelir ki sonuç yine sonsuz döngü ve kilitlenmedir. Ayrıca bazı kesme bayrakları yazılımda sıfırlanamaz, gerekli şartlar sağlanınca donanım tarafından otomatik olarak sıfırlanırlar, örneğin seri iletişim kesmeleri gibi.

18 serisi PIC'lerde kesmeler önceliklerine göre iki sınıfa ayrılabilir, ve bunlar istenildiği gibi sınıflandırılabilir (daha ileri modellerde daha karmaşık çözümler de var sanırım). Düşük öncelikli bir kesme işlenirken yüksek öncelikli bir kesme gelirse PIC yapmakta olduğu işi bırakıp yüksek öncelikli kesmeyle ilgilenmeye başlar. İşi bitince düşük öncelikli kesmeye geri döner. Yüksek işlenirken düşük öncelikli kesme gelirse ne olduğundan emin değilim, datasheet'i bir okumak gerek. Bu şekilde sorunu çözebilirsin bence ama 16 serisi için uzun bir ASM programı yazdıysan bunu 18 serisine uyarlamak çok zahmetli olacaktır.
Gökçe Tağlıoğlu

parda

Sizin sorununuzun prensipten sebebli başka bir sıkıntısı var diye düşünüyorum kesmelerin çakışması gözle fark edilecek bir salınıma neden olmamalı örnek vermek gerekirse çok uzun kesme programları veya kesme programlarında bekleme komutları, yetersiz saat hızı gibi en azından programınızın  kesme kısmını koyarsanız daha çok cevap alabilirsiniz.

Kolaylıklar
Bildiğim tek şey, hiç bir şey bilmediğimdir.

humanus

Cevaplar için teşekkür ediyorum. 18 serisini kabaca inceleme şansım oldu. Ama dediğiniz gibi 16f için yazılmış uzunca bir kodu bu seriye aktarmayı ve çıkacak sorunlarla baş etmeyi göze alamadım. Daha önce 16f877 için yazdığım bir kodu 16f887'ye aktarırken bile bayağı bir sıkıntı çekmiştim ki bu apayrı bir aile. Neyse sonuç alabilirsem buraya yazacağım.