int_rda ile timer1 kesmesini çağırmak

Başlatan isoment01, 21 Haziran 2017, 11:26:24

isoment01

Arkadaşlar herkese merhaba ben timer1 kesmesi ile oluşturduğum stepper motor palslerimi serialden vereceğim komutlarla başlatıp durdurmak istiyorum bunun için rda kesmesini kullandım fakat rda kesmesindeyken timer1 kesmesini nasıl call edeceğim onu bilemiyorum aslında belki timer1'i çağırmaya da gerek yoktur çözüm yollarınıza açığım. Kodlarımı buraya atacağım. Rda kesme fonksiyonunda eksiğim var.
16f877 kullanıyorum, devremi breadboard üzerinde hazırlıyorum.
#device PIC16F877A
#include <16f877a.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;
char klavye=0;
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1, Bits=8,BRGH1OK)
#int_rda
#int_timer1
#priority rda, timer1
void serihaberlesme_kesmesi ()
{
 disable_interrupts(int_rda); // int_rda kesmesini pasif yap
 output_high(pin_b0); // RC5 çıkışı lojik-1
 klavye=getchar();// String ifadeyi al ve "klavye" adlı dizi değişkenine aktar.
 putc(klavye);
 printf("\n\rYazdiginiz harf> %s\n",klavye); // Satır atla, yeni satır,RS232 üzerinden klavye string ifadesini gönder,satır atla
 printf("\f%s",klavye); //LCD'yi temizle ve klavye string ifadesini LCD'de göster
 output_low(pin_b0); // RC5 çıkışı lojik-0
 printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder
}
void timer1_interrupts()
{

set_timer1(64923);

sayac++;
if(sayac==hedef_ileri)
{
yon=2;
output_low(pin_c1);// motor geri gidiyor
}
if(sayac<3200 || sayac>4000)
{
output_high(pin_c2);
delay_us(20);
output_low(pin_c2);
}
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(GLOBAL);
enable_interrupts(INT_timer1);
enable_interrupts(int_rda);
printf("\n\r System initializing....\n\r");
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)
   {
     enable_interrupts(INT_timer1);
enable_interrupts(int_rda); //TODO: User Code
   }

}

serial monitörde de şunları görüyorum ; buradası da çok garip programı çalıştırdığımda direk bunlar karşıma çıkıyor .




ferdem

