int_rda ile timer1 kesmesini çağırmak

isoment01

Üye
Katılım
26 Haz 2016
Mesajlar
197
Puanları
1
Yaş
31
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.

Kod:
#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
   }

}
 

Forum istatistikleri

Konular
128,133
Mesajlar
915,308
Kullanıcılar
449,849
Son üye
cagan20

Yeni konular

Çevrimiçi üyeler

Geri
Üst