Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Bu Kod parçasında hata nerde?

Başlatan mihri, 08 Ekim 2008, 23:09:01

mihri

#include <htc.h>	
  

unsigned char var1;
void fnc(unsigned char cnt)
{
    
    #asm
    movlw 0xc7 
    movwf _var1
    #endasm  
}

void main(void)
{
    fnc(100); 
}


Yukarıdaki kod parçası aşağıdaki hatayı veriyor 3 gündür uğraşıyorum sebebini bulamadım kafayı yemek üzereyim.  Böyle bir hatayla karşılaşan oldu mu?
HI-TECH PICC-18 PRO COMPILER (Microchip PIC micro) V9.61
Copyright (C) 1984-2007 HI-TECH SOFTWARE
Serial number: HCPIC18P-12345
Employing 18F452 errata work-arounds:
 * Address 4000h boundary
 * Faulty table reads at -40 degrees C
 * Needs NOP instruction at reset vector
 * Peripherals can misbehave if BSR = 15
 * DAW instruction may improperly clear CARRY bit
 * Specifically disable interrupt sources during tblwt instruction
 * Writes to flash must target opposite side of 4000h boundary
Error   [800] C:\Users\ENERGY\AppData\Local\Temp\s1afs.; 192. undefined symbol "_var1"
"Eppur si muove!"

controller

değişkeni tanımlarken "var1" olarak, kullanırken "_var1" olarak yazmışsın. değişken tanımlanmamış hatası veriyor. "movwf _var1" yerine

"movwf var1" kullanırsan muhtemelen problemin çözülür.

ayrıca fonksiyona geçirdiğin parametreyi hiç kullanmamışsın. bunun içinde warning verebilir.

düzeltme: az önce bir örnek koda baktım, #asm bloğu içinde değişken ismi önüne _ (altçizgi) ekleniyormuş. normalde hi-tech kullanıcısı olmadığım için ben bu şekilde düşünmüştüm. sanırım hi-tech kullananlar cevap verebilir.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

mihri

controller dediğini denedim hata devam ediyor. Aşağıdaki gibi...

HI-TECH PICC-18 PRO COMPILER (Microchip PIC micro) V9.61
Copyright (C) 1984-2007 HI-TECH SOFTWARE
Serial number: HCPIC18P-12345
Employing 18F452 errata work-arounds:
 * Address 4000h boundary
 * Faulty table reads at -40 degrees C
 * Needs NOP instruction at reset vector
 * Peripherals can misbehave if BSR = 15
 * DAW instruction may improperly clear CARRY bit
 * Specifically disable interrupt sources during tblwt instruction
 * Writes to flash must target opposite side of 4000h boundary
Error   [800] C:\Users\ENERGY\AppData\Local\Temp\s1vsg.; 192. undefined symbol "var1"
"Eppur si muove!"

Prescaler

Merhaba mihri,

Derleyici optimizasyonları yalnız C kodlarında uyguladığı için bu ilginç durum ortaya çıkıyor. Olayın açıklaması şöyle:

Eğer bir değişken tanımlar ancak bunu kullanmazsak derleyici bu değişken için yer ayırmıyor ve link aşamasında böyle bir değişken yokmuş gibi davranıyor. Yazmış olduğun kodda var1 kullanılmamış olduğundan derleyici optimizasyon sırasında bu değişkeni elimine ederek link aşamasına dahil etmemiş yani bu değişkeni yok saymış. Yazmış olduğun inline assembly kod içinde yer alan _var1 optimizasyonda dikkate alınmıyor ve link aşamasında olmayan bir _var1'i kullanmış olduğun için hata ortaya çıkıyor.

Çözüm için aşağıdaki yolu deneyebilirsin:

/////////////////////
#include <htc.h>    
 
unsigned char var1;

void fnc(unsigned char cnt)
{    
   #asm
   movlw 0xc7
   movwf _var1
   #endasm  
}

void main(void)
{
   var1 = 0;
   fnc(100);
}
/////////////////////

main fonksiyonunda var1'i kullandık artık var1 var  :) Bu yüzden link aşamasında hata ortaya çıkmayacak.

