Timer1 sorunu

Başlatan ziyaretci, 13 Kasım 2015, 14:29:57

Okan AKÇA

register tanımlamalarını boşverin ccs bunu bizm icin kendisi yapıyor kapatın gitsin

sadece yapmanız gereken

setup_timer_1(T1_INTERNAL|T1_DIV_BY_4); // işlemciye göre  timer bolme oranına bakınız
enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);

ziyaretci

 Hocam bilgisayarınızdaki 16f1937 sürücü dosyasında, sayfa sonundaki kesme adreslerini kontrol edebilir misiniz benim için.

Bende;
#define INT_TIMER1                0x9101

Sizde de aynı mı? Geçen hata almıştım, burayı kurcaladım. Tam hatırlamıyorum şimdi.

Okan AKÇA

hic bir şey tanımlamanıza gerek yok dedigim şekilde main icerisine kodu koyunuz geri bütün herşeyi siliniz.

ziyaretci

Hocam onları en başından denedim. Olmadı. Bu denetleyici sıkıntı çıkardı.  O yüzden kayıtçılar ile yapmaya çalışıyorum şuan. Rica etsem bakabilir misiniz? Bahsettiğim dosyaya. Şimdi tekrar sil kur, uğraştıracak beni.

Okan AKÇA

#19
#include <16f1937.h>
#use delay(clock=4m)

int sayici;
#int_timer1
void  timer1_kesme ()   
{
sayici++;
  output_b(sayici);
}
void main()
{

setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);
sayici=0;

   while(TRUE);

}

dedigimi yapsanız olacaktı proteusta bizzat denedim çalısıyor.

Baran Ekrem hocamızın dedigi gibi ccs den başka bir  derleyiciye gecen eşşekten düşmüs gibi olur.

RaMu

Alıntı yapılan: erkantr67 - 20 Kasım 2015, 23:12:07
O değilde şu benim konuyla ilgilensek. :)
İlgilenelim, ama yine araya bir şeyler serpiştireyim:
CcsC iyidir kötüdür diye bir şey demek istemedim, diyememde zaten,
araçtır, kısaca yerine göre iyi yerine göre kötü,
bende birşey çalışmadığında senin yapmaya çalıştığın gibi yapıyorum,
datasheet i açıp ne yapılması gerektiğini bulup
CcsC nin asm çıktısının ne yaptığına bakıyorum,
bu güne kadar tamam yakaladım CcsC hatalı diyebilecem dediğim her durumda
CcsC doğru derlemiş demek zorunda kaldım,
yinede bu eksik olduğu gerçeğini değiştirmiyor.

Bu kadar sözden sonra CcsC nin registerlar ile ilgili sunduğu kolaylıktan bahsedelim:


#BYTE reg_TMR1L=0x16
yazmak için
gidip datasheet te TMR1L neredeymiş oooo kim bulacak şimdi,
uğraşmak yerine

#BYTE reg_TMR1L = GETENV("SFR:TMR1L")


#bit regb_TMR1ON=T1CON.0
yerine
#bit   reg_TMR1ON= GETENV("BIT:TMR1ON")


Başka  konudada benzerini yazmışım.
https://www.picproje.org/index.php?topic=61481.0
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ziyaretci

#21
Alıntı yapılan: Okan AKÇA - 20 Kasım 2015, 23:34:06
#include <16f1937.h>
#use delay(clock=4m)

int sayici;
#int_timer1
void  timer1_kesme ()   
{
sayici++;
  output_b(sayici);
}
void main()
{

setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);
sayici=0;

   while(TRUE);

}

dedigimi yapsanız olacaktı proteusta bizzat denedim çalısıyor.

Baran Ekrem hocamızın dedigi gibi ccs den başka bir  derleyiciye gecen eşşekten düşmüs gibi olur.


Hocam yanlış anlamayın. İnanın bu işlemci ile ilk çalıştırmaya çalıştığımda sizin gibi yaptım. Fakat çalışmadı. Ama şimdi baktım çalışıyor. Yani yukarıdaki kodlar ile. Sağolun.

mesaj birleştirme:: 21 Kasım 2015, 01:20:44

Alıntı yapılan: RaMu - 21 Kasım 2015, 00:17:32
İlgilenelim, ama yine araya bir şeyler serpiştireyim:
CcsC iyidir kötüdür diye bir şey demek istemedim, diyememde zaten,
araçtır, kısaca yerine göre iyi yerine göre kötü,
bende birşey çalışmadığında senin yapmaya çalıştığın gibi yapıyorum,
datasheet i açıp ne yapılması gerektiğini bulup
CcsC nin asm çıktısının ne yaptığına bakıyorum,
bu güne kadar tamam yakaladım CcsC hatalı diyebilecem dediğim her durumda
CcsC doğru derlemiş demek zorunda kaldım,
yinede bu eksik olduğu gerçeğini değiştirmiyor.

Bu kadar sözden sonra CcsC nin registerlar ile ilgili sunduğu kolaylıktan bahsedelim:


