Delay_Ms Cok fazla ASM kod üretiyor

Başlatan birumher, 23 Ekim 2006, 13:11:41

birumher

Aşağıda bir delay_ms komutu için compiler ın ürettiği assemilirbly kodu var.
Hepsi de aynı olan bir sürü kod üretmiş bunun önüne nasıl geçilebilir?
Kullandığım compiler versionu 3.249
....................    Delay_ms(1);
*
0AE6:  MOVLW  01
0AE7:  MOVWF  67
0AE8:  BCF    0A.3
0AE9:  CALL   0EB
0AEA:  BSF    0A.3
0AEB:  BTFSC  28.7
0AEC:  BSF    0B.7
*
0B33:  MOVLW  01
0B34:  MOVWF  67
0B35:  BCF    0A.3
0B36:  CALL   0EB
0B37:  BSF    0A.3
0B38:  BTFSC  28.7
0B39:  BSF    0B.7
*
0B5A:  MOVLW  01
0B5B:  MOVWF  67
0B5C:  BCF    0A.3
0B5D:  CALL   0EB
0B5E:  BSF    0A.3
0B5F:  BTFSC  28.7
0B60:  BSF    0B.7
*
0BCE:  MOVLW  01
0BCF:  MOVWF  67
0BD0:  BCF    0A.3
0BD1:  CALL   0EB
0BD2:  BSF    0A.3
0BD3:  BTFSC  28.7
0BD4:  BSF    0B.7
*
0C1B:  MOVLW  01
0C1C:  MOVWF  67
0C1D:  BCF    0A.3
0C1E:  CALL   0EB
0C1F:  BSF    0A.3
0C20:  BTFSC  28.7
0C21:  BSF    0B.7
*
0C42:  MOVLW  01
0C43:  MOVWF  67
0C44:  BCF    0A.3
0C45:  CALL   0EB
0C46:  BSF    0A.3
0C47:  BTFSC  28.7
0C48:  BSF    0B.7
*
0D6F:  MOVLW  01
0D70:  MOVWF  67
0D71:  BCF    0A.3
0D72:  CALL   0EB
0D73:  BSF    0A.3
0D74:  BTFSC  28.7
0D75:  BSF    0B.7
*
0DBC:  MOVLW  01
0DBD:  MOVWF  67
0DBE:  BCF    0A.3
0DBF:  CALL   0EB
0DC0:  BSF    0A.3
0DC1:  BTFSC  28.7
0DC2:  BSF    0B.7
*
0DE3:  MOVLW  01
0DE4:  MOVWF  67
0DE5:  BCF    0A.3
0DE6:  CALL   0EB
0DE7:  BSF    0A.3
0DE8:  BTFSC  28.7
0DE9:  BSF    0B.7
*
0E57:  MOVLW  01
0E58:  MOVWF  67
0E59:  BCF    0A.3
0E5A:  CALL   0EB
0E5B:  BSF    0A.3
0E5C:  BTFSC  28.7
0E5D:  BSF    0B.7
*
0EA4:  MOVLW  01
0EA5:  MOVWF  67
0EA6:  BCF    0A.3
0EA7:  CALL   0EB
0EA8:  BSF    0A.3
0EA9:  BTFSC  28.7
0EAA:  BSF    0B.7
*
0ECB:  MOVLW  01
0ECC:  MOVWF  67
0ECD:  BCF    0A.3
0ECE:  CALL   0EB
0ECF:  BSF    0A.3
0ED0:  BTFSC  28.7
0ED1:  BSF    0B.7
Birkan.Herguner

kurumahmut

Selam
Bende 3satırlık kod oluşturdu... PIC18F452 ve 20MHZ kristalde elde ettiğim sonuç bu. CCS versiyonlarımızda aynı.......

....................    //Başlangıç...
....................
....................    delay_ms(1);
006E:  MOVLW  01
0070:  MOVWF  06
0072:  BRA    0004
....................    //bitiş

kurumahmut

Bu da 16F877 de 20MHZ de

....................    delay_ms(1);
005F:  MOVLW  01
0060:  BCF    03.5
0061:  MOVWF  21
0062:  GOTO   004
....................

for döngüsünde delay ms çağırmış olabilir misin?

XX_CİHAN_XX

Alıntı yapılan: "kurumahmut"Bu da 16F877 de 20MHZ de

....................    delay_ms(1);
005F:  MOVLW  01
0060:  BCF    03.5
0061:  MOVWF  21
0062:  GOTO   004
....................

for döngüsünde delay ms çağırmış olabilir misin?
goto 004 de kı programıda eklersek delay_ms(1) ın 4 satırdan ibaret olmadıgını görebiliriz.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

kurumahmut

evet dediğiniz doğru...

0004:  MOVLW  0F
0005:  MOVWF  04
0006:  MOVF   00,W
0007:  BTFSC  03.2
0008:  GOTO   018
0009:  MOVLW  01
000A:  MOVWF  0D
000B:  CLRF   0C
000C:  DECFSZ 0C,F
000D:  GOTO   00C
000E:  DECFSZ 0D,F
000F:  GOTO   00B
0010:  MOVLW  4A
0011:  MOVWF  0C
0012:  DECFSZ 0C,F
0013:  GOTO   012
0014:  NOP
0015:  NOP
0016:  DECFSZ 00,F
0017:  GOTO   009
0018:  GOTO   025 (RETURN) sonraki komut

şeklinde kod parçası var. Ancak bu parça yeni delay komutları içinde kullanılıyor... yeni bir tane daha oluşmuyor... Nese arkadaşın bir problemi var... Ona yoğunlaşalım.......

birumher

18F452 için compile ettiğimde dediğiniz gibi çok daha az komut üretiyor. Galiba program hafızası bankları ile ilgili bir şey ama daha tam çözemedim. Program biraz büyük olunca böyle kod üretiyor ben de araştırıyorum bir çözümü var mı diye.
Birkan.Herguner

birumher

Arkadaşlar problemi çözdüm. 16F877 de stack derinliği 8 olduğu için C kodunda bu derinlikten daha fazla fonksiyon çağırıldığında compiler doğal olarak bunu alt program olarak derleyemiyor (call ile çağıramıyor) ve o fonksiyonun her çağırılışı için ayrı asm kodu üretip goto komutlarıyla oraya dallanıp çalıştırmaya çalışıyor. Programdaki iç içe fonksiyonları azaltınca problem çözüldü şu anda herşey normale döndü. Kullandığım program hafızası da 4100 wordden 1158 worde düştü. :)
Birkan.Herguner