birden fazla kesme yada zamanlayıcı kullanmak 16f1827 picbasic+asm

Başlatan safaka123, 06 Kasım 2018, 00:21:24

safaka123

Merhaba,
Bugüne kadar pwm ve timer kesme olarak çeşitli devrelerde kullandım. Şimdikinde ise tmr0 kesmesini kullanıyorum. bu kesme haricindeki kalan kısmı ise yine bir zamanlama ile kullanmak istiyorum.
TV de siyah beyaz yazı yazmak istiyorum. buradaki yatay senkron palsini tmr0 ile ayarladım. bana iş yapılacak süre olarak
52 usn kalıyor bunu ise nano saniye düzeyinde bir sayaçla kontrol edip doğru zamanda doğru bilginin ekrana yansımasını sağlamalıyım. Kesme olarak tmr0 ON INTERRUPT GoTo KESME ile gönderip işimi görüyorum. 2. zamanlamayı kesme yada zaman kontrolümü yapmalıyım. bir yandan pwm sinyali üretip iş yapma zamanı geldiğinde pwm sinyalini girdiğim bir pini kontrol edip 1 seviyesindeyse işlem yapabilirim diye düşünüyorum, fakat bu şekilde yapmak yerine bunu da bir kesme gibi kontrol edebilirmiyim.  şu anda internal osc kullanıyorum.  işlemci 32mhz de kullanılıyor. 
Ya da Daha uygun bir çözümünüz var mı.

ete

İŞlem sıranı çok açık anlayamadım. Ancak şunu söyleyebilirim.
Bu gibi işlerde zamanlamanın birini kesmeye bağlarım. Diğerini ise kesme rutini içine sokmadan yalnızca kesme bayrağını kontrol ederek yaparım.
Örnekle açıklayayım.
Her 100 us de bir kesmeyi TMR0 ile yaratmış olalım. Bana ayrıca her 50 ms de bir kontrol işi için zamanlama gerekiyor ise onuda TMR1 ile ayarlarım. TMR1' her 50 ms de bir kesme yaratacak şekilde kurarım. Kesme bayrağı PIR1.0 da yer alır.
WHILE PIR1.0=0
Burada 50 ms lik kontrol işimi yaparım
wend
program buraya geldiği zaman pIR1.0=1 olacak ve 50 ms geçmiş olacaktır. Ama arada TMR0 da kesmeye gidecektir.
PIR1.0=1 olacağı için onu sıfırlar ve yeniden TMR1 ön yükleme değerlerini verip programı tekrar while wend döngüsüne gönderirim. Böylece iki iş de hassas bir zamanlama ile yapılmış olacaktır.

Ete

Hattuşa

slm hocam;
interrupt içerisinde aynı anda 2 tmr kesmesini de kullandığım zaman bir sorun yaratmadı. hatta bu kesmenin bir tanesinin içinde adc interruptu da kullandım. üzerine birde hc 05 için usart kesmesini de kullandım. ticari bir proje olduğu için açık kaynak kodunu vermemem ama bu tip bir kod örneği yazabilirim. burada püf noktası kesme içerisinde ilgili rutinlerde fazla oyalanmayacaksın. ayrıca her girdiğin kesmede bayrağı en sona set edeceksin.

safaka123

yanıtlarınız için teşekkürler. fakat ete beyin yolunu izlemeyi düşünüyorum. çünkü kesme rutininde 12usn oyalanmak ve senkron palsini oluşturmam gerekiyor ve sonrasında 52usn boyunca başka tmr0 kesmesi gelmeyecek bu garanti bunun içerisinde tmr1 devamlı kesme bayrağını 1 yapacak. bunu kontrol edebilirim. fakat programın basında on int goto kesme dediğim için tmr1 de bu kesme kısmına gidecektir diye düşünüyorum. sadece bayrağı set etmeyecektir diye düşünüyorum. bundan dolayı tmr0 kesmesinden çıkmadan on int goto kesme2 diye bir isme gönderme mi yapmam gerekiyor. bu konuda tereddütüm var. aynı kesme rutinine giderse senkron palsi devam eder. ki bu yanlış olur. aşağıdaki resim gibi bir sinyal çıkarmaya çalışıyorum.resim bilgisi büyük resimde olan 52usn lik kısımda verilecek. bu da tmr1 gibi bir zamanlamayla verilebilmesini sağlamaya çalışıyorum. bu sinyaller yaratılırken picbasic yavaş kalacak biliyorum mantığını oturttuktan sonra bazı yerlerde asm kullanıyorum.
 

Hattuşa

şafak bey;