Bir anımsatma yapayım: Global değişkenlerin access bank'ta yer almadığı durumlarda yazmış olduğun kod doğru çalışmayacaktır. Bu durumda var1'e ulaşmak için örnekteki gibi bank da seçmen gerekir:

void fnc(unsigned char cnt)
{  
   #asm
   movlw 0xc7
   movlb _var1 & 0xFF
   movwf _var1 >> 8,b
   #endasm  
}

İyi çalışmalar.

KAZIMUGUR

@Prescaler hocam sağolasın, tammm hi-tech e ... atıyordum ki...
Dediğiniz şekilde derledi.

İyi güzel hoş , yüzlerce elemanla yaptığımız devreler kolayca "yazılıveriyor" da, devrelerle mi uğraşacağız programlamı ? Çözemedim bu işi. :roll:

mihri

Teşekkürler Prescaler problem çözüldü fakat bu sefer başka bir problemle karşılaştım. Yazdığım makroda #asm ve #endasm komutları çalışmıyor. kod ve hatası aşağda. Bu Hi-Tech iyice can sıkıcı olmaya başladı.

#include <htc.h>	

unsigned char var1;
unsigned char var2;
unsigned char cnt;

#define dly_ms(x){\
    cnt=(unsigned char)x;\
    var1=0xc7;\
    var2=0x01;\
    #asm\
    nop\
    #endasm}\

void main(void)
{
   dly_ms(10);
}


Hata mesajı;

Warning [172] dly_ms; 18.0 formal parameter expected after #
Warning [172] dly_ms; 18.0 formal parameter expected after #
Error   [298] D:\KodBankasi\HI_TECH_WORK\Deneme\Yeni Klasör\main.c; 19.0 end of file in #asm
"Eppur si muove!"

arslan74

Merhaba,

Yazdığın koda ASM kullanmasan bile hata alırsın.

Cünkü macroda bir cok hatan var. En başta fonksiyon tanımlamaya çalışmışsın. Tanımalama olduğu için kullandığın yere bu fonksiyonu yazacak. Bu durumdada fonksiyon içinde fonksiyon tanımlamış olursun. Buda hataya neden olur.

Tanımlamayı yanış yapmışsın. Burada yapmak istediğin asıl amac tam olarak nedir? Onu öğrenbilirsek ona göre belki düzeltme yapabiliriz.

Macro yerine neden normal fonksiyon yazmiyorsun?

Selamlar

mihri

@arslan74 ben kendim delay kütüphanesini oluşturmaya çalışıyorum amacım bu. Yukardaki kodda #asm,nop,#endasm komutlarını çıkardığım zaman derleme sorunsuz oluyor. Mesela aşağıdaki kod sorunsuz derleniyor.
#include <htc.h>    

unsigned char var1; 
unsigned char var2; 
unsigned char cnt; 

#define dly_ms(x){\ 
    cnt=(unsigned char)x;\ 
    var1=0xc7;\ 
    var2=0x01;\ 
 }\ 

void main(void) 
{ 
   dly_ms(10); 
}


#asm #endasm komutlarını kullandığımda derleme sırasında #endasm yok diye hata veriyor oysa var! Aşağıdaki Kod parçasıda sorunsuz derleniyor mesela.Hi-tech CCS'yi geçecek bu gidişle.

#include <htc.h>    

unsigned char var1; 
unsigned char var2; 
unsigned char cnt; 

#define dly_ms(x){\ 
    cnt=(unsigned char)x;\ 
    var1=0xc7;\ 
    var2=0x01;\ 
 asm("nop");}\ 

void main(void) 
{ 
   dly_ms(10); 
}
"Eppur si muove!"

arslan74

Merhaba,

Aşağaıdaki gibi kullanırsan çalışıyor.

#define	DelayUs(x)	{ unsigned char _dcnt;\
			  _dcnt = (unsigned char)x;\
			  while(--_dcnt != 0){\
				  NOP();\
				  NOP();\
				  asm("nop");\
			  }\
		}


Hi-Tech içinde samples klasörü var onun içinde delay.c kodu var onu biraz incele.

Selamlar

mihri

Oradaki delay.c kodunu ezberledim artık. Hazırladığım kütüphaneyide asm("") komutuyla sorunsuz derliyorum. Disassembly ettiğimde ise asm ile yazdığım makroda ekstradan nop komutu ortaya çıkıyor. Derlediğim kod aşağıda.

