Timer1 ile puls aralık zamanını ölçmek

Başlatan ergün, 18 Temmuz 2018, 18:52:18

ergün

Merhabalar;
         Farklı açılardaki puls sinyalleri arasındaki farkı ölçecek bir program üzerinde çalışıyorum, temel mantık komparatör kesmesini kullanarak saymaktı, fakat bunun yerine
her kesmede TIMER1 i bir register a eşitleyip sıfırlayarak aradaki farkı ekrana yazdırmaya çalışıyorum. puls uygulandığında kesmeler düzgün gibi ama ekranda birbirine yakın satabil olmayan
sayılar görüyorum. Yardımlarınız için şimdiden teşekkür ederim.


volatile unsigned long timer1_reg=0;
unsigned zmn1=0;
long as=0;

char txt[16];

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;


void init(){

  CMCON = 0x03;
  trisa = 0b11100111;
  porta = 0;
  trisb = 0b00000000;
  portb = 0;
 
 
  Lcd_Init();
  Lcd_Cmd(_LCD_CURSOR_OFF);
  Lcd_Out(1,1,"Sistem ");
  Lcd_Out(2,1,"Acildi ");
  delay_ms(500);
  Lcd_Cmd(_LCD_CLEAR);
}

void main()
{
init();
INTCON = 0b11000000; // GIE ve PEIE global kesmeler aktif
PIE1   = 0b01000000; // komparatör kesmesi aktif
T1CON  = 0b00000000;

//PIE1.TMR1IE=1;//Timer 1 kesmesi aktif.
T1CON.T1CKPS1=0;  //prsclH
T1CON.T1CKPS0=0; // prsclL

T1CON.T1OSCEN=0;
T1CON.NOT_T1SYNC=0;
T1CON.TMR1CS=0;
T1CON.TMR1ON=1;
TMR1H = 0x00;
TMR1L = 0x00;
 
  while(1)
  {
      longToStr(timer1_reg,txt);
      Lcd_out(2,1,"Timer = ");
      Lcd_out(2,6,txt);

}
}

void interrupt(){

     if( CMCON.C1OUT){
      c1out_bit=0;
      c2out_bit=0;
     
     PIR1.CMIF=0;
     timer1_reg = (TMR1H<<8) + TMR1L;
     TMR1L=0x00;
     TMR1H=0x00;
     }
}

ete

Stabil olmayan sayılar görüyorsan kullandığın mantık pek iyi değil demektir.
Yapacağın işi çok iyi anlamadım. Olay faz farkını hesaplamak ise komparatörden farklı metodlar kullanmak gerekir diye düşünüyorum. Elimizde iki sinyal olduğuna göre bunları PORTB 4-7 arasında iki pine bağlayıp PORB değişiklik kesmesi kullansan nasıl olurdu acaba?
BU girişler sırası ile %00 - %01 - %10 - %11  şeklinde değer alacak ve her yeni değer bir kesme oluşturacaktır
Böylece aradki faz farkı ölçülebilir diyorum. İLk kesmede TMR1 sayacı sıfırlanır ikinci kesmede değer başka bir değişkene aktarılarak ölçüm alınabilir diyorum.

C dili ile uğraşmadığım için teorik bilgiden fazlasını veremiyorum maalesef.
Ete


MB_77

#2
bu mesaj tarafımdan silinmiştir.

ergün

Merhabalar,
  Acaba T1 gate fonksiyonu 16f628 de var mı? varsa da  sanırım datasheetler de gözden kaçırdım. Bu fonksiyon kullanımı ile ilgili bir reg kaydı örneği yazabilir misiniz? Şimdiden cevaplar için teşekkür ederim.

Hattuşa

slm yeni nesil mcu larda özellikle timerlerdeki gate kontrolünün işlevi nedir

MB_77

#5
bu mesaj tarafımdan silinmiştir.

MB_77

#6
bu mesaj tarafımdan silinmiştir.

ete

Gate fonksiyonunu kullandımmı hatırlamıyorum. Genelde bir özellik lazım olursa detaylı inceleyip daha sonra data sheet'e uygun olarak kullanıyorum. Detyları hatırlamadığım için bende data sheet inceleyip bir açıklama yazayım demiştim ama MB_77 benden önce halletmiş teşekkür ederim.

Ete

Hattuşa

@MB_77
bilgiler için tşk ederim. güzel özellikmiş, biraz tembellik yapayım bahsettiğiniz gate kontrolü sanki T0CKI ve INT girişlerinin özelliklerine yakın. peki bu bahsettiğiniz özelliği kullanmak için illa INT veya T0CKI veya T1ICKI kanallarına mı girmek gerekiyor yoksa bağımsız mı? neden diye soracak olursanız. eski nesillerde 16F877 vb mcu larda bir adc okuayacaksanız ADCON1 registerindeki adc sıralamasına göre adc yi açmanız gerekir, mesela 2 kanal adc okuyacaksanız enaz 3 adc kanalı açmanız gerekiyor ki 2 kanal seçimi yok ve kesinlikle belirtilen pinlerden başkasını kullanamıyorsunuz. Ancak yeni nesillerde biraz opsiyon verilmiş. mesela ister portA ister portB de istediğin pini istediğin gibi ADC ye açabiliyorsun. neredeyse 10 senedir 877 yi kullanmadım. yeni nesil, yeni özellik her zaman kullanıcıyı rahatlatmak adına oldukça başarılı. ne var ki ne kadar özellik o kadar işleri karmaşıklaştırıyor, hele de bizim gibi eski versiyonları...

birde merak ettiğim bu işlemcilerde ki comparator özelliği onca yıldır kod yazıyorum hiç comparator özelliğini kullanmadım, belki ihtiyaç olmadı belki zor geldi bilmiyorum. içinizde deneyeniniz varmı?

MB_77

#9
bu mesaj tarafımdan silinmiştir.

MB_77

#10
bu mesaj tarafımdan silinmiştir.

Hattuşa

@MB_77 usta
o zaman isisde bu comparator uygulaması ile ilgili bir örnek yapıp ekleyebilirmiyiz? söylemlerinizin pekiştirilmesi adına

MB_77

#12
bu mesaj tarafımdan silinmiştir.

MB_77

#13
bu mesaj tarafımdan silinmiştir.

MB_77

#14
bu mesaj tarafımdan silinmiştir.

Powered by EzPortal