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;
}
Eğer mümkünse hardware usart kullanın bu zamanlamaları o halleder zaten. Normal seri port kullanır gibi kullanabilirsiniz.
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
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.
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.
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;
}
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.
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.
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
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.)
İş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.