Timer1 input okuma Problem

vcv

Üye
Katılım
9 Kas 2012
Mesajlar
28
Puanları
1
Herkese selamlar.
Timer kesmesi oluşturup MCP3202 ile haberleştirme gerçekleştiriyorum. Timer içinde a portunda bulunan MCP3202 den gelen dout girişini okuyarak 16 bitlik değişken üzerine bitleri yazıyorum.(MSB first) Problem şu program timerdan hiç çıkmıyor. Belirli bir süre değer okuyorum ve lcd ye bunu yazıyorum. Bir süre sonra lcd ye veri yazamıyor çünkü main kısmına dönüş yapmıyor. Led ile toggle yaparak bunu test ettim. Yani timer çalışıyor fakat main kısmına dönüp kaldığı yerden devam etmiyor. MCP ile asenkron sürücüye ait dc bara okuyorum fakat mcp beslemesi ile pic beslemesi izole. Sinyaller için 6n serisi optolar kullandım ve pic ile izole sağladım. Timerdan çıkmama sebebi ne olabilir? (Gürültü harici) Yardımlarınız için şimdiden teşekkürler.
 

Ekli dosyalar

  • timer.PNG
    timer.PNG
    12.8 KB · Görüntüleme: 15
  • timer_1.PNG
    timer_1.PNG
    4.1 KB · Görüntüleme: 14
Msp kullanmadım hiç ama dün aynı problemi bende yaşadım. Timer kesmesinin içerisinde çok fazla komut barındırmamak gerekiyor. Timer içerisinde flag oluşturup ana döngüde o flagleri kullanarak işlem yapmak gerekiyor. Ben böyle çözdüm problemimi belki sende de işe yarar
 
Timer içerisinde kendi yazdığım fonksiyon ile mcp3202 ye clock gönderip dout u okuyorum .(16f877A ile) Bu işlemi iptal ettiğimde yani haberleştirme yapmadığımda sadece sabit matematiksel işlem yaptırdım lcd ekranda donma olmadı. Hem timer hemde main olağan şekilde çalıştı. Bahsettiğiniz gibi mantıklı ama periyodu 40ms yaptım benim timer içindeki işlemim 1ms sürüyor. Digital Input okuması yaparken ya bir problem oluyor. Yada farklı birşey anlayamadım. Tuhaf bir durum. Dediğinizi değerlendireceğim fakat belki bir arkadaş farklı bir yaklaşımla farklı bir çözüm önerisi getirir diye ümit ediyorum. Teşekkürler
 
her timer kesmesinde mcp3202 init etmen gerekiyor mu? En başta bir kere init edip sonra tekrar sorgulaman gerekmez mi?
 
Init olayını her haberleşme başlangıcında yapıyorum. O sadece kısa süreli pulse üretiyor. Başladığını bildirmek için. Konu mcp değil zaten ben değer okuyorum sürekli. Dc bara Voltajını kestiğim zaman b portu çıkışlarıda sıfıra çekiliyor. Problem sürekli timer da kalması yada main de işlem yapmaması.
 
Ortada interrupt kullanmayı gerektiren bir durum yok.
 
Init olayını her haberleşme başlangıcında yapıyorum. O sadece kısa süreli pulse üretiyor. Başladığını bildirmek için. Konu mcp değil zaten ben değer okuyorum sürekli. Dc bara Voltajını kestiğim zaman b portu çıkışlarıda sıfıra çekiliyor. Problem sürekli timer da kalması yada main de işlem yapmaması.
Sürekli timer da kalmasının sebebi senin oradan okuduğun veriyse konu nasıl mcp olmuyor onu anlamadım. Normal fonksiyon içinde çalışıp timer içinde çalışmıyorsa belli ki bi problem var. init ve mcp fonksiyonlarını paylaşırsan belki sorunu bulabiliriz. Veri görmeden sadece tahmin yürütebilirim.
 