#BYTE reg_TMR1L=0x16
yazmak için
gidip datasheet te TMR1L neredeymiş oooo kim bulacak şimdi,
uğraşmak yerine

#BYTE reg_TMR1L = GETENV("SFR:TMR1L")


#bit regb_TMR1ON=T1CON.0
yerine
#bit   reg_TMR1ON= GETENV("BIT:TMR1ON")


Başka  konudada benzerini yazmışım.
https://www.picproje.org/index.php?topic=61481.0

Öğrenmiş olduk. :)

mesaj birleştirme:: 21 Kasım 2015, 01:23:14

Hocam birde; eksikten kastınız nedir? Örnek verebilir misiniz? Vereceğiniz örneğe cevaben, asm ile destek sağlasak CCS C 'ye eksik kapanmaz mı?

mesaj birleştirme:: 21 Kasım 2015, 02:20:18

Alıntı yapılan: Okan AKÇA - 20 Kasım 2015, 23:34:06
#include <16f1937.h>
#use delay(clock=4m)

int sayici;
#int_timer1
void  timer1_kesme ()   
{
sayici++;
  output_b(sayici);
}
void main()
{

setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);
sayici=0;

   while(TRUE);

}

dedigimi yapsanız olacaktı proteusta bizzat denedim çalısıyor.

Baran Ekrem hocamızın dedigi gibi ccs den başka bir  derleyiciye gecen eşşekten düşmüs gibi olur.


Hocam yukarıdaki çalışıyor. Aşağıdaki çalışmıyor. Hayret bir şey...

#include <16f1937.h>
#use delay(clock=4M)

#int_timer1
Void Timer13_7(){
output_high(pin_c0);
}

Void main(){
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(int_timer1);
enable_interrupts(global);
  
output_c(2);
While(true);
}

RaMu

16F in bu yeni serisindeki IOC interrupt larının
project wizard da kurulumu yok,
bunun gibi eksikler...
Asm ile halledilir herhalde ama
yanlış hatırlamıyorsam
CcsC microchipin mpASM sini değil kendi asm derleyicisini kullanıyordu,
fark olur mu bakmadım.

2. Programda C portunu kullanıyorsun,
bu portu kullanan başka şeyler varsa onları kapatmak gerekebilir,
psp, ccp, analog vs. oluyorya.
2. program çalışmıyor derken,
C0 ve C1 pinleri high olmuyor mu?
Sonuç ne oluyor,
proje ve simulasyon varsa dosya olarak paylaşırsan
direk bizde deneyip bakabiliriz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

M_B

@erkantr67  Hocam;
Calışmıyor dediğiniz programda #int_timer1 kesmesi icine dikkatli bakarmısınız.
burda output_high(pin_c0); demişsiniz. C0 portu ne zaman konum değiştirecek?
Her durumda high seviyesinde. Calısıp çalışmadığını nasıl anladınız ?
#include <16f1937.h>
#use delay(clock=4M)

#int_timer1
Void Timer13_7(){
output_high(pin_c0);
}

Void main(){
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(int_timer1);
enable_interrupts(global);
  
output_c(2);
While(true);
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

ziyaretci


RaMu

Bu kesmeye girmiyor anlamına gelir diyemeyiz,
belkide C0 pinini set edemiyor.
Isis de pic e, CcsC nin ürettiği .cof dosyasını yükleyip
adım adım bakmak daha iyi olur.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

ziyaretci

#26
Alıntı yapılan: RaMu - 21 Kasım 2015, 11:54:41
Bu kesmeye girmiyor anlamına gelir diyemeyiz,
belkide C0 pinini set edemiyor.
Isis de pic e, CcsC nin ürettiği .cof dosyasını yükleyip
adım adım bakmak daha iyi olur.

Hocam ona da baktım. Okan Akça 'nın verdiği kodda kesmeye giriyor, sayıcıyı arttırıyor. Fakat benim verdiğim kodda timer sürekli 0-65535 sayıyor. Ama kesmeye gitmiyor.

ziyaretci

  İlk defa bununla karşılaşıyorum.
 
  Sonsuz döngüden önce c portuna değer gönderdiğimde timer kesmesine gitmiyor. Örneğin;

 
#include <16f1937.h>
#use delay(clock=4M)

#int_timer1
Void Timer13_7(){
output_high(pin_c0);
}

Void main(){
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(int_timer1);
enable_interrupts(global);
  
output_c(2);  // Dikkat
While(true);
}


Yukarıdaki kodda kesmeye gitmiyor.

Aşağıdakinde kesmeye gidiyor.

#include <16f1937.h>
#use delay(clock=4M)

#int_timer1
Void Timer13_7(){
output_high(pin_c0);
}

Void main(){
SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_8);
enable_interrupts(int_timer1);
enable_interrupts(global);
  
// output_c(2);  
While(true);
}

 
Timer1 ayarlarından sonra c portuna çıkış bilgisi gönderdiğimde, kesmeye gidemiyorum. Eğer c portuna çıkış bilgisini kesme ayarlarından önce gönderirsem kesmeye gidiyor.

Var mı bunun bir mantığı? Fikri olan?