Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: pax - 23 Nisan 2014, 14:43:54

Başlık: udea rf modül zamanlama
Gönderen: pax - 23 Nisan 2014, 14:43:54
UDEA' nın ATX34S  RF modülünü kullanmak istiyorum. bununla ilgili UDEA'nın dökümanlarına program örneği var. örnek program için Compiler olarak HI-TECH Software kullanılmıştır diyor. ben programı CCS de yazmak istiyorum ve kendime göre programı uyarladım. takıldığım konu bit gönderim süresi ile ilgili. udea notlarına göre modüller 2400 baud rate kullanıyor ve buna göre her bit 416 mikro saniye aralıklarla gönderiliyor. örnek programda 375 mikro sn lik bekleme yapılıyor ve geri kalan sürede komut işleme süresi olarak hesaplanıp 416 mikro sn tamamlanıyor.

ben aşağıdaki programı  yazdım programda ccs c derleyicisinde .  burada bekleme olarak 375 mikro sn veriyorum ancak geri kalan komut işleme süresini n toplamda ne kadar olduğunu bilmiyorum. bunu nasıl öğrenebilirim daha doğrusu her bir bit 416 mikro sn de gönderebilmek için bekle süresi ne kadar olmalı.
void bekle()
{
     delay_us(200);
     delay_us(175);
}
void  gonder(data) // data gönderen alt program
  {
     while(sayac<=7)
      {
        data_set=data & mask;
       
        if(data_set==0x80)
          {
           output_high(data_giden);
          }
        else
          {
           output_low(data_giden);
          }
       bekle();
        sayac++; 
        if(sayac<=7)
        {
           data=data<<1;
        }
       }
      sayac=0;
   
}
Başlık: Ynt: udea rf modül zamanlama
Gönderen: mozkan87 - 23 Nisan 2014, 19:08:53
Eğer mümkünse hardware usart kullanın bu zamanlamaları o halleder zaten. Normal seri port kullanır gibi kullanabilirsiniz.
Başlık: Ynt: udea rf modül zamanlama
Gönderen: pax - 23 Nisan 2014, 19:33:50
Alıntı yapılan: mozkan87 - 23 Nisan 2014, 19:08:53
Eğer mümkünse hardware usart kullanın bu zamanlamaları o halleder zaten. Normal seri port kullanır gibi kullanabilirsiniz.
dediğiniz gibi yapabiliyorum zaten. Bir de bu şekilde yapmak istedim. Biraz daha detaya inip daha fazla şey öğrenmek istiyorum
Başlık: Ynt: udea rf modül zamanlama
Gönderen: serhat1990 - 23 Nisan 2014, 20:47:26
Merhabalar , ben zamanında 375uS kullanarak yapmıştım. Start biti ve stop bitlerini datanın başına ve sonuna ekleyip denersen belki bir çözüme ulaşabilirsin. İyi çalışmalar dilerim.
Başlık: Ynt: udea rf modül zamanlama
Gönderen: LukeSkywalker - 23 Nisan 2014, 21:03:44
Alıntı yapılan: pax - 23 Nisan 2014, 19:33:50
dediğiniz gibi yapabiliyorum zaten. Bir de bu şekilde yapmak istedim. Biraz daha detaya inip daha fazla şey öğrenmek istiyorum
CCS'de bildiğim kadarı ile ASM kod gömülebiliyor. Veri gönderme ve alma kısımlarını ASM kod kullanarak yaparsanız zaman hesaplamaları kolay olacaktır.
Başlık: Ynt: udea rf modül zamanlama
Gönderen: pax - 24 Nisan 2014, 00:15:00
Alıntı yapılan: LukeSkywalker - 23 Nisan 2014, 21:03:44
CCS'de bildiğim kadarı ile ASM kod gömülebiliyor. Veri gönderme ve alma kısımlarını ASM kod kullanarak yaparsanız zaman hesaplamaları kolay olacaktır.

asm ile aram pek iyi değildir. o yüzden asm'den uzak duruyorum


Alıntı yapılan: serhat1990 - 23 Nisan 2014, 20:47:26
Merhabalar , ben zamanında 375uS kullanarak yapmıştım. Start biti ve stop bitlerini datanın başına ve sonuna ekleyip denersen belki bir çözüme ulaşabilirsin. İyi çalışmalar dilerim.
bunu naıl yapabilirim ?

benim asıl öğrenmek istediğim aşağıdaki kodda ""// basla"" noktasından başlayarak program "//bitir" noktasına gelenekadar ne kadar süre geçmiştir. bunu öğrenebileceğim bir yol var mı
void bekle()
{
     delay_us(200);
     delay_us(175);
}
void  gonder(data) // data gönderen alt program
  {
     while(sayac<=7)
      {
        data_set=data & mask;
        //bitir
        if(data_set==0x80)
          {
           output_high(data_giden);
          }
        else
          {
           output_low(data_giden);
          }
       bekle();
//// basla
        sayac++; 
        if(sayac<=7)
        {
           data=data<<1;
        }
       }
      sayac=0;
   
}


