40 Mhz ile çalıştırdığım bir 18F işlemcim var.RB0,RB1 kesmesini aktif ediyorum.Timer0'ı da 5us ye ayarlıyorum.Bir butonla RB0 kesmesine gittiğimde işlemcinin bir pininden 5 mslik bir darbe üretip, bu esnada Timer0'ı aktif ediyorum.Bu darbeyi bazı işlemlerden geçirip çıkışı RB1 kesmesine uyguluyorum.RB1 kesmesine gittiğimde Timer0'ı durduruyorum.
Sorun şu:Butona basınca işlemcim kaçınılmaz bir şekilde kilitleniyor.Timer i 10 us ve üstüne ayarladığımda hiç sorun çıkmıyor.10us altında sorun oluşuyor.
Bu sorun hem isiste hemde gerçekte aynen devam etmektedir.Üstadlar sizce sorun nedir?
Merhaba,
5us işlemi high interrup seviyesine al ve sadece bu işlemi yaptın. diğer işlemleri low interrup sebiyesine al.
Alıntı yapılan: "arslan74"Merhaba,
5us işlemi high interrup seviyesine al ve sadece bu işlemi yaptın. diğer işlemleri low interrup sebiyesine al.
Bn denedim olmadı.Siz çalıştırdıysanız kod koyar mısınız..
Alıntı yapılan: "707yunus"Alıntı yapılan: "arslan74"Merhaba,
5us işlemi high interrup seviyesine al ve sadece bu işlemi yaptın. diğer işlemleri low interrup sebiyesine al.
Bn denedim olmadı.Siz çalıştırdıysanız kod koyar mısınız..
Siz yaptığınız örnek kodları yayınlayın, neden çalışmadığına öyle bakalım.
İşte kodlar.Test etmek için palsin çıktığı ucu ext2 ucuna direk bağlamanız yeterli.
unsigned int16 zaman=0;
//==============================================================================
#int_ext2
void durdurucu()
{
disable_interrupts(int_timer0);
}
//=============================================================================
#int_ext1
void start()
{
output_high(pin_c2);
delay_us(500);
delay_us(500);
delay_us(500);
delay_us(500);
output_low(pin_c2);
enable_interrupts(int_timer0);
}
//==============================================================================
#int_timer0
void sure_olc()
{
zaman++;
set_timer0(65535);
}
//==============================================================================
void main(void)
{
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);
disable_interrupts(INT_TIMER0);
enable_interrupts(int_ext2);
enable_interrupts(int_ext1);
disable_interrupts(INT_RB);
EXT_INT_EDGE(H_TO_L);
set_tris_b(0xFF);
set_tris_a(0x00);
set_tris_c(0x00);
output_c(0x00);
output_a(0x00);
lcd_init();
set_timer0(65535);
enable_interrupts(GLOBAL);
for( ; ; )
{
lcd_gotoxy(1,1);
printf(lcd_putc,"%lu ",zaman);
lcd_gotoxy(1,2);
printf(lcd_putc,":");
delay_ms(500);
lcd_gotoxy(1,2);
printf(lcd_putc," ");
delay_ms(500);
}
}
Merhaba,
Kodunu CCS ile yazmışsın. CCS özel sentaks ını bilmiyorum. Ancak kodları incelediğimde düşük ve yüksek özeliklerle ilgili bir atmama yapmamışsın. Sanki hepsi ortak özellikteymiş gibi yazılmış.
Eğer C18 veya Hi-Tech de kodu yazmak istersen sana yardımcı olablirim. Ben CCS ile kod yazmiyorum.
Selamlar
@707yunus;
#int_timer0
void sure_olc()
{
zaman++;
set_timer0(65535);
}
bu kod hatalı çalışabilir...
neden?
TMR0 sayıcısı 1 clock aldığında kesme oluşacak.
daha interrupttan çıkmadan bile 0 a düşebilir bu sayıcı...
kesme rutinine dallandığında; bir komut sonrasında tüm kesmeleri pasif yapıyormusun?
Alıntı yapılan: "buiba"kesme rutinine dallandığında; bir komut sonrasında tüm kesmeleri pasif yapıyormusun?
yapmıyorum ama compiler ile ilgili bir sorun.denemler sonucu buldum.çünkü maindeki fonksiyonundaki sonsuz döngüde ki delay_ms(500); leri kaldırınca sorun
kalkıyor.Ne alaka ise??
CCS delay_ms deyince kesmeleri kapatıyor olmasın ? :D
Hi-tech e geçecek bir arkadaş daha sezinliyorum burada :P
delay_ms(500);
komutu CCS derleyicisi C kod yazımı oluyor değilmi?
peki siz bu fonksiyonun içindeki yazılı kod satırları kümesini görebiliyormusunuz?sonuçda fonksiyona 500 değerli bir değişken argüman olarak geçiriliyor demekki fonksiyon içinde en az 2 satır yada diğer bir tabirle en az iki adet noktalı virgül ile biten komut var.
bu derleyicinizde bunun gibi C fonksiyonlarının içlerini görme durumunuz oluyormu?
eğer oluyorsa sorun burdanmı kaynaklanır bakılabilir.
ama bu ve bunun gibi hazır kullanılan ve içine yalnızca parametre-argüman geçirilen fonksiyonlar varsa ve içlerini asla göremiyorsanız size
tek bir kelime bu derleyiciyi çöpe atın gitsin profesyonel endüstriyel ticari hiç bir projeyi bu ve bunun gibi fonksiyonları hazırdan kullanarak bitiremezsiniz ömrünüzün hayrını göremezsiniz sonra C mi hızlı asm mi hızlı kastırır durursunuz.
Microchip Markalı İşlemcilere C dili kodlama ile program yazıp geliştirmeyi düşünüyorsanız;
8 bit işlemcilerinde Hi-Tech C derleyicisini.
16-32 bit işlemcilerinde C30,C33,C24 ki bunlar birbirinin tamamen aynısı gibidir. yada C32 kullanmanızı ilk öncelikli Hi-Tech derleyiciyide ikinci öncelikli seçmenizi tavsiye ederim.
ben bir fonksiyon kullanacağım ama içindeki kod satırlarını göremiyeceğim yerim öyle derleyiciyi benden uzak Allaha yakın olsun.