16F877A ve kesme ile hız hesaplama

Başlatan deccoyi, 13 Aralık 2015, 21:08:31

deccoyi

Planım şu şekilde B0 ext kesme pinine sinyal geldiğinde timer1 den süreyi alıp bir diziye kaydedecek. Sonra timer ı sıfırlayıp 1 ve 2. sinyal arasında gaçen süreyi  aynı diziye atayacak. Bu şekilde her sinyalde arada geçen süreyi hesaplayıp o beş sürenin ortalamasını alıp o hıza göre dakikada kaç tıklama (BPM) olduğunu hesaplamak istiyorum.

Şöyle bir kod yazdım ancak çalışmıyor. Saçma sapan değerler veriyor.

#include <16F877A.H> 
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP 
#use delay(clock=4000000)
#priority ext,timer1
#include "lcd.c" 
unsigned int32 timerdegeri[5];
unsigned int32 timertoplam=0;
unsigned int16 timerort=0;
unsigned int16 hiz=0;
unsigned int d=0,f=0;
unsigned int  timertasmasi=0;

#int_timer1
void timertas(){
   timertasmasi++; 
}

#int_ext
void hizoku(void){
   timerdegeri[d]=(get_timer1())+65536*timertasmasi;
   set_timer1(0);
   timertasmasi=0;
   timertoplam=timertoplam+timerdegeri[d];
   d++;
   if(d==5){
   d=0;
   timerort=timertoplam/(5);
   hiz=60000000/timerort;
   }
   

}



void main() //Ana program
{    
   lcd_init();     //LCD yi hazırla  
   setup_timer_1(T1_internal |T1_div_by_8);
   ext_int_edge(L_TO_H); 
   enable_interrupts(INT_EXT); 
   enable_interrupts(INT_timer1); 
   enable_interrupts(GLOBAL); 
   while(1){
   
      lcd_gotoxy(1,1);
      printf(lcd_putc,"HIZ:%lu",hiz);
//!      lcd_gotoxy(8,1);
//!      printf(lcd_putc," bpm");
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%lu",timerdegeri[d]);
      
   
   }
}

PROTECH_

bu süreyi kesme içinde bir pini high-low yapıp
osiloskoptan single-shot modu ile görebilirsin.

Yani ornek olarak RB4 pinini program içerisinde 0 yapıp kesme içerisinde 1 yapacaksın. O
siloskoptan Single shot modunda RB0 ve R4 Ü AYNI ANDA gözlemleyeceksin.
kesme oluşturup RB0 VE RB4 ün high olma sürelerindeki farkı sana kesme gecikmesini verir.
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

RaMu

Mikrodenetleyiciye C ile program yazmak
bazen MerCedes görünümlü Şahin havası yaratıyor.

  timerdegeri[d]=(get_timer1())+65536*timertasmasi;
...
timerort=timertoplam/(5);
   hiz=60000000/timerort;
...

bu gibi bölme çarpma işlemleri
helede 32bit sayılarla felan
Şahinde klimayı açıp bu araba neden bayırı tırmanamıyor demek gibi.


Bölme çarpma matematik işlemleri kaldırılmalı,
en azından kesme içinde yapılmamalı,
yani süreyi etkileyecek yerlerde yapılmamalı.

Misal kesme esnasında sadece o ölçümün sonucu bir değişkene yazılabilir,
yeterli sayıda ölçüm yapıldığında, gerekirse kesme kapatılarak,
alınan ölçümlerin ortalaması alınır,
hatta ortalama almayı mcu daha kolay yapabilsin diye
2nin üstsel katları (2-4-8-16-32-64) sayısınca örnek alınıp,
ortalama bulunurken kaydırma işlemi ile bölme yapılır.

Sürdüğünüz arabayı tanıyın,
o MCUnun o işlemleri yapması için, bin dereden su getirmesi lazım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

magic_gun

Alıntı yapılan: RaMu - 14 Aralık 2015, 20:49:23
Mikrodenetleyiciye C ile program yazmak
bazen MerCedes görünümlü Şahin havası yaratıyor.

  timerdegeri[d]=(get_timer1())+65536*timertasmasi;
...
timerort=timertoplam/(5);
   hiz=60000000/timerort;
...

bu gibi bölme çarpma işlemleri
helede 32bit sayılarla felan
Şahinde klimayı açıp bu araba neden bayırı tırmanamıyor demek gibi.


Bölme çarpma matematik işlemleri kaldırılmalı,
en azından kesme içinde yapılmamalı,
yani süreyi etkileyecek yerlerde yapılmamalı.

