CCS C delay_ms ve Interrupt

Başlatan esensoy, 02 Aralık 2012, 01:20:07

JOKERAS

Alıntı yapılan: esensoy - 02 Aralık 2012, 20:00:01
siz CCS C kullanmadan bu kadar fikir sahibi nasıl oldunuz?
Dikkat ederseniz kesme'den bahsediyoruz derleyiciden değil,her derleyicinin sentaksı farklı
olabilir,optimizasyonu farklı olabilir,ama sonuçta aynı mantıkta kod üretirler.
Bir donanım kesmesi hangisi olursa olsun farketmez PC o an hangi işi yaparsa yapsın
kesme geldiği anda o an yaptığı işin hiç bir önemi yok direk kesme vectör'üne dallanır.
Eğer bunu yapamıyorsa o  zaman kesme olmazki.
Ayrıca kesme içinde delay çağırmakta ne oluyor?Bunun hiç bir mantıklı tarafı yokki.

Size bir örnek vereyim dışardan her 100ms kesme alıp bunu işlediğimi düşünün,bu 100ms zaman çok önemli.Şu an kesme gelmedi kod koşuyor,kod delay fonksiyonunu çalıştırıyor orada zaman geçiriyor diyelim,
şimdi benim için çok önemli olan 100ms'lik kesme isteği geldi sizin söylediğiniz gibi delay fonksiyonu
kesmeleri kapatıyorsa benim için çok önemli olan kesme'yi kaçırmış olacağım.
Şimdi  delay fonksiyonunun bitmesinimi bekleyeceğim.O zaman bu "kes'me" olmuyorki "kesme!" oluyor.
Acaba ben yanlışmı biliyorum bu kesme olayını?

Okan AKÇA

kesmeleri sadece disable ederseniz kapanır. delay ile bir ilgisi yok ancak kesme icinde kullanılırsa  o süre zarfınca bekler.

esensoy

Alıntı YapDikkat ederseniz kesme'den bahsediyoruz derleyiciden değil
siz biraz daha dikkat ederseniz bu konunun CCS C alt başlığında olduğunu,
Konu başlığında CCS C yazdığını,
İlk mesajımda da CCS C 'de interrupt ın kapandığını yazdığımı görebilirsiniz,

akşamdan beri beni hasta etmeniz sonucu yaptığım incelemelerde lcd_flex.c driver dosyası içinde bir fonksiyonda delay_ms kullanılırsa tüm projede ki delay_ms lere girerken kesmeleri kapatıyor, çıkarken kesmeleri açıyor,
yok kullanılmazsa tüm projede ki delay_ms lerde interrupt lara dokunmuyor,
lcd_flex.c dosyası; (bahsettiğim delay_ms() alttan 9. satırda)
//coder: PCM Programmer
#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7

#define LCD_E PIN_D3
#define LCD_RW PIN_D2
#define LCD_RS PIN_D1

#define LCD_CGRAM_ADDR 0x40
#define LCD_DDRAM_ADDR 0x80

#define USE_LCD_RW 0

#define lcd_type 2

#define lcd_line_two 0x40

#define LCD_CHAR_1 0x01
#define LCD_CHAR_2 0x02
#define LCD_CHAR_3 0x03
#define LCD_CHAR_4 0x04
#define LCD_CHAR_5 0x05
#define LCD_CHAR_6 0x06
#define LCD_CHAR_7 0x07
#define LCD_CHAR_8 0x08

int8 const LCD_INIT_STRING[4] =
{0x20 | (lcd_type << 2),0xc,1,6};

void lcd_send_nibble(int8 nibble)
{
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);

output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}

void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);
delay_us(60);

if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);

output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

void lcd_setcursor_vb(short visible, short blink) {
lcd_send_byte(0, 0xC|(visible<<1)|blink);
}

void lcd_init(void){
int8 i;
output_low(LCD_RS);
output_low(LCD_E);
delay_ms(15);

for(i=0 ;i < 3; i++){
   lcd_send_nibble(0x03);
   delay_ms(5);
}

lcd_send_nibble(0x02);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
}
}

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
if(y != 1)
address = lcd_line_two;
else
address=0;
address += x-1;
lcd_send_byte(0, 0x80 | address);
}

void lcd_putc(char c){
switch(c)
{
case '\f':
lcd_send_byte(0,1);
delay_ms(2);                         //BURASI
break;
case '\n':lcd_gotoxy(1,2);break;
case '\b':lcd_send_byte(0,0x10);break;

default:
lcd_send_byte(1,c);break;
}
}

aslında derleyici ilgili satırda  interrupt ın kapandığını warning olarak belirtiyor, ama tüm projede kileri kapatması garip,

Geldiğim noktada Jkramer in gösterdiği sayfada ki gibi ikinci kez use delay(clock=20000000) yazmak sorunu çözmüyor, bir çok yere ekleyerek denedim ama CCS hata veriyor, kodu derlemiyor,

Şimdi "olmaz oyle şey" den başka bir çözüme sahip biri var mı? yoksa fikir yürütmeye devam mı edeceksiniz?
En tehlikeli an "zafer" anıdır.

Okan AKÇA

kesinlikle kapanmaz  ;D gözden kaçırdıklarınız var
eger kapanıyor olsa lcdli bir cok haberleşmeli proje yaptım hepsindede haberleşme kopardı

esensoy

yani bence de mutlaka vardır gözden kaçan bir şey de şimdi işi gücü bırakıp onu mu arayayım yani,
amacım ccs gurusu olmak değil ki,
siz de aynı lcd driver ını mı kullanıyorsunuz?
En tehlikeli an "zafer" anıdır.

Okan AKÇA

ccs nin forumundan indirdigim flex lcd kullanıyorum

sadogan

Ccs main içerisinde kullanılan başka fonksiyonlarda  interrupt  da kullanılmışsa
fonksiyon bitene kadar intrupt tu kapatıyor bu yanlızca delay_ms() için gecerli deyil.

unsigned int32 hesapla (unsigned int16 a, unsigned int16 b,unsigned int16 c)
{
  unsigned int32 d; 
  d=(int32)a*b*c;
  return d;
}


bu fonksiyonu mainde ve inttrupt kullandıgımda
interrupt disabled call prevent re-entrancy (hesapla) //uyarıyor
Fonksiyon mainde koşarken inttrupt dallanıp geri aynı fonksiyona döndügünde içeriği
bozulmuş  fonksiyon bulacak.Bu sebeple kapatıgını düşünüyorum.
@esensoy hocam
lcd_putc(); foksiyonunu  inttrupt içerisinde kullanıyorsanız ondandır.



aliveli

#22
kullandığınız kesme rutininde delay_ms yer alırsa
ana fonksiyondaki delay_ms komutu çalıştığında "recursion "olmasın diye kesme kapatılır
bu yüzden çoğu programcı kesmede  delay_ms kullanmaz

edit:benden önce cevap verilmiş