ccs c 5 derleyisi timer0 kesmesi sorunu

Başlatan Emre MERMİ, 17 Ağustos 2014, 01:28:22

Emre MERMİ

arkadaşlar bugün yeni kurduğum ccs c 5.007 sürümünü kullanmaya başladım. timer 0 ile basit bir şekilde kesme süresini 1ms ye ayarlayıp daha sonradan saniyede bir b0 portunu toggle yapmaya çalıştım ama bir türlü program kesmeye girmiyor. kodları yüklüyorum hatalarıımı söylerseniz sevinirim.


#include <16F877A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4MHz)
#use fast_io(b)

int a=0;

#INT_TIMER0
void  TIMER0_isr(void)
{
a=a+1;
if(a==1000)
output_toggle(pin_b0);
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4|RTCC_8_bit);      //1,0 ms overflow


   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   set_tris_b(0x00);
   output_b(0x00);
   while(TRUE)
   {
     //TODO: User Code
   }

}

RaMu

Kesmeye girmediğini nereden anladın?
a değişkenini programında bir lcd veya uart üzerinden gösteren kısım yazsan
sürekli -128 den +127 ve arasında değiştiğini görürsün.

Kısaca tanımladığın a değişkeni integer ( int a;)
yani işaretli 1 bayt /8 bit) tamsayı demek değeri -128 + 127 ve arasında olabilir,
hiçbirzaman 1000 olamaz,
unsigned int a;
şeklinde tanımlarsan  işaretsiz 1 bayt (8 bit) tamsayı,
0 255 ve arasında değer alır
sen 1000 için
unsigned int16 a;
şeklinde tanımlamalısın.
bu 0 65535 ve arasında değer alır.

Ayrıca if(a==1000)
kontrolünü yaptın ve baktın a=1000 olmuş
e sonra kendiliğinden mi sıfır olacak,
int16 tanımladıktan sonra bu kısmıda düzeltmelisin.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Emre MERMİ

if kısmını silmeyi unutmuşum sadece output_high(pin_b0)  yazdım kesmenin içine yinede bir değişiklik olmadı

RaMu

#3
while (true) içinde
while(1)
{
output_toggle(pin_b5);
delay_ms(300);
}

yazıp programın düzenli çalışıyormu kontrolü yap.

fast input output kullanmışsın,
portları kendin giriş çıkış olarak yönlendirmelisin (tris)
yada #use fast_io(b) kısmını sil
o zaman output input komutları
pinleri kendileri giriş çıkış olarak ayarlarlar.

if kısmını silersen,
output_toggle(pin_b0); ise
high içinde sürekli yaznması lazım zaten,
led sürekli biraz daha düşük parlaklıkta yanar.

Devreni nerede deniyorsun buda önemli.
Şema vs.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Erol YILMAZ


Emre MERMİ

#5
hocam devreyi proteusda simüle ediyorum. kodların son hali ve simüle edilmiş devre resmi;


#include <16F877A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(crystal=4MHz)


#INT_TIMER0
void  TIMER0_isr(void)
{
output_high(pin_b0);
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4|RTCC_8_bit);      //1,0 ms overflow
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   set_tris_b(0x00);
   output_b(0x00);
   while(TRUE)
   {
       //TODO: User Code
   }

}



mesaj birleştirme:: 17 Ağustos 2014, 11:19:36

void  TIMER0_isr(void)
{
output_high(pin_b0);
delay_ms(100);
}

bunu da denedim olmadı acaba neyi eksik yapıyorum anlamıyorum ? timer ayarlarını da picwizard dan yapıyorum

Erol YILMAZ

İnt içinde delay kullanilmasi problemlere yol açabilir...

RaMu

Lede bağladığın direnç 10k
bu direnç değeriyle led yanmaz,
üstüne çift tıklayıp
resistor yazan kutucuğa 330ohm yaz.

Örnek programları veya anlatım videolarını izlemende fayda var,
belki dikkatsizlikten olmuştur ama
yeni başlıyorsan örnek anlatımlarda bu detaylardan bahsediliyor,
birde MCLR bacağını 5-10 direnç ile +5V a bağlamanda fayda var,
mikrodenetleyiciye çift tıkladığında
processor clock frequency yazan kutucuğada  4MHz yazmayı unutma.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Emre MERMİ

haklısınız hocam görmemişim direnç değerini değiştirdim sonuç aynı. yok hocam biraz da olsa bilgim var ama proteusda o mclr ve kristal bağlantısını yapmaya gerek yok diye biliyorum.

Kabil ATICI

direnç özelliği olarak analog mu, dijital mi kontrol et. Dijital değilse, Özelliğini Dijial olarak değiştir. LED bağladığın işlemcinin bacağını sanal osilaskop ile inceleyebilirsin. Bir değişiklik olup olmadığını daha rahat görebilirsin. İşlem çok hızlı olursa LED ile göremeyebilirsin.
ambar7

RaMu

İlk mesajımdan itibaren bahsettiğim bütün değişiklikleri yaparsan
programın çalışıyor,
ben sana söylediklerimi değiştirip denedim çalışıyor.

#include <16F877A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#fuses XT

#use delay(crystal=4MHz)
#use fast_io(b)

int16 a=0;

#INT_TIMER0
void  TIMER0_isr(void) 
{
a=a+1;
if(a==1000)
{
output_toggle(pin_b0);
a=0;
}
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4|RTCC_8_bit);      //1,0 ms overflow


   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   set_tris_b(0x00);
   output_b(0x00); 
   while(TRUE)
   {
     //TODO: User Code
   }

}


#fuses XT
gerçek devre için eklemelisin,
simulasyonda problem olmaz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Emre MERMİ

aynı kodları kopyala yapıştır yapıp derledim proteusda simüle ettim yine çalışmadı galiba derleyicide bir sorun var benim

RaMu

Proteus ve ccsc proje dosyaları paylaş derleyip deneyeyim,
sende isis şemasını sıfırdan
ve ccsc projesini File menüsünden close all dedikten sonra
file menüsünden project wizardı kullanarak tekrardan oluşturup deneyebilirsin.

Ben ccsc 5.025 isis 7.6 da denedim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

Emre MERMİ


RaMu

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html