PIC in C portunu kesme olarak kullanmak

Başlatan makine_terbiyecisi, 04 Mart 2016, 00:42:39

makine_terbiyecisi

Merhaba arkadaşlar...
Ben 4x3 lük keypadı kesme ile almak istiyorum.
Keypadı PIC in C portuna bağladım.
Bu C portunu kesme olarak kullanabilir miyim ?
Pic16f877a kullanıyorum. 20MHz kristal..
# ÖĞRENELİM, ÖĞRETELİM #

dursuncemal

#1
malesef portc de port interuptu yok.fakat timer inerrupt kesmesiyle  tarama yontemi ile okuyabilirsin.
:=

makine_terbiyecisi

Alıntı yapılan: dursuncemal - 04 Mart 2016, 03:58:16
malesef portc de port interuptu yok.fakat timer inerrupt kesmesiyle  tarama yontemi ile okuyabilirsin.

cavabınız için teşekkür ediyorum..

Hocam bu keypad tarama PIC i çok meşgul ediyor.
Bu yüzden motorun enkoderinden gelen sinyalleri kaçırıyorum ve başka işlem yaptıramıyorum.
Sizce ne yapmalıyım ?
# ÖĞRENELİM, ÖĞRETELİM #

vitruvius

Para yada Pcb'de yer sorununuz var mı? Yoksa ucuz bir işlemci seçip onu bir encoder olarak kullanabilirsiniz.

makine_terbiyecisi

Alıntı yapılan: vitruvius - 04 Mart 2016, 18:07:57
Para yada Pcb'de yer sorununuz var mı? Yoksa ucuz bir işlemci seçip onu bir encoder olarak kullanabilirsiniz.

cavabınız için teşekkür ediyorum..

Yani iki farklı işlemci mi kullanayım ?

İki tane pic kullansam;
> Birini keypad tarama için
> Diğerini motor kontrolü için

Sonra bu iki pic RX-TX üzerinden seri haberleştirsem olurmu ?
# ÖĞRENELİM, ÖĞRETELİM #

mehmet

Bir timer ile portları kontrol edebilirsiniz...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr


sadogan

Alıntı yapılan: makine_terbiyecisi - 04 Mart 2016, 16:56:17
cavabınız için teşekkür ediyorum..

Hocam bu keypad tarama PIC i çok meşgul ediyor.
Bu yüzden motorun enkoderinden gelen sinyalleri kaçırıyorum ve başka işlem yaptıramıyorum.
Sizce ne yapmalıyım ?
Enkoder i nasıl sayıyorsunuz.

makine_terbiyecisi

# ÖĞRENELİM, ÖĞRETELİM #

dursuncemal

her durumda  bu islemi yapmak zorundasin key pad tarama okadar zaman alan bir is degil.bir kerede hepsini taramayacaksin.interrupta taramiyim pals kacmasin diyorsan mainin icinde her dongude tek tek tararsin baska bir islemci ile okuyup uartan tus verisi almak cok daha fazla zaman kaybetirir. kanimca. ama sunu yapabilirsin.zaten tus icin 7 adet pin kullaniyorsun ikinci bir pic kullanacaksan tus verilerini
paralel olarak okursan cok hizli olursun.birde encoderi nasli saydigin onemli eger inteerupt ile saydiriyorsan cok sikinti yasayabilirsin.encoderi timer e saydirirsan daha rahat olur gibime geliyor.
:=

makine_terbiyecisi

# ÖĞRENELİM, ÖĞRETELİM #

makine_terbiyecisi

Alıntı yapılan: dursuncemal - 04 Mart 2016, 21:35:14
her durumda  bu islemi yapmak zorundasin key pad tarama okadar zaman alan bir is değil.bir kerede hepsini taramayacaksin.interrupta taramiyim pals kacmasin diyorsan mainin icinde her dongude tek tek tararsin baska bir islemci ile okuyup uartan tus verisi almak cok daha fazla zaman kaybetirir. kanimca. ama sunu yapabilirsin.zaten tus icin 7 adet pin kullaniyorsun ikinci bir pic kullanacaksan tus verilerini
paralel olarak okursan cok hizli olursun.birde encoderi nasli saydigin onemli eger inteerupt ile saydiriyorsan cok sikinti yasayabilirsin.encoderi timer e saydirirsan daha rahat olur gibime geliyor.

