pic im kilitleniyor.

Başlatan 707yunus, 18 Aralık 2009, 23:52:26

707yunus

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?

arslan74

Merhaba,

5us işlemi high interrup seviyesine al ve sadece bu işlemi yaptın. diğer işlemleri low interrup sebiyesine al.

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..

arslan74

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.

707yunus

İş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);

}
}

arslan74

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

Erol YILMAZ

@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ı...

buiba

kesme rutinine dallandığında; bir komut sonrasında  tüm kesmeleri pasif yapıyormusun?

707yunus

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??

Erol YILMAZ

CCS delay_ms   deyince   kesmeleri kapatıyor olmasın ?   :D

Hi-tech e geçecek bir arkadaş daha sezinliyorum burada :P

azimli

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.