Sürekli timer da kalmasının sebebi senin oradan okuduğun veriyse konu nasıl mcp olmuyor onu anlamadım. Normal fonksiyon içinde çalışıp timer içinde çalışmıyorsa belli ki bi problem var. init ve mcp fonksiyonlarını paylaşırsan belki sorunu bulabiliriz. Veri görmeden sadece tahmin yürütebilirim.
Kod:
void MCP3202_init() {
//Haberletmeyi batlat:
/*optolu*/

output_low(cs);
delay_us(t);
output_high(cs);
delay_us(t);


}

int16 MCP3202()
{

int16 deger=0;
/*OPTOLU*/


//start biti
output_low(din);
output_low(clk);
delay_us(sure);
output_high(clk);
output_high(din);
delay_us(sure);
//sgl/diff
output_high(din);
output_low(clk);
delay_us(sure);
output_high(clk);
output_high(din);
delay_us(sure);
//odd/sign
output_high(din);
output_low(clk);
delay_us(sure);
output_high(clk);
output_high(din);
delay_us(sure);
//msbf
output_high(din);
output_low(clk);
delay_us(sure);
output_high(clk);
output_high(din);
delay_us(sure);
//null biti




for(int i=0;i<12;i++)
{
output_low(clk);
delay_us(sure);
output_high(clk);


if (input(dout))
{
bit_clear(deger,11-i);
}
else if (input(dout)==0)
{
bit_set(deger,11-i);
}
delay_us(sure);
}//For bititi
return (deger);

}
Foksiyonlar bu şekilde. Demek istediğim ben bilgiyi okuyabiliyorum ve voltaj değerine göre b portunun bazı çıkışlarını aktif yada pasip yapıyorum. Ekran donduğu halde voltaj değerini değiştirirsem b portu çıkışları aktif yada pasif oluyor. işlem yapıyor. Ama sadece timer çalışıyor. Main kısmına hiç gitmiyor.
Ortada interrupt kullanmayı gerektiren bir durum yok.
Anlamadım ne demek istediğini. Main içinde lcd arayüz tasarımı ile parametre değerlerinin değiştiriebilmesi için kod bulunmakta. Benim için ne kadar kısa sürede voltaj okuyup çıkışı o kadar kısa sürede aç kapa yapmam gerekli. Loop kısmındaki süreye mi bırakacağım işlemi? Yani neye göre yok?
 
Moderatör tarafında düzenlendi:
Kodun içinde çok fazla delay var bence senin timer kesme anında işlemi bitiremiyor diğer kesme devreye giriyor bu yüzden ana döngü çalışamıyor ekrana o yüzden bilgi gitmiyorç

Kod:
T1_DIV_BY_1

kısmını

Kod:
T1_DIV_BY_8

olarak değiştir.

With an internal clock at 20mhz and with the T1_DIV_BY_8 mode, the timer will increment every 1.6us. It will overflow every 104.8576ms.

Kod:
set_timer1(6250)
verirsen 10ms de bir kesmeye gider. CCS yi kullanmayalı yıllar oldu sayenizde öğreniyorum tekrar.
 
Son düzenleme:
Kodun içinde çok fazla delay var bence senin timer kesme anında işlemi bitiremiyor diğer kesme devreye giriyor bu yüzden ana döngü çalışamıyor ekrana o yüzden bilgi gitmiyorç

Kod:
T1_DIV_BY_1

kısmını

Kod:
T1_DIV_BY_8

olarak değiştir.
Orada ki gecikmeler mikrosaniye cinsinden. Max 300 us de bitiyor. Timer kesme süresini değiştirdim. Yani 100ms üzerine de çıkarttım. Yine aynı durum. Ayrıca belirli bir süre sonra donuyor. Başlangıçta değil de belirli süre sonra main iptal. Olmadı wdt vs. bakacağım bi şekilde. İlginiz için teşekkür ederim.
 

Forum istatistikleri

Konular
128,198
Mesajlar
915,767
Kullanıcılar
449,979
Son üye
schule48

Yeni konular

Çevrimiçi üyeler

Geri
Üst