Timer1 input okuma Problem

İnternette incelediğim örneklerde şunu buldum.

Kod:
clear_interrupt(INT_TIMER1);

kesme kodunun başına bunu koymuşlar. Interrupt bitini siliyor. Dene istersen

Kod:
#INT_TIMER1
void timer1_isr(void)
{
   clear_interrupt(INT_TIMER1);
   set_timer1(3036);
   output_toggle(PIN_B0);
 
}
 
Tepkiler: vcv
Bugün ccs c forumda görmüştüm bunu bende. Kart firmada yarın deneyeceğim. Konu ile ilgili paylaşım yaparım size de. Gerçekten sağolun zaman ayırıp problemle ilgilendiğiniz için.
 
300us uzun zaman. Başka seyleri etkileyip orada kilitlenmeye sebebiyet verebilir. Bazen disable interrupt sonra enable interrupt ile interrupt oluşmaması gereken yerlerde interrupt kapatilmali. Sen fazla rahat düşünüyorsun, interrupt akıllıca planlanmali
 
Tepkiler: vcv
Rahat düşünmüyorum. Disable ve enable ettiğim yerler var. İşin açıkçası uzun zamandır pıc kullanmadım ama timer ve counterlar ile sürekli uğraş içindeyim. Benim timer içindeki kodun 300us olduğunu farzedelim max. Main işlerken interrupt ta gittiğinde oradaki işlemi yapıp maine döner. En basit hali. Bir timer kullandım. 40ms periyodu olan bir timer içinde işlem 300us de bittiğini farzedersek neyi etkiler?
 
Moderatör tarafında düzenlendi:
En basitinden software seri port veya SPI kullaniyorsundur. Burada zamanlamalar kritik, anlık port okuma yazmalar oluyor. Sen tam değer okuman gerekirken interrupt geliyor. 9600 bps de bit timing 100us. Döndüğünde ise okuman gereken değer çoktan kayboldu. İnterruptin program içinde nerede geleceği belli değil ki. Senin interrupt 3-5 mikrosaniye sürmeli ki birşey etkilenmesin. Kacinilamiyorsa bazen interrupti işlem bitene kadar kapatacaksin.
 
Genel anlamda bu konuda hem fikiriz ama uart,spi, vs yok. Var şöyleki mcp spi üzerinden data aktarıyor. Daha önce mcp nin spi için gerekli kodu ekledim ve opto kullandığım için kütüphane kullanmadım mcp3202 datasheet’ i üzerinden kendim yazdım. Onuda timer ile belirli periyotlarda çağırdım. Neyi etkilerden kasıtım veri kaybetmem ile ilgili değil. 300us yüzünden “konumuz olan” main e hiç girmemesi ve timerda işlem yapıp hiç çıkmamasına nasıl etken olabilirdi. İlginiz için teşekkürler.
 
LCD ler çok yavaş cihazlardır. Ayrıca
veri yazılmadıkça görünen değerler hiç
değişmez.
Buna göre algoritmanızı yeniden düzenleyin.
 
Değişkenler unsigned tanımlı. Mcp okumayı iptal edince main çalışıyor. Yani en azından gözlemlediğim süre zarfında hiç durma olmadı.Yarın İlk clear_interrupt() olmazsa mcp haberleşmeyi İptal edip timer içine sadece delay_us ekleyeceğim us ile oynayacağım. Eğer bu delay_us fonksiyonuna bağlı ise algoritmayı değiştireceğim.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…