Başlık: Ynt: udea rf modül zamanlama
Gönderen: Kabil ATICI - 24 Nisan 2014, 00:29:04
Belirttiğin bölümler arasında bir bacağı (başka bir bacak) 1 sonra 0 yapacak şekilde ayarlayıp, işlemciye yükleyip osilaskopla bakıyorsun! (en kolay yolu)

Derleyicinin o belirttiğin yerler arasına hangi komutları gömeceğini bilemeyebiliriz. çünkü pic üzerinde asm olarak doğrudan bir değeri karşılaştırmak için takla atmak gerekiyor.
Başlık: Ynt: udea rf modül zamanlama
Gönderen: LukeSkywalker - 24 Nisan 2014, 09:57:21
Eğer derleyici yazdığınız C programının asm çıktısını veriyorsa nerede ne kadar zaman geçtiğini hesaplayabilirsiniz. Ama ASM ile aranız pek iyi değilse hesaplayamayadabilirsiniz.
Başlık: Ynt: udea rf modül zamanlama
Gönderen: pax - 24 Nisan 2014, 18:31:53
Alıntı yapılan: LukeSkywalker - 24 Nisan 2014, 09:57:21
Eğer derleyici yazdığınız C programının asm çıktısını veriyorsa nerede ne kadar zaman geçtiğini hesaplayabilirsiniz. Ama ASM ile aranız pek iyi değilse hesaplayamayadabilirsiniz.

evet sam kısmını yapamam. ancak derleyici asm çıktısı veriyor zannedersem. asm den nasıl hesaplayacağım ?
.................... void  gonder(data) // data gönderen alt program
....................   {
....................      while(sayac<=7)
....................       {
*
0019:  MOVF   20,W
001A:  SUBLW  07
001B:  BTFSS  03.0
001C:  GOTO   038
....................         data_set=data & mask;
001D:  MOVF   24,W
001E:  ANDWF  23,W
001F:  MOVWF  22
....................         
....................         if(data_set==0x80)
0020:  MOVF   22,W
0021:  SUBLW  80
0022:  BTFSS  03.2
0023:  GOTO   026
....................           {
....................            output_high(data_giden);
0024:  BSF    08.3
....................           }
....................         else
0025:  GOTO   027
....................           {
....................            output_low(data_giden);
0026:  BCF    08.3
....................           }
....................         delay_us(200);
0027:  MOVLW  42
0028:  MOVWF  77
0029:  DECFSZ 77,F
002A:  GOTO   029
002B:  NOP
....................         delay_us(175);
002C:  MOVLW  3A
002D:  MOVWF  77
002E:  DECFSZ 77,F
002F:  GOTO   02E
....................         sayac++;   
0030:  INCF   20,F
....................         if(sayac<=7)
0031:  MOVF   20,W
0032:  SUBLW  07
0033:  BTFSS  03.0
0034:  GOTO   037
....................         {
....................            data=data<<1;
0035:  BCF    03.0
0036:  RLF    24,F
....................         } 
....................        }
0037:  GOTO   019
....................       sayac=0;
0038:  CLRF   20
Başlık: Ynt: udea rf modül zamanlama
Gönderen: LukeSkywalker - 24 Nisan 2014, 18:58:43
Dikkat ederseniz c'de yazdığınız hangi satırın ne kadar asm koduna denk geldiği gösteriliyor. Buradan asm kodlarının kaç cycle tuttuğu belli olduğuna göre her C satırı için kaç cycle işlem yapıldığını görebilirsiniz. Dikkat edin bazı asm kodları 2 cycle tutar. hangi kodların 2 cycle hangilerinin 1 cycle olduğu işlemcinin datasheetinde sonlara doğru gösterilmekte. Cycle sayısını bulduğunuzda gerisi çok kolay. İşlemcinizin osilatör frekansını 4'e böleceksiniz ve T=1/f işleminden her cycle için geçen süreyi bulacaksınız. (Bu yazdıklarım PIC16-18 familyası için geçerli.)
Başlık: Ynt: udea rf modül zamanlama
Gönderen: Kabil ATICI - 24 Nisan 2014, 19:25:55
İşlemcinin veri kağıdını açtığınızda komut listesini göreceksiniz. Orada her komutun ne kadar çevrim işgal ettiğini karşısına yazıp topladığınızda sadece bilmeniz gereken sadece bir çevrimin kaç saat frekansını denk geldiğini bilmektir. En bunuda bildiğinize göre hesaplayabilirsiniz...

Bu hesapta tek şaşıran bazı komutların duruma göre çevrimi değişmesidir.