İnterrupt ile timer kesmeleri farkı nedir ki?
Sonuçta düşen kenar yada yükselen kenarda ikiside kesme yapar. Farkını anlayamadım??
# ÖĞRENELİM, ÖĞRETELİM #

selimkoc

encoderi timer ile say. tuş okuma için kesme gerekiyorsa pcf8574 veya 8den 3'e kodlayıcı kullanabilirsin. bu enteggrelerin kesme için çıkışları var. bir tane kesme kullanırsın ve entegre çıkışını okursun. bu da bir yöntem.

sadogan

Alıntı yapılan: makine_terbiyecisi - 04 Mart 2016, 21:46:14
İnterrupt ile timer kesmeleri farkı nedir ki?
Sonuçta düşen kenar yada yükselen kenarda ikiside kesme yapar. Farkını anlayamadım??
Dış kesme her düşen veya yükselen kenarda kesme üretir.
Timer ise timer taştığında kesme üretir.
16lik bir timer 0xffff olduğunda bir kere kesme üretir eğer
timer a ön değer yüklerseniz, 0xFFFF- öndeğer  kadar pals geldiğinde
kesme ürertir. 
Enkoderi saymaktaki amacınız nedir bunu ve kesme rutinini görsek daha
kolay yorum yapabilirdik.

makine_terbiyecisi

Alıntı yapılan: sadogan - 05 Mart 2016, 11:42:44
Dış kesme her düşen veya yükselen kenarda kesme üretir.
Timer ise timer taştığında kesme üretir.
16lik bir timer 0xffff olduğunda bir kere kesme üretir eğer
timer a ön değer yüklerseniz, 0xFFFF- öndeğer  kadar pals geldiğinde
kesme ürertir. 
Enkoderi saymaktaki amacınız nedir bunu ve kesme rutinini görsek daha
kolay yorum yapabilirdik.

İlginiz için Teşekkür ediyorum..

Keypad ile hız bilgisini gireceğim.
sonra pwm ile bu hızı motor sürücüsüne vereceğim.
enkoder üzerinden feedback yapacağım. yani motor o hızda gerçekten dönüyor mu diye.
Hızı girilen değere getirmek için PID ile oto-kontrol yapacağım.

#int_ext // Enkoder pulse sayici
void pulse_counter(){
   pulse++;
}

#int_timer0 // Saniyede bir gelen pulse sayısını hesaplama
void timer(){
   set_timer0(60);
   flag=0;
   
   if(tt>0){
      tt--;
   }
   else{
      flag=1;
      disable_interrupts (global);
      disable_interrupts(int_timer0);
      disable_interrupts(int_ext);
      tt=100;
   }
}

//************ ANA FONKSIYON *********************
void main(){
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   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_d(0x00); // D portu cikis
   set_tris_b(0x03);
   set_tris_c(0xF0);
   
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_timer0);
   enable_interrupts(GLOBAL);
   ext_int_edge(H_TO_L);
   set_timer0(60);
   
   lcd_init(); // lcd hazirlaniyor

   while(TRUE){
      
      if(flag){
         tur=((float)pulse/36)*60;
         printf(lcd_putc,"\fF=%Lu puls/sn\n devir=%.2f dev/dk",pulse,tur);
         
         enable_interrupts(INT_EXT);
         enable_interrupts(INT_timer0);
         enable_interrupts(GLOBAL);
         ext_int_edge(H_TO_L);
         set_timer0(60);
         pulse=0;
         tt=100;
         flag=0;
      }
   }
}
# ÖĞRENELİM, ÖĞRETELİM #