timer1 start stop acil yardım

isoment01

Üye
Katılım
26 Haz 2016
Mesajlar
197
Puanları
1
Yaş
32
arkadaşlar merhaba, forumda oldukça fazla yardım istiyorum heryerden araştırıyorum fakat deneyimsiz olduğum için hep eksik kalıyor ama işin ucunu bırakmak istemiyorum bırakamam buradan başka akıl danışabileceğim birisi yok, konuyu daha önce açtım bir abimiz yardım etti fakat ccs de yazdıgım ıcın mp lab uyumlu kodlarda bazı register atamalarını yapamadım. Yapacagım sistemi hemen anlatacak olursam;
step motorum 200 adımlık yarım adım sürüp 400 adımda 8 tur atmasını fakat ileri ve geri yönde olacak buna göre kesmeyi ileri yönde 8 tur ve geri yönde 8 tur yapmam lazım. Bu noktada kesmeyi nasıl sonlandırıp başlatacagımı bilemedim sizlere yazdığım kodu göndereceğim ve ordaki eksiklerimi söylerseniz ptesi günü olan tubitak sunumumda bana cok yardımcı olmanız lazım sistemi calıstırabılmem ıcın bu motoru sürmem şart.
ledlerle calıstırdıgımda sadece motor ve yon pınlerım calısıyor timer a hıc gırmıyor.

#device PIC18F4680
#include <18f4680.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
#use fast_io(b)
unsigned int16 sayac = 0, hedef = 0;
#int_timer1
void timer1_interrupts()
{
set_timer1(63036);
output_high(pin_b0);
delay_us(20);
output_low(pin_b0);
sayac++;
if(sayac>=hedef)
disable_interrupts(INT_TIMER1);
disable_interrupts(GLOBAL);
}

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //65,5 ms overflow
setup_timer_2 (T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_b(0x00);
output_b(0x00);
set_tris_c(0x00);
output_c(0x00);
enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);
output_high(pin_c3);// motor aktif
delay_ms(100);
output_high(pin_c1);// motor yönü belirlendi
delay_us(50);
hedef=3200; //400*8
sayac=0;
set_timer1(63036);

output_low(pin_c1); // yon degıstırıldı
hedef=3200;
sayac=0;
set_timer1(63036);
output_low(pin_c3); // motor durdu






while(TRUE)
{
//TODO: User Code
}

}
 
hiç yardım edebilecek bir arkadaş yok mu ?
 
Hatayı tam olarak nerede alıyorsun?

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
 
hocam yazıyorum smdı
 
Son düzenleme:
Hatayı tam olarak nerede alıyorsun?

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
Kod:
#device PIC18F4680
#include <18f4680.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
#use fast_io(b)
unsigned int16 sayac = 0, hedef_ileri = 0, hedef_geri=0, yon=1;
#int_timer1
void timer1_interrupts()
{

set_timer1(64923);
output_high(pin_c2);
delay_us(20);
output_low(pin_c2);
sayac++;
if(sayac==hedef_ileri)
{
yon=2;
output_low(pin_c1);// motor geri gidiyor
}
if(sayac==hedef_geri)
{
sayac=0;
yon=1;
output_high(pin_c1);// motor yönü belirlendi
//disable_interrupts(int_timer1);// motor calısıyor fakat pulse uretmıyor
}
}

void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);      //262 ms overflow      //65,5 ms overflow
setup_timer_2 (T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_b(0x00);
output_b(0x00);
set_tris_c(0x00);
output_c(0x00);

enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);
output_high(pin_c3);// motor aktif
delay_ms(100);
output_high(pin_c1);// motor yönü belirlendi
yon=1;//ileri yon
delay_us(50);
hedef_ileri=3200;//400*8
hedef_geri=6400;
sayac=0;
set_timer1(64923);












   while(TRUE)
   {
      //TODO: User Code
   }

}
hocam şu an bu noktadayım kımse yardım etmeyince iş başa dustu dene yanıl dene yanıl su an 8 sanıye ılerı 8 sanıye gerı yapıyorum sureklı sekılde. ama 8 sanıye ılerı gıttıgımde tımer1 kapatmak 8 sanıye gerı gıderken tekrar acmak ıstıyorum yapamıyorum. kısacası tımer1 start stop yapmayı beceremedım. bırde main programımda ben confugurasyonları yapıp aktıf edıp timer degerını gırdıgım anda mı benım tımer fonksıyonum cagrılıyor calısma mekanızmasını ben yarım yamalak anladım normalde bır fonksıyon tanımlarsın ornegın void x() bunu x(); seklınde cagırrsın burda boyle olmuyor :D bunu bana acıklayabılır mısınız ?
 
Timer enerji verdiğiniz anda çalışmaya başlar, her saat darbesinde bir artar ve ayarlanan değeri aşınca yani taşma olduğunda kesme fonksiyonuna otomatik gider. Şu an kodları inceleyemedim işte olduğum için. Boş bir vakitte bakacağım. Bende pic konusunda yeniyim elimden geldiğince yardımcı olmaya çalışacağım.

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
 
Timer enerji verdiğiniz anda çalışmaya başlar, her saat darbesinde bir artar ve ayarlanan değeri aşınca yani taşma olduğunda kesme fonksiyonuna otomatik gider. Şu an kodları inceleyemedim işte olduğum için. Boş bir vakitte bakacağım. Bende pic konusunda yeniyim elimden geldiğince yardımcı olmaya çalışacağım.

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
enable_interrupts(INT_timer1);
enable_interrupts(GLOBAL);
set_timer1(64923);
bence enable lar timer a calısma izni veriyor ve set_timer1 ile belirlenen değerden itibaren kesme fonksiyonuna gidip oradaki işlerini yapıyor. Enerji verildiği andan kastınız bu sanırım . Ama yani timer'ı aç kapa yapmak istediğimde kesme fonksiyonunda da bunu yapsam mainde de yazsam ya hiç timer calısmıyor ya da timer ledim sürekli cok hızlı bir şekilde yanıp sönüyo motor un içeriside tık tık tık edip hiç çalışmıyor vaziyette oluyor. Hocam benim bildiğim sana senin bildiğin bana :D
 
Enable işlemi zaten kesmeyi aktif etmek için kullanılır. Kesmeler aktif edilmeden timer çalışmaz.
Diyelim ki belirlenen süre sonunda kesme fonksiyonu çalıştı, işlemlerden sonra programınız main fonksiyonuna geri döner. Senin kesme süren 65 ms yani bu demek oluyorki timer fonksiyonu bitip main'e geri döndükten 65 ms sonra timer tekrar çalışacaktır.

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
 
Ben bu olayı çözemedim, @MAIN_LOOP arkadaş müsaitse bizi aydınlatabilir mi?

GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
 

Forum istatistikleri

Konular
129,867
Mesajlar
930,872
Kullanıcılar
452,732
Son üye
erencok

Yeni konular

Çevrimiçi üyeler

Geri
Üst