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);
 
}
 
  • Beğen
Tepkiler: vcv
İ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);

}
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
 
  • Beğen
Tepkiler: vcv
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
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.
 
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.
 
  • Beğen
Tepkiler: vcv
t ve sure değişkenleri unsigned tanımlanmamış olabilir,
delay_us fonksiyonundada unsigned olmalı.

Yinede kesme içinde delay kullanılmamalı.
MC okumayı kapatıp kesme içinde delay_us fonksiyonuna elle değer girip arttırarak deneyebilirsin.
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.
 

Forum istatistikleri

Konular
130,089
Mesajlar
932,980
Kullanıcılar
453,116
Son üye
bthnercan

Yeni konular

Geri
Üst