timer diyagramınızda 4uS,8uS ve 52 usLUk pencereleriniz sabitmidir? sabitse 2. kesmeye bile ihtiyacınız yok.yani şöyle düşünelim. 1 usluk bir adımda sayan bir kesmeniz olsun buda tmr0 olsun. ben 1 usluk kesmeye giren tmr0 imda bir saayaç çalıştırsam bu sayacım  adımlık olsa, kontrol edilecek
1. adımda 4 us için ilgili pini high yapsam tmr0 değerini 4 us için ayarlasam
2. adıma geldiğimde 4 us geçmiş olur ve ben o pini kapatmış olurum. sonra tmr0 i 8 us için yeni değeri belirlesem
3.adımda 8 us geçmiş olur ve tekrar tmr0 i 52 us a ayarlasam ve pini aktif etsem sayacı sıfırlasam

sonsuz döngüde bu pencereleri görebilirim.

yok ben bunu yapamam derseniz bir kesme içinde if lerle tmr0 ve tmr1 i kullanabilirsiniz ayrı ayrı kesme etiketi oluşturmanıza gerek yok. üstteki konuyu anlamadınız sa basit bir örnek yapabilirim

safaka123

demek istediğinizi anladım. 4 ve 8 usn tamam fakat 52 usn tmr1 ile nanosaniyelik parçalara ayrılarak resim bilgisini alması için çalışacak o sırada tmr0 64usn toplam sinyalin kesmesini çalıştırıyor olacak ben de bu arada 52 usn kadar kendi resim bilgilerimi ekrana ileteceğim. tmr0 kesmesi toplam 64usn için çalışırken ben de  resim bilgisi için bu kalan zamanda işlemcinin başka işlem yapması için çalışacağım. şu anda tmr1 yokken toplam 64usn pals için tmr0 çalışıyor. resim bilgisini ise 52 usn de rastlansal olarak veriyorum. fakat o da 52usn baslangıcından sonuna kadar belli bir zaman sabitiyle çalışması gerekiyor. kesmeye gidip gelme süresi ve oradaki if ile ilgili kısım sorun olabilir. bunun yerine boş bir kesme de üretebilirim fakat bununda sonunu kontrol etmeliyim ki tekrar 52usn nin sonunda kesme etiketini değiştirebileyim. 52usn nin son kısmını kullanmayacağım için bu yapılabilir.

ete

Elbette iki timer kesmesi aynı anda kullanılabilir. Ancak birinde kesme süresi ok kısa ise diğerini etkiler birinden biri gecikmeli çalışmak zorunda kalır. Bu durumda zaman paylaşımı yapmak ve işin bir kısmını kesme haricindeki zamana taşımak akıllıca olur diye örneğimi vermiştim.

Ete

safaka123

ETE bey sizin düşündüğünüz gibi düşünüyorum. senkron kesme zamanında oluyor. diğer zamanı işlemci resim bilgisi için kullanıyor. fakat bu zamanında birim ölçüsü olması gerekiyor. bir sayac gibi okuduğum bilgilerde tmr1 di sanırım hem counter olarak kullanılıyor hem de zaman kesmesi olarak kullanılıyor diye hatırlıyorum. kesme yaratmadan bir sayaç gibi çalışsa ki hatta bir kapı girişini set reset yapsa ben set süresini kontrol ederek o kısmı resim bilgisini ekrana yansıtmak için kullansam daha uygun bir çalışma olacak gibi. anlamadığım kısım tock girişlerini bu 52 sn lik bölümü senkronize bir şekilde kullanabilirmiyim. ya da hpwm üretip o da tmr2  kullanıyor sanırım bir kapı girişini set reset yaptırıp kapı girişini kontrol edip bunu yapabilirim. fakat pwm çok yüksek hızlara ulaşamayabilir. yaklaşık  52 usn / 400 olacak şekilde. Açıkçası buradaki gate kullanımını algılayamadım. benzer bir mantık oluşturmaya çalıştım kafamda. https://www.mikroe.com/ebooks/pic-microcontrollers-programming-in-c/timer-tmr1

ete

Gözden kaçırdığım bir soruyu cevaplamak istiyorum.
"bu garanti bunun içerisinde tmr1 devamlı kesme bayrağını 1 yapacak. bunu kontrol edebilirim. fakat programın basında on int goto kesme dediğim için tmr1 de bu kesme kısmına gidecektir diye düşünüyorum."
Bir kesme kaynağını aktive etmedikten sonra program kesme rutinine gitmez. Ama aksine kesme bayrağı her kesme oluştuğunda aktive edilir.
TMR1 için kullanacağımız mantıkta biz sadece kesme bayrağını kontrol ederek işimizi görüyoruz. Bu durumda program TMR1 kesmesi oluştuğunda kesme rutinine gitmeyecektir. Ama size kesme bayrağını (PIR1.0) set ederek bilgi verecektir.
Bütün kesme kaynakları uygun ortam sağlandığında kesme oluştururlar. Ama kesmeyi aktif etmezseniz kesme rutinine kimse gitmez bunu unutmayın.

Diğer sorularınız için çok fazla yorum yapamayacağım. Sonuca denemeler yapark ulaşabileceğinizi düşünüyorum.

Ete

safaka123

Tesekkurler ete bey son soylediginizi bilmiyordum bunu ogrendigim iyi oldu.

Powered by EzPortal