Picc18 hız sorunu asm çözüm arıyorum.

Başlatan emrez, 13 Nisan 2011, 20:50:02

emrez

Selam arkadarşlar 23k256 ya veri yollayacağım ancak PLL ile 40 mhz de 20 us gibi bir zaman alıyor bir veri, bunu 5-6 us ile bitirecek asm olarak düzenleyebilirmiyiz,

asm ile yapmaya çalıştım ancak nedense ilk satırdan sonra bcf PORTB,2 bsf PORTB,2 yapıyorum tris 0b00000000; ancak ilk satırdan sonra clock ve shift yapamadım. derleyici 60 satır asm üretiyor buda çok fazla saat kaybı bunu az ve öz bir kod ile nasıl yapabilirim. void SramWriteByte(unsigned char data)  alanını yapsanız gerisini ben yazarım, asm çok az kullandım.



unsigned static char GCC;

void SramWriteByte(unsigned char data);


#define clk_low() PORTDbits.RD5=0
#define clk_high() PORTDbits.RD5=1
#define s_datasend PORTDbits.RD4
#define s_dataout PORTDbits.RD6

void sramon(void)
{
GCC = TRISD;
TRISD =0x40;
PORTD=0x00;
PORTAbits.RA5=0;
}

void sramoff(void)
{
PORTAbits.RA5=1;
TRIS

void Sram_init(void)
{
// write status register
sramon();
SramWriteByte(0x01);
SramWriteByte(0x41);
sramoff();
udelay(1);
sramon();
SramWriteByte(0x05);
SramWriteByte(0xFF);
sramoff();
}



void SramWriteByte(unsigned char data)    // felaket yavaş, tek çözüm asm.
{
   clk_low(); 
   s_datasend=data>>7;                   
   clk_high();
   clk_low(); 
   s_datasend=data>>6;                   
   clk_high();
   clk_low();     
   s_datasend=data>>5;                   
   clk_high();
   clk_low();     
   s_datasend=data>>4;                   
   clk_high();
   clk_low();     
   s_datasend=data>>3;                   
   clk_high();
   clk_low();     
   s_datasend=data>>2;                   
   clk_high();
   clk_low();     
   s_datasend=data>>1;                   
   clk_high();
   clk_low();     
   s_datasend=data;                   
   clk_high();
   }


----



#include "p18F4620.INC"
#include "C18_MACRO.INC"

STRING CODE
EMRE
SRAM
   global SRAM

      Stk1CpyToReg -1,WREG ;

        ;MOVWF SRAM
      
      MOVWF  EMRE, ACCESS;

X-Fi

veriyi 7 kere peşpeşe kaydırıyorsunuz her seferinde bir tane kaydırın registerda saklayıp gönderin for döngüsüne alın işlemi hızlanacaktır.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

Daha kısa çözümler olsa da;

data & 0x80 sonucu 1 ise 1 yolla değilse 0 yolla
data & 0x40 sonucu 1 ise 1 yolla değilse 0 yolla
..
..
data & 0x02 sonucu 1 ise 1 yolla değilse 0 yolla
data & 0x01 sonucu 1 ise 1 yolla değilse 0 yolla

tipi program bile hızlı çalışır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Erol YILMAZ

Alıntı yapılan: bunalmis - 13 Nisan 2011, 22:03:25
Daha kısa çözümler olsa da;

data & 0x80 sonucu 1 ise 1 yolla değilse 0 yolla
data & 0x40 sonucu 1 ise 1 yolla değilse 0 yolla
..
..
data & 0x02 sonucu 1 ise 1 yolla değilse 0 yolla
data & 0x01 sonucu 1 ise 1 yolla değilse 0 yolla

tipi program bile hızlı çalışır.

yolla(data & 0x80); :)

emrez

çok teşekkür ederim hemen deniyorum.
%50-60 saat çevrimi kazansam yeterli umarım olur. yoksa sram kullanımı yavaş olacak kullanamayacağım

emrez


emrez

dostum, spi üzerinden kurmak istediğimde ram yetmiyor, çok fazla veri var ondan dolayı lcd ye yazar gibi veri kullanıyorum, c18 spi için gerekli yazılımı ekleyince hata alıyorum. udata section hatası.

z

#7
Alıntı yapılan: Allegro - 13 Nisan 2011, 22:05:56
yolla(data & 0x80); :)

Data 0x80 ise yolla(data & 0x80);  0x80 gider. Halbuki yolla rutini 0 yada 1 yollamak uzere dusunulmus.

Bu arada yazimda da hata yapmisim

data & 0x80 sonucu 0 degilse ise 1 yolla değilse 0 yolla
data & 0x40 sonucu 0 degilse ise 1 yolla değilse 0 yolla
..
..

olmaliydi.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muuzoo

#8
1) İlk olarak şu adrese bir göz atın. C ile kod yazarken tavsiye eidlen (pic16 serisi için söylenmiş ama yine de faydası olabilir) bazı püf noktaları var.

http://www.microchipc.com/Hi-Tech_C_speed_optimization/

2)Udata hatası ise hafıza adresleme ile alakalıdır. Muhtemelen kullandığınız değişken boyutundan kaynaklı. C18 kullanım klavuzunu okursanız büyük değişken alanlarını nasıl kullanacağınız anlatılıyor.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

