Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

_delay problemi

Başlatan LukeSkywalker, 05 Eylül 2011, 22:06:27

LukeSkywalker

İlk olarak PIC18F2550 ile denediğim kodumu vereyim.
#include <htc.h>

void main(void)
{
 TRISB=0;
 while(1)
	{
 	 LATB0=0;	 
	 LATB0=1;	 
	}
}


4MHZ kristal ile PORTB.0'ın frekansı ne olur?

f_machine

bence üretilen asm koduna bakmak lazım.

serdararikan

proteus da counter timer adlı bir ölçüm aleti var.onu frekans  moduna al ve ölç.orada göreceksin frekansı

-Hasan-

Alıntı yapılan: f_machine - 05 Eylül 2011, 22:10:52
bence üretilen asm koduna bakmak lazım.

En garanti sonuç için kesinlikle.  ;)

LukeSkywalker

Buyrun;
C:\Documents and Settings\Maytere\Desktop\asd\main.c  ---------------------------------------
1:                 #include <htc.h>
2:                 __CONFIG(1,0x0c08);
3:                 __CONFIG(2,0x0001);
4:                 __CONFIG(3,0x00);
5:                 
6:                 void main(void)
7:                 {
8:                  TRISB=0;
  7FF8    6A93     CLRF 0xf93, ACCESS
9:                  while(1)
  7FFE    D7FD     BRA 0x7ffa
10:                	{
11:                 	 LATB0=0;	 
  7FFA    908A     BCF 0xf8a, 0, ACCESS
12:                	 LATB0=1;	 
  7FFC    808A     BSF 0xf8a, 0, ACCESS
---  C:\Documents and Settings\Maytere\Desktop\asd\startup.as  -----------------------------------
1:                 
2:                 	; HI-TECH C PRO for the PIC18 MCU Family V9.63PL3
3:                 	; Copyright (C) 1984-2009 HI-TECH Software
4:                 	;Licensed for evaluation purposes only.
5:                 	;This licence will expire on Thu, 20 Oct 2011
6:                 
7:                 	; Auto-generated runtime startup code for final link stage.
8:                 
9:                 	;
10:                	; Compiler options:
11:                	;
12:                	; -oasd.cof -masd.map --summary=default --output=default main.p1 \
13:                	; --chip=18F2550 -P --runtime=default --opt=default -D__DEBUG=1 \
14:                	; --rom=default --ram=default -g --asmlist \
15:                	; --errformat=Error   [%n] %f; %l.%c %s --msgformat=Advisory[%n] %s \
16:                	; --warnformat=Warning [%n] %f; %l.%c %s
17:                	;
18:                
19:                
20:                	GLOBAL	_main,start,_exit
21:                	FNROOT	_main
22:                
23:                	pic18cxx	equ	1
24:                
25:                	psect	config,class=CONFIG,delta=1
26:                	psect	idloc,class=IDLOC,delta=1
27:                	psect	eeprom_data,class=EEDATA,delta=1
28:                	psect	const,class=CODE,delta=1,reloc=2
29:                	psect	smallconst,class=SMALLCONST,delta=1,reloc=2
30:                	psect	mediumconst,class=MEDIUMCONST,delta=1,reloc=2
31:                	psect	rbss,class=COMRAM,space=1
32:                	psect	bss,class=RAM,space=1
33:                	psect	rdata,class=COMRAM,space=1
34:                	psect	irdata,class=CODE,space=0,reloc=2
35:                	psect	bss,class=RAM,space=1
36:                	psect	data,class=RAM,space=1
37:                	psect	idata,class=CODE,space=0,reloc=2
38:                	psect	nvram,class=NVRAM,space=1
39:                	psect	nvrram,class=COMRAM,space=1
40:                	psect	nvbit,class=COMRAM,bit,space=1
41:                	psect	temp,ovrld,class=COMRAM,space=1
42:                	psect	struct,ovrld,class=COMRAM,space=1
43:                	psect	rbit,class=COMRAM,bit,space=1
44:                	psect	bigbss,class=BIGRAM,space=1
45:                	psect	bigdata,class=BIGRAM,space=1
46:                	psect	ibigdata,class=CODE,space=0,reloc=2
47:                	psect	farbss,class=FARRAM,space=0,reloc=2,delta=1
48:                	psect	fardata,class=FARRAM,space=0,reloc=2,delta=1
49:                	psect	ifardata,class=CODE,space=0,reloc=2,delta=1
50:                
51:                	psect	reset_vec,class=CODE,delta=1,reloc=2
52:                	psect	powerup,class=CODE,delta=1,reloc=2
53:                	psect	intcode,class=CODE,delta=1,reloc=2
54:                	psect	intcodelo,class=CODE,delta=1,reloc=2
55:                	psect	intret,class=CODE,delta=1,reloc=2
56:                	psect	intentry,class=CODE,delta=1,reloc=2
57:                
58:                	psect	intsave_regs,class=BIGRAM,space=1
59:                	psect	init,class=CODE,delta=1,reloc=2
60:                	psect	text,class=CODE,delta=1,reloc=2
61:                GLOBAL	intlevel0,intlevel1,intlevel2
62:                intlevel0:
63:                intlevel1:
64:                intlevel2:
65:                GLOBAL	intlevel3
66:                intlevel3:
67:                	psect	end_init,class=CODE,delta=1,reloc=2
68:                	psect	clrtext,class=CODE,delta=1,reloc=2
69:                
70:                
71:                ; User config settings for word 1
72:                ;
73:                	psect config
74:                	org 0
75:                	dw 0xC637
76:                
77:                ; User config settings for word 2
78:                ;
79:                	psect config
80:                	org 2
81:                	dw 0x21
82:                
83:                ; User config settings for word 3
84:                ;
85:                	psect config
86:                	org 4
87:                	dw 0xC00
88:                	psect	rparam,class=COMRAM,space=1
89:                	psect	param0,class=BANK0,space=1
90:                	psect	param1,class=BANK1,space=1
91:                	psect	param2,class=BANK2,space=1
92:                	psect	param3,class=BANK3,space=1
93:                wreg	EQU	0FE8h
94:                fsr0l	EQU	0FE9h
95:                fsr0h	EQU	0FEAh
96:                fsr1l	EQU	0FE1h
97:                fsr1h	EQU	0FE2h
98:                fsr2l	EQU	0FD9h
99:                fsr2h	EQU	0FDAh
100:               postinc0	EQU	0FEEh
101:               postdec0	EQU	0FEDh
102:               postinc1	EQU	0FE6h
103:               postdec1	EQU	0FE5h
104:               postinc2	EQU	0FDEh
105:               postdec2	EQU	0FDDh
106:               tblptrl	EQU	0FF6h
107:               tblptrh	EQU	0FF7h
108:               tblptru	EQU	0FF8h
109:               tablat		EQU	0FF5h
110:               
111:               	GLOBAL __accesstop
112:               __accesstop EQU 96
113:               	PSECT	ramtop,class=RAM
114:               	GLOBAL	__S1			; top of RAM usage
115:               	GLOBAL	__ramtop
116:               	GLOBAL	__LRAM,__HRAM
117:               __ramtop:
118:               
119:               	PSECT	reset_vec
120:               reset_pos:
121:               
122:               	PSECT	init
123:               start:
124:               _exit:
125:               ; fardata psect  - 0 bytes to load
126:               
127:               ; farbss psect  - 0 bytes to clear
128:               
129:               ; bigdata psect - 0 bytes to load
130:               
131:               	lfsr	0,1024
132:               	lfsr	1,256
  0004    EE11     LFSR 0x1, 0x100
  0006    F000     NOP
133:               	call	clear_ram
  0008    EC0E     CALL 0x1c, 0
  000A    F000     NOP
134:               	lfsr	0,3952
  000C    EE0F     LFSR 0, 0xf70
  000E    F070     NOP
135:               	movlw	15	; loop counter
  0010    0E0F     MOVLW 0xf
136:               clear_2:
137:               	clrf	postinc0,c	; clear, increment FSR0
  0012    6AEE     CLRF 0xfee, ACCESS
138:               	decf	wreg,c	; decrement loop counter
  0014    06E8     DECF 0xfe8, F, ACCESS
139:               	bnz	clear_2
  0016    E1FD     BNZ 0x12
140:               	PSECT	end_init
141:               	goto	_main		;go do the main stuff
  0018    EFFC     GOTO 0x7ff8
  001A    F03F     NOP
142:               ; Clear these memory locations
143:               clear_ram:
144:               	clrf	postinc0	;clear, increment FSR0
  001C    6AEE     CLRF 0xfee, ACCESS
145:               	movf	postdec1,w	;decrement loop variable
  001E    50E5     MOVF 0xfe5, W, ACCESS
146:               	movf	fsr1l,w
  0020    50E1     MOVF 0xfe1, W, ACCESS
147:               	bnz	clear_ram
  0022    E1FC     BNZ 0x1c
148:               	movf	fsr1h,w
  0024    50E2     MOVF 0xfe2, W, ACCESS
149:               	bnz	clear_ram
  0026    E1FA     BNZ 0x1c
150:               	return
  0028    0012     RETURN 0

Tagli

PLL kullanmıyorsan 250 kHz'te %75 iş zamanlı bir sinyal olur sanırım.

Ancak, çıkışta bağlı olan şeye göre, bacak çıkışları kodu takip edemeyebilir bildiğim kadarıyla. Osiloskopta bakmak lazım emin olmak için.
Gökçe Tağlıoğlu

-Hasan-

Tagli Hocam; bu kadar basit bir iş için, bu kadar kod mu üretiliyor?  :o

LukeSkywalker


LukeSkywalker

4/4'ten 1MHz olması gerekmez mi?

Tagli

Hasan Oguz, aslında komik bir şekilde, 4 satır C kodu için 4 satır asm kodu üretilmiş. Geriye kalan bölüm, yani startup.as içindeki kodlar ise başlangıç ayarları kodu. Yani derleyicinin dahili işleyişi için başlangıçta yapması gereken bazı ayarları yapıyor. Ne yaptığını ben de anlamıyorum, çünkü maalesef derleyici tasarımı konusunda bildiğim tek şey zor bir iş olduğu.

maytere, bakıldığı zaman yazdığın döngünün asm kodu şöyle:
7FFA: BCF 0xf8a, 0, ACCESS
7FFC: BSF 0xf8a, 0, ACCESS
7FFE: BRA 0x7ffa

Burada baştaki değerler adres değerleri. PIC18'in hafıza yapısı gereği ikişer ikişer artıyorlar. Yine ilginç bir şekilde, yukarıda yazılan BRA komutunun aslında en altta olduğu gözüküyor adres değerine bakıldığında (bunu geç farkettiğim için ilk tepkim "ama bu geri dönmüyor?" olmuştu).

BRA komutu kısa menzilli GOTO demek. Diğer iki komutun işlemesi 1'er cycle, yani 4 MHz'de 1'er us zaman alıyor. Ancak GOTO komutunun atlama yapması 2 cycle sürer. Bu durumda döngü süresi 4 us oluyor, ki bu da 250 kHz yapar. Atlama BSF komutundan sonra yapılmış olduğu için, bacak 0'a çekilmeden önce 3 us geçiyor. Bu sebeple de iş zamanı %75.

Ama dediğim gibi, bacağa bağlı olan şey örneğin kapasitif bir özellik gösteriyorsa, bacağa "0 olma emri" gidişinin ardından geçen 1 us'lik sürede bacak 0 olamadan tekrar "1 olma emri" gidebilir. Bu konuda benim de fazla bilgim yok, sanırım en iyisi bakıp görmek. LATA, LATB gibi ifadeleri forumda aratırsan bu mesele ile ilgili 1-2 başlık bulabilirsin forumda.
Gökçe Tağlıoğlu

-Hasan-

7FFA: BCF 0xf8a, 0, ACCESS
7FFC: BSF 0xf8a, 0, ACCESS
7FFE: BRA 0x7ffa


Hocam komutlar niçin 0000 dan değilde, ta bilmem 7FFA ' dan başlıyor peki?
Bir de başlangıç ayarları kodu dedğiniz şey programın uzunluğuna göre değişiyor mu? yoksa sabit mi?

LukeSkywalker

@Tagli hocam teşekkür ederim.
Hı-Tech ile uğraşıyorum da. Bu _CONFIG ayarlarını bir türlü yapamadım. ISIS ile simüle ediyorum kodlarımı.
"__CONFIG(1,0x0c00);"
yazdığımda  Osilatör frekansını PLL'siz 4'e bölmeden kullanıyorum.
Fakat CPUDIV ile PLL kullanmadan
"__CONFIG(1,0x0c18);" yaptığımda frekans yine değişmiyor. Osilatör frekansını yine 4 'e bölmeden kullanıyor. Oysaki 0x0c18 yazdığımda 4'e bölmesi gerekmez mi?


f_machine


   
__CONFIG(1,HS);								   //
	          __CONFIG(2,PWRTEN&WDTDIS);				       //CONFIGURATION
	          __CONFIG(3,CCP2RC1);			               //BITS
	          __CONFIG(4,DEBUGDIS&LVPDIS&STVREN);			   //
	          __CONFIG(5,CPALL);


ben 18f452 için yazdığım hitech kodlarında yukarıdaki config ayarlarını kullanıyorum.
Benzerleri senin mikron içinde vardır.Hitech klasorünün içindeki işlemcinle ilgili header (örn 18452.h)
dosyasını aç orda config ayarlarının nasıl tanımlandığı gösteriliyor.

LukeSkywalker

Sorun da orada zaten. 18f2550'nin header dosyasında böyle tanımlamalar yok. 4550'de var 2550'de yok.

Tagli

Hasan Oguz, kod parçalarının hafızaya yerleştirilme işini, ve sanırım bu sırada gerekli adres atamalarını linker yapıyor. Ama bunu neye göre yaptığını bilmiyorum. Elbette donanımı gereği kod çalışmaya 0000 adresinden başlıyor, ki başladığı yerde genelde bir GOTO bulunur, bu da bahsetmiş olduğum başlangıç ayarları koduna gider.

İlginçtir ki yukarıdaki disassembly kodunda 0000 ve 0002 adreslerini göremedim. Gözüken ilk adres 0004. Ondan sonra kodu takip edersen bir yerde 7FFA'ya atladığını görebilirsin. İki word yer kapladığı için, 0000 ve 0002 adreslerine de bir GOTO oturması lazım. MPLAB'de View menüsünden program memory'ye bakarsan gözükecektir. Muhtemelen GOTO 0004 olması lazım.

Başlangıç ayarları kodu program uzunluğuna göre değişmez. Ama programa eklenen kütüphanelere (.h dosyaları, bir başka deyişle) göre belki uzayabilir. Ayrıca, başlangıç değerleri atanmış olan değişkenlerin (int a = 5; gibi) atamaları da bu sırada yapıldığı için, bu değişkenlerin sayısına göre de kod işleyiş süresi değişebilir.

maytere, Hi-Tech bilmiyorum maalesef. XTAL frekansını ve ulaşmaya çalıştığın frekansı yazarsan fikir verebilirim belki. Tabi komut işleme frekansının çalışma frekansının 4'te 1'i olduğunu unutma. Örneğin, azami hız 48 MHz'tir ama bu durumda 12 MIPS hızındasındır (saniyede 12 milyon işlem).
Gökçe Tağlıoğlu