Kesme altprogramlarını # ile yapılan bildirimin hemen altına koyun, yazdığınız şekilde çalışıyor mu?
#int_rda
void serihaberlesme_kesmesi (){

#int_timer1
void timer1_interrupts(){
Adım adım gitmek lazım. Forumda #int_rda ve #int_timer1 kelimelerini ayrı ayrı arayıp bu kesmelerin kullanım örneklerine ulaşabilirsiniz. UART tan her "bir byte" geldiğinde rda kesmesi oluşur. Timer1 her taşdığında timer1 kesmesi oluşur.

isoment01

Alıntı yapılan: ferdem - 21 Haziran 2017, 13:50:28
Kesme altprogramlarını # ile yapılan bildirimin hemen altına koyun, yazdığınız şekilde çalışıyor mu?
#int_rda
void serihaberlesme_kesmesi (){

#int_timer1
void timer1_interrupts(){
Adım adım gitmek lazım. Forumda #int_rda ve #int_timer1 kelimelerini ayrı ayrı arayıp bu kesmelerin kullanım örneklerine ulaşabilirsiniz. UART tan her "bir byte" geldiğinde rda kesmesi oluşur. Timer1 her taşdığında timer1 kesmesi oluşur.
onu da denerim ama daha farklı sorunlarım var iki kesmeyi kendi başına kullanabiliyorum fakat ilk entryimde de anlattığım gibi benim pc den komutu girdiğimde timer ım aktif olması lazım  hocam ikisini nasıl birbirine entegre edecem bilemiyorum. Bu tarz birşey bulamadım kaç gündür araştırıyorum.

vitruvius

#3
Alıntı yapılan: isoment01 - 21 Haziran 2017, 14:01:12
onu da denerim ama daha farklı sorunlarım var iki kesmeyi kendi başına kullanabiliyorum fakat ilk entryimde de anlattığım gibi benim pc den komutu girdiğimde timer ım aktif olması lazım  hocam ikisini nasıl birbirine entegre edecem bilemiyorum. Bu tarz birşey bulamadım kaç gündür araştırıyorum.

Onu da denerim derken, ferdem hatalarınızdan birini göstermiş ve kodu o şekilde düzeltmeniz lazım.

İkisini ayrı ayrı çalıştırabiliyorsanız timer1 kesmesini nasıl aktif ettiğinizi biliyorsunuz demektir. int_rda kesmesi içinde bir bayrağı set edip ana fonksiyonda bu bayrağın durumunu kontrol etmelisiniz. Eğer bayrak aktifse timer1 kesmesini çalıştırırsınız.

Ayrıca kesme fonksiyonu içindeki ıvır zıvır (output, printf v.b.) işlemleri de ana fonksiyon içinde bu bayrak set edilmiş ise yapmak lazım ki kesme fonksiyonunda oyalanmasın program.

isoment01

Alıntı yapılan: vitruvius - 21 Haziran 2017, 15:10:01
Onu da denerim derken, ferdem hatalarınızdan birini göstermiş ve kodu o şekilde düzeltmeniz lazım.

İkisini ayrı ayrı çalıştırabiliyorsanız timer1 kesmesini nasıl aktif ettiğinizi biliyorsunuz demektir. int_rda kesmesi içinde bir bayrağı set edip ana fonksiyonda bu bayrağın durumunu kontrol etmelisiniz. Eğer bayrak aktifse timer1 kesmesini çalıştırırsınız.

Ayrıca kesme fonksiyonu içindeki ıvır zıvır (output, printf v.b.) işlemleri de ana fonksiyon içinde bu bayrak set edilmiş ise yapmak lazım ki kesme fonksiyonunda oyalanmasın program.
hocam tam ferdem beye de bunu yazıcaktım onu yapmadan önce timer1 çalışmıyordu şimdi çalıştı bir art niyetim yoktu orda özür dilerim. rda daki ıvır zıvırları sadece kontrol amaçlı rda ya giriyormu diye kontrol amaçlı yaptım. şimdi bu dediklerinizi ben nasıl yapacam bilemiyorum hocam ya minik bir örnek vererek anlatır mısınız rica etsem ? ccs de kesme bayragını set etme işi sanırım enable_interrupt, disable interrupt ile oluyor ama algoritmayı nasıl kuracam bilemiyorum.

vitruvius

Art niyetlik bir şey olduğundan değil ferdem'in yazdığı konuyu geçiştirme diye söyledim. Bayrak dediğim şey bir boolean değişken.

Mesela:

bool kesmeGeldiMi = false; // RDA kesmesi gelip gelmedigini kontrol etmek icin bir bayrak

#int_rda
void serihaberlesme_kesmesi (){
  kesmeGeldiMi = true; // Kesme geldi, bayragi set et
}

int main () {
  if (kesmeGeldiMi){
    // RDA kesmesi gedigindeki isleri yap
    kesmeGeldiMi = false; // Isler bittiginde bayragi sifirla ki tekrar kullanabilesin.
  }
}


Algoritma işi için pseudo code yazacaksın. Eline kalem kağıt alıp akış diyagramı çizeceksin. Daha profesyonel bir şey olsun diyorsan UML öğreneceksin.

isoment01

Alıntı yapılan: vitruvius - 21 Haziran 2017, 15:27:35
Art niyetlik bir şey olduğundan değil ferdem'in yazdığı konuyu geçiştirme diye söyledim. Bayrak dediğim şey bir boolean değişken.

Mesela:

bool kesmeGeldiMi = false; // RDA kesmesi gelip gelmedigini kontrol etmek icin bir bayrak

#int_rda
void serihaberlesme_kesmesi (){
  kesmeGeldiMi = true; // Kesme geldi, bayragi set et
}

int main () {
  if (kesmeGeldiMi){
    // RDA kesmesi gedigindeki isleri yap
    kesmeGeldiMi = false; // Isler bittiginde bayragi sifirla ki tekrar kullanabilesin.
  }
}


Algoritma işi için pseudo code yazacaksın. Eline kalem kağıt alıp akış diyagramı çizeceksin. Daha profesyonel bir şey olsun diyorsan UML öğreneceksin.
timer1 i if(kesmegeldimi) döngüsünün içerisinde mi  enable edeceğim o zaman?

vitruvius