Erol YILMAZ

Alıntı yapılan: bunalmis - 13 Nisan 2011, 23:17:46
Alıntı yapılan: Allegro - 13 Nisan 2011, 22:05:56
yolla(data & 0x80); :)

Data 0x80 ise yolla(data & 0x80);  0x80 gider. Halbuki yolla rutini 0 yada 1 yollamak uzere dusunulmus.

Bu arada yazimda da hata yapmisim

data & 0x80 sonucu 0 değilse ise 1 yolla değilse 0 yolla
data & 0x40 sonucu 0 değilse ise 1 yolla değilse 0 yolla
..
..

olmaliydi.

if(data & 0x80)  yolla(1);
else                  yolla(0);

oldu mu şimdi ?

iyildirim

@emrez

spi üzerinden kurmak istediğimde ram yetmiyor, çok fazla veri var ondan dolayı lcd ye yazar gibi veri kullanıyorum

demişşsiniz.

H/W SPI kullanımında neden RAM yetmiyor, anlamadım. Satırlarca kod yerine sadece data byte olarak SPI buffer 'a yazılacak.  SPI kullanımı RAM üzerinde bir etki yapmamalı. Ancak Flash'da ki kodu tam tersine daha da kısaltır.  Eğer sorun hız ise 10 Mhz SPI hızında bir  byte'ın gönderilmesi de sadece 800ns sürer. SPI kullanmanın sakıncasını anlamadım gerçekten.

Bu arada yanıtlarken alıntı yapamama, önizleme görememe sıkıntısı yaşayan sadece benmiyim, başka arkadaşlarda da bu sorun var mı ?

iyildirim

Son bir hafta gibi bir süredir, önizleme, alıntı gibi özellikler yanıtlama sırasında kullanılamıyor.

FxDev, peki format atınca düzeldimi ?

Alıntı yapabildiğini görüyorum, da quote yi elle mi yazıyorsum bilemedim.

z

Alıntı yapılan: Allegro - 13 Nisan 2011, 23:34:41
Alıntı yapılan: bunalmis - 13 Nisan 2011, 23:17:46
Alıntı yapılan: Allegro - 13 Nisan 2011, 22:05:56
yolla(data & 0x80); :)

Data 0x80 ise yolla(data & 0x80);  0x80 gider. Halbuki yolla rutini 0 yada 1 yollamak uzere dusunulmus.

Bu arada yazimda da hata yapmisim

data & 0x80 sonucu 0 değilse ise 1 yolla değilse 0 yolla
data & 0x40 sonucu 0 değilse ise 1 yolla değilse 0 yolla
..
..

olmaliydi.

if(data & 0x80)  yolla(1);
else                  yolla(0);

oldu mu şimdi ?

Sevmedim
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

tyildizak

#13
Alıntı yapılan: Allegro - 13 Nisan 2011, 23:34:41
Alıntı yapılan: bunalmis - 13 Nisan 2011, 23:17:46
Alıntı yapılan: Allegro - 13 Nisan 2011, 22:05:56
yolla(data & 0x80); :)

Data 0x80 ise yolla(data & 0x80);  0x80 gider. Halbuki yolla rutini 0 yada 1 yollamak uzere dusunulmus.

Bu arada yazimda da hata yapmisim

data & 0x80 sonucu 0 değilse ise 1 yolla değilse 0 yolla
data & 0x40 sonucu 0 değilse ise 1 yolla değilse 0 yolla
..
..

olmaliydi.

if(data & 0x80)  yolla(1);
else                  yolla(0);

oldu mu şimdi ?

data && 0x80 ?  yolla(1) : yolla(0); 

8)

X-Fi

#14
Alıntı yapılan: Allegro - 13 Nisan 2011, 23:34:41

if(data & 0x80)  yolla(1);
else                  yolla(0);

oldu mu şimdi ?

madem konu açıldı doğru en doğru bilgiyi deneyerek vereyim.

hitech pic18 de (9.63PL3) alttaki kodu yazdığımızda
       
if(data & 0x80)  RD1=1;
	else             RD1=0;
   
aldığımız asm karşılığı şöyledir:
     
     BTFSS 0xfd9, 0x7, ACCESS
     BRA 0x52
     BSF 0xf83, 0x1, ACCESS
     BRA 0x54
     BCF 0xf83, 0x1, ACCESS

görüldüğü gibi fazladan bra komutları ile goto işlemi yapmış else kodların tek işlem olduğunu düşünmeyip adresleyipde dallanmış.

Aynı kodu şu şekilde yazdığımda:
        RD1=0;
	if(data & 0x80)  RD1=1;
   
  karşılığında üretilen kod böyle oluyor:
      
      BCF 0xf83, 0, ACCESS
      BTFSC 0xfd9, 0x7, ACCESS
      BSF 0xf83, 0x1, ACCESS


Yukarıdaki gibi else kullanılan yöntemden 3 kaz daha hızlı sonuç almak mümkün C18 kurulu değil ondada farklı olacağını sanmıyorum bunları keşfetmek için illaki biraz asm bilgisi gerekli.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)