#include <htc.h>	

unsigned char var1;
unsigned char var2;
unsigned char cnt;	
					
#define dly_ms(x) { \
		var1=0xc7;\
		var2=0x01;\
		cnt=(unsigned char)x;\
		asm("decfsz	_var1,f");\
		asm("goto	$+4");\
		asm("decfsz	_var2, f");\
		asm("goto	$-8");\
		asm("decfsz	_cnt, f");\
		asm("goto	$-12");}\

void main(void)
{
   dly_ms(10);

}


Disassembly ettiğim zamanda aşağıdaki asm kodları oluşuyo. Burda  goto $+4 komutundan sonra ve diğer goto komutlarından sonra nop komutu derleyici tarafından ekleniyor.

#define dly_ms(x) { \
9:                 		var1=0xc7;\
10:                		var2=0x01;\
11:                		cnt=(unsigned char)x;\
12:                		asm("decfsz	_var1,f");\
13:                		asm("goto	$+4");\
14:                		asm("decfsz	_var2, f");\
15:                		asm("goto	$-8");\
16:                		asm("decfsz	_cnt, f");\
17:                		asm("goto	$-12");}\
18:                
19:                void main(void)
20:                {
  3FDC    FFFF     NOP
21:                   dly_ms(10);
  3FDE    0EC7     MOVLW 0xc7
  3FE0    6E04     MOVWF 0x4, ACCESS
  3FE2    0E01     MOVLW 0x1
  3FE4    6E03     MOVWF 0x3, ACCESS
  3FE6    0E0A     MOVLW 0xa
  3FE8    6E02     MOVWF 0x2, ACCESS
  3FEA    2F04     DECFSZ 0x4, F, BANKED
  3FEC    EFF8     GOTO 0x3ff0
  3FEE    F01F     NOP                                  <<<< Derleyiciden gelen nop
  3FF0    2F03     DECFSZ 0x3, F, BANKED
  3FF2    EFF5     GOTO 0x3fea
  3FF4    F01F     NOP                                  <<<<Derleyiciden gelen nop
  3FF6    2F02     DECFSZ 0x2, F, BANKED
  3FF8    EFF6     GOTO 0x3fec
  3FFA    F01F     NOP                                  <<<<...


nop komutu neden ekleniyor anlamadım. Üstelik yazdığım kod bu nop komutları yüzünden yalnış çalışıyor. Çünkü döngü içinde olmaması gereken komut oluyor zaman gecikmesi fazla oluyor ve goto komutu yalnış yere dallanıyor. Mesela goto $+4 nop yüzünden yalnış yere dallanıyor.

Bu nop komutlarının derleyici tarafından otomatik olarak oluşturulmasını nasıl engelleyebilirim.
"Eppur si muove!"

Prescaler

Aslında NOP komutu eklenmiyor, zaten var. PIC18 mimarisinde goto komutu 32-bit yani 2 word'den (2 tane 16-bit'ten) oluşuyor. Ancak tasarım sırasında ikinci wordun başından bakıldığında NOP olarak yorumlanması esas alınmış. Böyle olması gereklidir çünkü goto ya da call gibi komutların üstünde yer alan btfxx benzeri (aşağıdaki word komutu pas geçebilen) komutlar, eğer aşağıda çift word'den oluşan bir komut varsa onun ortasına düşerler. Bu durumda işlemci nop işletimi yaparak yoluna devam eder. Kısacası aslında o NOP'lar üstteki komutun devamı. Program counter herzaman çift adres değeri taşır ve 32-bitlik bir komutunun ortasına da düşebilir. Tüm 32-bit komutlar ortalarından NOP görülecek şekilde tasarlanmışlar.

Fazladan NOP istemiyorsan GOTO yerine BRA komutunu kullanabilirsin, bu komut tek word uzunlukta.

İyi çalışmalar.

serdararikan

ben hitech hiç kullanmadım.bi ara ccsc kullanmıştım bide üniversiteden kalma C bilgim var.  noktalı virgülden sonra neden \ kullandığınız pek anlamadım ama.ben bunlar silerek derledim.bi problem çıkmadı.derleme işlemi başarılı oldu.[/URL][/img]