Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Delay_(değişken) sorunu

Başlatan rogue_cn, 05 Ekim 2013, 11:38:16

rogue_cn

Arkadaşlar aşağıdaki devrede r0 kesmesini kullanarak ledlerin yanıp sönmesi kısaltmak istiyorum ama olmuyor. delay içindeki değişkeni sanki hiç tanımıyor gibi. program başlarken 1 saniye bir yanıp sönmesi  gerekirken(çünkü başta i'yi 1000 tanıtıyorum) daha hızlı yanıp sönüyor. Ama delay_ms(1000) yapınca oluyor nedenni nedir acaba? nereyi atlıyorum?
#include <16f628a.h>
#use delay(clock=4000000)
 
#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT
#int_ext                          //harici kesme
unsigned int8  i=1000;   
void int_hiz(void)             /
   {
     i=i-100;
   }

main()                            //ana döngü
{

   enable_interrupts(GLOBAL);     //tüm kesmelere izin ver
   enable_interrupts(INT_EXT);    //harici kesmeye izin ver
   while(1)                       //sonsuz döngü
   {
      
      OUTPUT_B(0b11000000);
      delay_ms(i);
      OUTPUT_B(0b00000000);
      delay_ms(i);

   }
}

esensoy

int max 255 değerini alır, dolayısıyla kurgunuzda hata var
int16 olarak tanımlayınız
En tehlikeli an "zafer" anıdır.

rogue_cn

hoca dediğin gibi oldu sağolasın. Ama bukez kesmeyi yapmıyor. Yani hiç butona basmamışım gibi devam ediyor. onun nedeni nedir acaba? Delay dışnda bir değişkeni değiştirmeye çalıştığımda oluyor

mir_as82

1- unsigned int8 degeri 1000 olamaz sanki.
2-bu degisken tanimlama yerin yanlis olabilir.

mesaj birleştirme:: 05 Ekim 2013, 12:06:07

1- unsigned int8 degeri 1000 olamaz sanki.
2-bu degisken tanimlama yerin yanlis olabilir.

diot

her interrup geldiğinde , interrupt rutininin içinde i değişkeni
unsigned int8  i=1000; şeklinde yeniden tanımlanıyor. ve int_hiz yeniden tanımlanıyor ama kullanılmıyor. interrup rutinini yeniden düzenlemen gerekli. i değişkenini kesme dışında statik olarak tanımlaman lazım.

Ayrıca
static void int_hiz(i)             
   {
     i=i-100;
   }

şeklinde tanımlayıp interrup dizini içinde int_hiz(i) şeklinde çağırman lazım.

esensoy

#5
#include <16f628a.h>
#use delay(clock=4000000)
 
#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT

unsigned int16  i=1000;
 
#int_ext                          //harici kesme
void int_hiz(void){
 i=i-100;
}

main(){
   enable_interrupts(GLOBAL);     //tüm kesmelere izin ver
   enable_interrupts(INT_EXT);    //harici kesmeye izin ver

   while(1){
      OUTPUT_B(0b11000000);
      delay_ms(i);
      OUTPUT_B(0b00000000);
      delay_ms(i);
   }
}

diot un dediği gibi interrupt içindeki kodu alt programla dışarı da alabilirsin, ama ben kısa kodları interrupt içinde işletmeyi tercih ediyorum, o yüzden ayırmadım
CCS output_b komutunu işletirke otomatik olarak tris registerlarını çıkış olarak ayarlıyor, ama bu işin doğrusu program başlarken girişleri çıkışları ve pin ilk değerlerini işletmektir,
Buna göre tekrar düzenlersek;
#include <16f628a.h>
#use delay(clock=4000000)
 
#fuses INTRC,NOMCLR,PROTECT,NOWDT
#fuses PUT,NOLVP,NOCPD,NOBROWNOUT

unsigned int16  i=1000;
 
#int_ext                          //harici kesme
void int_hiz(void){
 i=i-100;
}

main(){
   enable_interrupts(GLOBAL);     //tüm kesmelere izin ver
   enable_interrupts(INT_EXT);    //harici kesmeye izin ver
   
   set_tris_b(0b00000000);
   output_b(0b00000000);
   while(1){
      output_toggle(PIN_B7);       //B7 yi tersle
      output_toggle(PIN_B6);
      delay_ms(i);
   }
}

bu kod seninkinden göre daha az yer kaplayacaktır.
use delay satırının altına #USE FAST_IO (B) yazarsan daha da az yer kaplar.
En tehlikeli an "zafer" anıdır.

rree

Benim yazdığım soft delay vardı forma koymuştum onu dene.