Misal kesme esnasında sadece o ölçümün sonucu bir değişkene yazılabilir,
yeterli sayıda ölçüm yapıldığında, gerekirse kesme kapatılarak,
alınan ölçümlerin ortalaması alınır,
hatta ortalama almayı mcu daha kolay yapabilsin diye
2nin üstsel katları (2-4-8-16-32-64) sayısınca örnek alınıp,
ortalama bulunurken kaydırma işlemi ile bölme yapılır.

Sürdüğünüz arabayı tanıyın,
o MCUnun o işlemleri yapması için, bin dereden su getirmesi lazım.

+1 :)
hayal etmeden basaramazsınız www.atariturkiye.com

deccoyi

Alıntı yapılan: RaMu - 14 Aralık 2015, 20:49:23
Mikrodenetleyiciye C ile program yazmak
bazen MerCedes görünümlü Şahin havası yaratıyor.

  timerdegeri[d]=(get_timer1())+65536*timertasmasi;
...
timerort=timertoplam/(5);
   hiz=60000000/timerort;
...

bu gibi bölme çarpma işlemleri
helede 32bit sayılarla felan
Şahinde klimayı açıp bu araba neden bayırı tırmanamıyor demek gibi.


Bölme çarpma matematik işlemleri kaldırılmalı,
en azından kesme içinde yapılmamalı,
yani süreyi etkileyecek yerlerde yapılmamalı.

Misal kesme esnasında sadece o ölçümün sonucu bir değişkene yazılabilir,
yeterli sayıda ölçüm yapıldığında, gerekirse kesme kapatılarak,
alınan ölçümlerin ortalaması alınır,
hatta ortalama almayı mcu daha kolay yapabilsin diye
2nin üstsel katları (2-4-8-16-32-64) sayısınca örnek alınıp,
ortalama bulunurken kaydırma işlemi ile bölme yapılır.

Sürdüğünüz arabayı tanıyın,
o MCUnun o işlemleri yapması için, bin dereden su getirmesi lazım.

Teşekkürler. Ilk defa bi proje için bişeyer yazıyorum derste led yakıp söndürmeye benzemiyor :(

datax

Alıntı yapılan: RaMu - 14 Aralık 2015, 20:49:23Mikrodenetleyiciye C ile program yazmak
bazen MerCedes görünümlü Şahin havası yaratıyor.

  timerdegeri[d]=(get_timer1())+65536*timertasmasi;
...
timerort=timertoplam/(5);
  hiz=60000000/timerort;
...

bu gibi bölme çarpma işlemleri
helede 32bit sayılarla felan
Şahinde klimayı açıp bu araba neden bayırı tırmanamıyor demek gibi.


Bölme çarpma matematik işlemleri kaldırılmalı,
en azından kesme içinde yapılmamalı,
yani süreyi etkileyecek yerlerde yapılmamalı.

Misal kesme esnasında sadece o ölçümün sonucu bir değişkene yazılabilir,
yeterli sayıda ölçüm yapıldığında, gerekirse kesme kapatılarak,
alınan ölçümlerin ortalaması alınır,
hatta ortalama almayı mcu daha kolay yapabilsin diye
2nin üstsel katları (2-4-8-16-32-64) sayısınca örnek alınıp,
ortalama bulunurken kaydırma işlemi ile bölme yapılır.

Sürdüğünüz arabayı tanıyın,
o MCUnun o işlemleri yapması için, bin dereden su getirmesi lazım.

matematiksel islemlerde C nin ne gibi dezavantaji var biraz aciklar misin

RaMu

Konu eski nereden buldunuz.

Size her şeyi yapabileceğinizi zannettirmesi dezavantaj,
arka planda o işlemi yapabilmek için neler çevirdiğini bilmiyorsanız dezavanaj.
Yaptırmak istediğiniz matematiksel işlemler için
uygun özellikleri olan mikrodenetleyiciler kullanmalısınız ve
bu mikrodenetleyicilerin ilgili matematik komutlarını
derleyicinin C komutlarını makina diline çevirirken
uygun şekilde kullandığından emin olmalısınız.

Bir kaç işlem yaptırıp asm çıktısına bakın anlarsınız.
Birde aynı işlemleri donanımsal çarpma bölme modülü bulunan
matematik işlem komutları olan mcu lar ile yapıp
asm çıktısına bakıp karşılaştırabilirsininiz.

Ayrıca varmak istediğiniz matematiksel işlem sonucuna ulaşmanın bir çok yolu var
bu yollardan işlemciyi en az yoracak olanı seçecek şekilde programınızı yazmalısınız,
burada yazdığınız C komutlarını derleyicinin neye çevirdiğini yine bilmeniz gerekiyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html