FakirMaker
Profesyonel Üye
- Katılım
- 5 May 2009
- Mesajlar
- 1,137
- Puanları
- 281
clear_interrupt(INT_TIMER1);
#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.İ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); }
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?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
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.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.
delay_us(t);
t ve sure değişkenleri unsigned tanımlanmamış olabilir,delay_us(sure);
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.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.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?